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)
|
||||
|
||||
Reference in new issue
Block a user