将 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

@@ -92,7 +92,7 @@ class ExprAttrHandle(BaseHandle):
PossibleKeys.append(key)
for lookup_key in PossibleKeys:
SymInfo = self.Trans.SymbolTable.get(lookup_key)
if SymInfo and getattr(SymInfo, 'IsDefine', None) and getattr(SymInfo, 'DefineValue', None) is not None:
if SymInfo and SymInfo.IsDefine and SymInfo.DefineValue is not None:
return self._make_define_constant(Gen, SymInfo.DefineValue)
# 也检查 _define_constants
define_constants = getattr(Gen, '_define_constants', {})
@@ -202,7 +202,7 @@ class ExprAttrHandle(BaseHandle):
# 检查 property getter
PropKey = f'{ClassName}.{Node.attr}'
PropInfo = self.Trans.SymbolTable.get(PropKey)
if PropInfo and hasattr(PropInfo, 'MetaList') and FuncMeta.PROPERTY_GETTER in PropInfo.MetaList:
if PropInfo and PropInfo.MetaList and FuncMeta.PROPERTY_GETTER in PropInfo.MetaList:
SelfVar = Gen._get_var_ptr('self')
if SelfVar:
SelfPtr = Gen._load(SelfVar, name="self")
@@ -234,16 +234,16 @@ class ExprAttrHandle(BaseHandle):
def _handle_attr_enum(self, Node, VarName):
"""处理枚举成员访问 (VarName 是枚举类型名)"""
SymInfo = self.Trans.SymbolTable.get(VarName)
if not SymInfo or not getattr(SymInfo, 'IsEnum', None):
if not SymInfo or not SymInfo.IsEnum:
return None
if Node.attr in self.Trans.SymbolTable:
MemberInfo = self.Trans.SymbolTable[Node.attr]
if getattr(MemberInfo, 'IsEnumMember', None) and getattr(MemberInfo, 'EnumName', None) == VarName:
if isinstance(getattr(MemberInfo, 'value', None), int):
if MemberInfo.IsEnumMember and MemberInfo.EnumName == VarName:
if isinstance(MemberInfo.value, int):
return ir.Constant(ir.IntType(32), MemberInfo.value)
for key, info in self.Trans.SymbolTable.items():
if getattr(info, 'IsEnumMember', None) and getattr(info, 'EnumName', None) == VarName and key == Node.attr:
if isinstance(getattr(info, 'value', None), int):
if info.IsEnumMember and info.EnumName == VarName and key == Node.attr:
if isinstance(info.value, int):
return ir.Constant(ir.IntType(32), info.value)
return None
@@ -285,7 +285,7 @@ class ExprAttrHandle(BaseHandle):
# 检查 property getter
PropKey = f'{ClassName}.{AttrName}'
PropInfo = self.Trans.SymbolTable.get(PropKey)
if PropInfo and hasattr(PropInfo, 'MetaList') and FuncMeta.PROPERTY_GETTER in PropInfo.MetaList:
if PropInfo and PropInfo.MetaList and FuncMeta.PROPERTY_GETTER in PropInfo.MetaList:
ObjVal = self.HandleExprLlvm(Node.value)
GetterFunc = Gen._get_function(PropKey)
if GetterFunc and ObjVal:
@@ -297,7 +297,7 @@ class ExprAttrHandle(BaseHandle):
TypeInfo = self.Trans.SymbolTable.get(ClassName)
IsUnion = TypeInfo.IsUnion if TypeInfo else False
IsCenum = TypeInfo.IsEnum if TypeInfo else False
IsRenum = getattr(TypeInfo, 'IsRenum', False) if TypeInfo else False
IsRenum = TypeInfo.IsRenum if TypeInfo else False
# REnum 处理
if IsRenum:
@@ -322,12 +322,12 @@ class ExprAttrHandle(BaseHandle):
for qname in (f"{ClassName}.{AttrName}", f"{ClassName}_{AttrName}"):
if qname in self.Trans.SymbolTable:
info = self.Trans.SymbolTable[qname]
if getattr(info, 'IsEnumMember', None) and isinstance(getattr(info, 'value', None), int):
if info.IsEnumMember and isinstance(info.value, int):
return ir.Constant(ir.IntType(32), info.value)
for key, info in self.Trans.SymbolTable.items():
if key == AttrName:
if getattr(info, 'IsEnumMember', None) and getattr(info, 'EnumName', None) == ClassName:
if isinstance(getattr(info, 'value', None), int):
if info.IsEnumMember and info.EnumName == ClassName:
if isinstance(info.value, int):
return ir.Constant(ir.IntType(32), info.value)
break
@@ -1062,7 +1062,7 @@ class ExprAttrHandle(BaseHandle):
possible_keys.append(key)
for lookup_key in possible_keys:
SymInfo = self.Trans.SymbolTable.get(lookup_key)
if SymInfo and getattr(SymInfo, 'IsDefine', None) and getattr(SymInfo, 'DefineValue', None) is not None:
if SymInfo and SymInfo.IsDefine and SymInfo.DefineValue is not None:
val = SymInfo.DefineValue
if isinstance(val, int):
if val > 0x7FFFFFFF or val < -0x80000000:
@@ -1085,21 +1085,21 @@ class ExprAttrHandle(BaseHandle):
for enum_key in enum_keys:
if enum_key in self.Trans.SymbolTable:
SymInfo = self.Trans.SymbolTable[enum_key]
if getattr(SymInfo, 'IsEnum', None):
if SymInfo.IsEnum:
for qname in (f"{enum_key}.{member_name}", f"{enum_key}_{member_name}"):
if qname in self.Trans.SymbolTable:
info = self.Trans.SymbolTable[qname]
if getattr(info, 'IsEnumMember', None) and isinstance(getattr(info, 'value', None), int):
if info.IsEnumMember and isinstance(info.value, int):
return ir.Constant(ir.IntType(32), info.value)
for key, info in self.Trans.SymbolTable.items():
if getattr(info, 'IsEnumMember', None) and getattr(info, 'EnumName', None) == enum_key and key == member_name:
if isinstance(getattr(info, 'value', None), int):
if info.IsEnumMember and info.EnumName == enum_key and key == member_name:
if isinstance(info.value, int):
return ir.Constant(ir.IntType(32), info.value)
for key, info in self.Trans.SymbolTable.items():
if getattr(info, 'IsEnumMember', None) and key == member_name:
if isinstance(getattr(info, 'value', None), int):
if info.IsEnumMember and key == member_name:
if isinstance(info.value, int):
for enum_key in enum_keys:
if getattr(info, 'EnumName', None) == enum_key:
if info.EnumName == enum_key:
return ir.Constant(ir.IntType(32), info.value)
return None