将 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

@@ -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):