将部分 | t.CPtr 修正为 rawptr[T]

This commit is contained in:
TermiNexus committed 2026-09-18 17:56:24 +08:00
1 parent eb01a45024
commit 9e2ccbfab7
58 files changed
+3543 -3564

No files matched your search

+15 -15
View File
@@ -27,12 +27,12 @@ class CallGenVt(CallGenBase.CallGenBase):
# ============================================================
def _write_vtable_slot(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr,
mod: rawptr[llvmlite.LLVMModule],
obj_ptr: llvmlite.Value | t.CPtr,
class_name: str,
method_index: int,
func_val: llvmlite.Value | t.CPtr,
trans: HT.Translator | t.CPtr) -> int:
trans: rawptr[HT.Translator]) -> int:
"""生成 vtable 槽位写入(写时复制),成功返回 1"""
if pool is None or builder is None or mod is None or trans is None:
return 0
@@ -40,23 +40,23 @@ class CallGenVt(CallGenBase.CallGenBase):
return 0
if method_index < 0 or trans._cur_func is None:
return 0
i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool)
i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool)
if i8_ty is None:
return 0
i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty)
i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty)
if i8_ptr_ty is None:
return 0
i8_ptr_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ptr_ty)
i8_ptr_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ptr_ty)
if i8_ptr_ptr_ty is None:
return 0
method_count: int = self.Gen.StructGen.get_vtable_method_count(class_name)
if method_count <= 0:
return 0
# 构造 vtable 类型 { i8*, i8*, ... }
vt_first: llvmlite.ParamNode | t.CPtr = None
vt_prev: llvmlite.ParamNode | t.CPtr = None
vt_first: rawptr[llvmlite.Function] = None
vt_prev: rawptr[llvmlite.Function] = None
for vi in range(method_count):
pn: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, i8_ptr_ty)
pn: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, i8_ptr_ty)
if pn is None:
continue
if vt_first is None:
@@ -64,7 +64,7 @@ class CallGenVt(CallGenBase.CallGenBase):
if vt_prev is not None:
llvmlite.paramnode_set_next(vt_prev, pn)
vt_prev = pn
vtable_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Struct(pool, vt_first, method_count, None)
vtable_ty: rawptr[llvmlite.LLVMType] = llvmlite.Struct(pool, vt_first, method_count, None)
if vtable_ty is None:
return 0
# 对象 vtable 槽位(对象头 → i8**,vtable 指针总是第一个字段)
@@ -163,22 +163,22 @@ class CallGenVt(CallGenBase.CallGenBase):
return 1
def _write_vtable_attr(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr,
mod: rawptr[llvmlite.LLVMModule],
node: rawptr[ast.AST],
rhs_val: llvmlite.Value | t.CPtr,
trans: HT.Translator | t.CPtr) -> int:
trans: rawptr[HT.Translator]) -> int:
"""属性写入 obj.method = func:检测 vtable 方法并生成槽位写入(成功返回 1)"""
if node is None or builder is None or pool is None or mod is None:
return 0
if rhs_val is None or trans is None:
return 0
at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node)
at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node)
if at is None or at.value is None or at.attr is None:
return 0
# 解析类名(AnnotClassName;去模块前缀)
class_nm_v: str = None
if at.value.kind() == ast.ASTKind.Name:
nm_v: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value)
nm_v: rawptr[ast.Name] = rawptr[ast.Name](at.value)
if nm_v.id is not None:
ve_v: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry(
trans.SymTab, nm_v.id)
@@ -201,7 +201,7 @@ class CallGenVt(CallGenBase.CallGenBase):
obj_ptr_v: llvmlite.Value | t.CPtr = None
if at.value.kind() == ast.ASTKind.Name:
obj_ptr_v = self.Gen.VarGen.lookup_var(
trans.SymTab, ((ast.Name | t.CPtr)(at.value)).id)
trans.SymTab, (rawptr[ast.Name](at.value)).id)
else:
obj_ptr_v = self.Gen.ExprGen.translate_value(
builder, pool, mod, at.value, None, 0, trans)