fix(TransPyV): 指针 cast 的跨层 idiom 修正:(str | t.CPtr)(x) → rawptr(x)

c 类(源码违规):(str | t.CPtr)(x) 按既定语义 = i8**(char**,指针的指针),

而这些位置要的是 i8*。TPC 的 return/赋值检查现在按声明精确校验(本次即

TypeGenResolve.vp:1221 `return (str | t.CPtr)(v)` 声明返回 i8* 却 return i8** 被抳下),

该 idiom 在旧的无条件 bitcast 下一直不可见。

改法:86 处 (str | t.CPtr)(X) → rawptr(X)(rawptr 是 t.CPtr 的内置名,同为 i8*;

整数操作数走 inttoptr,指针操作数走 bitcast)。不用 str(X):整数操作数会编译成 itoa

(Gen/FuncGenMixin.vp:1159 注释已记录该陷阱),精确类型仍由使用处的 `: str` 标注承担。

保留 4 处本就该是 i8** 的用例(未改):Converter.vp:820(_g_pyi_cdef_names 声明为

str | t.CPtr 的指针数组)、CallGenCBuiltin.vp:1194/1215(声明即 str | t.CPtr)、

1411(先 cast 再 [0] 取首元素)。

另:Gen/Type/TypeGenResolve.vp:1221 手工改为 return t.CPtr(v)(该文件含你的未提交改动,未一并提交)。
This commit is contained in:
TermiNexus committed 2026-09-28 18:43:59 +08:00
1 parent d579d70113
commit 825fe6d326
19 files changed
+85 -85

No files matched your search

+7 -7
View File
@@ -1530,7 +1530,7 @@ def _tb_dir_lookup(dirs: bytes, count: int, idx: int) -> str:
i: int = 0
while i < count:
if int(_tb_rd_u32(dirs, sizet(i) * TB_DIR_SIZE)) == idx:
return (str | t.CPtr)(_tb_rd_u64(dirs, sizet(i) * TB_DIR_SIZE + 8))
return rawptr(_tb_rd_u64(dirs, sizet(i) * TB_DIR_SIZE + 8))
i += 1
return None
@@ -1550,8 +1550,8 @@ def _tb_resolve_file(mb: memhub.MemBuddy*, files: bytes, fcount: int,
roff: sizet = sizet(frec) * TB_FILE_SIZE
cached: uint64 = _tb_rd_u64(files, roff + 24)
if cached != 0:
return (str | t.CPtr)(cached)
name: str = (str | t.CPtr)(_tb_rd_u64(files, roff + 8))
return rawptr(cached)
name: str = rawptr(_tb_rd_u64(files, roff + 8))
path: str = name
if name is not None and _tb_is_abs_path(name) == 0:
didx: int = int(_tb_rd_u32(files, roff + 4))
@@ -1637,7 +1637,7 @@ def _tb_func_name_for(fbuf: bytes, fcount: int, rva: uint64) -> str:
low: uint64 = _tb_rd_u64(fbuf, sizet(k) * TB_FUNC_SIZE)
high: uint64 = _tb_rd_u64(fbuf, sizet(k) * TB_FUNC_SIZE + 8)
if low <= rva and rva < high:
return (str | t.CPtr)(_tb_rd_u64(fbuf, sizet(k) * TB_FUNC_SIZE + 16))
return rawptr(_tb_rd_u64(fbuf, sizet(k) * TB_FUNC_SIZE + 16))
return None
@@ -2106,12 +2106,12 @@ def WriteStackMap(mb: memhub.MemBuddy*, exe_path: str) -> int:
pool_need: sizet = 1
i = 0
while i < uniq:
pth: str = (str | t.CPtr)(_tb_rd_u64(d.RowBuf, sizet(i) * TB_ROW_SIZE + TB_ROW_OFF_FILE))
pth: str = rawptr(_tb_rd_u64(d.RowBuf, sizet(i) * TB_ROW_SIZE + TB_ROW_OFF_FILE))
pool_need += string.strlen(pth) + 1
i += 1
i = 0
while i < fkept:
nm0: str = (str | t.CPtr)(_tb_rd_u64(d.FuncBuf, sizet(i) * TB_FUNC_SIZE + 16))
nm0: str = rawptr(_tb_rd_u64(d.FuncBuf, sizet(i) * TB_FUNC_SIZE + 16))
if nm0 is not None:
pool_need += string.strlen(nm0) + 1
i += 1
@@ -2135,7 +2135,7 @@ def WriteStackMap(mb: memhub.MemBuddy*, exe_path: str) -> int:
return 1
i = 0
while i < uniq:
pth2: str = (str | t.CPtr)(_tb_rd_u64(d.RowBuf, sizet(i) * TB_ROW_SIZE + TB_ROW_OFF_FILE))
pth2: str = rawptr(_tb_rd_u64(d.RowBuf, sizet(i) * TB_ROW_SIZE + TB_ROW_OFF_FILE))
foff: uint64 = _tb_intern(p, pth2)
noff: uint64 = 0
rv2: uint64 = _tb_rd_u64(d.RowBuf, sizet(i) * TB_ROW_SIZE)
+10 -10
View File
@@ -3744,7 +3744,7 @@ def _repl_stub_find_base(e: rawptr[ReplStubClass], bi: int) -> rawptr[ReplStubCl
StructGen.find_struct_by_module → find_struct 的父类回退口径)"""
if e is None or e.Bases is None or bi < 0 or bi >= e.BaseCount:
return None
pname: str = (str | t.CPtr)(e.Bases[bi])
pname: str = rawptr(e.Bases[bi])
if pname is None:
return None
i: int
@@ -3775,7 +3775,7 @@ def _repl_stub_has_name(arr: sizet*, cnt: int, name: str) -> int:
addr: sizet = arr[i]
if addr == 0:
continue
ex: str = (str | t.CPtr)(addr)
ex: str = rawptr(addr)
if ex is not None and string.strcmp(ex, name) == 0:
return 1
return 0
@@ -3964,7 +3964,7 @@ def _repl_stub_try(e: rawptr[ReplStubClass], mod: llvmlite.LLVMModule*) -> int:
for fi in range(pe.Count):
if cn >= _REPL_STUB_FIELD_MAX:
break
nm: str = (str | t.CPtr)(pe.Names[fi])
nm: str = rawptr(pe.Names[fi])
if nm is None:
continue
if _repl_stub_has_name(e.Names, cn, nm) != 0:
@@ -3976,7 +3976,7 @@ def _repl_stub_try(e: rawptr[ReplStubClass], mod: llvmlite.LLVMModule*) -> int:
for oi in range(e.OwnCount):
if cn >= _REPL_STUB_FIELD_MAX:
break
nm2: str = (str | t.CPtr)(e.OwnNames[oi])
nm2: str = rawptr(e.OwnNames[oi])
if nm2 is None:
continue
if _repl_stub_has_name(e.Names, cn, nm2) != 0:
@@ -4001,7 +4001,7 @@ def _repl_stub_try(e: rawptr[ReplStubClass], mod: llvmlite.LLVMModule*) -> int:
for vi in range(pe.VtCount):
if vn >= _REPL_STUB_VT_MAX:
break
mn: str = (str | t.CPtr)(pe.VtNames[vi])
mn: str = rawptr(pe.VtNames[vi])
if mn is None:
continue
if _repl_stub_has_name(e.VtNames, vn, mn) != 0:
@@ -4012,7 +4012,7 @@ def _repl_stub_try(e: rawptr[ReplStubClass], mod: llvmlite.LLVMModule*) -> int:
for mi in range(e.MethodCount):
if vn >= _REPL_STUB_VT_MAX:
break
mn2: str = (str | t.CPtr)(e.MethodNames[mi])
mn2: str = rawptr(e.MethodNames[mi])
if mn2 is None:
continue
if string.strcmp(mn2, "__init__") == 0:
@@ -4087,7 +4087,7 @@ def _repl_stub_try(e: rawptr[ReplStubClass], mod: llvmlite.LLVMModule*) -> int:
GenApi.add_field(pool, entry, "__vtable__", i8_ptr)
fi3: int
for fi3 in range(cn):
fname: str = (str | t.CPtr)(e.Names[fi3])
fname: str = rawptr(e.Names[fi3])
fty3: llvmlite.LLVMType* = (llvmlite.LLVMType*)(e.Types[fi3])
if fname is None or fty3 is None:
continue
@@ -4104,13 +4104,13 @@ def _repl_stub_try(e: rawptr[ReplStubClass], mod: llvmlite.LLVMModule*) -> int:
string.memset(arr, 0, 8 * e.BaseCount)
bi3: int
for bi3 in range(e.BaseCount):
bnm: str = (str | t.CPtr)(e.Bases[bi3])
bnm: str = rawptr(e.Bases[bi3])
bdup: str = _repl_stub_dupstr(pool, bnm)
if bdup is not None:
arr[bi3] = sizet(bdup)
entry.ParentNames = arr
entry.ParentCount = e.BaseCount
pn: str = (str | t.CPtr)(e.Bases[0])
pn: str = rawptr(e.Bases[0])
entry.ParentName = _repl_stub_dupstr(pool, pn)
if hv == 1 and e.VtTrust == 1 and e.VtCount > 0:
entry.VTableMethods = e.VtNames
@@ -4193,7 +4193,7 @@ def _repl_stub_add_class(pool: memhub.MemBuddy*,
bcnt = _REPL_STUB_FIELD_MAX
bi: int
for bi in range(bcnt):
bnm: str = (str | t.CPtr)(pb[bi])
bnm: str = rawptr(pb[bi])
bdup: str = _repl_stub_dupstr(pool, bnm)
if bdup is not None:
e.Bases[bi] = sizet(bdup)
+4 -4
View File
@@ -1054,7 +1054,7 @@ def _BuildReachableSha1Set(mb: memhub.MemBuddy*, source_dir: str,
# 输出槽防御性初始化(成功路径必全写;未找到/未命中时仅 free 槽本身)
# 槽联合必须用 (sizet*):t.CPtr|t.CPtr 会被折叠成 t.CPtr,
# [0] 变成 1 字节访问 → 指针被截断(0x2e 崩溃根因)。CSizeT 成员为
# 8 字节:写侧 sizet(ptr),读侧必须用 (str | t.CPtr)(slot[0]) 做 u64→
# 8 字节:写侧 sizet(ptr),读侧必须用 rawptr(slot[0]) 做 u64→
# 指针转换;str(slot[0]) 是内置"数字转字符串"(snprintf 到栈缓冲并返回
# 该栈地址),拿到的是十进制文本+栈指针 → free 即 bad-free。
abs_slot: sizet* = (sizet*)(out_abs)
@@ -1072,9 +1072,9 @@ def _BuildReachableSha1Set(mb: memhub.MemBuddy*, source_dir: str,
stdlib.free(out_inc)
stdlib.free(mod_buf)
continue
abs_path: str = (str | t.CPtr)(abs_slot[0])
rel_path: str = (str | t.CPtr)(rel_slot[0])
inc_dir: str = (str | t.CPtr)(inc_slot[0])
abs_path: str = rawptr(abs_slot[0])
rel_path: str = rawptr(rel_slot[0])
inc_dir: str = rawptr(inc_slot[0])
# 读文件 + 计算 SHA1(CRLF→LF,与 IncludesScanner 一致)
sha1_r2: str = IncludesScanner.compute_file_sha1(mb, abs_path)
+1 -1
View File
@@ -1043,7 +1043,7 @@ novirtual class CallGenBase:
stdlib.free(key_buf)
if v is None:
return None
return (str | t.CPtr)(v)
return rawptr(v)
# _CacheModuleRetTyTexts:单趟扫描某模块 text.ll——把全部 define 行的返回类型写入持久缓存(键/值深拷贝进 PermPool,同名只记首次,只登记 "{sha1}." 开头的本模块 mangled 名),并在同一趟里返回首个匹配 search_buf 的 define 的返回类型(未匹配返回 None);仅在成功读到 text.ll 后调用,负结果绝不缓存
def _CacheModuleRetTyTexts(self, class_sha1: str, text_buf: bytes,
+10 -10
View File
@@ -99,7 +99,7 @@ novirtual class CallGenCall(CallGenBase.CallGenBase):
for mi in range(vc_entry.VTableMethodCount):
mname_addr: sizet = methods_arr[mi]
if mname_addr == 0: continue
mname: str = (str | t.CPtr)(mname_addr)
mname: str = rawptr(mname_addr)
if mname is not None and string.strcmp(mname, method_name) == 0:
method_index = mi
break
@@ -612,7 +612,7 @@ novirtual class CallGenCall(CallGenBase.CallGenBase):
cmop_mname_addr: sizet = cmop_methods_arr[cmop_mi]
if cmop_mname_addr == 0:
continue
cmop_mname: str = (str | t.CPtr)(cmop_mname_addr)
cmop_mname: str = rawptr(cmop_mname_addr)
if cmop_mname is not None and string.strcmp(cmop_mname, method_name) == 0:
cmop_method_idx = cmop_mi
break
@@ -795,7 +795,7 @@ novirtual class CallGenCall(CallGenBase.CallGenBase):
mro_ptr: sizet* = self.Gen.StructGen.get_mro_chain(pool, class_name)
mi: int = 1
while mro_ptr is not None and mro_ptr[mi] != 0:
anc: str = (str | t.CPtr)(mro_ptr[mi])
anc: str = rawptr(mro_ptr[mi])
if anc is not None:
parent_lookup: str = pool.alloc(128)
if parent_lookup is not None:
@@ -950,7 +950,7 @@ novirtual class CallGenCall(CallGenBase.CallGenBase):
mro_s0: sizet* = self.Gen.StructGen.get_mro_chain(pool, class_name)
mi_s0: int = 1
while mro_s0 is not None and mro_s0[mi_s0] != 0 and ret_anc_sha1 is None:
anc_s0: str = (str | t.CPtr)(mro_s0[mi_s0])
anc_s0: str = rawptr(mro_s0[mi_s0])
if anc_s0 is not None:
ret_anc_sha1 = self.Gen.StructGen.get_struct_sha1(anc_s0)
mi_s0 += 1
@@ -1058,7 +1058,7 @@ novirtual class CallGenCall(CallGenBase.CallGenBase):
mro_t2: sizet* = self.Gen.StructGen.get_mro_chain(pool, class_name)
mi_t2: int = 1
while mro_t2 is not None and mro_t2[mi_t2] != 0 and looked_up_ty is None:
anc_t2: str = (str | t.CPtr)(mro_t2[mi_t2])
anc_t2: str = rawptr(mro_t2[mi_t2])
if anc_t2 is not None and string.strcmp(anc_t2, class_name) != 0:
anc_sha1_t2: str = self.Gen.StructGen.get_struct_sha1(anc_t2)
looked_up_ty = self._LookupMethodRetTyFromTextLL(pool, anc_sha1_t2, anc_t2, method_name)
@@ -1076,7 +1076,7 @@ novirtual class CallGenCall(CallGenBase.CallGenBase):
mro_v2: sizet* = self.Gen.StructGen.get_mro_chain(pool, class_name)
mi_v2: int = 1
while mro_v2 is not None and mro_v2[mi_v2] != 0 and vpi_ret_ty is None:
anc_v2: str = (str | t.CPtr)(mro_v2[mi_v2])
anc_v2: str = rawptr(mro_v2[mi_v2])
if anc_v2 is not None and string.strcmp(anc_v2, class_name) != 0:
anc_sha1_v2: str = self.Gen.StructGen.get_struct_sha1(anc_v2)
vpi_ret_ty = self._lookup_method_ret_ty_via_vpi(pool, anc_sha1_v2, anc_v2, method_name)
@@ -1113,7 +1113,7 @@ novirtual class CallGenCall(CallGenBase.CallGenBase):
mi_p2: int = 1
anc_missing_p2: int = 0
while mro_p2 is not None and mro_p2[mi_p2] != 0:
anc_p2: str = (str | t.CPtr)(mro_p2[mi_p2])
anc_p2: str = rawptr(mro_p2[mi_p2])
if anc_p2 is not None:
anc_sha1_p2: str = self.Gen.StructGen.get_struct_sha1(anc_p2)
if anc_sha1_p2 is None \
@@ -1187,7 +1187,7 @@ novirtual class CallGenCall(CallGenBase.CallGenBase):
is_first_parent_th: int = 0
mro_fp_th: sizet* = self.Gen.StructGen.get_mro_chain(pool, class_name)
if mro_fp_th is not None and mro_fp_th[1] != 0:
first_parent_th: str = (str | t.CPtr)(mro_fp_th[1])
first_parent_th: str = rawptr(mro_fp_th[1])
if first_parent_th is not None and string.strcmp(first_parent_th, mc_anc) == 0:
is_first_parent_th = 1
anc_entry_th: GenTypes.StructEntry* = self.Gen.StructGen.find_struct(mc_anc)
@@ -1563,7 +1563,7 @@ novirtual class CallGenCall(CallGenBase.CallGenBase):
mc_mname_addr: sizet = mc_methods_arr[mc_mi]
if mc_mname_addr == 0:
continue
mc_mname: str = (str | t.CPtr)(mc_mname_addr)
mc_mname: str = rawptr(mc_mname_addr)
if mc_mname is not None and string.strcmp(mc_mname, method_name) == 0:
mc_method_idx = mc_mi
break
@@ -1830,7 +1830,7 @@ novirtual class CallGenCall(CallGenBase.CallGenBase):
mro_sp: sizet* = self.Gen.StructGen.get_mro_chain(pool, cur_class)
mi_sp: int = 1
while mro_sp is not None and mro_sp[mi_sp] != 0:
anc_sp: str = (str | t.CPtr)(mro_sp[mi_sp])
anc_sp: str = rawptr(mro_sp[mi_sp])
if anc_sp is not None:
probe_sp: str = pool.alloc(160)
if probe_sp is not None:
+8 -8
View File
@@ -303,7 +303,7 @@ novirtual class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
self.Gen.TypeGenErr.fatal_error(cls_node, "isinstance() 参数类型推断失败", "TypeError")
ci: int = 0
while cls_names[ci] != 0:
cn: str = (str | t.CPtr)(cls_names[ci])
cn: str = rawptr(cls_names[ci])
if cn is not None:
if self.Gen.StructGen.is_novtable_by_name(cn) != 0 \
or self.Gen.StructGen.has_vtable_by_name(cn) == 0:
@@ -326,7 +326,7 @@ novirtual class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
if subs is not None:
k: int = 0
while subs[k] != 0:
scn: str = (str | t.CPtr)(subs[k])
scn: str = rawptr(subs[k])
if scn is not None:
sub_i8: llvmlite.Value* = self._make_vtable_ref_i8(pool, builder, mod, scn, trans)
if sub_i8 is not None:
@@ -412,14 +412,14 @@ novirtual class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
while qcount > 0:
qcount -= 1
cur_addr: sizet = queue[qcount]
cur: str = (str | t.CPtr)(cur_addr)
cur: str = rawptr(cur_addr)
if cur is None:
continue
dup: int = 0
for vi in range(vcount):
va: sizet = visited[vi]
if va != 0:
vn: str = (str | t.CPtr)(va)
vn: str = rawptr(va)
if vn is not None and string.strcmp(vn, cur) == 0:
dup = 1
break
@@ -447,7 +447,7 @@ novirtual class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
for j in range(e2.ParentCount):
pa: sizet = parr[j]
if pa != 0:
pn: str = (str | t.CPtr)(pa)
pn: str = rawptr(pa)
if pn is not None and string.strcmp(pn, cur) == 0:
if qcount < CallGenBase.ISINSTANCE_CLASS_MAX:
queue[qcount] = sizet(e2.Name)
@@ -471,7 +471,7 @@ novirtual class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
if buf is None:
return None
viperlib.snprintf(buf, 256, "%s.vtable", class_name)
vn: str = (str | t.CPtr)(buf)
vn: str = rawptr(buf)
sha1: str = self.Gen.StructGen.get_struct_sha1(class_name)
if sha1 is None:
if trans is None:
@@ -519,7 +519,7 @@ novirtual class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
if mro is not None:
k: int = 0
while mro[k] != 0:
mn: str = (str | t.CPtr)(mro[k])
mn: str = rawptr(mro[k])
if mn is not None and string.strcmp(mn, class_name) == 0:
return 1
k += 1
@@ -1445,7 +1445,7 @@ novirtual class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
return llvmlite.ConstNull(pool, i8_ptr_ty, "null")
elif kind == ast.CONST_STR:
if gd_entry.ConstStrs is not None and gd_entry.ConstStrs[di] != 0:
sv: str = (str | t.CPtr)(gd_entry.ConstStrs[di])
sv: str = rawptr(gd_entry.ConstStrs[di])
return self.Gen.ExprGenConst.create_global_string(builder, pool, mod, sv, trans)
# 无法重建的(如 CONST_FLOAT/复杂表达式)返回 None,调用方回退到 AST
return None
+1 -1
View File
@@ -1024,7 +1024,7 @@ novirtual class ClassGenBase:
for fi in range(count):
addr: sizet = names_buf[fi]
if addr != 0:
existing: str = (str | t.CPtr)(addr)
existing: str = rawptr(addr)
if existing is not None and string.strcmp(existing, name) == 0:
return 1
return 0
+2 -2
View File
@@ -225,7 +225,7 @@ novirtual class ClassGenDef(ClassGenBase.ClassGenBase):
for pi in range(parents_count):
pname_addr: sizet = parents_buf[pi]
if pname_addr == 0: continue
pname: str = (str | t.CPtr)(pname_addr)
pname: str = rawptr(pname_addr)
if pname is None: continue
# 用 SHA1 感知查找父类,规避跨模块同名找错
parent_entry: GenTypes.StructEntry* = self.Gen.StructGen.find_struct_by_module(pname, trans.ModuleSha1)
@@ -585,7 +585,7 @@ novirtual class ClassGenDef(ClassGenBase.ClassGenBase):
fname_addr: sizet = field_names_buf[fi]
if fname_addr == 0:
continue
fname: str = (str | t.CPtr)(fname_addr)
fname: str = rawptr(fname_addr)
fty_addr2: sizet = field_types_buf[fi]
if fty_addr2 == 0:
continue
+10 -10
View File
@@ -497,7 +497,7 @@ novirtual class ClassGenEnum(ClassGenBase.ClassGenBase):
fname_addr: sizet = member_names_buf[mi]
if fname_addr == 0:
continue
mname: str = (str | t.CPtr)(fname_addr)
mname: str = rawptr(fname_addr)
fty_addr2: sizet = member_types_buf[mi]
if fty_addr2 == 0:
continue
@@ -736,7 +736,7 @@ novirtual class ClassGenEnum(ClassGenBase.ClassGenBase):
fname_addr: sizet = field_names_buf[fi]
if fname_addr == 0:
continue
fname: str = (str | t.CPtr)(fname_addr)
fname: str = rawptr(fname_addr)
fty_addr2: sizet = field_types_buf[fi]
if fty_addr2 == 0:
continue
@@ -1399,9 +1399,9 @@ novirtual class ClassGenEnum(ClassGenBase.ClassGenBase):
# 去重检查(去指针化):class 槽位存 perm_pool 字符串拷贝,用 strcmp 内容比较——
# 不再依赖指针值统一(注册用 AST 指针、查找用 entry.Name 池拷贝,指针恒不等)。
for i in range(self.RenumAliasCount):
cls_existing_ptr: str = (str | t.CPtr)(self.RenumAliasClass[i])
cls_existing_ptr: str = rawptr(self.RenumAliasClass[i])
if cls_existing_ptr is not None and string.strcmp(cls_existing_ptr, class_name) == 0:
fld_existing_ptr: str = (str | t.CPtr)(self.RenumAliasField[i])
fld_existing_ptr: str = rawptr(self.RenumAliasField[i])
if fld_existing_ptr is not None and string.strcmp(fld_existing_ptr, field_name) == 0:
# 已存在记录:首遍注册期解析失败(自引用字段,见
# _refill_renum_field_types)类型槽为 0 时,本次解析成功则
@@ -1457,10 +1457,10 @@ novirtual class ClassGenEnum(ClassGenBase.ClassGenBase):
if class_name is None or field_name is None or self.RenumAliasClass is None:
return -1
for i in range(self.RenumAliasCount):
cls_existing_ptr: str = (str | t.CPtr)(self.RenumAliasClass[i])
cls_existing_ptr: str = rawptr(self.RenumAliasClass[i])
if cls_existing_ptr is not None and string.strcmp(cls_existing_ptr, class_name) == 0:
# field_name 用 strcmp 内容比较(指针不同但内容相同)
fld_existing_ptr: str = (str | t.CPtr)(self.RenumAliasField[i])
fld_existing_ptr: str = rawptr(self.RenumAliasField[i])
if fld_existing_ptr is not None and string.strcmp(fld_existing_ptr, field_name) == 0:
return self.RenumAliasIndex[i]
return -1
@@ -1474,9 +1474,9 @@ novirtual class ClassGenEnum(ClassGenBase.ClassGenBase):
if class_name is None or field_name is None or self.RenumAliasTy is None:
return None
for i in range(self.RenumAliasCount):
cls_existing_ptr: str = (str | t.CPtr)(self.RenumAliasClass[i])
cls_existing_ptr: str = rawptr(self.RenumAliasClass[i])
if cls_existing_ptr is not None and string.strcmp(cls_existing_ptr, class_name) == 0:
fld_existing_ptr: str = (str | t.CPtr)(self.RenumAliasField[i])
fld_existing_ptr: str = rawptr(self.RenumAliasField[i])
if fld_existing_ptr is not None and string.strcmp(fld_existing_ptr, field_name) == 0:
if self.RenumAliasTy[i] == 0:
return None
@@ -1496,12 +1496,12 @@ novirtual class ClassGenEnum(ClassGenBase.ClassGenBase):
if payload_idx < 1:
return None
for i in range(self.RenumAliasCount):
cls_existing_ptr: str = (str | t.CPtr)(self.RenumAliasClass[i])
cls_existing_ptr: str = rawptr(self.RenumAliasClass[i])
if cls_existing_ptr is None or string.strcmp(cls_existing_ptr, class_name) != 0:
continue
if self.RenumAliasVariant[i] == 0:
continue
vnt_ptr: str = (str | t.CPtr)(self.RenumAliasVariant[i])
vnt_ptr: str = rawptr(self.RenumAliasVariant[i])
if vnt_ptr is None or string.strcmp(vnt_ptr, variant_name) != 0:
continue
if self.RenumAliasIndex[i] != payload_idx:
+3 -3
View File
@@ -166,7 +166,7 @@ novirtual class ClassGenGeneric(ClassGenBase.ClassGenBase):
buf_addr: sizet = self.GenericClassTpParams[i]
if buf_addr == 0:
return None
buf_tp: str = (str | t.CPtr)(buf_addr)
buf_tp: str = rawptr(buf_addr)
# 空格分隔 → list[str]
# 注意:list[str](pool, 8) 第二个参数是 elem_size(指针 8 字节),
# 不是容量!传 4 会导致 get(i) 偏移算错、append 相互覆盖
@@ -440,11 +440,11 @@ novirtual class ClassGenGeneric(ClassGenBase.ClassGenBase):
for i in range(self.SpecCount):
key_addr: sizet = self.SpecKeys[i]
if key_addr != 0:
k: str = (str | t.CPtr)(key_addr)
k: str = rawptr(key_addr)
if k is not None and string.strcmp(k, spec_key) == 0:
name_addr: sizet = self.SpecNames[i]
if name_addr != 0:
return (str | t.CPtr)(name_addr)
return rawptr(name_addr)
return None
def _cache_spec(self, pool: memhub.MemBuddy*, spec_key: str, spec_name: str):
"""缓存特化结果(stdlib 深拷贝存储,跨文件安全)"""
+4 -4
View File
@@ -171,7 +171,7 @@ novirtual class ClassGenVTable(ClassGenBase.ClassGenBase):
mro_ptr: sizet* = self.Gen.StructGen.get_mro_chain(pool, pname)
mro_i: int = 1
while mro_ptr is not None and mro_ptr[mro_i] != 0:
anc: str = (str | t.CPtr)(mro_ptr[mro_i])
anc: str = rawptr(mro_ptr[mro_i])
if anc is not None:
probe_buf: str = pool.alloc(128)
if probe_buf is not None:
@@ -232,7 +232,7 @@ novirtual class ClassGenVTable(ClassGenBase.ClassGenBase):
for mi in range(method_count):
exist_addr: sizet = method_names_buf[mi]
if exist_addr != 0:
exist_name: str = (str | t.CPtr)(exist_addr)
exist_name: str = rawptr(exist_addr)
if exist_name is not None and string.strcmp(exist_name, mname) == 0:
already_in_vt = 1
break
@@ -337,13 +337,13 @@ novirtual class ClassGenVTable(ClassGenBase.ClassGenBase):
self._vtable_strcat(init_buf, 16384, "i8* null")
continue
full_name: str = (str | t.CPtr)(full_name_addr)
full_name: str = rawptr(full_name_addr)
# 检查是否是继承方法(method_parent_sha1s 非 0 表示用父模块 SHA1 mangling)
parent_sha1_addr: sizet = method_parent_sha1s[i]
if parent_sha1_addr != 0:
# 继承方法: 用父类模块 SHA1 做 mangling
parent_sha1: str = (str | t.CPtr)(parent_sha1_addr)
parent_sha1: str = rawptr(parent_sha1_addr)
mangled_name: str = self.Gen.FuncGenBase._mangle_name_with_sha1(parent_sha1, full_name)
else:
# 当前类方法: 用当前模块 SHA1
+1 -1
View File
@@ -613,7 +613,7 @@ novirtual class ExprGenBase:
# chain[0] = 自身;父类/祖先在后,遇 0 终止。只查「自身之后」的祖先。
i: int = 1
while chain[i] != 0:
anc: str = (str | t.CPtr)(chain[i])
anc: str = rawptr(chain[i])
if anc is not None and string.strcmp(anc, dst_name) == 0:
return 1
i += 1
+1 -1
View File
@@ -380,7 +380,7 @@ novirtual class ExprGenCls(ExprGenBase.ExprGenBase):
mro_ptr: sizet* = self.Gen.StructGen.get_mro_chain(pool, class_name)
mi: int = 1
while mro_ptr is not None and mro_ptr[mi] != 0:
anc: str = (str | t.CPtr)(mro_ptr[mi])
anc: str = rawptr(mro_ptr[mi])
if anc is not None:
anc_lookup: str = pool.alloc(128)
if anc_lookup is not None:
+4 -4
View File
@@ -1149,7 +1149,7 @@ novirtual class ExprGenOps(ExprGenBase.ExprGenBase):
mro_ptr: sizet* = self.Gen.StructGen.get_mro_chain(pool, class_name)
mi: int = 1
while mro_ptr is not None and mro_ptr[mi] != 0:
anc: str = (str | t.CPtr)(mro_ptr[mi])
anc: str = rawptr(mro_ptr[mi])
if anc is not None:
parent_lookup: str = pool.alloc(128)
if parent_lookup is not None:
@@ -1173,7 +1173,7 @@ novirtual class ExprGenOps(ExprGenBase.ExprGenBase):
mro_p: sizet* = self.Gen.StructGen.get_mro_chain(pool, search_class)
mj: int = 1
while mro_p is not None and mro_p[mj] != 0 and cls_sha1 is None:
anc_p: str = (str | t.CPtr)(mro_p[mj])
anc_p: str = rawptr(mro_p[mj])
if anc_p is not None:
cls_sha1 = self.Gen.StructGen.get_struct_sha1(anc_p)
mj += 1
@@ -1244,7 +1244,7 @@ novirtual class ExprGenOps(ExprGenBase.ExprGenBase):
mro_ptr: sizet* = self.Gen.StructGen.get_mro_chain(pool, class_name)
mi: int = 1
while mro_ptr is not None and mro_ptr[mi] != 0:
anc: str = (str | t.CPtr)(mro_ptr[mi])
anc: str = rawptr(mro_ptr[mi])
if anc is not None:
parent_lookup: str = pool.alloc(128)
if parent_lookup is not None:
@@ -1267,7 +1267,7 @@ novirtual class ExprGenOps(ExprGenBase.ExprGenBase):
mro_p: sizet* = self.Gen.StructGen.get_mro_chain(pool, search_class)
mj: int = 1
while mro_p is not None and mro_p[mj] != 0 and cls_sha1 is None:
anc_p: str = (str | t.CPtr)(mro_p[mj])
anc_p: str = rawptr(mro_p[mj])
if anc_p is not None:
cls_sha1 = self.Gen.StructGen.get_struct_sha1(anc_p)
mj += 1
+3 -3
View File
@@ -333,7 +333,7 @@ novirtual class ImportsGenMixin:
if self.CurFromImportsOrigs.__contains__(local_name) != 0:
v_o: t.CPtr = self.CurFromImportsOrigs.__getitem__(local_name)
if v_o is not None:
return (str | t.CPtr)(v_o)
return rawptr(v_o)
# 索引未命中 | 值为 None(首个即无别名):绝不据此直接返回 None——
# 真实串可能仍含该名,落到下方原逐字符扫描按串内容判定(正确性优先)。
name_len: sizet = string.strlen(local_name)
@@ -419,11 +419,11 @@ novirtual class ImportsGenMixin:
if name_is_star == 0:
v_f: t.CPtr = self.CurFromImportsMods.__getitem__(name)
if v_f is not None:
return (str | t.CPtr)(v_f)
return rawptr(v_f)
if allow_star_fallback != 0:
sv_f: t.CPtr = self.CurFromImportsMods.__getitem__("*")
if sv_f is not None:
return (str | t.CPtr)(sv_f)
return rawptr(sv_f)
# 索引精确名 | star 均未命中:绝不据此直接返回 None(索引不完整会漏报
# "名已 import",_op_head NameError 即此类),落到下方原逐字符扫描按串内容判定。
name_len: sizet = string.strlen(name)
+2 -2
View File
@@ -671,7 +671,7 @@ novirtual class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin):
# (对齐 TPC HandlesWith.py L167-174;逆序弹栈,经 gen 单例委托)
for pi_pop in range(n):
if ctx_class_buf[pi_pop] != 0:
cls_pop: str = (str | t.CPtr)(ctx_class_buf[pi_pop])
cls_pop: str = rawptr(ctx_class_buf[pi_pop])
fd_cls_bare_p: str = cls_pop
if cls_pop is not None:
fd_dot_p: str = string.strrchr(cls_pop, '.')
@@ -684,7 +684,7 @@ novirtual class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin):
for i in range(n):
ci: int = n - 1 - i
if ctx_class_buf[ci] != 0:
cls_ci: str = (str | t.CPtr)(ctx_class_buf[ci])
cls_ci: str = rawptr(ctx_class_buf[ci])
self.Gen.VarGen.set_var_annot_class_name(trans.SymTab, "__with_ctx", cls_ci)
self._with_ctx_call(trans, pool, builder, mod, "__exit__")
+6 -6
View File
@@ -1669,7 +1669,7 @@ novirtual class StructGenMixin:
addr: sizet = names_ptr[i]
arr[i] = 0
if addr != 0:
src: str = (str | t.CPtr)(addr)
src: str = rawptr(addr)
if src is not None:
slen: sizet = string.strlen(src)
dup: str = pn_pool.alloc(slen + 1)
@@ -1702,7 +1702,7 @@ novirtual class StructGenMixin:
addr: sizet = parr[idx]
if addr == 0:
return None
return (str | t.CPtr)(addr)
return rawptr(addr)
def get_mro_chain(self, pool: memhub.MemBuddy*,
name: str) -> sizet*:
@@ -1727,7 +1727,7 @@ novirtual class StructGenMixin:
while stack_count > 0:
stack_count -= 1
cur_addr: sizet = stack[stack_count]
cur: str = (str | t.CPtr)(cur_addr)
cur: str = rawptr(cur_addr)
if cur is None:
continue
# 已访问检查(线性搜索)
@@ -1735,7 +1735,7 @@ novirtual class StructGenMixin:
for vi in range(visit_count):
va: sizet = visited[vi]
if va != 0:
vn: str = (str | t.CPtr)(va)
vn: str = rawptr(va)
if vn is not None and string.strcmp(vn, cur) == 0:
dup = 1
break
@@ -1796,7 +1796,7 @@ novirtual class StructGenMixin:
mname_addr: sizet = methods_arr[i]
if mname_addr == 0:
continue
mname: str = (str | t.CPtr)(mname_addr)
mname: str = rawptr(mname_addr)
if mname is not None and string.strcmp(mname, method_name) == 0:
return i
return -1
@@ -1823,7 +1823,7 @@ novirtual class StructGenMixin:
mname_addr: sizet = methods_arr[idx]
if mname_addr == 0:
return None
return (str | t.CPtr)(mname_addr)
return rawptr(mname_addr)
def get_field_count(self, name: str) -> int:
"""获取结构体字段数量,返回 -1=未找到"""
+1 -1
View File
@@ -260,7 +260,7 @@ def _spec_key_at(keys: bytes, index: int) -> str:
if keys is None or index < 0:
return None
addr: uint64 = uint64(keys) + uint64(index * SPEC_TEXT_MAX)
return (str | t.CPtr)(addr)
return rawptr(addr)
# ============================================================
+7 -7
View File
@@ -715,7 +715,7 @@ def _repl_base_cdefine_find(name: str) -> int:
return -1
i: int
for i in range(ReplBaseCDefineCount):
nm: str = (str | t.CPtr)(ReplBaseCDefineNames[i])
nm: str = rawptr(ReplBaseCDefineNames[i])
if nm is not None and string.strcmp(nm, name) == 0:
return i
return -1
@@ -734,8 +734,8 @@ def ReplBaselineRestore(pool: memhub.MemBuddy*) -> int:
return 1
i: int
for i in range(ReplBaseCDefineCount):
nm: str = (str | t.CPtr)(ReplBaseCDefineNames[i])
val: str = (str | t.CPtr)(ReplBaseCDefineValues[i])
nm: str = rawptr(ReplBaseCDefineNames[i])
val: str = rawptr(ReplBaseCDefineValues[i])
kind: int = int(ReplBaseCDefineKinds[i])
if nm is None or val is None:
continue
@@ -748,8 +748,8 @@ def ReplBaselineRestore(pool: memhub.MemBuddy*) -> int:
# 的壳同款调用形态)
GenApi._g_gen.TypeGenCDef.register_cdefine_string(pool, nm, val)
for i in range(ReplBaseCTypedefCount):
tn: str = (str | t.CPtr)(ReplBaseCTypedefNames[i])
tv: str = (str | t.CPtr)(ReplBaseCTypedefTypeStrs[i])
tn: str = rawptr(ReplBaseCTypedefNames[i])
tv: str = rawptr(ReplBaseCTypedefTypeStrs[i])
if tn is None or tv is None:
continue
GenApi.register_ctypedef(pool, tn, tv)
@@ -813,7 +813,7 @@ def ReplBaselineCapture() -> int:
dup_hit: int = 0
k: int
for k in range(ReplBaseCTypedefCount):
ex: str = (str | t.CPtr)(ReplBaseCTypedefNames[k])
ex: str = rawptr(ReplBaseCTypedefNames[k])
if ex is not None and string.strcmp(ex, tn) == 0:
dup_hit = 1
break
@@ -868,7 +868,7 @@ def _repl_cmd_append_implibs(cmd: bytes, cap: int, pos: int) -> int:
return pos
i: int
for i in range(ReplFragImplibCount):
p: str = (str | t.CPtr)(ReplFragImplibs[i])
p: str = rawptr(ReplFragImplibs[i])
if p is None:
continue
pos = _repl_cat_str(cmd, cap, pos, " ")