Skip to content

مترجم (حاجز الاستضافة ٣/F2-ج): تمرير/إرجاع بنية @تمثيل_سي بالقيمة عبر الربط الخارجيّ (RFC #53 F2-ج)#286

Merged
SalehKadah merged 1 commit into
devfrom
feat/ffi-crepr-f2c
Jul 25, 2026
Merged

مترجم (حاجز الاستضافة ٣/F2-ج): تمرير/إرجاع بنية @تمثيل_سي بالقيمة عبر الربط الخارجيّ (RFC #53 F2-ج)#286
SalehKadah merged 1 commit into
devfrom
feat/ffi-crepr-f2c

Conversation

@SalehKadah

Copy link
Copy Markdown
Collaborator

الهدف

إكمال F2-ج — المرحلة الأخيرة من الحاجز الثالث (FFI بنيويّ) في حملة الاستضافة الذاتيّة (RFC #52): تمرير/إرجاع بنية @تمثيل_سي بالقيمة عبر الربط الخارجيّ، بتصنيف ABI مطابقٍ لـClang لهدفَي System V AMD64 و Windows x64. بذا يكتمل الحاجز الثالث بمراحله الثلاث (F2-أ #277 + F2-ب #280 + F2-ج هذا).

قرار المالك: بنية @تمثيل_سي في توقيع دالة خارجية = بالقيمة ضمنًا؛ التمرير بالمؤشّر يبقى صريحًا عبر رقم (كالاستعمال القائم memset/clock_gettime) ⇒ إضافة غير كاسرة.

التنفيذ (٨ ملفّات، +488 سطر)

  • SIRFunction.isExtern + returnClassName يُنقَلان من FunctionDecl (sir_module.h، sir_builder_functions.cpp).
  • مصنِّف ABI classifyCReprAbi (classes_vtables_ops.cpp): Win64 حجم∈{1,2,4,8}⇒سجلّ iN وإلّا byval؛ SysV >16⇒byval وإلّا 1-2 «ثمانيّات» (كلّها عشريّة⇒double في XMM، وإلّا iN في GPR)؛ العائد ≤حدّ⇒مباشر (RAX[:RDX]) وإلّا sret.
  • emitFunctionPrototype (functions2_ops.cpp): يحسب CReprCallPlan مرّةً (تصاريح-أوّلًا مضمونة)، يطبّق byval/sret على التصريح، ويخزّن الخطّة في creprCallPlans.
  • موقع النداء emitCall (cf_branch_call.cpp): يقرأ الخطّة، يحمّل قطع البنية من ذاكرة الكائن، يخصّص عائد sret، يجسّد العائد المباشر، ويطبّق byval/sret على النداء.
  • إصلاح المحلّل (parser_declarations.cpp): parseExternFunctionDecl كان يقبل نوع العائد المبنيّ فقط لا اسمَ صنفٍ مُعرَّف ⇒ أُضيف إرشاد الرمزين المتتاليين (مطابقًا للدالّة العاديّة) + حفظ returnTypeName.

البرهان

  • IR مطابقٌ لـClang للهدفين:
    • Win64: declare i64 @small_sum(i64) · @make_small()→i64 · @point_sum(ptr byval(...)) · void @make_point(ptr sret(...))
    • SysV: @point_sum(i64, i64) · { i64, i64 } @make_point()
  • ربطٌ وتشغيلٌ حيٌّ Win64: برنامج ص ينادي دوالّ C حقيقيّة تمرّر/تُرجِع بنى @تمثيل_سي بالقيمة (Small 8ب سجلّ + Point 16ب byval/sret) ⇒ الخرج 107 / 42 / 42 / 42 صحيحٌ طرفًا لطرف.
  • LLVM يضمن توليد الشِّفرة الآليّة المطابقة للـABI من IR الصحيح (byval/sret/تقسيم القطع)، فبرهان شكل IR ≈ برهان صحّة.

الانحدار والمراجعة

  • rules_matrix: 2459/2460 — الفشل الوحيد b2_recursion_accumulator سابقٌ حتميّ (تعاود مفسّر، غير متعلّق بالـFFI). انحدار صفريّ.
  • مراجعة أميليا متزامنة: لا عيب مسار سعيد ولا انهيار؛ المصنِّف صحيح لكلّ بنية عدديّة قابلة للتعبير. ملاحظاتها = قيود متأصّلة/تشخيصيّة وُثّقت في RFC test(errors): مراجعة أميليا (وكيل فرعي) لترحيل reportError — إصلاح 4 علل #53 لا عيوب (حقول 64-بت رقم⇔int64_t، لا بنى متداخلة، وبنيةٌ غير-@تمثيل_سي بالقيمة تنحطّ صامتةً لمؤشّر = قرار دلاليّ للمالك، غير كاسر).

مرتبط: RFC sadlang/rfcs#53 (محدَّث بتوثيق F2-ج).

🤖 Generated with Claude Code

… الربط الخارجيّ (RFC #53 F2-ج)

يُكمل هذا الحاجزَ الثالثَ (FFI بنيويّ) بمراحله الثلاث: بنيةُ @تمثيل_سي في
توقيع «دالة خارجية» تُمرَّر/تُرجَع بالقيمة ضمنًا (قرار المالك)، بتصنيف ABI
مطابقٍ لـClang لهدفَي System V AMD64 و Windows x64.

التنفيذ (٨ ملفّات):
- SIRFunction.isExtern + returnClassName ⇐ FunctionDecl.
- مصنِّف ABI classifyCReprAbi: Win64 حجم∈{1,2,4,8}⇒سجلّ iN وإلّا byval؛
  SysV >16⇒byval وإلّا 1-2 ثمانيّات (عشريّة⇒double وإلّا iN)؛ العائد
  ≤حدّ⇒مباشر (RAX[:RDX]) وإلّا sret.
- emitFunctionPrototype: يحسب CReprCallPlan مرّةً (تصاريح-أوّلًا) ويطبّق
  byval/sret على التصريح، ويخزّنه في creprCallPlans.
- موقع النداء (emitCall): يحمّل قطع البنية من ذاكرة الكائن، يخصّص sret،
  يجسّد العائد، ويطبّق byval/sret على النداء.
- إصلاح المحلّل parseExternFunctionDecl: كان يقبل نوع العائد المبنيّ فقط
  لا اسمَ صنفٍ مُعرَّف ⇒ أُضيف إرشاد الرمزين المتتاليين.

البرهان: IR مطابقٌ لـClang للهدفين؛ ربطٌ وتشغيلٌ حيٌّ Win64 (ص تنادي دوالّ
C تمرّر/تُرجِع Small 8ب + Point 16ب بالقيمة) ⇒ 107/42/42/42. انحدار صفريّ
(rules_matrix 2459/2460، الفشل الوحيد b2_recursion_accumulator سابق).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

📚 تذكير مزامنة دليل المطوّرين

هذا الـPR يلمس مصادر موثَّقة في دليل المطوّرين. راجع الفصول الآتية وحدّثها إن تغيّر سلوكها، ثم ثبّت البصمات هناك (python scripts/check_sync.py --update):

بندٌ في معيار الإنجاز. تذكيرٌ آليّ — لا يحجب الدمج.

@SalehKadah
SalehKadah merged commit 47d0c81 into dev Jul 25, 2026
24 of 26 checks passed
@SalehKadah
SalehKadah deleted the feat/ffi-crepr-f2c branch July 25, 2026 12:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant