fix(诊断): _get_node_info 还原自动注入 import 的行偏移;属性写入失败补成员槽来源明细
1) 行号还原(b 机制缺陷,实测可证):Phase2Translator._inject_auto_imports 在源码头 注入 import _list/_dict/json,AST 节点行号整体下移 N (translator._line_offset = N),而 Gen._current_source_lines 是**磁盘**原文。 BaseGen._get_node_info / _DescribeValueNode 此前直接用 AST 行号读源码 ⇒ 同一次 fail-fast 里出现两套互相矛盾的行号:_ErrorStack 帧印磁盘行 1140/1141, _get_node_info 印 1142,并把源码显示成 1142 行的 `return "t.CPtr"` (真实错误行是 1141 的 `...LastBuiltinsTypedefResult = "t.CPtr"`,与被指语句无关)。 新增 BaseGen._DiskLineno,判据与 HandlesBase._FailFastFixedArrayKeyword:687、 HandlesAssign._RaiseGlobalAttrError:2051、LlvmGenerator/HandlesBody 的 _ErrorStack 各站点逐字一致;标签行号(_current_node_info)与源码行一并还原。 2) 成员槽来源明细:HandlesAssign 的「对象.字段 = 值」写入路径(:1182)此前 _StoreWithCoerce 失败时只报隐式转换禁令,不报目标槽来源,报文与被指语句、 偏移对不上。现与 `self.x = ...` 路径(:897-905)同口径补 _DescribeMemberSlot: 附上 class_members 声明侧(项数/base/表内下标/声明槽类型)与布局侧 (struct name/元素数/elements[offset])两侧数据,可直接判定是声明侧退化 还是布局侧退化(本次现场即"表内下标被同名继承项过滤移位"一类)。
This commit is contained in:
1 parent
a18ca4da3b
commit
909d8ff0eb
2 files changed
+54
-5
No files matched your search
@@ -1179,7 +1179,22 @@ class AssignHandle(BaseHandle):
|
||||
if isinstance(member_type, ir.IntType):
|
||||
Value = Gen._apply_bswap_if_big(Value, byte_order, f"bswap_store_{AttrName}")
|
||||
|
||||
self._StoreWithCoerce(Value, MemberPtr)
|
||||
# 成员槽写入失败时补「来源明细」(与 `self.x = ...` 路径 :897-905
|
||||
# 同一套 `_DescribeMemberSlot`):槽类型的两条独立来源
|
||||
# (class_members 声明侧 / struct body 布局侧)不一致时,值会被
|
||||
# 写进类型完全不同的槽(现场:`self.Gen.TypeGenCType.
|
||||
# LastBuiltinsTypedefResult = "t.CPtr"` 落到 i32 槽 → 指针隐式
|
||||
# 转整数 fail-fast);报文里逐项列出两侧数据即可直接判定谁退化
|
||||
# (此处目标形态是 `对象.字段 = 值`,Base 侧同理取 ObjVal 所指布局)。
|
||||
try:
|
||||
self._StoreWithCoerce(Value, MemberPtr)
|
||||
except Exception as _Me:
|
||||
from lib.core.LLVMCG.FuncGen import FailFastError as _FFE
|
||||
if not isinstance(_Me, _FFE):
|
||||
raise
|
||||
raise _FFE(
|
||||
f"{_Me}{self._DescribeMemberSlot(Gen, ClassName, AttrName, offset, ObjVal)}"
|
||||
) from _Me
|
||||
if not ClassName:
|
||||
imported_modules: list[str] | None = getattr(self.Trans, '_ImportedModules', None)
|
||||
resolved_mod: str = self.Trans.SymbolTable.resolve_alias(VarName)
|
||||
|
||||
Reference in new issue
Block a user