Commit Graph
8 Commits
Author SHA1 Message Date
TermiNexus 601db9e265 fix(gen): from-import 模块名截断后再查 SHA1(非 NUL 结尾退化裸名)
undefined symbol: _op_head 根因:lookup_from_import 返回指向 from_imports
内部的指针(非 NUL 结尾,后随空格分隔的其他条目,如 "ast.tokens
TokenType:ast.tokens ...")。ExprGenName 的 from-import 全局查找直接用
该值 LookupSha1ByModName → 整串查不到 → _mangle_name_with_sha1(None)
退化裸名 → 引用 @_op_head 而非 @<tokens_sha1>._op_head → 链接 undefined
(tokens 定义端已带 SHA1 前缀)。ExprGenAttr 别名解析同病。

修复:ExprGenName 新增 _cut_from_import_mod(截断到空格/冒号/NUL),
两处 from-import 分支截断后再查 SHA1;ExprGenAttr 别名解析内联截断。
对齐 CallGenBase._lookup_sha1_from_modname_raw / ExprGenCdef 既有截断逻辑。
2026-08-20 05:01:21 +08:00
TermiNexus 99df2aef99 fix(gen): 全局变量引用加引号(SHA1 前缀名以数字开头)
llc "expected instruction opcode" 根因:模块级全局带 SHA1 前缀后名以
数字开头("sha1.name"),LLVM 无引号标识符不能以数字开头。stub/text
打印端早已按 _ll_name_needs_quote 加引号,但引用端(make_global_ref /
_find_pool_var 兜底 / 定义端 ref_name)一律 @%s 无引号 → 组合 IR 指令里
store i32 0, i32* @748d0424e8976fa0._pass_count 解析失败。

修复三处引用生成按 _vtable_name_needs_quote(数字开头或含 .)加引号,
对齐函数引用路径(ExprGenName/FuncGenMixin 的 needs_quote 判断)。
组合 IR 去重(_HasGlobalInBuf 等)按打印格式名匹配,带引号一致无需改。
2026-08-20 04:42:20 +08:00
TermiNexus 252d15ba9f fix(gen): 模块属性访问支持别名解析(import X as Y → Y._attr)
直接写 GenGenerator._g_gen = gen(别名模块属性)此前不可用:
_resolve_module_attribute_global 未解析别名,_lookup_module_sha1
("GenGenerator") 查不到(Sha1Store 用原始模块名)→ 退化裸名 →
全局带 SHA1 前缀后 undefined symbol。

修复:查目标模块 SHA1 前经 from_imports 解析别名(lookup_from_import
返回原始模块名 lib.core.Gen.Generator)。别名属性写与 setter 调用等价
(写同一 @<模块sha1>._g_gen),且更高效(无函数调用/链接依赖)。
2026-08-20 04:37:50 +08:00
TermiNexus 5f7a87341a fix(gen): 模块级全局变量命名带 SHA1 前缀,消除 ld.lld duplicate symbol
多个模块声明同名模块级全局(如 _mbuddy)时全部生成裸名强定义(zeroinit)
→ 链接时 ld.lld duplicate symbol: _mbuddy(大量 warning)。函数名早已
mangled,全局变量漏做。

修复(对齐函数名 _mangle_name,SymTab key 保持裸名查找逻辑零改动):
1. 定义端 TranslatorGenMixin:全局名 = {模块sha1}.{变量名}
2. 模块属性访问 ExprGenAttr:按目标模块 SHA1 前缀精确查找/创建(含嵌套
   模块 w32.xxx 与 t 类型对象裸名 linkonce_odr 特例),引用用完整名
3. from-import 全局 ExprGenName:带源模块 SHA1 前缀查找,引用用完整名
4. _find_pool_var 兜底:linkonce_odr + zeroinitializer 定义(每模块独立,
   不再依赖裸名链接合并共享;运行时未初始化则真实崩溃暴露,不掩盖)
2026-08-20 04:31:39 +08:00
TermiNexus e8a3fd0a65 fix(attr): ALL_CAPS 非 CDefine 回退跨模块全局变量
Phase1.PYI_BUF_SIZE: t.CSizeT = 262144 是 i64 模块级全局而非 CDefine 宏,
语义同 C 的 extern size_t PYI_BUF_SIZE。原 ALL_CAPS 属性路径在 CDefine
查找失败后直接 fail-fast,从不尝试跨模块全局。修复:
- ExprGenAttr 模块限定路径:CDefine 失败时先查 find_global_in_module,
  命中则按跨模块全局引用加载,仅全局也不存在时才 fail-fast;
- ExprGenName 裸名路径:from-import 确认后同样回退跨模块全局加载
  (覆盖 from Phase1 import PYI_BUF_SIZE 形式)。
2026-08-19 05:41:21 +08:00
TermiNexus 6d627d67cf fix(gen): fatal_error 后补 return 样板,修复属性访问/写入掉出末尾
translate_attribute 与 get_attribute_ptr 的 match 末 arm(case _)调
fatal_error 后无 return None → 块未 terminated → 该 arm 被 match 收尾
误判掉出 → br end_bb → merge 可达 → 方法收尾 fail-fast '流程掉出末尾'
(返回类型 Value*)。补显式 return None(块设计约定:fatal_error 后也
必须保证块 terminated)。
2026-08-19 04:58:12 +08:00
TermiNexus 2cb974ae5a refactor(handles): HandlesExprCall 拆 6 组(Base/Deref/Ctor/Call/Table/Handle,2041→241 行)
直接移动+改调用方:~100 个委托函数按功能移至 6 个子模块,主文件
保留 _g_gen/set_global_gen/顶层常量/4 个类(AsmOperand、FuncEntry、
FuncDefaultsEntry、ExprCallHandle——CallGenLeafKit/HandlesTranslator
仍以 HandlesExprCall.类名 引用)。
- 子模块函数体内 _g_gen/常量/类裸引用 → HandlesExprCall.xxx 跨模块访问
- 28 个调用方 HandlesExprCall.func( → 子模块前缀并补 import
- 全 App 语法/引用/import 验证通过
2026-08-17 08:10:55 +08:00
TermiNexus 54fa8b46c8 refactor(gen): ExprGenMixin 拆 8 组(Base/Const/Fstr/Ops/Cdef/Name/Attr/Cls,6203→129 行)
- ExprGenMixin 保留 translate_value,其余 74 方法按功能拆至 8 个子 Mixin
- 子 Mixin 均 1 级继承 ExprGenBase(TPV self 调用仅支持 1 级父类)
- 跨 Mixin 调用转 HandlesExpr 模块级委托(_g_gen 单例 cast)
- HandlesExpr 补 15 个委托:f-string 组 7 个、docstring 组 4 个、
  Cdef/Attr 各 1 个、Ops 组 translate_binop/_binop_to_dunder/_unaryop_to_dunder
- Generator 继承链加入 8 个 ExprGen 子 Mixin
- 全部 Gen/ 文件均 ≤1500 行,500~1500 行/文件架构重构完成
2026-08-17 07:32:56 +08:00