将 EnumName/value/IsSigned 加入 FIELD_ROUTES,消除所有冗余 hasattr/getattr
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user