From 60afcf1168803a9c227a4aa66611f79546c0e783 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sun, 23 Aug 2026 13:39:20 +0800 Subject: [PATCH] =?UTF-8?q?diagnose(tpv):=20Phase=20A=20=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E6=8E=A2=E9=92=88=E5=88=AB=E5=90=8D=E8=A7=A3=E6=9E=90=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20+=20ClassGenDef/MatchGenMixin=20=E5=B4=A9=E6=BA=83?= =?UTF-8?q?=E5=AE=9A=E4=BD=8D=E8=AF=8A=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Phase2 PhaseA-DBG 探针:精确匹配失败后后缀匹配(别名=基名如 GenTypes→lib.core.Gen.GenTypes),t/c 内置模块跳过,改名别名标'未解析'而非'缺失',消息头改'依赖探测明细' - ClassGenDef 两个 _deps_pending 置位点加 [PHASEADBG] 打印(父类未注册 class/parent、字段注解未解析 class/field/annot_kind) - MatchGenMixin _handle_renum_match 加 [MATCHDBG] 打印(renum 元信息 + 第一/二遍 case 列表快照对比,定位 REnum match 崩溃的列表破坏点) --- App/lib/Phase/Phase2/__init__.vp | 29 +++++++++++++++++++++-------- App/lib/core/Gen/ClassGenDef.vp | 8 ++++++++ App/lib/core/Gen/MatchGenMixin.vp | 21 +++++++++++++++++++++ 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/App/lib/Phase/Phase2/__init__.vp b/App/lib/Phase/Phase2/__init__.vp index bdb084b..8529b54 100644 --- a/App/lib/Phase/Phase2/__init__.vp +++ b/App/lib/Phase/Phase2/__init__.vp @@ -735,34 +735,47 @@ def RunMultiFileProject(mb: memhub.MemBuddy | t.CPtr, continue string.strncpy(im_dp_buf, tr_a._imported_modules + im_dp_start, im_dp_mod_len) im_dp_buf[im_dp_mod_len] = '\0' + # 别名/基名解析:精确匹配 → 后缀匹配(import X as Y 且 Y==X 基名时命中, + # 如 GenTypes → lib.core.Gen.GenTypes;改名别名如 HT→HandlesTranslator 不命中) im_dp_sha1: str = StubMergerStore.LookupSha1ByModName(im_dp_buf) - im_dp_missing: int = 1 + if im_dp_sha1 is None: + im_dp_sha1 = StubMergerStore.LookupSha1ByModNameSuffix(im_dp_buf) + im_dp_resolved: int = 0 + im_dp_missing: int = 0 if im_dp_sha1 is not None: + im_dp_resolved = 1 im_dp_txt: str = StubMergerCollect._sliced_path( temp_dir, td_len_pa, im_dp_sha1, "text.ll") if im_dp_txt is not None: im_dp_f: fileio.File | t.CPtr = fileio.File(im_dp_txt, fileio.MODE.R) - if not im_dp_f.closed: + if im_dp_f.closed: + im_dp_missing = 1 + else: im_dp_f.close() - im_dp_missing = 0 stdlib.free(im_dp_txt) - if im_dp_missing != 0: + else: + im_dp_missing = 1 + else: + # 内置模块(t/c)不生成 text.ll,解析不到不算缺失 + if string.strcmp(im_dp_buf, "t") == 0 or string.strcmp(im_dp_buf, "c") == 0: + im_dp_resolved = 2 + if im_dp_missing != 0 or im_dp_resolved == 0: if md_cnt > 0 and string.strlen(miss_dp) < 700: string.strcat(miss_dp, ", ") if string.strlen(miss_dp) < 700: - if im_dp_sha1 is not None: + if im_dp_missing != 0: viperlib.snprintf(miss_dp + string.strlen(miss_dp), 768 - string.strlen(miss_dp), - "%s(%s)", im_dp_buf, im_dp_sha1) + "%s(%s)缺text.ll", im_dp_buf, im_dp_sha1) else: viperlib.snprintf(miss_dp + string.strlen(miss_dp), 768 - string.strlen(miss_dp), - "%s(sha1?)", im_dp_buf) + "%s(未解析-改名别名?)", im_dp_buf) md_cnt += 1 stdlib.free(im_dp_buf) if md_cnt > 0: viperlib.snprintf(fb_dp, 1024, - "Phase A 依赖未就绪,下遍重试: %s | 缺失 text.ll 的直接依赖: %s", + "Phase A 依赖未就绪,下遍重试: %s | 依赖探测明细: %s", ent.Path, miss_dp) else: viperlib.snprintf(fb_dp, 1024, diff --git a/App/lib/core/Gen/ClassGenDef.vp b/App/lib/core/Gen/ClassGenDef.vp index 680a9bc..1b472a2 100644 --- a/App/lib/core/Gen/ClassGenDef.vp +++ b/App/lib/core/Gen/ClassGenDef.vp @@ -228,6 +228,8 @@ class ClassGenDef(ClassGenBase.ClassGenBase): # L422-426 / FuncGenMixin L482-483),不致命,本遍文件不写盘。 if trans is not None: trans._deps_pending = 1 + # [PHASEADBG] 临时诊断:父类未注册即 pending 的根因(用后移除) + stdio.printf("[PHASEADBG] 父类未注册: class=%s parent=%s\n", class_name, pname) return 0 pfc: int = parent_entry.FieldCount for pfi in range(pfc): @@ -362,6 +364,12 @@ class ClassGenDef(ClassGenBase.ClassGenBase): # 翻译: ,请检查依赖模块是否已编译/注册"),不静默掩盖。 if trans is not None: trans._deps_pending = 1 + # [PHASEADBG] 临时诊断:字段注解类型未解析即 pending 的根因(用后移除) + dbg_ak: t.CInt = -1 + if aa.annotation is not None: + dbg_ak = aa.annotation.kind() + stdio.printf("[PHASEADBG] 字段类型未解析: class=%s field=%s annot_kind=%d\n", + class_name, tgt.id, dbg_ak) return 0 # 旧行为:fast-fail NameError(已移除——Phase A 依赖未就绪时 # 误报真实错误,中断多遍收敛;真实错误交给收敛检查兜底) diff --git a/App/lib/core/Gen/MatchGenMixin.vp b/App/lib/core/Gen/MatchGenMixin.vp index df96740..58d0ff4 100644 --- a/App/lib/core/Gen/MatchGenMixin.vp +++ b/App/lib/core/Gen/MatchGenMixin.vp @@ -5,6 +5,7 @@ from stdint import * import ast import llvmlite import memhub +import stdio import string import viperlib import lib.core.Handles.HandlesTranslator as HT @@ -364,6 +365,11 @@ class MatchGenMixin: self.Gen.TypeGenErr.fatal_error(node, "match cases 缺失", "TypeError") case_count: t.CSizeT = len(cases_list) + # [MATCHDBG] 临时诊断:match 元信息(对比崩溃对应文件/语句;用后移除) + stdio.printf("[MATCHDBG] renum_match node=%llx renum=%s subject=%llx cases=%llx count=%zu\n", + t.CUInt64T(node), renum_name, t.CUInt64T(subject_ptr), + t.CUInt64T(cases_list), case_count) + # BB 指针数组、case 值指针数组、default 标记数组、nobreak 标记数组 bb_arr: t.CSizeT | t.CPtr = pool.alloc(8 * MAX_MATCH_CASES) cv_arr: t.CSizeT | t.CPtr = pool.alloc(8 * MAX_MATCH_CASES) @@ -448,6 +454,17 @@ class MatchGenMixin: body_list: list[ast.AST | t.CPtr] | t.CPtr = mc.children nb: int = self._has_no_break(body_list) + # [MATCHDBG] 临时诊断:第一遍记录 case 快照(对比第二遍,定位列表破坏点;用后移除) + dbg_bl_len: t.CInt = -1 + dbg_first0: t.CSizeT = 0 + if body_list is not None: + dbg_bl_len = t.CInt(len(body_list)) + if dbg_bl_len > 0: + dbg_first0 = t.CUInt64T(body_list.get(0)) + stdio.printf("[MATCHDBG] pass1 i=%d mc=%llx pat=%llx children=%llx len=%d data0=%llx\n", + i, t.CUInt64T(mc), t.CUInt64T(pat), + t.CUInt64T(body_list), dbg_bl_len, dbg_first0) + # 存入数组 if collected < MAX_MATCH_CASES: bb_arr[collected] = t.CSizeT(bb) @@ -524,6 +541,10 @@ class MatchGenMixin: bi: int = 0 while bi < bc: stmt: ast.AST | t.CPtr = body_list.get(bi) + # [MATCHDBG] 临时诊断:第二遍逐条打印(对比 pass1 快照;用后移除) + stdio.printf("[MATCHDBG] pass2 i=%d bi=%d bc=%zu mc=%llx children=%llx stmt=%llx\n", + i, bi, bc, t.CUInt64T(mc), + t.CUInt64T(body_list), t.CUInt64T(stmt)) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) bi = bi + 1