refactor(gen): P5 对象化迁移完成 - FuncGenMixin/ClassGenMixin 全量迁移+委托层; 泛型模板表迁入 gen 字段; stub 方法 ParamCount 不含 self(修复跨模块方法调用默认参数填充错位); 默认参数快照失败 fail-fast(防悬空 AST UAF); HandlesMatch 改委托 gen._lookup_renum_variant

This commit is contained in:
TermiNexus committed 2026-08-10 06:24:50 +08:00
1 parent 0e4f00baf4
commit ba3f22702e
10 files changed
+5343 -4434

No files matched your search

+7 -1
View File
@@ -1130,10 +1130,16 @@ def _inject_method_declare(pool: memhub.MemBuddy | t.CPtr,
llvmlite.add_param(pool, func, param_ty, pname)
# 注册到函数表(用裸名 ClassName.method,与调用方 lookup_name 一致)
# ParamCount 不含 self(方法首参 self/cls 不计入,与 _translate_method 的
# md_param_count = args.__len__() - 1 保持一致)——默认参数填充按非 self
# 参数计数,若含 self 会导致 mdf_param_count 虚高、填充逻辑错位/越界。
if funcs_ptr is not None:
cur_count: int = trans._func_count
param_count_no_self: int = param_count
if param_count_no_self > 0:
param_count_no_self -= 1
if HandlesExprCall.add_func_to_table(funcs_ptr, cur_count, lookup_name, func, max_funcs,
None, 0, param_count) == 0:
None, 0, param_count_no_self) == 0:
trans._func_count = cur_count + 1
+6 -2
View File
@@ -17,6 +17,8 @@ import lib.core.Handles.HandlesType as HandlesType
import lib.core.Handles.HandlesExpr as HandlesExpr
import lib.core.Handles.HandlesExprOps as HandlesExprOps
import lib.core.Handles.HandlesExprCall as HandlesExprCall
import lib.core.Handles.HandlesFunctions as HandlesFunctions
import lib.core.Handles.HandlesClassDef as HandlesClassDef
import lib.core.Handles.HandlesImports as HandlesImports
import lib.core.StubMerger as StubMerger
import lib.StubGen.Converter as StubConverter
@@ -145,13 +147,15 @@ def TranslateFileGetTrans(mb: memhub.MemBuddy | t.CPtr, file_path: str,
gen.__before_init__()
gen.__init__(mb)
GenGenerator.set_global_gen(gen)
# P2/P3/P4: 注入 HandlesType/HandlesStruct/HandlesExpr/HandlesExprOps/HandlesExprCall
# 模块级单例(委托函数经本地 _g_gen 访问,避免函数体 import 包模块与类/模块名歧义)
# P2-P5: 注入各 Handles 模块级单例(委托函数经本地 _g_gen 访问,
# 避免函数体 import 包模块与类/模块名歧义)
HandlesType.set_global_gen(gen)
HandlesStruct.set_global_gen(gen)
HandlesExpr.set_global_gen(gen)
HandlesExprOps.set_global_gen(gen)
HandlesExprCall.set_global_gen(gen)
HandlesFunctions.set_global_gen(gen)
HandlesClassDef.set_global_gen(gen)
# 设置当前文件名(供报错使用)
HandlesType.set_current_file(file_path)
# 同步到 HandlesImports(import 时 SHA1 检查报错需要当前文件名,循环依赖无法直接读 HandlesType)
+24 -24
View File
@@ -2483,24 +2483,24 @@ class CallGenMixin:
if mdf_defaults is not None and mdf_default_count > 0 and mdf_pi >= mdf_offset:
mdf_di: int = mdf_pi - mdf_offset
if mdf_di < mdf_default_count:
# 优先用 stdlib 常量快照重建(mdf_gd.Defaults 的 pool 内 AST 可能已被 reset 回收)
# 用 stdlib 常量快照重建(mdf_gd.Defaults 的 pool 内 AST 可能已被 reset 回收,
# 直接回退读 AST 会 use-after-free——快照失败时 fail-fast 暴露,绝不读悬空 AST)
mdf_val: llvmlite.Value | t.CPtr = None
if mdf_gd is not None:
mdf_val = HandlesExprCall._build_const_from_snapshot(
pool, mod, mdf_gd, mdf_di, trans, builder)
if mdf_val is None:
mdf_defaults_list: list[ast.AST | t.CPtr] | t.CPtr = (list[ast.AST | t.CPtr] | t.CPtr)(t.CVoid(t.CUInt64T(mdf_defaults), t.CPtr))
mdf_node: ast.AST | t.CPtr = mdf_defaults_list.get(mdf_di)
if mdf_node is not None:
mdf_val = HandlesExpr.translate_value(
builder, pool, mod, mdf_node, None, 0, trans)
if mdf_val is not None:
llvmlite.value_set_next(mdf_val, None)
llvmlite.value_set_next(tail, mdf_val)
tail = mdf_val
total_count += 1
mdf_pi += 1
HandlesType.fatal_error(
cl,
f"跨模块默认参数无法重建(快照缺失,默认值需为简单常量): {lookup_name}",
"TypeError")
continue
llvmlite.value_set_next(mdf_val, None)
llvmlite.value_set_next(tail, mdf_val)
tail = mdf_val
total_count += 1
mdf_pi += 1
continue
# 无默认值时用零值兜底(需要 found_func 获取参数类型)
if found_func is not None:
param_node_z: llvmlite.Param | t.CPtr = llvmlite.function_get_param_head(found_func)
@@ -3608,24 +3608,24 @@ class CallGenMixin:
if mdf_defaults is not None and mdf_default_count > 0 and mdf_pi >= mdf_offset:
mdf_di: int = mdf_pi - mdf_offset
if mdf_di < mdf_default_count:
# 优先用 stdlib 常量快照重建(mdf_gd.Defaults 的 pool 内 AST 可能已被 reset 回收)
# 用 stdlib 常量快照重建(mdf_gd.Defaults 的 pool 内 AST 可能已被 reset 回收,
# 直接回退读 AST 会 use-after-free——快照失败时 fail-fast 暴露,绝不读悬空 AST)
mdf_val: llvmlite.Value | t.CPtr = None
if mdf_gd is not None:
mdf_val = HandlesExprCall._build_const_from_snapshot(
pool, mod, mdf_gd, mdf_di, trans, builder)
if mdf_val is None:
mdf_defaults_list: list[ast.AST | t.CPtr] | t.CPtr = (list[ast.AST | t.CPtr] | t.CPtr)(t.CVoid(t.CUInt64T(mdf_defaults), t.CPtr))
mdf_node: ast.AST | t.CPtr = mdf_defaults_list.get(mdf_di)
if mdf_node is not None:
mdf_val = HandlesExpr.translate_value(
builder, pool, mod, mdf_node, None, 0, trans)
if mdf_val is not None:
llvmlite.value_set_next(mdf_val, None)
llvmlite.value_set_next(tail, mdf_val)
tail = mdf_val
total_count += 1
mdf_pi += 1
HandlesType.fatal_error(
cl,
f"跨模块默认参数无法重建(快照缺失,默认值需为简单常量): {lookup_name}",
"TypeError")
continue
llvmlite.value_set_next(mdf_val, None)
llvmlite.value_set_next(tail, mdf_val)
tail = mdf_val
total_count += 1
mdf_pi += 1
continue
# 无默认值时用零值兜底(需要 found_func 获取参数类型)
if found_func is not None:
param_node_z: llvmlite.Param | t.CPtr = llvmlite.function_get_param_head(found_func)
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+27 -1
View File
@@ -7,6 +7,8 @@ import lib.core.Gen.TypeGenMixin as TypeGenMixin
import lib.core.Gen.StructGenMixin as StructGenMixin
import lib.core.Gen.ExprGenMixin as ExprGenMixin
import lib.core.Gen.CallGenMixin as CallGenMixin
import lib.core.Gen.FuncGenMixin as FuncGenMixin
import lib.core.Gen.ClassGenMixin as ClassGenMixin
import lib.core.Handles.HandlesVar as HandlesVar
import lib.core.Handles.HandlesExprCall as HandlesExprCall
@@ -26,7 +28,8 @@ import lib.core.Handles.HandlesExprCall as HandlesExprCall
@t.NoVTable
class Generator(BaseGenMixin.BaseGenMixin, TypeGenMixin.TypeGenMixin,
StructGenMixin.StructGenMixin, ExprGenMixin.ExprGenMixin,
CallGenMixin.CallGenMixin):
CallGenMixin.CallGenMixin, FuncGenMixin.FuncGenMixin,
ClassGenMixin.ClassGenMixin):
"""生成器:多继承 Mixin 组合(对象化迁移宿主)"""
def __init__(self, pool: memhub.MemBuddy | t.CPtr):
@@ -86,6 +89,29 @@ class Generator(BaseGenMixin.BaseGenMixin, TypeGenMixin.TypeGenMixin,
self.GlobalFuncCount = 0
self.GlobalDefaults = None
self.GlobalDefaultsCount = 0
# ---- ClassGenMixin 字段 ----
self.MethodMetaKeys = None
self.MethodMetaFlags = None
self.MethodMetaCount = 0
self.RenumClassNames = None
self.RenumClassVariantCounts = None
self.RenumVariantNames = None
self.RenumVariantTags = None
self.RenumClassCount = 0
self.RenumAliasClass = None
self.RenumAliasField = None
self.RenumAliasIndex = None
self.RenumAliasCount = 0
self.SpecKeys = None
self.SpecNames = None
self.SpecCount = 0
self.GenericClassNames = None
self.GenericClassNodes = None
self.GenericClassSha1s = None
self.VtFullNames = None
self.VtMethodNames = None
self.VtParentSha1s = None
self.VtMethodCount = 0
# ============================================================
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+4 -10
View File
@@ -172,20 +172,14 @@ class MatchHandle(HandlesBase.Mixin):
# ============================================================
# _find_renum_class_for_variant - 从变体名反查 REnum 类名
#
# P5-2 后 REnum 变体表迁入 gen 字段(RenumClassNames/RenumClassCount),
# 模块级 _renum_class_* 已失效,统一委托到 gen._lookup_renum_variant。
# ============================================================
def _find_renum_class_for_variant(self, variant_name: str) -> str:
if variant_name is None:
return None
i: int = 0
while i < HandlesClassDef._renum_class_count:
cls_nm: str = HandlesClassDef._renum_class_names[i]
if cls_nm is not None:
tag: int = HandlesClassDef._lookup_renum_variant_in_class(
cls_nm, variant_name)
if tag >= 0:
return cls_nm
i = i + 1
return None
return HandlesClassDef._lookup_renum_variant(variant_name)
# ============================================================
# _has_no_break - 检测 case body 是否含 c.NoBreak() 调用
+5 -2
View File
@@ -18,6 +18,8 @@ import lib.core.Handles.HandlesStruct as HandlesStruct
import lib.core.Handles.HandlesExpr as HandlesExpr
import lib.core.Handles.HandlesExprOps as HandlesExprOps
import lib.core.Handles.HandlesExprCall as HandlesExprCall
import lib.core.Handles.HandlesFunctions as HandlesFunctions
import lib.core.Handles.HandlesClassDef as HandlesClassDef
import lib.core.Handles.HandlesType as HandlesType
import lib.core.BuildPipeline as BuildPipeline
import lib.core.IncludesScanner as IncludesScanner
@@ -89,13 +91,14 @@ def main() -> int:
gen.__before_init__()
gen.__init__(mb)
GenGenerator.set_global_gen(gen)
# P2/P3/P4: 注入 HandlesType/HandlesStruct/HandlesExpr/HandlesExprOps/HandlesExprCall
# 模块级单例(Phase1 阶段即调用其状态函数)
# P2-P5: 注入各 Handles 模块级单例(Phase1 阶段即调用其状态函数)
HandlesType.set_global_gen(gen)
HandlesStruct.set_global_gen(gen)
HandlesExpr.set_global_gen(gen)
HandlesExprOps.set_global_gen(gen)
HandlesExprCall.set_global_gen(gen)
HandlesFunctions.set_global_gen(gen)
HandlesClassDef.set_global_gen(gen)
# 初始化 VLogger 并打印启动日志
log: VLogger.Logger | t.CPtr = VLogger.get_logger()