将 EnumName/value/IsSigned 加入 FIELD_ROUTES,消除所有冗余 hasattr/getattr

This commit is contained in:
2026-06-18 19:09:50 +08:00
parent f99666420b
commit d7b98cc9c5
33 changed files with 1722 additions and 1200 deletions

View File

@@ -440,8 +440,8 @@ class AssignHandle:
sym_key = f"{ModulePath}.{FuncName}"
sym_info = self.Trans.SymbolTable.get(sym_key)
if sym_info and sym_info.IsFunction:
ret_type_info = getattr(sym_info, 'FuncPtrReturn', None)
param_type_infos = [pt for _, pt in getattr(sym_info, 'FuncPtrParams', [])]
ret_type_info = sym_info.FuncPtrReturn
param_type_infos = [pt for _, pt in (sym_info.FuncPtrParams or [])]
if ret_type_info:
if isinstance(ret_type_info, CTypeInfo) and ret_type_info.BaseType:
ret_type = ret_type_info.ToLLVM(Gen)
@@ -616,7 +616,7 @@ class AssignHandle:
if ClassName and ClassName in Gen.structs:
PropKey = f'{ClassName}.{AttrName}'
PropInfo = self.Trans.SymbolTable.get(PropKey)
if PropInfo and hasattr(PropInfo, 'MetaList') and FuncMeta.PROPERTY_SETTER in PropInfo.MetaList:
if PropInfo and PropInfo.MetaList and FuncMeta.PROPERTY_SETTER in PropInfo.MetaList:
SelfVar = Gen._get_var_ptr('self')
if SelfVar:
SelfPtr = Gen._load(SelfVar, name="self")
@@ -734,7 +734,7 @@ class AssignHandle:
if ClassName and ClassName in Gen.structs:
PropKey = f'{ClassName}.{AttrName}'
PropInfo = self.Trans.SymbolTable.get(PropKey)
if PropInfo and hasattr(PropInfo, 'MetaList') and FuncMeta.PROPERTY_SETTER in PropInfo.MetaList:
if PropInfo and PropInfo.MetaList and FuncMeta.PROPERTY_SETTER in PropInfo.MetaList:
ObjVal = self.Trans.ExprHandler.HandleExprLlvm(Target.value)
SetterFunc = Gen._get_function(PropKey + '$set')
if SetterFunc and ObjVal:
@@ -1222,7 +1222,7 @@ class AssignHandle:
elif isinstance(count_node, ast.Name):
if count_node.id in self.Trans.SymbolTable:
SymInfo = self.Trans.SymbolTable[count_node.id]
if isinstance(getattr(SymInfo, 'value', None), int):
if isinstance(SymInfo.value, int):
ArrayCount = SymInfo.value
if ArrayCount == 1 and count_node.id in getattr(Gen, '_define_constants', {}):
DefVal = Gen._define_constants[count_node.id]
@@ -1558,94 +1558,10 @@ class AssignHandle:
Gen.variables[VarName] = GlobalVar
def _eval_const_expr(self, node, Gen):
"""计算常量表达式的值"""
import ast
if isinstance(node, ast.Constant):
return node.value
elif isinstance(node, ast.BinOp):
left = self._eval_const_expr(node.left, Gen)
right = self._eval_const_expr(node.right, Gen)
if left is None or right is None:
return None
if isinstance(node.op, ast.Add):
return left + right
elif isinstance(node.op, ast.Sub):
return left - right
elif isinstance(node.op, ast.Mult):
return left * right
elif isinstance(node.op, ast.Div):
return left // right if isinstance(left, int) and isinstance(right, int) else left / right
elif isinstance(node.op, ast.FloorDiv):
return left // right
elif isinstance(node.op, ast.Mod):
return left % right
elif isinstance(node.op, ast.Pow):
return left ** right
elif isinstance(node.op, ast.LShift):
return left << right
elif isinstance(node.op, ast.RShift):
return left >> right
elif isinstance(node.op, ast.BitOr):
return left | right
elif isinstance(node.op, ast.BitXor):
return left ^ right
elif isinstance(node.op, ast.BitAnd):
return left & right
elif isinstance(node, ast.UnaryOp):
operand = self._eval_const_expr(node.operand, Gen)
if operand is None:
return None
if isinstance(node.op, ast.USub):
return -operand
elif isinstance(node.op, ast.UAdd):
return +operand
elif isinstance(node.op, ast.Invert):
return ~operand
elif isinstance(node, ast.Name):
if node.id in getattr(Gen, '_define_constants', {}):
return Gen._define_constants[node.id]
if node.id in self.Trans.SymbolTable:
SymInfo = self.Trans.SymbolTable[node.id]
val = getattr(SymInfo, 'value', None)
if isinstance(val, (int, float)):
return val
if getattr(SymInfo, 'IsDefine', None) and isinstance(getattr(SymInfo, 'DefineValue', None), (int, float)):
return SymInfo.DefineValue
elif isinstance(node, ast.Attribute):
module_name = node.value.id if isinstance(node.value, ast.Name) else None
attr_name = node.attr
if module_name and attr_name:
combined_key = f"{module_name}.{attr_name}"
if combined_key in getattr(Gen, '_define_constants', {}):
val = Gen._define_constants[combined_key]
if isinstance(val, (int, float)):
return int(val) if isinstance(val, float) and val == int(val) else val
for key, SymInfo in self.Trans.SymbolTable.items():
if key.endswith(f".{combined_key}") or key == combined_key:
if getattr(SymInfo, 'IsDefine', None) and isinstance(getattr(SymInfo, 'DefineValue', None), (int, float)):
return int(SymInfo.DefineValue) if isinstance(SymInfo.DefineValue, float) and SymInfo.DefineValue == int(SymInfo.DefineValue) else SymInfo.DefineValue
all_dc = getattr(self.Trans, '_all_define_constants', None) or getattr(Gen, '_all_define_constants', {})
if combined_key in all_dc:
val = all_dc[combined_key]
if isinstance(val, (int, float)):
return int(val) if isinstance(val, float) and val == int(val) else val
if attr_name in all_dc:
val = all_dc[attr_name]
if isinstance(val, (int, float)):
return int(val) if isinstance(val, float) and val == int(val) else val
for dc_key, dc_val in all_dc.items():
if dc_key == attr_name or dc_key.endswith(f".{attr_name}"):
if isinstance(dc_val, (int, float)):
return int(dc_val) if isinstance(dc_val, float) and dc_val == int(dc_val) else dc_val
if attr_name in self.Trans.SymbolTable:
SymInfo = self.Trans.SymbolTable[attr_name]
if getattr(SymInfo, 'IsDefine', None) and isinstance(getattr(SymInfo, 'DefineValue', None), (int, float)):
return int(SymInfo.DefineValue) if isinstance(SymInfo.DefineValue, float) and SymInfo.DefineValue == int(SymInfo.DefineValue) else SymInfo.DefineValue
if attr_name in getattr(Gen, '_define_constants', {}):
val = Gen._define_constants[attr_name]
if isinstance(val, (int, float)):
return int(val) if isinstance(val, float) and val == int(val) else val
return None
"""计算常量表达式的值(委托到 ConstEvaluator"""
from lib.core.ConstEvaluator import ConstEvaluator, EvalContext
ctx = EvalContext(Gen=Gen, symtab=self.Trans.SymbolTable)
return ConstEvaluator.eval_full(node, ctx)
def _eval_global_count(self, node, Gen):
val = self._eval_const_expr(node, Gen)