مترجم (حاجز ٣/F2): تخطيط بنية C-متوافق بلا ترويسة — @تمثيل_سي ينجز الربط الخارجيّ (RFC #53 F2-ب)#280
Merged
Merged
Conversation
…سي ينجز الربط الخارجيّ (RFC #53 F2-ب) بنى ص تُمثَّل داخليًّا كأصناف SIR بترويسة مؤشّر vtable في الحقل 0 (`{ ptr, i64, i64 }`)، فتُزاح حقول المستخدم 8 بايت مقابل بنية C نظيرة — وهو الحاجب الحقيقيّ للـFFI البنيويّ: تمرير بنية ص إلى دالّة C يقرأ/يكتب إزاحات خاطئة. هذه اللبنة تُفعّل سمة @تمثيل_سي (المُقرّة والمقبولة في F2-أ، #277) لتُسقِط ترويسة vtable: النوع يصير `{ i64, i64 }`، فالحقل 0 عند الإزاحة 0 — مطابقٌ لـ`struct { long؛ long؛ }` في C. التغييرات: - SIRClass::isCRepr يُنقل من StructDecl::isCRepr (المُحلَّل في F2-أ). - context_info_.cReprClasses تُملأ في preprocessClasses. - preprocessClasses: تخطّي دفع مؤشّر الترويسة للحقل 0 لبنى C-repr (كبنى ADT سلفًا). - getFieldStructIndex: يُرجِع i (بلا إزاحة) لـC-repr، وi+1 لغيرها. مركزة كلّ إزاحات إنشاء الكائن المبرمَجة صلبًا (mem_alloca/objects_arrays_ops/oop_ops) عليه. - storeVtablePtr: حارس مبكّر يتخطّى C-repr (لئلّا يطمس بيانات الحقل 0). - buildClassVtables: بنية C-repr لا تُبنى لها vtable (تبقى غائبة عن classVtableLayout/ classVtableGlobals) ⇒ استدعاء طريقةٍ عليها إرسالٌ مباشر لا افتراضيّ (حارس أمان C-1 من مراجعة أميليا: منع قراءة الحقل 0 كمؤشّر vtable). الهدم محفوظ بالاسم. - حجم malloc يتقلّص آليًّا (24→16) عبر getTypeAllocSize. البراهين الحيّة: - سلوكيّ: memset خارجيّة تصفّر أوّل 8 بايتات ⇒ الحقل الأوّل يصير 0 (عند الإزاحة 0)؛ الضبط (بنية عاديّة) ⇒ يبقى 111 (الحقل عند 8). IR: `{ i64, i64 }`+malloc(16) مقابل `{ ptr, i64, i64 }`+malloc(24). - طريقة على بنية @تمثيل_سي ⇒ 42 بإرسال مباشر (لا انهيار C-1). اختبار: 052_c_repr_method_direct_dispatch (تكافؤ مزدوج). انحدار صفريّ: 2459/2460 (الفشل الوحيد b2_recursion_accumulator انهيار انحدار عميق مسبق في المفسّر، غير ذي صلة). مراجعة أميليا خصميّة (جولتان): SAFE؛ ديون مؤجَّلة موثَّقة (H-2 حقول غير عدديّة، تخمين الصنف). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
📚 تذكير مزامنة دليل المطوّرين هذا الـPR يلمس مصادر موثَّقة في دليل المطوّرين. راجع الفصول الآتية وحدّثها إن تغيّر سلوكها، ثم ثبّت البصمات هناك (
بندٌ في معيار الإنجاز. تذكيرٌ آليّ — لا يحجب الدمج. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
الحاجز ٣ (FFI بنيويّ) / F2-ب — تخطيط بنية C-ABI متوافق
يُكمل هذا الـPR F2-ب من RFC #53 (سدّ الحاجز ٣ لخارطة الاستضافة الذاتيّة rfcs#52)، بعد F2-أ المدموجة (#277).
المشكلة (الحاجب الحقيقيّ للـFFI البنيويّ)
بنى ص تُمثَّل داخليًّا كأصناف SIR بترويسة مؤشّر vtable في الحقل 0:
{ ptr, i64, i64 }. هذا يزيح حقول المستخدم 8 بايت مقابل بنية C نظيرة، فتمرير بنية ص إلى دالّة C يقرأ/يكتب إزاحات خاطئة — غير متوافق مع C-ABI.الحلّ
تفعيل سمة
@تمثيل_سي(نظير Rust#[repr(C)]، المقبولة في F2-أ) لإسقاط ترويسة vtable: النوع يصير{ i64, i64 }، فالحقل 0 عند الإزاحة 0 — مطابقٌ لـstruct { long؛ long؛ }في C.@تمثيل_سي{ i64, i64 }{ ptr, i64, i64 }التغييرات
SIRClass::isCReprيُنقل منStructDecl::isCRepr؛cReprClassesتُملأ فيpreprocessClasses.preprocessClasses: تخطّي دفع مؤشّر الترويسة للحقل 0 لبنى C-repr.getFieldStructIndex: بلا إزاحة لـC-repr؛ مركزة كلّ إزاحات إنشاء الكائن المبرمَجة صلبًا عليه (mem_alloca/objects_arrays_ops/oop_ops).storeVtablePtr: حارس يتخطّى C-repr.buildClassVtables: بنية C-repr لا تُبنى لها vtable ⇒ استدعاء الطُّرق عليها إرسالٌ مباشر (حارس أمان C-1: منع قراءة الحقل 0 كمؤشّر vtable).getTypeAllocSize.البراهين الحيّة
memsetخارجيّة تصفّر أوّل 8 بايتات ⇒ الحقل الأوّل يصير 0 (عند الإزاحة 0)؛ الضبط ⇒ يبقى 111 (الحقل عند 8).الاختبارات والمراجعة
052_c_repr_method_direct_dispatch(تكافؤ مزدوج، يحرس ضدّ C-1).b2_recursion_accumulatorانهيار انحدار عميق مسبق في المفسّر، غير ذي صلة، مُتحقَّق على الأساس النظيف).buildClassVtables. الجولة ٢: SAFE للدمج، حصر مغلق لكلّ قارئ/كاتب للحقل 0.ديون مؤجَّلة موثَّقة (لا تحجب — تشخيصيّة لا أمان-ذاكرة)
أيّ/نص/مصفوفةداخل@تمثيل_سيليست C-متوافقة تخطيطيًّا (موثَّق قيدًا في RFC test(errors): مراجعة أميليا (وكيل فرعي) لترحيل reportError — إصلاح 4 علل #53؛ النطاق: العدديّات).objectClassMap(دَين قائم سلفًا).ptrبدلi64) يعمل اليوم بتطابق العرض على x86-64.🤖 Generated with Claude Code