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)