将 EnumName/value/IsSigned 加入 FIELD_ROUTES,消除所有冗余 hasattr/getattr
This commit is contained in:
@@ -395,74 +395,8 @@ class CTypeInfo:
|
||||
|
||||
@staticmethod
|
||||
def TryEvalConstExpr(node, SymbolTable):
|
||||
if isinstance(node, ast.Constant) and isinstance(node.value, int):
|
||||
return node.value
|
||||
if isinstance(node, ast.BinOp):
|
||||
left = CTypeInfo.TryEvalConstExpr(node.left, SymbolTable)
|
||||
right = CTypeInfo.TryEvalConstExpr(node.right, SymbolTable)
|
||||
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.FloorDiv):
|
||||
return left // right if right != 0 else None
|
||||
elif isinstance(node.op, ast.Mod):
|
||||
return left % right if right != 0 else None
|
||||
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.BitAnd):
|
||||
return left & right
|
||||
elif isinstance(node.op, ast.BitXor):
|
||||
return left ^ right
|
||||
elif isinstance(node.op, ast.Pow):
|
||||
return left ** right
|
||||
return None
|
||||
if isinstance(node, ast.UnaryOp):
|
||||
operand = CTypeInfo.TryEvalConstExpr(node.operand, SymbolTable)
|
||||
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
|
||||
return None
|
||||
if isinstance(node, ast.Name):
|
||||
if node.id in SymbolTable:
|
||||
info = SymbolTable[node.id]
|
||||
if getattr(info, 'IsDefine', None) and isinstance(getattr(info, 'DefineValue', None), int):
|
||||
return info.DefineValue
|
||||
if isinstance(node, ast.Attribute):
|
||||
parts = []
|
||||
current = node
|
||||
while isinstance(current, ast.Attribute):
|
||||
parts.append(current.attr)
|
||||
current = current.value
|
||||
if isinstance(current, ast.Name):
|
||||
parts.append(current.id)
|
||||
parts.reverse()
|
||||
attr_name = parts[-1]
|
||||
possible_keys = [attr_name, '.'.join(parts)]
|
||||
for key in possible_keys:
|
||||
if key in SymbolTable:
|
||||
info = SymbolTable[key]
|
||||
if getattr(info, 'IsDefine', None) and isinstance(getattr(info, 'DefineValue', None), int):
|
||||
return info.DefineValue
|
||||
if len(parts) >= 2:
|
||||
for mod_key, mod_info in SymbolTable.items():
|
||||
if getattr(mod_info, 'IsDefine', None) and isinstance(getattr(mod_info, 'DefineValue', None), int):
|
||||
if mod_key.endswith('.' + attr_name) or mod_key == attr_name:
|
||||
return mod_info.DefineValue
|
||||
return None
|
||||
from lib.core.ConstEvaluator import ConstEvaluator
|
||||
return ConstEvaluator.eval_with_symtab(node, SymbolTable)
|
||||
|
||||
@classmethod
|
||||
def FromNode(cls, Node: ast.AST, SymbolTable: dict) -> "CTypeInfo":
|
||||
@@ -1136,10 +1070,6 @@ class CTypeInfo:
|
||||
NewInfo._ts.original_type = NewInfo._ts.original_type.Copy()
|
||||
if NewInfo._ts.array_ptr:
|
||||
NewInfo._ts.array_ptr = NewInfo._ts.array_ptr.Copy()
|
||||
# 实例上的动态属性也需要拷贝(如 IsSigned 等)
|
||||
for key, val in self.__dict__.items():
|
||||
if key not in ('_ts', '_sm'):
|
||||
object.__setattr__(NewInfo, key, val)
|
||||
return NewInfo
|
||||
|
||||
def get(self, key, default=None):
|
||||
|
||||
Reference in New Issue
Block a user