fix(define): _try_resolve_nested_cdefine 复用 _make_define_constant,消除模块属性 CDefine 的位宽误判

模块属性访问(win32.win32file.GENERIC_READ)走的是 _try_resolve_nested_cdefine,其内部三处常量物化仍用 val > 0x7FFFFFFF 判 i64,绕过 _make_define_constant 的按值推断;导致 0x80000000 等无符号 32 位 define 变 i64、与 32 位使用点组合时报「64→32 隐式窄化」。改为委托 _make_define_constant(带声明类型按声明位宽,否则按值推断)
This commit is contained in:
TermiNexus committed 2026-10-11 11:51:31 +08:00
1 parent 7a061d4d49
commit 3122793139
1 file changed
+7 -9
+7 -9
View File
@@ -2227,9 +2227,9 @@ class ExprAttrHandle(BaseHandle):
if SymInfo and SymInfo.IsDefine and SymInfo.DefineValue is not None:
val: Any = SymInfo.DefineValue
if isinstance(val, int):
if val > 0x7FFFFFFF or val < -0x80000000:
return ir.Constant(ir.IntType(64), val & 0xFFFFFFFFFFFFFFFF)
return ir.Constant(ir.IntType(32), val)
# 复用 _make_define_constant:带声明类型按声明位宽,否则按值推断
# (含无符号 32 位高半区),与本文件其它 CDefine 解析点同口径。
return self._make_define_constant(Gen, val, attr_name)
elif isinstance(val, float):
return ir.Constant(ir.FloatType(), val)
# 回退:检查 Gen._define_constants(LlvmGenerator 预扫描阶段填充)
@@ -2238,9 +2238,9 @@ class ExprAttrHandle(BaseHandle):
if key in define_constants:
val: Any = define_constants[key]
if isinstance(val, int):
if val > 0x7FFFFFFF or val < -0x80000000:
return ir.Constant(ir.IntType(64), val & 0xFFFFFFFFFFFFFFFF)
return ir.Constant(ir.IntType(32), val)
# 复用 _make_define_constant:带声明类型按声明位宽,否则按值推断
# (含无符号 32 位高半区),与本文件其它 CDefine 解析点同口径。
return self._make_define_constant(Gen, val, attr_name)
elif isinstance(val, float):
return ir.Constant(ir.FloatType(), val)
# 回退:_all_define_constants(Phase2Translator 从所有 .pyi 预提取的跨模块 CDefine,
@@ -2256,9 +2256,7 @@ class ExprAttrHandle(BaseHandle):
if key2 in all_dc:
val2: Any = all_dc[key2]
if isinstance(val2, int):
if val2 > 0x7FFFFFFF or val2 < -0x80000000:
return ir.Constant(ir.IntType(64), val2 & 0xFFFFFFFFFFFFFFFF)
return ir.Constant(ir.IntType(32), val2)
return self._make_define_constant(Gen, val2, attr_name)
elif isinstance(val2, float):
return ir.Constant(ir.FloatType(), val2)
return None