Files
TransPyC/lib
TermiNexus 66de269ebf fix(tpc): 撤回失效的"事后修复",改为 set_body 前拦截降级布局(不冻结)
a 编译器缺陷。实测证据(07ea8e2f 的探针回执):对本版本 llvmlite,
`st._elements = None` 之后 `st.set_body(*elems)` 仍以
`RuntimeError: <name> is already defined` 拒绝 —— 说明 **`_elements` 不是 set_body 的
判定存储**,即"清 _elements 以便重载/重设 body"这一全仓惯用手段在本版本是**空操作**
(结构体 body 一经设定即不可改)。因此:

  - 撤回 7fb0e498 加的 `_SyncStructBodyTypes`(使用点就地修复)及其在
    `_get_member_offset` 的调用 —— 它在本版本永不可能成功,只会把编译卡死;
  - 改为**事前拦截**:`_generate_structs` 在 `set_body` 前调用
    `_HasDegradedMemberTypes`,若本次布局里存在「注解是类引用(`Mod.Class` /
    首字母大写裸名,排除 t/c 模块)**却**解析成 `i8**`」的成员,说明该 pass 类型尚未
    就绪 ⇒ **不设 body、保持 opaque**,等类型就绪的 pass 再设。这样从根上避免
    "降级布局被永久冻结"(现场:Generator 的槽 i8** 而声明 %"…ExprGenFstr"*,
    赋值时报「层数不同」)。始终不就绪则在使用点响亮失败(opaqueness / 层数不同),
    不再静默产出错布局。
  - 新增 `_IsI8DoublePtr` / `_IsClassRefPtrAnnotation` 两个判据助手(保守:只在
    "指针包装 + 类引用内层 + i8 系两层指针"三条同时成立时判降级)。
2026-09-29 11:56:08 +08:00
..