مترجم: معالجة الأخطاء المسترجَعة في المسار المترجَم (الحاجز ٧ للاستضافة الذاتيّة)#275
Merged
Merged
Conversation
…لتقاط قيمة غير نصّيّة + نوع() + التقاط هلع القسمة) يسدّ ثلاث فجوات في `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>
|
📚 تذكير مزامنة دليل المطوّرين هذا الـ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.
السياق
يعالج الحاجز ٧ للاستضافة الذاتيّة (RFC
sadlang/rfcs#52): معالجة الأخطاء المسترجَعة كانت مكسورة في المسار المترجَم (المفسّر سليم). شرطٌ لتراكم تشخيصات مترجمٍ مكتوبٍ بـ ص. النطاق: المترجمcompiler/. مستقلّ عن رزمة ADT.ما كان مكسورًا (تشخيص تجريبيّ)
نوع()على الخطأ الملتقَط يعيدنصخطأً.حاول.الإصلاح (٧ ملفّات + إيداع تصحيح)
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