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
+5413
-4504
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)
|
llvmlite.add_param(pool, func, param_ty, pname)
|
||||||
|
|
||||||
# 注册到函数表(用裸名 ClassName.method,与调用方 lookup_name 一致)
|
# 注册到函数表(用裸名 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:
|
if funcs_ptr is not None:
|
||||||
cur_count: int = trans._func_count
|
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,
|
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
|
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.HandlesExpr as HandlesExpr
|
||||||
import lib.core.Handles.HandlesExprOps as HandlesExprOps
|
import lib.core.Handles.HandlesExprOps as HandlesExprOps
|
||||||
import lib.core.Handles.HandlesExprCall as HandlesExprCall
|
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.Handles.HandlesImports as HandlesImports
|
||||||
import lib.core.StubMerger as StubMerger
|
import lib.core.StubMerger as StubMerger
|
||||||
import lib.StubGen.Converter as StubConverter
|
import lib.StubGen.Converter as StubConverter
|
||||||
@@ -145,13 +147,15 @@ def TranslateFileGetTrans(mb: memhub.MemBuddy | t.CPtr, file_path: str,
|
|||||||
gen.__before_init__()
|
gen.__before_init__()
|
||||||
gen.__init__(mb)
|
gen.__init__(mb)
|
||||||
GenGenerator.set_global_gen(gen)
|
GenGenerator.set_global_gen(gen)
|
||||||
# P2/P3/P4: 注入 HandlesType/HandlesStruct/HandlesExpr/HandlesExprOps/HandlesExprCall
|
# P2-P5: 注入各 Handles 模块级单例(委托函数经本地 _g_gen 访问,
|
||||||
# 模块级单例(委托函数经本地 _g_gen 访问,避免函数体 import 包模块与类/模块名歧义)
|
# 避免函数体 import 包模块与类/模块名歧义)
|
||||||
HandlesType.set_global_gen(gen)
|
HandlesType.set_global_gen(gen)
|
||||||
HandlesStruct.set_global_gen(gen)
|
HandlesStruct.set_global_gen(gen)
|
||||||
HandlesExpr.set_global_gen(gen)
|
HandlesExpr.set_global_gen(gen)
|
||||||
HandlesExprOps.set_global_gen(gen)
|
HandlesExprOps.set_global_gen(gen)
|
||||||
HandlesExprCall.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)
|
HandlesType.set_current_file(file_path)
|
||||||
# 同步到 HandlesImports(import 时 SHA1 检查报错需要当前文件名,循环依赖无法直接读 HandlesType)
|
# 同步到 HandlesImports(import 时 SHA1 检查报错需要当前文件名,循环依赖无法直接读 HandlesType)
|
||||||
|
|||||||
@@ -2483,24 +2483,24 @@ class CallGenMixin:
|
|||||||
if mdf_defaults is not None and mdf_default_count > 0 and mdf_pi >= mdf_offset:
|
if mdf_defaults is not None and mdf_default_count > 0 and mdf_pi >= mdf_offset:
|
||||||
mdf_di: int = mdf_pi - mdf_offset
|
mdf_di: int = mdf_pi - mdf_offset
|
||||||
if mdf_di < mdf_default_count:
|
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
|
mdf_val: llvmlite.Value | t.CPtr = None
|
||||||
if mdf_gd is not None:
|
if mdf_gd is not None:
|
||||||
mdf_val = HandlesExprCall._build_const_from_snapshot(
|
mdf_val = HandlesExprCall._build_const_from_snapshot(
|
||||||
pool, mod, mdf_gd, mdf_di, trans, builder)
|
pool, mod, mdf_gd, mdf_di, trans, builder)
|
||||||
if mdf_val is None:
|
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))
|
HandlesType.fatal_error(
|
||||||
mdf_node: ast.AST | t.CPtr = mdf_defaults_list.get(mdf_di)
|
cl,
|
||||||
if mdf_node is not None:
|
f"跨模块默认参数无法重建(快照缺失,默认值需为简单常量): {lookup_name}",
|
||||||
mdf_val = HandlesExpr.translate_value(
|
"TypeError")
|
||||||
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
|
|
||||||
continue
|
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 获取参数类型)
|
# 无默认值时用零值兜底(需要 found_func 获取参数类型)
|
||||||
if found_func is not None:
|
if found_func is not None:
|
||||||
param_node_z: llvmlite.Param | t.CPtr = llvmlite.function_get_param_head(found_func)
|
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:
|
if mdf_defaults is not None and mdf_default_count > 0 and mdf_pi >= mdf_offset:
|
||||||
mdf_di: int = mdf_pi - mdf_offset
|
mdf_di: int = mdf_pi - mdf_offset
|
||||||
if mdf_di < mdf_default_count:
|
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
|
mdf_val: llvmlite.Value | t.CPtr = None
|
||||||
if mdf_gd is not None:
|
if mdf_gd is not None:
|
||||||
mdf_val = HandlesExprCall._build_const_from_snapshot(
|
mdf_val = HandlesExprCall._build_const_from_snapshot(
|
||||||
pool, mod, mdf_gd, mdf_di, trans, builder)
|
pool, mod, mdf_gd, mdf_di, trans, builder)
|
||||||
if mdf_val is None:
|
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))
|
HandlesType.fatal_error(
|
||||||
mdf_node: ast.AST | t.CPtr = mdf_defaults_list.get(mdf_di)
|
cl,
|
||||||
if mdf_node is not None:
|
f"跨模块默认参数无法重建(快照缺失,默认值需为简单常量): {lookup_name}",
|
||||||
mdf_val = HandlesExpr.translate_value(
|
"TypeError")
|
||||||
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
|
|
||||||
continue
|
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 获取参数类型)
|
# 无默认值时用零值兜底(需要 found_func 获取参数类型)
|
||||||
if found_func is not None:
|
if found_func is not None:
|
||||||
param_node_z: llvmlite.Param | t.CPtr = llvmlite.function_get_param_head(found_func)
|
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
@@ -7,6 +7,8 @@ import lib.core.Gen.TypeGenMixin as TypeGenMixin
|
|||||||
import lib.core.Gen.StructGenMixin as StructGenMixin
|
import lib.core.Gen.StructGenMixin as StructGenMixin
|
||||||
import lib.core.Gen.ExprGenMixin as ExprGenMixin
|
import lib.core.Gen.ExprGenMixin as ExprGenMixin
|
||||||
import lib.core.Gen.CallGenMixin as CallGenMixin
|
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.HandlesVar as HandlesVar
|
||||||
import lib.core.Handles.HandlesExprCall as HandlesExprCall
|
import lib.core.Handles.HandlesExprCall as HandlesExprCall
|
||||||
|
|
||||||
@@ -26,7 +28,8 @@ import lib.core.Handles.HandlesExprCall as HandlesExprCall
|
|||||||
@t.NoVTable
|
@t.NoVTable
|
||||||
class Generator(BaseGenMixin.BaseGenMixin, TypeGenMixin.TypeGenMixin,
|
class Generator(BaseGenMixin.BaseGenMixin, TypeGenMixin.TypeGenMixin,
|
||||||
StructGenMixin.StructGenMixin, ExprGenMixin.ExprGenMixin,
|
StructGenMixin.StructGenMixin, ExprGenMixin.ExprGenMixin,
|
||||||
CallGenMixin.CallGenMixin):
|
CallGenMixin.CallGenMixin, FuncGenMixin.FuncGenMixin,
|
||||||
|
ClassGenMixin.ClassGenMixin):
|
||||||
"""生成器:多继承 Mixin 组合(对象化迁移宿主)"""
|
"""生成器:多继承 Mixin 组合(对象化迁移宿主)"""
|
||||||
|
|
||||||
def __init__(self, pool: memhub.MemBuddy | t.CPtr):
|
def __init__(self, pool: memhub.MemBuddy | t.CPtr):
|
||||||
@@ -86,6 +89,29 @@ class Generator(BaseGenMixin.BaseGenMixin, TypeGenMixin.TypeGenMixin,
|
|||||||
self.GlobalFuncCount = 0
|
self.GlobalFuncCount = 0
|
||||||
self.GlobalDefaults = None
|
self.GlobalDefaults = None
|
||||||
self.GlobalDefaultsCount = 0
|
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
|
||||||
|
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|||||||
+333
-3348
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 类名
|
# _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:
|
def _find_renum_class_for_variant(self, variant_name: str) -> str:
|
||||||
if variant_name is None:
|
if variant_name is None:
|
||||||
return None
|
return None
|
||||||
i: int = 0
|
return HandlesClassDef._lookup_renum_variant(variant_name)
|
||||||
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
|
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# _has_no_break - 检测 case body 是否含 c.NoBreak() 调用
|
# _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.HandlesExpr as HandlesExpr
|
||||||
import lib.core.Handles.HandlesExprOps as HandlesExprOps
|
import lib.core.Handles.HandlesExprOps as HandlesExprOps
|
||||||
import lib.core.Handles.HandlesExprCall as HandlesExprCall
|
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.Handles.HandlesType as HandlesType
|
||||||
import lib.core.BuildPipeline as BuildPipeline
|
import lib.core.BuildPipeline as BuildPipeline
|
||||||
import lib.core.IncludesScanner as IncludesScanner
|
import lib.core.IncludesScanner as IncludesScanner
|
||||||
@@ -89,13 +91,14 @@ def main() -> int:
|
|||||||
gen.__before_init__()
|
gen.__before_init__()
|
||||||
gen.__init__(mb)
|
gen.__init__(mb)
|
||||||
GenGenerator.set_global_gen(gen)
|
GenGenerator.set_global_gen(gen)
|
||||||
# P2/P3/P4: 注入 HandlesType/HandlesStruct/HandlesExpr/HandlesExprOps/HandlesExprCall
|
# P2-P5: 注入各 Handles 模块级单例(Phase1 阶段即调用其状态函数)
|
||||||
# 模块级单例(Phase1 阶段即调用其状态函数)
|
|
||||||
HandlesType.set_global_gen(gen)
|
HandlesType.set_global_gen(gen)
|
||||||
HandlesStruct.set_global_gen(gen)
|
HandlesStruct.set_global_gen(gen)
|
||||||
HandlesExpr.set_global_gen(gen)
|
HandlesExpr.set_global_gen(gen)
|
||||||
HandlesExprOps.set_global_gen(gen)
|
HandlesExprOps.set_global_gen(gen)
|
||||||
HandlesExprCall.set_global_gen(gen)
|
HandlesExprCall.set_global_gen(gen)
|
||||||
|
HandlesFunctions.set_global_gen(gen)
|
||||||
|
HandlesClassDef.set_global_gen(gen)
|
||||||
|
|
||||||
# 初始化 VLogger 并打印启动日志
|
# 初始化 VLogger 并打印启动日志
|
||||||
log: VLogger.Logger | t.CPtr = VLogger.get_logger()
|
log: VLogger.Logger | t.CPtr = VLogger.get_logger()
|
||||||
|
|||||||
Reference in new issue
Block a user