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: