Skip to content

مترجم: معالجة الأخطاء المسترجَعة في المسار المترجَم (الحاجز ٧ للاستضافة الذاتيّة)#275

Merged
SalehKadah merged 2 commits into
devfrom
fix/compiled-recoverable-errors
Jul 25, 2026
Merged

مترجم: معالجة الأخطاء المسترجَعة في المسار المترجَم (الحاجز ٧ للاستضافة الذاتيّة)#275
SalehKadah merged 2 commits into
devfrom
fix/compiled-recoverable-errors

Conversation

@SalehKadah

Copy link
Copy Markdown
Collaborator

السياق

يعالج الحاجز ٧ للاستضافة الذاتيّة (RFC sadlang/rfcs#52): معالجة الأخطاء المسترجَعة كانت مكسورة في المسار المترجَم (المفسّر سليم). شرطٌ لتراكم تشخيصات مترجمٍ مكتوبٍ بـ ص. النطاق: المترجم compiler/. مستقلّ عن رزمة ADT.

ما كان مكسورًا (تشخيص تجريبيّ)

  • رمي/التقاط قيمة غير نصّيّة يُحطّم المترجَم (SIGSEGV).
  • نوع() على الخطأ الملتقَط يعيد نص خطأً.
  • هلع زمن التشغيل (قسمة/صفر) يهرب من حاول.

الإصلاح (٧ ملفّات + إيداع تصحيح)

  • ① القيمة غير النصّيّة: تمييز نوع LLVM في exception_ops.cpp — المؤشّرات (نصّ/كائن) ⇒ __sad_exception_msg؛ العدديّ ⇒ i64 في __sad_exception_value جديد.
  • نوع() صحيح: استنتاج نوع المرميّ عبر مكدّس tryThrownStack_ (يحترم التداخل) ⇒ ربط متغيّر «امسك» بنوعه الساكن.
  • ③ التقاط هلع القسمة/صفر: emitRecoverablePanicToHandler (setjmp/longjmp) + مُميِّز __sad_try_active يتفادى القفز لمعالِج تنظيف الدالّة.
  • إصلاح حاجب (مراجعة أميليا): تسريب __sad_try_active عند ارجع/توقف/استمر من داخل حاول (كان يقفز لإطار ميّت ⇒ 0xC0000005) — حُسم باقتران العدّاد بدورة حياة «حاول» اللفظيّة عبر currentTryDepth_.

التحقّق (تطابق مترجم↔مفسّر، مُراجَع بأميليا جولتان)

رمي كائن(الهدف)/رقم/نص/عشري/منطقي + التقاط + نوع() + الحقول + استئناف · تداخل · أخيراً · قسمة/صفر (مباشرة+عبر دالّة+بعد عودة/توقف من try) — كلّها مطابقة بلا SIGSEGV. صفر انحدار: try 19 · throw 7 · أخطاء 25 · for 95 · while 94 · return 12 · break 8 · continue 8 (١٠٠٪ تكافؤ مزدوج). مكسب جانبيّ: توقف/استمر داخل try صارا صحيحين.

دَين موثَّق (تباعد لا انهيار — خارج النطاق)

  • رمي مختلط الأنواع في «حاول» واحدة، أو رمي مصفوفة/خريطة/لاشيء: نوع() قد يعيد نص والقيمة العدديّة قد تُفقَد ((null)) — لا انهيار. الحلّ الجذريّ: تمثيل مرميّ ديناميّ %SadDyn.
  • حدّ المصفوفة داخل حاول: يطبع ويخرج (لا يُلتقَط بعد) — نفس نمط emitRecoverablePanicToHandler.
  • الاستثناء غير الملتقَط (ارمي بلا حاول): ينهار 139 بدل خروج 1 — عيب بنيويّ سابق مستقلّ.

🤖 Generated with Claude Code

SalehKadah and others added 2 commits July 24, 2026 22:40
…لتقاط قيمة غير نصّيّة + نوع() + التقاط هلع القسمة)

يسدّ ثلاث فجوات في `sad-build` كشفها مسبار الاستضافة الذاتيّة، مطابقًا للمفسّر:

١) رمي/التقاط قيمة غير نصّيّة بلا انهيار (الأهمّ):
   كان `ارمي 404` / `ارمي كائن` يخزّن i64/مؤشّرًا مباشرةً في مؤشّر الرسالة
   العامّ ⇒ IR غير سليم ⇒ SIGSEGV في المترجَم. الآن يميّز حاجزُ `__sad_raise`
   الخلفيّ نوعَ LLVM: المؤشّرات (نصّ/كائن) ⇒ `__sad_exception_msg`، والقيم
   العدديّة (رقم/منطقيّ/عشريّ) ⇒ بتّات i64 في `__sad_exception_value` الجديد.
   تُمرَّر القيمة من الواجهة بنوع SIR الصحيح (ثابت أو سجلّ).

٢) `نوع()` على الخطأ الملتقَط يعيد النوع الصحيح لا «نص»:
   يُستنتَج نوعُ المرميّ من جسم «حاول» (مكدّس ذاتيّ لكلّ «حاول»، يحترم التداخل)
   فيُربَط متغيّرُ «امسك» بنوعه الساكن: كائن(Struct+اسم الصنف ⇒ وصول الحقل) /
   رقم / عشري / منطقي / نص. يُضاف `__sad_get_exception_value[f]`.

٣) التقاط هلع القسمة على صفر داخل «حاول» (الحاجز الأصعب):
   حارسا القسمة الساكن والديناميّ يرفعان استثناءً قابلًا للالتقاط عبر آليّة
   setjmp/longjmp عند وجود «حاول» فعليّة. مُميِّزٌ ذاتيّ `__sad_try_active`
   يفصل معالِجَ try/catch عن معالِج تنظيف الدالّة (المدفوع لكلّ دالّة) فلا
   تنهار قسمةٌ خارج «حاول» (تبقى: تشخيص + خروج ١).

مُبرهَن حيًّا (sad-build + تنفيذ = sad-run): رقم/نص/كائن(الهدف)/عشري/منطقي/
أخيراً/متداخل/قسمة(مباشرة+عبر دالّة) كلّها متطابقة؛ صفر انحدار في طوابير
throw(٧)/try(١٩)/معالجة_الأخطاء(٢٥).

ديون موثَّقة (خارج النطاق): التقاط تجاوز حدّ المصفوفة (لم يُوصَل إلا حارسا
القسمة)؛ الاستثناء غير الملتقَط (`ارمي` بلا «حاول») يتعطّل — عيب بنيويّ سابق
في معالِج تنظيف الدالّة، مستقلّ عن هذا التغيير.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… المحلّيّ من «حاول» (انهيار)

حاجب إلزاميّ (انحدار SIGSEGV كشفته أميليا): العدّاد المميِّز __sad_try_active
(الحاجز ٧) كان يُزاد عند دخول جسم «حاول» ويُنقَص فقط على مسارَي النجاح
والاستثناء — أمّا الخروج غير المحلّيّ (ارجع/توقف/استمر) فيقفز لتنظيف الدالّة
متخطّيًا الإنقاص، فيبقى العدّاد > 0 بعد موت الإطار؛ أوّلُ حارس قسمة/صفر لاحق
يقفز longjmp لـjmpbuf ميّت ⇒ 0xC0000005.

الإصلاح (اقتران بدورة حياة «حاول» اللفظيّة، لا يمسّ رمي/التقاط القيم):
- عدّاد توليد `currentTryDepth_`: يُزاد ببناء جسم «حاول» ويُنقَص بعده.
- `ارجع` يبعث __sad_try_exit بعدد كلّ «حاول» مُحيطة (currentTryDepth_).
- `توقف/استمر` يبعثان __sad_try_exit للفارق (currentTryDepth_ − عمق الحلقة)،
  عبر LoopContext.tryDepthAtEntry المضبوط في enterLoop.
__sad_try_active يقرأه حاجزُ القسمة وحده، فلا أثر على النقطتين ١+٢.

مُبرهَن حيًّا (sad-build + تنفيذ):
- الحاجب: عودة/توقف/استمر من «حاول» ثمّ قسمة/صفر ⇒ خروج ١ (لا انهيار)،
  مطابقٌ لسلوك المفسّر للقسمة غير الملتقَطة.
- سلامة العدّاد: عودة/توقف من «حاول» ثمّ قسمة/صفر داخل «حاول» لاحقة ⇒ تُلتقَط
  وتُستأنَف (er2/br2 مطابقان) — دليلٌ أنّ العدّاد لا يعلَق عاليًا ولا منخفضًا.
- صفر انحدار: throw 7، try 19، for 95، while 94، return 12، break 8،
  continue 8، معالجة_الأخطاء 25 — كلّها مطابقة.

دَين موثَّق صراحةً (النقطتان #٢/#٣ من مراجعة أميليا؛ تباعدٌ لا انهيار):
الاستنتاج الساكن لنوع المرميّ لا يغطّي كلّ الأنواع، فحين يكون النوع مختلطًا
(نوعان مشروطان في «حاول» واحدة) أو مصفوفةً/خريطةً/لاشيء يتراجع ربطُ «امسك» إلى
«نص»: نوع(الخطأ)=«نص» خطأً وقد تُفقَد القيمة العدديّة («(null)»). مثبَت لا
يتعطّل (مختلط ⇒ نص/(null)؛ مصفوفة ⇒ نص؛ لاشيء ⇒ نص) بخلاف المفسّر (رقم/404،
مصفوفة، عدم). الحلّ الجذريّ: تمثيل المرميّ ديناميكيًّا (%SadDyn) حين لا يُغطّى
النوعُ سكونيًّا — مؤجَّل كبند مستقلّ.

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 67955a4 into dev Jul 25, 2026
26 checks passed
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