fix(ffilib): 仅在 runtime=True 时引入 _ffilib 运行时依赖
runtime CDLL 的 thunk 需要 _ffilib.Load/Sym,但 includes 是按需可达性扫描:没有 import _ffilib 就不会收录、拿不到 SHA1。改为在 _RegisterFfiHandle 里按 runtime 判定——runtime=True 才 _AddPending("_ffilib"),纯链接期(runtime=False)的工程不会多编译这个运行时库。_check_import_sha1 也放行 _ffilib(它由生成代码引用,不是用户手写 import)。
This commit is contained in:
1 parent
2411ceff8c
commit
796a2f5921
1 file changed
+6
-4
@@ -463,12 +463,11 @@ def _HandleImport(stmt: ast.Import*) -> int:
|
||||
if al.asname is not None: _alias = _DupScratch(al.asname)
|
||||
else: _alias = _DupScratch("viperbuild")
|
||||
elif string.strcmp(al.name, "ffilib") == 0:
|
||||
# 宏库:不参与 BFS,只记别名(CDLL 语句由 _HandleCDLL 抽取)
|
||||
# 宏库:不参与 BFS,只记别名(CDLL 语句由 _HandleCDLL 抽取)。
|
||||
# _ffilib 的依赖只在真正出现 runtime=True 的 CDLL 时才加(见 _RegisterFfiHandle),
|
||||
# 纯链接期(runtime=False)的工程不需要编译这个运行时库。
|
||||
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
|
||||
|
||||
@@ -975,6 +974,9 @@ def _RegisterFfiHandle(handle: str, runtime: int, path: str) -> None:
|
||||
_ffi_handles_names.append(nm)
|
||||
_ffi_handles_rt.append(runtime)
|
||||
_ffi_handles_path.append(pth)
|
||||
# runtime=True:thunk 运行期要调 _ffilib.Load/Sym,把该运行时库加入依赖闭包
|
||||
# (按需可达性扫描只收录被 import 的模块,否则 _resolve_module_sha1("_ffilib") 为 None)。
|
||||
if runtime != 0: _AddPending("_ffilib")
|
||||
|
||||
|
||||
# _AssignTargetName - 取 `x = ...` 的赋值目标名;非简单 Name 时返回 None
|
||||
|
||||
Reference in new issue
Block a user