From 2caf6f07955f8f8628be0714ab8bf587b479619d Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 24 Oct 2026 23:20:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(ffilib):=20runtime=3DTrue=20=E6=97=B6?= =?UTF-8?q?=E6=8A=8A=20=5Fffilib=20=E7=99=BB=E8=AE=B0=E4=B8=BA=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E6=A8=A1=E5=9D=97=EF=BC=8C=E8=BF=9B=E5=85=A5=E5=8F=AF?= =?UTF-8?q?=E8=BE=BE=E6=80=A7=E6=89=AB=E6=8F=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pass 0 的 _AddPending 只影响 viperbuild 的闭包 BFS,不影响 Phase1/Phase2 的 includes 可达性扫描(后者由 tr._imported_modules 驱动),所以 _ffilib 仍然没被收录、拿不到 SHA1。改为在 translate_import 里判断:若存在 runtime=True 的句柄(ViperBuild.HasRuntimeFfiHandle),则随 import ffilib 一并 NotePlainImport("_ffilib")。 --- App/lib/core/Gen/ImportsGenMixin.vp | 7 ++++++- App/lib/core/builtin/ViperBuild.vp | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/App/lib/core/Gen/ImportsGenMixin.vp b/App/lib/core/Gen/ImportsGenMixin.vp index 64a7260..4408f3d 100644 --- a/App/lib/core/Gen/ImportsGenMixin.vp +++ b/App/lib/core/Gen/ImportsGenMixin.vp @@ -11,7 +11,8 @@ import sys import win32.fileio as fileio import lib.Stub.StubMerger as StubMerger import lib.core.CompilerFactory as CompilerFactory -import lib.core.Gen.Translator as HT +import lib.core.Gen.Translator as HT +import lib.core.builtin.ViperBuild as ViperBuild import lib.Stub.StubMerger.StubMergerStore as StubMergerStore import lib.core.VLogger as VLogger @@ -589,6 +590,10 @@ novirtual class ImportsGenMixin: # declare_only=1/2 is the pre-registration scan and would false-positive. if trans._declare_only == 0: self._check_import_sha1(node, alias.name) StubMergerStore.NotePlainImport(pool_val, ctx, alias.name, alias.asname) + # runtime CDLL 的 thunk 要调 _ffilib:只要存在 runtime=True 的句柄, + # 就把该运行时库登记成导入模块,让可达性扫描收录它并分配 SHA1。 + if string.strcmp(alias.name, "ffilib") == 0: + if ViperBuild.HasRuntimeFfiHandle() != 0: StubMergerStore.NotePlainImport(pool_val, ctx, "_ffilib", None) trans._imported_modules = ctx.ImportedModules trans._from_imports = ctx.FromImports return 0 diff --git a/App/lib/core/builtin/ViperBuild.vp b/App/lib/core/builtin/ViperBuild.vp index 5b09fb9..76bb816 100644 --- a/App/lib/core/builtin/ViperBuild.vp +++ b/App/lib/core/builtin/ViperBuild.vp @@ -1079,6 +1079,17 @@ def IsCdlLDeclCall(node: ast.AST*) -> int: return _IsCDLLCall(node) +# HasRuntimeFfiHandle - 是否存在 runtime=True 的 CDLL 句柄(决定是否要引入 _ffilib 依赖) +def HasRuntimeFfiHandle() -> int: + """至少一个句柄 runtime=1 时返回 1""" + global _ffi_handles_rt + if _ffi_handles_rt is None: return 0 + n: sizet = _ffi_handles_rt.__len__() + for i in range(int(n)): + if _ffi_handles_rt.get(i) != 0: return 1 + return 0 + + # FfiHandlePath - 查询 extern name(...) 的库路径(runtime=True 的 thunk 用它 LoadLibraryA) def FfiHandlePath(name: str) -> str: """库路径;未登记返回 None"""