fix(tpv): extern declare 返回类型含真实类型时不再误归 Void + 白名单兜底

vpi 注入 extern declare 时 has_state→Void 无条件触发:注解 HANDLE | t.State(FindFirstFileA/GetStdHandle)被归为 void → declare 返回 void,运行期 FindFirstFileA 句柄丢失 → 文件存在性判断失效(文件实际存在但报不存在)。修复:仅纯标记注解归 Void;含真实类型但解析 miss 时回退外部函数返回类型白名单(FindFirstFileA/GetStdHandle→i8*),GenApi 新增 infer_external_func_ret_ty 委托。
This commit is contained in:
TermiNexus committed 2026-08-29 12:03:12 +08:00
1 parent efc8f7948f
commit 2b2c242d14
2 files changed
+39 -1

No files matched your search

+18
View File
@@ -126,6 +126,24 @@ def resolve_typedef_or_map(pool: memhub.MemBuddy | t.CPtr,
return None
# ---------------- infer_external_func_ret_ty(委托 CallGenLib._infer_external_func_ret_ty) ----------------
def infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr,
func_name: str) -> llvmlite.LLVMType | t.CPtr:
"""委托到 gen.CallGenLib._infer_external_func_ret_ty(外部函数返回类型白名单)
vpi 注入 extern declare 时返回类型解析 miss 的兜底:FindFirstFileA/
GetStdHandle 等 Win32 HANDLE 返回函数 → i8*,避免默认 i32/void 导致
声明签名错误(运行期 FindFirstFileA 句柄丢失 → 文件存在性判断失效根因)。
fatal_if_unknown=0:白名单未命中返回默认 i32(不 fail-fast,注入上下文
无法收敛判断交给调用侧)。
"""
import lib.core.Gen.Generator as Generator
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
if g is not None:
return g.CallGenLib._infer_external_func_ret_ty(pool, func_name, None, 0)
return None
# ---------------- get_current_file(委托 TypeGenResolve.get_current_file) ----------------
def get_current_file() -> str:
"""委托到 gen.get_current_file(原 Handles 壳)"""