fix(ffilib): 把 _ffilib 拉进依赖闭包(Pass 0 pending + import 白名单)

thunk 生成时报 module _ffilib 未在 includes 扫描中:includes 是按需可达性扫描,没有任何文件 import _ffilib 就不会收录它。Pass 0 的 import 处理里对 ffilib 追加 pending(_ffilib);_check_import_sha1 也放行 _ffilib(防止显式 import 时报无 SHA1)。若可达性仍不生效,改用方案 B:thunk 直接调 LoadLibraryA/GetProcAddress(裸名、无需模块 SHA1),去掉对 _ffilib 的依赖。
This commit is contained in:
TermiNexus committed 2026-10-24 23:15:31 +08:00
1 parent ecd4a0b14a
commit 2411ceff8c
2 files changed
+7

No files matched your search

+3
View File
@@ -556,6 +556,9 @@ novirtual class ImportsGenMixin:
if string.strcmp(mod_name, "ctraits") == 0: return 1
if string.strcmp(mod_name, "viperbuild") == 0: return 1
if string.strcmp(mod_name, "ffilib") == 0: return 1
# runtime CDLL 的 thunk 会调用 _ffilib(真实运行时库),把它登记为已导入模块,
# 让按需可达性扫描收录它并分配 SHA1(否则 thunk 生成时报 module not found)。
if string.strcmp(mod_name, "_ffilib") == 0: return 1
mod_sha1: str = StubMergerStore.LookupSha1ByModName(mod_name)
if mod_sha1 is None:
# App sibling exemption: a {mod_name}.vp/.py exists next to the current file
+4
View File
@@ -10,6 +10,7 @@ import lib.Projectrans.Utils as Utils
import lib.Projectrans.Config as Config
import lib.core.VLogger as VLogger
import lib.core.IncludesScanner as IncludesScanner
import stdio
# kernel32!GetEnvironmentVariableA (DWORD(LPCSTR, LPSTR, DWORD)) - declared here, same as includes/traceback.vp;
# win32base.vp omits it but kernel32 is linked anyway; only for selfmachine host detection.
@@ -465,6 +466,9 @@ def _HandleImport(stmt: ast.Import*) -> int:
# 宏库:不参与 BFS,只记别名(CDLL 语句由 _HandleCDLL 抽取)
if al.asname is not None: _ffi_alias = _DupScratch(al.asname)
else: _ffi_alias = _DupScratch("ffilib")
# runtime CDLL 的 thunk 要调 _ffilib(真实运行时库):显式加入闭包,
# 否则按需可达性扫描不会收录它,_resolve_module_sha1("_ffilib") 会返回 None。
_AddPending("_ffilib")
else: _AddPending(al.name)
return 0