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:
1 parent
d579d70113
commit
825fe6d326
19 files changed
+85
-85
No files matched your search
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 深拷贝存储,跨文件安全)"""
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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__")
|
||||
|
||||
|
||||
@@ -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=未找到"""
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
# ============================================================
|
||||
|
||||
@@ -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, " ")
|
||||
|
||||
Reference in new issue
Block a user