From 3122793139278dcd8c1d1aad968c480fdb181a83 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sun, 11 Oct 2026 11:51:31 +0800 Subject: [PATCH] =?UTF-8?q?fix(define):=20=5Ftry=5Fresolve=5Fnested=5Fcdef?= =?UTF-8?q?ine=20=E5=A4=8D=E7=94=A8=20=5Fmake=5Fdefine=5Fconstant=EF=BC=8C?= =?UTF-8?q?=E6=B6=88=E9=99=A4=E6=A8=A1=E5=9D=97=E5=B1=9E=E6=80=A7=20CDefin?= =?UTF-8?q?e=20=E7=9A=84=E4=BD=8D=E5=AE=BD=E8=AF=AF=E5=88=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 模块属性访问(win32.win32file.GENERIC_READ)走的是 _try_resolve_nested_cdefine,其内部三处常量物化仍用 val > 0x7FFFFFFF 判 i64,绕过 _make_define_constant 的按值推断;导致 0x80000000 等无符号 32 位 define 变 i64、与 32 位使用点组合时报「64→32 隐式窄化」。改为委托 _make_define_constant(带声明类型按声明位宽,否则按值推断) --- lib/core/Handles/HandlesExprAttr.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/core/Handles/HandlesExprAttr.py b/lib/core/Handles/HandlesExprAttr.py index b19db18..615f926 100644 --- a/lib/core/Handles/HandlesExprAttr.py +++ b/lib/core/Handles/HandlesExprAttr.py @@ -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