chore(tpc): 移除属性链/调用分派错误路径的临时诊断打点
- HandlesBase: 删除 _AttrFailDiag 现场诊断(含模块别名链逐跳 dump),恢复精简错误信息 - HandlesExprAttr: 删除 [CHAIN-DBG] stderr 打点与 [attr-diag]/[attr-diag-nested] KeyError 包装 - HandlesExprCall: 删除 Unknown module 异常的 _rc_note 诊断后缀
This commit is contained in:
1 parent
ed3355202a
commit
355811d64e
3 files changed
+6
-155
No files matched your search
@@ -585,86 +585,9 @@ class BaseHandle:
|
||||
msg: str = (f"{What}表达式 '{expr_text}' 编译期求值为空(属性访问未能解析出"
|
||||
f"目标类型/成员),赋值将被跳过、变量保持未初始化。位置 {loc}"
|
||||
f"{(',源码: ' + code_line) if code_line else ''}")
|
||||
# 现场诊断:dump 最内层基变量在各类注册表/存储中的状态,定位属性解析
|
||||
# 在哪一级断裂(var_struct_class 缺失 / struct 键形态不匹配 / 存储退化)。
|
||||
diag: str = self._AttrFailDiag(Node, Gen)
|
||||
if diag:
|
||||
msg += f"\n[ATTR-DIAG]{diag}"
|
||||
_vlog().compile_error(msg, src_file, lineno, code_line)
|
||||
sys.exit(1)
|
||||
|
||||
@staticmethod
|
||||
def _AttrFailDiag(Node: ast.AST, Gen: Any) -> str:
|
||||
"""提取属性链失败现场:最内层 Name 变量的类登记与存储状态"""
|
||||
try:
|
||||
inner: ast.AST = Node
|
||||
while isinstance(inner, ast.Attribute):
|
||||
inner = inner.value
|
||||
if not isinstance(inner, ast.Name):
|
||||
return ''
|
||||
var: str = inner.id
|
||||
seg: list[str] = []
|
||||
seg.append(f"var={var}")
|
||||
vsc: Any = getattr(Gen, 'var_struct_class', {}) or {}
|
||||
gsc: Any = getattr(Gen, 'global_struct_class', {}) or {}
|
||||
seg.append(f"var_struct_class[{var}]={vsc.get(var)!r}")
|
||||
seg.append(f"global_struct_class[{var}]={gsc.get(var)!r}")
|
||||
def _ty_str(ptr: Any) -> str:
|
||||
try:
|
||||
if ptr is None:
|
||||
return 'None'
|
||||
return str(ptr.type)
|
||||
except Exception:
|
||||
return '?'
|
||||
for _tab_name, _tab in (('variables', getattr(Gen, 'variables', {}) or {}),
|
||||
('_reg_values', getattr(Gen, '_reg_values', {}) or {}),
|
||||
('_direct_values', getattr(Gen, '_direct_values', {}) or {}),
|
||||
('global_vars', getattr(Gen, 'global_vars', {}) or {})):
|
||||
if var in _tab:
|
||||
seg.append(f"{_tab_name}[{var}]={_ty_str(_tab[var])}")
|
||||
# 最内层类名 → 是否在 class_member_element_class 登记字段
|
||||
cn: Any = vsc.get(var) or gsc.get(var)
|
||||
cmap: Any = getattr(Gen, 'class_member_element_class', {}) or {}
|
||||
import re as _re
|
||||
def _short(k: str) -> str:
|
||||
return _re.sub(r'^[0-9a-fA-F]{16}\.', '', k)
|
||||
if cn:
|
||||
hit: list[str] = []
|
||||
for key, sub in cmap.items():
|
||||
if _short(key) == _short(cn):
|
||||
hit.append(f"{key}:{sub}")
|
||||
seg.append(f"elem_class_map_hits={hit or 'NONE'}")
|
||||
# Gen.structs 中含 cn 短名的键(供键形态比对)
|
||||
if cn:
|
||||
struct_keys: list[str] = [k for k in (getattr(Gen, 'structs', {}) or {})
|
||||
if _short(k) == _short(cn)]
|
||||
seg.append(f"structs_keys={struct_keys or 'NONE'}")
|
||||
# 模块别名链(Mod.Var.Field,如 CompilerFactory.factory.PermPool):
|
||||
# 最内层 Name 是**模块名**,上面的登记 dump(var_struct_class 等)对它
|
||||
# 恒为 None、无法定位断点。补逐跳诊断:Mod 的 sha1、`Mod.Var` 在全局量表
|
||||
# 里的候选键命中与类型,直接指出断在哪一跳。
|
||||
_chain: list[str] = []
|
||||
_cur: ast.AST = Node
|
||||
while isinstance(_cur, ast.Attribute):
|
||||
_chain.append(_cur.attr)
|
||||
_cur = _cur.value
|
||||
_chain.reverse()
|
||||
if _chain:
|
||||
_sha1_map2: Any = getattr(Gen, 'ModuleSha1Map', {}) or {}
|
||||
_gmap: Any = getattr(getattr(Gen, 'module', None), 'globals', {}) or {}
|
||||
_mod_sha: Any = _sha1_map2.get(var)
|
||||
seg.append(f"chain={var}.{'.'.join(_chain)} ModuleSha1Map[{var}]={_mod_sha!r}")
|
||||
_hop: str = _chain[0]
|
||||
_keys: list[str] = [f"{var}.{_hop}", _hop]
|
||||
if _mod_sha:
|
||||
_keys.append(f"{_mod_sha}.{_hop}")
|
||||
for _k in _keys:
|
||||
if _k in _gmap:
|
||||
seg.append(f"globals[{_k}]={_ty_str(_gmap[_k])}")
|
||||
return '\n'.join(seg)
|
||||
except Exception:
|
||||
return ''
|
||||
|
||||
def HandleBodyLlvm(self, Body: ast.AST | list[ast.stmt]) -> Any:
|
||||
return self.Trans.BodyHandler.HandleBodyLlvm(Body)
|
||||
|
||||
|
||||
Reference in new issue
Block a user