Some simple information syncing
This commit is contained in:
@@ -328,9 +328,14 @@ class ExprHandle(BaseHandle):
|
||||
def _HandleNameLlvm(self, Node: ast.Name, VarType: ir.Type | str | None = None) -> ir.Value:
|
||||
Gen: LlvmCodeGenerator = self.Trans.LlvmGen
|
||||
VarName: str = Node.id
|
||||
# [CD] 诊断:仅对关键常量输出(FOREGROUND_*, BACKGROUND_*, STD_*, *HANDLE*)
|
||||
import sys as _sys
|
||||
_is_cd_key: bool = isinstance(VarName, str) and (VarName.startswith('FOREGROUND_') or VarName.startswith('BACKGROUND_') or 'STD_' in VarName or 'HANDLE' in VarName)
|
||||
define_constants: dict[str, Any] = getattr(Gen, '_define_constants', {})
|
||||
if VarName in define_constants:
|
||||
val: Any = define_constants[VarName]
|
||||
if _is_cd_key:
|
||||
print(f"[CD] lookup: '{VarName}' found in _define_constants val={val}", file=_sys.stderr, flush=True)
|
||||
if isinstance(val, int):
|
||||
# Use VarType hint if available to avoid unnecessary type mismatch
|
||||
if VarType is not None and isinstance(VarType, ir.IntType):
|
||||
@@ -347,11 +352,13 @@ class ExprHandle(BaseHandle):
|
||||
elif isinstance(val, str):
|
||||
return Gen._create_string_global(val)
|
||||
# 如果 _define_constants 中没有,尝试从符号表查找
|
||||
if VarName not in getattr(Gen, '_define_constants', {}):
|
||||
if VarName not in define_constants:
|
||||
try:
|
||||
sym_info: Any = self.translator.SymbolTable.lookup(VarName)
|
||||
sym_info: Any = self.Trans.SymbolTable.lookup(VarName)
|
||||
if sym_info and sym_info.IsDefine and sym_info.DefineValue is not None:
|
||||
val = sym_info.DefineValue
|
||||
if _is_cd_key:
|
||||
print(f"[CD] lookup: '{VarName}' found in SymbolTable val={val}", file=_sys.stderr, flush=True)
|
||||
if isinstance(val, int):
|
||||
# Use VarType hint if available
|
||||
if VarType is not None and isinstance(VarType, ir.IntType):
|
||||
@@ -363,9 +370,32 @@ class ExprHandle(BaseHandle):
|
||||
return ir.Constant(ir.DoubleType(), val)
|
||||
elif isinstance(val, str):
|
||||
return Gen._create_string_global(val)
|
||||
elif _is_cd_key:
|
||||
print(f"[CD] lookup: '{VarName}' NOT in SymbolTable", file=_sys.stderr, flush=True)
|
||||
except Exception as _e:
|
||||
if _config_mode == "strict":
|
||||
self.Trans.LogWarning(f"异常被忽略: {_e}")
|
||||
# 治本修复:如果符号表也没有,回退查询 _all_define_constants
|
||||
# _all_define_constants 由 Phase2Translator 从所有 .pyi 文件预提取,
|
||||
# 包含跨模块导入的 CDefine 常量(如 FOREGROUND_GREEN、STD_OUTPUT_HANDLE)
|
||||
if VarName not in define_constants:
|
||||
all_dc: dict[str, Any] = getattr(Gen, '_all_define_constants', None) or getattr(self.Trans, '_all_define_constants', None) or {}
|
||||
if VarName in all_dc:
|
||||
val: Any = all_dc[VarName]
|
||||
if _is_cd_key:
|
||||
print(f"[CD] lookup: '{VarName}' found in _all_define_constants val={val}", file=_sys.stderr, flush=True)
|
||||
if isinstance(val, int):
|
||||
if VarType is not None and isinstance(VarType, ir.IntType):
|
||||
return ir.Constant(VarType, val & ((1 << VarType.width) - 1))
|
||||
if val < -(1 << 31) or val > 0xFFFFFFFF:
|
||||
return ir.Constant(ir.IntType(64), val & 0xFFFFFFFFFFFFFFFF)
|
||||
return ir.Constant(ir.IntType(32), val & 0xFFFFFFFF)
|
||||
elif isinstance(val, float):
|
||||
return ir.Constant(ir.DoubleType(), val)
|
||||
elif isinstance(val, str):
|
||||
return Gen._create_string_global(val)
|
||||
elif _is_cd_key:
|
||||
print(f"[CD] lookup: '{VarName}' NOT found in ANY CDefine table", file=_sys.stderr, flush=True)
|
||||
# 优先检查 variables(alloca),因为变量可能已被 += 等操作迁移到 variables
|
||||
if VarName in Gen.variables and Gen.variables[VarName] is not None:
|
||||
VarPtr: Any = Gen.variables[VarName]
|
||||
@@ -410,7 +440,18 @@ class ExprHandle(BaseHandle):
|
||||
return GVar
|
||||
return Gen._load(GVar, name=VarName)
|
||||
if VarName == 'self':
|
||||
return Gen.GetVarPtr('self')
|
||||
# 治本修复:方法名为 _get_var_ptr(小写),原 GetVarPtr 不存在会抛 AttributeError。
|
||||
# 当 self 未注册到 variables 时(如 opaque struct 参数走了 else 分支),
|
||||
# 通过 _get_var_ptr 兜底返回 None,由调用方处理。
|
||||
SelfPtr: ir.Value | None = Gen._get_var_ptr('self')
|
||||
if SelfPtr is not None:
|
||||
return SelfPtr
|
||||
# 最终兜底:若 _get_var_ptr 返回 None(self 既不在 _reg_values 也不在 variables),
|
||||
# 直接返回函数参数本身(LLVM Argument)。这避免了 AttributeError 导致的异常路径。
|
||||
for arg in getattr(Gen.func, 'args', []):
|
||||
if getattr(arg, 'name', None) == 'self':
|
||||
return arg
|
||||
return ir.Constant(ir.IntType(32), 0)
|
||||
if Gen._has_function(VarName):
|
||||
func: Any = Gen._get_function(VarName)
|
||||
if func:
|
||||
|
||||
Reference in New Issue
Block a user