From 936a43f54399b60250c479447c00cf3e14cfcd79 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 10 Oct 2026 20:46:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(attr):=20=E6=A8=A1=E5=9D=97=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E8=AE=BF=E9=97=AE=E7=9A=84=20CDefine=20=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E8=A1=A5=20=5Fall=5Fdefine=5Fconstants=20=E5=9B=9E?= =?UTF-8?q?=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一提交只补了 3 级路径 _try_resolve_nested_cdefine,而 win32file.STD_OUTPUT_HANDLE 是 2 级访问 → 走 _handle_attr_name → _lookup_cdefine,该函数只查 SymbolTable/_define_constants,没有裸名路径已有的 _all_define_constants 回退。includes 的 vpi 模块不会在 SymbolTable 里登记 IsDefine,于是解析落空 → _lookup_module_global 现造一个无定义的 @STD_OUTPUT_HANDLE → 链接期 undefined symbol。补回退(仅在无同名变量/全局时),覆盖 STD_INPUT/OUTPUT/ERROR_HANDLE。 --- lib/core/Handles/HandlesExprAttr.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/core/Handles/HandlesExprAttr.py b/lib/core/Handles/HandlesExprAttr.py index 3407c93..426184d 100644 --- a/lib/core/Handles/HandlesExprAttr.py +++ b/lib/core/Handles/HandlesExprAttr.py @@ -425,6 +425,18 @@ class ExprAttrHandle(BaseHandle): for key in (f"{VarName}.{AttrName}", AttrName): if key in define_constants: return self._make_define_constant(Gen, define_constants[key]) + # 回退:_all_define_constants(Phase2Translator 从所有 .pyi 预提取的跨模块 CDefine, + # 与 _HandleNameLlvm 的裸名回退同源)。**模块属性访问**(`win32file.STD_OUTPUT_HANDLE`) + # 此前只查 SymbolTable/_define_constants → 未命中就落到 _lookup_module_global 生成 + # `@STD_OUTPUT_HANDLE` 全局引用(无定义 → 链接期 undefined symbol)。 + # 与裸名路径同口径:仅当本模块没有同名变量/全局时才用常量(避免遮蔽真正的模块全局)。 + _has_shadow: bool = AttrName in Gen.variables \ + or (hasattr(Gen, 'module') and AttrName in getattr(Gen.module, 'globals', {})) + if not _has_shadow: + all_dc: dict[str, Any] = getattr(Gen, '_all_define_constants', None) or getattr(self.Trans, '_all_define_constants', None) or {} + for key2 in (f"{VarName}.{AttrName}", AttrName): + if key2 in all_dc: + return self._make_define_constant(Gen, all_dc[key2]) return None def _NormalizeModuleGlobalValue(self, Gen: LlvmCodeGenerator, Val: Any, AttrName: str) -> Any: