修复了一些错误,更改了一点语法

This commit is contained in:
TermiNexus committed 2026-09-18 20:00:40 +08:00
1 parent 9e2ccbfab7
commit 9910e05760
61 files changed
+2810 -2810

No files matched your search

+21 -21
View File
@@ -26,12 +26,12 @@ class CallGenVt(CallGenBase.CallGenBase):
# ============================================================
def _write_vtable_slot(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr,
builder: rawptr[llvmlite.IRBuilder],
mod: rawptr[llvmlite.LLVMModule],
obj_ptr: llvmlite.Value | t.CPtr,
obj_ptr: rawptr[llvmlite.Value],
class_name: str,
method_index: int,
func_val: llvmlite.Value | t.CPtr,
func_val: rawptr[llvmlite.Value],
trans: rawptr[HT.Translator]) -> int:
"""生成 vtable 槽位写入(写时复制),成功返回 1"""
if pool is None or builder is None or mod is None or trans is None:
@@ -68,20 +68,20 @@ class CallGenVt(CallGenBase.CallGenBase):
if vtable_ty is None:
return 0
# 对象 vtable 槽位(对象头 → i8**,vtable 指针总是第一个字段)
vtable_slot: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(
vtable_slot: rawptr[llvmlite.Value] = llvmlite.build_bitcast(
builder, obj_ptr, i8_ptr_ptr_ty)
if vtable_slot is None:
return 0
vtable_ptr: llvmlite.Value | t.CPtr = llvmlite.build_load(
vtable_ptr: rawptr[llvmlite.Value] = llvmlite.build_load(
builder, i8_ptr_ty, vtable_slot)
if vtable_ptr is None:
return 0
# 类默认 vtable 地址(比较用)
class_vt: llvmlite.Value | t.CPtr = self.Gen.CallGenLeafKit._make_vtable_ref_i8(
class_vt: rawptr[llvmlite.Value] = self.Gen.CallGenLeafKit._make_vtable_ref_i8(
pool, builder, mod, class_name, trans)
if class_vt is None:
return 0
cmp_vt: llvmlite.Value | t.CPtr = llvmlite.build_icmp(
cmp_vt: rawptr[llvmlite.Value] = llvmlite.build_icmp(
builder, llvmlite.ICMP_EQ, vtable_ptr, class_vt)
if cmp_vt is None:
return 0
@@ -93,10 +93,10 @@ class CallGenVt(CallGenBase.CallGenBase):
if vt_bb_buf3 is None:
return 0
viperlib.snprintf(vt_bb_buf3, 64, "vt.copy.%d", vtc3)
vt_copy_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block(
vt_copy_bb: rawptr[llvmlite.BasicBlock] = llvmlite.create_block(
pool, trans._cur_func, vt_bb_buf3)
viperlib.snprintf(vt_bb_buf3, 64, "vt.skip.%d", vtc3)
vt_skip_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block(
vt_skip_bb: rawptr[llvmlite.BasicBlock] = llvmlite.create_block(
pool, trans._cur_func, vt_bb_buf3)
if vt_copy_bb is None or vt_skip_bb is None:
return 0
@@ -108,7 +108,7 @@ class CallGenVt(CallGenBase.CallGenBase):
vcopy_buf: str = pool.alloc(256)
if vcopy_buf is not None:
viperlib.snprintf(vcopy_buf, 256, "%s.vtable.copy.%d", class_name, vtc)
vcopy_gv: llvmlite.GlobalVariable | t.CPtr = llvmlite.new_global_variable(
vcopy_gv: rawptr[llvmlite.GlobalVariable] = llvmlite.new_global_variable(
pool, vcopy_buf, vtable_ty)
if vcopy_gv is not None:
llvmlite.module_add_global(mod, vcopy_gv)
@@ -123,10 +123,10 @@ class CallGenVt(CallGenBase.CallGenBase):
vcopy_ref_nm = vcopy_buf
else:
viperlib.snprintf(vcopy_ref_nm, 272, "@%s", vcopy_buf)
vcopy_ref: llvmlite.Value | t.CPtr = llvmlite.SSAValue(
vcopy_ref: rawptr[llvmlite.Value] = llvmlite.SSAValue(
pool, llvmlite.Ptr(pool, vtable_ty), vcopy_ref_nm)
if vcopy_ref is not None:
vcopy_i8: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(
vcopy_i8: rawptr[llvmlite.Value] = llvmlite.build_bitcast(
builder, vcopy_ref, i8_ptr_ty)
if vcopy_i8 is not None:
# ConstInt 的 name 必须是数字文本(如 "56"),不能是
@@ -135,7 +135,7 @@ class CallGenVt(CallGenBase.CallGenBase):
vtsz_buf: str = pool.alloc(32)
if vtsz_buf is not None:
viperlib.snprintf(vtsz_buf, 32, "%lld", method_count * 8)
vt_size: llvmlite.Value | t.CPtr = llvmlite.ConstInt(
vt_size: rawptr[llvmlite.Value] = llvmlite.ConstInt(
pool, llvmlite.Int64(pool), method_count * 8, vtsz_buf)
if vt_size is not None:
self.Gen.CallGenLib._emit_llvm_memcpy_intrinsic(
@@ -144,28 +144,28 @@ class CallGenVt(CallGenBase.CallGenBase):
llvmlite.build_br(builder, vt_skip_bb)
# skip 块:reload vtable → GEP 槽位 → store 函数指针(i8*)
llvmlite.position_at_end(builder, vt_skip_bb)
vt_ptr2: llvmlite.Value | t.CPtr = llvmlite.build_load(
vt_ptr2: rawptr[llvmlite.Value] = llvmlite.build_load(
builder, i8_ptr_ty, vtable_slot)
if vt_ptr2 is None:
return 0
vt_typed: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(
vt_typed: rawptr[llvmlite.Value] = llvmlite.build_bitcast(
builder, vt_ptr2, llvmlite.Ptr(pool, vtable_ty))
if vt_typed is None:
return 0
vt_slotp: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct(
vt_slotp: rawptr[llvmlite.Value] = llvmlite.build_gep_struct(
builder, vtable_ty, i8_ptr_ty, vt_typed, method_index)
if vt_slotp is None:
return 0
fptr_i8: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(
fptr_i8: rawptr[llvmlite.Value] = llvmlite.build_bitcast(
builder, func_val, i8_ptr_ty)
if fptr_i8 is not None:
llvmlite.build_store(builder, fptr_i8, vt_slotp)
return 1
def _write_vtable_attr(self, builder: llvmlite.IRBuilder | t.CPtr,
def _write_vtable_attr(self, builder: rawptr[llvmlite.IRBuilder],
pool: rawptr[memhub.MemBuddy],
mod: rawptr[llvmlite.LLVMModule],
node: rawptr[ast.AST],
rhs_val: llvmlite.Value | t.CPtr,
rhs_val: rawptr[llvmlite.Value],
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:
@@ -180,7 +180,7 @@ class CallGenVt(CallGenBase.CallGenBase):
if at.value.kind() == ast.ASTKind.Name:
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(
ve_v: rawptr[GenTypes.VarEntry] = self.Gen.VarGen.lookup_var_entry(
trans.SymTab, nm_v.id)
if ve_v is not None:
class_nm_v = self.Gen.VarGen.var_annot_class_name(ve_v)
@@ -198,7 +198,7 @@ class CallGenVt(CallGenBase.CallGenBase):
if vm_idx_v < 0:
return 0
# 解析 obj_ptr(对齐 get_attribute_ptr 前半段:Name 直接查 alloca)
obj_ptr_v: llvmlite.Value | t.CPtr = None
obj_ptr_v: rawptr[llvmlite.Value] = None
if at.value.kind() == ast.ASTKind.Name:
obj_ptr_v = self.Gen.VarGen.lookup_var(
trans.SymTab, (rawptr[ast.Name](at.value)).id)