fix(attr): 模块属性访问的 CDefine 查询补 _all_define_constants 回退
上一提交只补了 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。
This commit is contained in:
1 parent
1050e5a23a
commit
936a43f543
1 file changed
+12
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user