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

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

+32 -32
View File
@@ -27,12 +27,12 @@ class CallGenFd(CallGenBase.CallGenBase):
# ============================================================
def _translate_fakeduck_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr,
builder: rawptr[llvmlite.IRBuilder],
mod: rawptr[llvmlite.LLVMModule],
cls_name: str,
method_name: str,
cl: rawptr[ast.Call],
trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr:
trans: rawptr[HT.Translator]) -> rawptr[llvmlite.Value]:
"""FakeDuck: str 变量方法调用解析到扩展类 _Type/_str,返回 call 结果或 None"""
if pool is None or builder is None or cl is None or trans is None:
return None
@@ -71,12 +71,12 @@ class CallGenFd(CallGenBase.CallGenBase):
return None
# 扩展类字段数:有字段(_str)时 self 用影子结构体指针;
# 无字段(_Type)时 self 用对象值 bitcast 到扩展类指针(对齐 TPC L2856-2876)
fd_entry_fd: GenTypes.StructEntry | t.CPtr = self.Gen.StructGen.find_struct_by_type(fd_sty)
fd_entry_fd: rawptr[GenTypes.StructEntry] = self.Gen.StructGen.find_struct_by_type(fd_sty)
fd_has_fields: int = 0
if fd_entry_fd is not None and fd_entry_fd.FieldCount > 0:
fd_has_fields = 1
# self 参数:优先使用已有影子 {var}__meta__(fd2 创建,仅当扩展类有字段时)
fd_self: llvmlite.Value | t.CPtr = None
fd_self: rawptr[llvmlite.Value] = None
if fd_at.value.kind() == ast.ASTKind.Name:
fd_onm: rawptr[ast.Name] = rawptr[ast.Name](fd_at.value)
if fd_onm.id is not None:
@@ -84,7 +84,7 @@ class CallGenFd(CallGenBase.CallGenBase):
fd_mn: str = pool.alloc(256)
if fd_mn is not None:
viperlib.snprintf(fd_mn, 256, "%s__meta__", fd_onm.id)
fd_meta: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_current(
fd_meta: rawptr[llvmlite.Value] = self.Gen.VarGen.lookup_current(
trans.SymTab, fd_mn)
if fd_meta is not None and fd_has_fields != 0:
fd_self = fd_meta
@@ -96,22 +96,22 @@ class CallGenFd(CallGenBase.CallGenBase):
fd_self = self.Gen.VarGen._alloca_at_entry(builder, fd_sty)
if fd_self is None:
return None
fd_obj_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value(
fd_obj_val: rawptr[llvmlite.Value] = self.Gen.ExprGen.translate_value(
builder, pool, mod, fd_at.value, None, 0, trans)
if fd_obj_val is not None:
fd_dfe: GenTypes.FieldEntry | t.CPtr = \
fd_dfe: rawptr[GenTypes.FieldEntry] = \
self.Gen.StructGen.lookup_field(fd_sty, "__data__")
if fd_dfe is not None and fd_dfe.Ty is not None:
fd_dp: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct(
fd_dp: rawptr[llvmlite.Value] = llvmlite.build_gep_struct(
builder, fd_sty, fd_dfe.Ty, fd_self, fd_dfe.Index)
if fd_dp is not None:
llvmlite.build_store(builder, fd_obj_val, fd_dp)
fd_bfe: GenTypes.FieldEntry | t.CPtr = \
fd_bfe: rawptr[GenTypes.FieldEntry] = \
self.Gen.StructGen.lookup_field(fd_sty, "__mbuddy__")
if fd_bfe is not None and fd_bfe.Ty is not None:
fd_bp: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct(
fd_bp: rawptr[llvmlite.Value] = llvmlite.build_gep_struct(
builder, fd_sty, fd_bfe.Ty, fd_self, fd_bfe.Index)
fd_null: llvmlite.Value | t.CPtr = llvmlite.ConstNull(
fd_null: rawptr[llvmlite.Value] = llvmlite.ConstNull(
pool, fd_bfe.Ty, "null")
if fd_bp is not None and fd_null is not None:
llvmlite.build_store(builder, fd_null, fd_bp)
@@ -120,7 +120,7 @@ class CallGenFd(CallGenBase.CallGenBase):
trans, pool, builder, mod, fd_self, fd_cls)
else:
# 无字段扩展类(_Type):对象值 bitcast 到扩展类指针
fd_obj_v: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value(
fd_obj_v: rawptr[llvmlite.Value] = self.Gen.ExprGen.translate_value(
builder, pool, mod, fd_at.value, None, 0, trans)
if fd_obj_v is None:
return None
@@ -130,16 +130,16 @@ class CallGenFd(CallGenBase.CallGenBase):
return None
# 构建参数链表: self → 其余参数
llvmlite.value_set_next(fd_self, None)
fd_head: llvmlite.Value | t.CPtr = fd_self
fd_tail: llvmlite.Value | t.CPtr = fd_self
fd_args: list[rawptr[ast.AST]] | t.CPtr = cl.args
fd_head: rawptr[llvmlite.Value] = fd_self
fd_tail: rawptr[llvmlite.Value] = fd_self
fd_args: rawptr[list[rawptr[ast.AST]]] = cl.args
fd_can: int = 0
if fd_args is not None:
fd_can = len(fd_args)
for fd_ai in range(fd_can):
fd_arg: rawptr[ast.AST] = fd_args.get(fd_ai)
if fd_arg is not None:
fd_av: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value(
fd_av: rawptr[llvmlite.Value] = self.Gen.ExprGen.translate_value(
builder, pool, mod, fd_arg, None, 0, trans)
# char 常量参数 → 单字符字符串(char 隐式转 str,
# 如 s1.split(','):',' 是 i32 值 44,传给 str 参数须先字符串化,
@@ -190,9 +190,9 @@ class CallGenFd(CallGenBase.CallGenBase):
# ============================================================
def _inject_requires_fields(self, trans: rawptr[HT.Translator],
pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr,
builder: rawptr[llvmlite.IRBuilder],
mod: rawptr[llvmlite.LLVMModule],
meta_ptr: llvmlite.Value | t.CPtr,
meta_ptr: rawptr[llvmlite.Value],
class_name: str) -> int:
"""在 with 上下文注入 requires 字段,返回注入字段数"""
if trans is None or pool is None or builder is None or mod is None:
@@ -233,28 +233,28 @@ class CallGenFd(CallGenBase.CallGenBase):
GenTypes.CLASS_META_REQUIRES, class_name, ji)
if fname is None:
continue
fe: GenTypes.FieldEntry | t.CPtr = self.Gen.StructGen.lookup_field(
fe: rawptr[GenTypes.FieldEntry] = self.Gen.StructGen.lookup_field(
sty, fname)
if fe is None or fe.Ty is None:
continue
# 参数:字段名字符串(i8*)
fd_fstr: llvmlite.Value | t.CPtr = self.Gen.ExprGenConst.create_global_string(
fd_fstr: rawptr[llvmlite.Value] = self.Gen.ExprGenConst.create_global_string(
builder, pool, mod, fname, trans)
if fd_fstr is None:
continue
llvmlite.value_set_next(fd_fstr, None)
self._ensure_method_declare(
pool, mod, fd_fname, i8_ptr_ty_j, fd_fstr, 1)
fd_ptr: llvmlite.Value | t.CPtr = llvmlite.build_call(
fd_ptr: rawptr[llvmlite.Value] = llvmlite.build_call(
builder, fd_fname, fd_fstr, 1, i8_ptr_ty_j, 0)
if fd_ptr is None:
continue
# 条件注入:ptr != NULL 才写入(保留用户手动设置的值)
fd_null: llvmlite.Value | t.CPtr = llvmlite.ConstNull(
fd_null: rawptr[llvmlite.Value] = llvmlite.ConstNull(
pool, i8_ptr_ty_j, "null")
if fd_null is None:
continue
fd_cmp: llvmlite.Value | t.CPtr = llvmlite.build_icmp(
fd_cmp: rawptr[llvmlite.Value] = llvmlite.build_icmp(
builder, llvmlite.ICMP_NE, fd_ptr, fd_null)
if fd_cmp is None:
continue
@@ -266,20 +266,20 @@ class CallGenFd(CallGenBase.CallGenBase):
if fd_bb_buf2 is None:
continue
viperlib.snprintf(fd_bb_buf2, 64, "fd.skip.%d", vtc2)
fd_skip_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block(
fd_skip_bb: rawptr[llvmlite.BasicBlock] = llvmlite.create_block(
pool, cur_func, fd_bb_buf2)
viperlib.snprintf(fd_bb_buf2, 64, "fd.inject.%d", vtc2)
fd_inject_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block(
fd_inject_bb: rawptr[llvmlite.BasicBlock] = llvmlite.create_block(
pool, cur_func, fd_bb_buf2)
if fd_skip_bb is None or fd_inject_bb is None:
continue
llvmlite.build_cond_br(builder, fd_cmp, fd_inject_bb, fd_skip_bb)
# inject 块:bitcast + GEP + store,跳回 skip
llvmlite.position_at_end(builder, fd_inject_bb)
fd_cast: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(
fd_cast: rawptr[llvmlite.Value] = llvmlite.build_bitcast(
builder, fd_ptr, fe.Ty)
if fd_cast is not None:
fd_fp: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct(
fd_fp: rawptr[llvmlite.Value] = llvmlite.build_gep_struct(
builder, sty, fe.Ty, meta_ptr, fe.Index)
if fd_fp is not None:
llvmlite.build_store(builder, fd_cast, fd_fp)
@@ -301,10 +301,10 @@ class CallGenFd(CallGenBase.CallGenBase):
# ============================================================
def _emit_provider_push(self, trans: rawptr[HT.Translator],
pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr,
builder: rawptr[llvmlite.IRBuilder],
mod: rawptr[llvmlite.LLVMModule],
cls_name: str,
ctx_val: llvmlite.Value | t.CPtr) -> int:
ctx_val: rawptr[llvmlite.Value]) -> int:
"""生成 _push_provider(field, ctx_i8) 调用(每提供字段一次),返回字段数"""
if trans is None or pool is None or builder is None or mod is None:
return 0
@@ -333,7 +333,7 @@ class CallGenFd(CallGenBase.CallGenBase):
if ret_i32_p is None:
return 0
# ctx 值 bitcast 到 i8*(provider 栈存 void*)
fd_ctx_i8: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(
fd_ctx_i8: rawptr[llvmlite.Value] = llvmlite.build_bitcast(
builder, ctx_val, i8_ptr_ty_p)
if fd_ctx_i8 is None:
return 0
@@ -342,7 +342,7 @@ class CallGenFd(CallGenBase.CallGenBase):
GenTypes.CLASS_META_PROVIDES, cls_name, pi)
if fname is None:
continue
fd_fstr: llvmlite.Value | t.CPtr = self.Gen.ExprGenConst.create_global_string(
fd_fstr: rawptr[llvmlite.Value] = self.Gen.ExprGenConst.create_global_string(
builder, pool, mod, fname, trans)
if fd_fstr is None:
continue
@@ -354,7 +354,7 @@ class CallGenFd(CallGenBase.CallGenBase):
return fd_pc
def _emit_provider_pop(self, trans: rawptr[HT.Translator],
pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr,
builder: rawptr[llvmlite.IRBuilder],
mod: rawptr[llvmlite.LLVMModule],
cls_name: str) -> int:
"""生成 _pop_provider() 调用(每提供字段一次),返回字段数"""