refactor(gen): P5 对象化迁移完成 - FuncGenMixin/ClassGenMixin 全量迁移+委托层; 泛型模板表迁入 gen 字段; stub 方法 ParamCount 不含 self(修复跨模块方法调用默认参数填充错位); 默认参数快照失败 fail-fast(防悬空 AST UAF); HandlesMatch 改委托 gen._lookup_renum_variant
This commit is contained in:
1 parent
0e4f00baf4
commit
ba3f22702e
10 files changed
+5319
-4410
No files matched your search
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -2483,18 +2483,18 @@ 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:
|
||||
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
|
||||
@@ -3608,18 +3608,18 @@ 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:
|
||||
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
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -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
|
||||
|
||||
|
||||
# ============================================================
|
||||
|
||||
+323
-3338
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -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
@@ -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()
|
||||
|
||||
Reference in new issue
Block a user