diff --git a/App/lib/Phase/BuildPipeline.vp b/App/lib/Phase/BuildPipeline.vp index 36e0943..77a2b4d 100644 --- a/App/lib/Phase/BuildPipeline.vp +++ b/App/lib/Phase/BuildPipeline.vp @@ -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) diff --git a/App/lib/Stub/StubGen/VpiReader.vp b/App/lib/Stub/StubGen/VpiReader.vp index ede112b..740b3fe 100644 --- a/App/lib/Stub/StubGen/VpiReader.vp +++ b/App/lib/Stub/StubGen/VpiReader.vp @@ -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) diff --git a/App/lib/Stub/StubMerger/StubMergerBuild.vp b/App/lib/Stub/StubMerger/StubMergerBuild.vp index 0ab3307..1de400a 100644 --- a/App/lib/Stub/StubMerger/StubMergerBuild.vp +++ b/App/lib/Stub/StubMerger/StubMergerBuild.vp @@ -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) diff --git a/App/lib/core/Gen/Call/CallGenBase.vp b/App/lib/core/Gen/Call/CallGenBase.vp index 315adcd..5b8f8d1 100644 --- a/App/lib/core/Gen/Call/CallGenBase.vp +++ b/App/lib/core/Gen/Call/CallGenBase.vp @@ -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, diff --git a/App/lib/core/Gen/Call/CallGenCall.vp b/App/lib/core/Gen/Call/CallGenCall.vp index 2020921..77ebd36 100644 --- a/App/lib/core/Gen/Call/CallGenCall.vp +++ b/App/lib/core/Gen/Call/CallGenCall.vp @@ -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: diff --git a/App/lib/core/Gen/Call/CallGenLeafKit.vp b/App/lib/core/Gen/Call/CallGenLeafKit.vp index 1dbc15f..977c28c 100644 --- a/App/lib/core/Gen/Call/CallGenLeafKit.vp +++ b/App/lib/core/Gen/Call/CallGenLeafKit.vp @@ -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 diff --git a/App/lib/core/Gen/Class/ClassGenBase.vp b/App/lib/core/Gen/Class/ClassGenBase.vp index e95e6e4..ef1db27 100644 --- a/App/lib/core/Gen/Class/ClassGenBase.vp +++ b/App/lib/core/Gen/Class/ClassGenBase.vp @@ -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 diff --git a/App/lib/core/Gen/Class/ClassGenDef.vp b/App/lib/core/Gen/Class/ClassGenDef.vp index eef3f13..901bae6 100644 --- a/App/lib/core/Gen/Class/ClassGenDef.vp +++ b/App/lib/core/Gen/Class/ClassGenDef.vp @@ -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 diff --git a/App/lib/core/Gen/Class/ClassGenEnum.vp b/App/lib/core/Gen/Class/ClassGenEnum.vp index b6d43bd..c458050 100644 --- a/App/lib/core/Gen/Class/ClassGenEnum.vp +++ b/App/lib/core/Gen/Class/ClassGenEnum.vp @@ -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: diff --git a/App/lib/core/Gen/Class/ClassGenGeneric.vp b/App/lib/core/Gen/Class/ClassGenGeneric.vp index 30f236b..baae092 100644 --- a/App/lib/core/Gen/Class/ClassGenGeneric.vp +++ b/App/lib/core/Gen/Class/ClassGenGeneric.vp @@ -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 深拷贝存储,跨文件安全)""" diff --git a/App/lib/core/Gen/Class/ClassGenVTable.vp b/App/lib/core/Gen/Class/ClassGenVTable.vp index 942ea08..17cfa51 100644 --- a/App/lib/core/Gen/Class/ClassGenVTable.vp +++ b/App/lib/core/Gen/Class/ClassGenVTable.vp @@ -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 diff --git a/App/lib/core/Gen/Expr/ExprGenBase.vp b/App/lib/core/Gen/Expr/ExprGenBase.vp index 489c2bc..cf0a29b 100644 --- a/App/lib/core/Gen/Expr/ExprGenBase.vp +++ b/App/lib/core/Gen/Expr/ExprGenBase.vp @@ -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 diff --git a/App/lib/core/Gen/Expr/ExprGenCls.vp b/App/lib/core/Gen/Expr/ExprGenCls.vp index 884ea58..9024ce3 100644 --- a/App/lib/core/Gen/Expr/ExprGenCls.vp +++ b/App/lib/core/Gen/Expr/ExprGenCls.vp @@ -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: diff --git a/App/lib/core/Gen/Expr/ExprGenOps.vp b/App/lib/core/Gen/Expr/ExprGenOps.vp index c048835..dbb6869 100644 --- a/App/lib/core/Gen/Expr/ExprGenOps.vp +++ b/App/lib/core/Gen/Expr/ExprGenOps.vp @@ -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 diff --git a/App/lib/core/Gen/ImportsGenMixin.vp b/App/lib/core/Gen/ImportsGenMixin.vp index a207129..74e3a10 100644 --- a/App/lib/core/Gen/ImportsGenMixin.vp +++ b/App/lib/core/Gen/ImportsGenMixin.vp @@ -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) diff --git a/App/lib/core/Gen/Stmt/StmtGenMixin.vp b/App/lib/core/Gen/Stmt/StmtGenMixin.vp index b617ddd..4ae1163 100644 --- a/App/lib/core/Gen/Stmt/StmtGenMixin.vp +++ b/App/lib/core/Gen/Stmt/StmtGenMixin.vp @@ -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__") diff --git a/App/lib/core/Gen/StructGenMixin.vp b/App/lib/core/Gen/StructGenMixin.vp index a5aa914..4d6c150 100644 --- a/App/lib/core/Gen/StructGenMixin.vp +++ b/App/lib/core/Gen/StructGenMixin.vp @@ -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=未找到""" diff --git a/App/lib/core/Gen/Type/TypeSpec.vp b/App/lib/core/Gen/Type/TypeSpec.vp index 3bfd9d9..0d31fb0 100644 --- a/App/lib/core/Gen/Type/TypeSpec.vp +++ b/App/lib/core/Gen/Type/TypeSpec.vp @@ -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) # ============================================================ diff --git a/App/lib/core/Repl.vp b/App/lib/core/Repl.vp index ff7f6e0..63d51b9 100644 --- a/App/lib/core/Repl.vp +++ b/App/lib/core/Repl.vp @@ -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, " ")