进行了优化,减少了上帝结构体的符号表占用
This commit is contained in:
@@ -91,7 +91,7 @@ class ExprAttrHandle(BaseHandle):
|
||||
if key not in PossibleKeys:
|
||||
PossibleKeys.append(key)
|
||||
for lookup_key in PossibleKeys:
|
||||
SymInfo = self.Trans.SymbolTable.get(lookup_key)
|
||||
SymInfo = self.Trans.SymbolTable.lookup(lookup_key)
|
||||
if SymInfo and SymInfo.IsDefine and SymInfo.DefineValue is not None:
|
||||
return self._make_define_constant(Gen, SymInfo.DefineValue)
|
||||
# 也检查 _define_constants
|
||||
@@ -104,10 +104,9 @@ class ExprAttrHandle(BaseHandle):
|
||||
def _lookup_module_global(self, Gen, VarName, AttrName):
|
||||
"""在模块全局变量中查找 import 的属性"""
|
||||
imported_modules = getattr(self.Trans, '_ImportedModules', None)
|
||||
import_aliases = getattr(self.Trans, '_ImportAliases', {})
|
||||
if not imported_modules:
|
||||
return None
|
||||
resolved_mod = import_aliases.get(VarName, VarName)
|
||||
resolved_mod = self.Trans.SymbolTable.resolve_alias(VarName)
|
||||
if VarName not in imported_modules and resolved_mod not in imported_modules:
|
||||
return None
|
||||
PossibleKeys = [f"{VarName}.{AttrName}", AttrName]
|
||||
@@ -201,7 +200,7 @@ class ExprAttrHandle(BaseHandle):
|
||||
return None
|
||||
# 检查 property getter
|
||||
PropKey = f'{ClassName}.{Node.attr}'
|
||||
PropInfo = self.Trans.SymbolTable.get(PropKey)
|
||||
PropInfo = self.Trans.SymbolTable.lookup(PropKey)
|
||||
if PropInfo and PropInfo.MetaList and FuncMeta.PROPERTY_GETTER in PropInfo.MetaList:
|
||||
SelfVar = Gen._get_var_ptr('self')
|
||||
if SelfVar:
|
||||
@@ -233,10 +232,10 @@ class ExprAttrHandle(BaseHandle):
|
||||
|
||||
def _handle_attr_enum(self, Node, VarName):
|
||||
"""处理枚举成员访问 (VarName 是枚举类型名)"""
|
||||
SymInfo = self.Trans.SymbolTable.get(VarName)
|
||||
SymInfo = self.Trans.SymbolTable.lookup(VarName)
|
||||
if not SymInfo or not SymInfo.IsEnum:
|
||||
return None
|
||||
if Node.attr in self.Trans.SymbolTable:
|
||||
if self.Trans.SymbolTable.has(Node.attr):
|
||||
MemberInfo = self.Trans.SymbolTable[Node.attr]
|
||||
if MemberInfo.IsEnumMember and MemberInfo.EnumName == VarName:
|
||||
if isinstance(MemberInfo.value, int):
|
||||
@@ -284,7 +283,7 @@ class ExprAttrHandle(BaseHandle):
|
||||
|
||||
# 检查 property getter
|
||||
PropKey = f'{ClassName}.{AttrName}'
|
||||
PropInfo = self.Trans.SymbolTable.get(PropKey)
|
||||
PropInfo = self.Trans.SymbolTable.lookup(PropKey)
|
||||
if PropInfo and PropInfo.MetaList and FuncMeta.PROPERTY_GETTER in PropInfo.MetaList:
|
||||
ObjVal = self.HandleExprLlvm(Node.value)
|
||||
GetterFunc = Gen._get_function(PropKey)
|
||||
@@ -294,7 +293,7 @@ class ExprAttrHandle(BaseHandle):
|
||||
return Gen.builder.call(GetterFunc, [ObjVal], name=f"prop_{PropKey}")
|
||||
|
||||
# 获取类型信息
|
||||
TypeInfo = self.Trans.SymbolTable.get(ClassName)
|
||||
TypeInfo = self.Trans.SymbolTable.lookup(ClassName)
|
||||
IsUnion = TypeInfo.IsUnion if TypeInfo else False
|
||||
IsCenum = TypeInfo.IsEnum if TypeInfo else False
|
||||
IsRenum = TypeInfo.IsRenum if TypeInfo else False
|
||||
@@ -320,7 +319,7 @@ class ExprAttrHandle(BaseHandle):
|
||||
# CEnum 处理
|
||||
if IsCenum:
|
||||
for qname in (f"{ClassName}.{AttrName}", f"{ClassName}_{AttrName}"):
|
||||
if qname in self.Trans.SymbolTable:
|
||||
if self.Trans.SymbolTable.has(qname):
|
||||
info = self.Trans.SymbolTable[qname]
|
||||
if info.IsEnumMember and isinstance(info.value, int):
|
||||
return ir.Constant(ir.IntType(32), info.value)
|
||||
@@ -817,8 +816,7 @@ class ExprAttrHandle(BaseHandle):
|
||||
ClassName = Gen.global_struct_class.get(VarName)
|
||||
if not ClassName:
|
||||
imported_modules = getattr(self.Trans, '_ImportedModules', None)
|
||||
import_aliases = getattr(self.Trans, '_ImportAliases', {})
|
||||
resolved_mod = import_aliases.get(VarName, VarName)
|
||||
resolved_mod = self.Trans.SymbolTable.resolve_alias(VarName)
|
||||
if imported_modules and (VarName in imported_modules or resolved_mod in imported_modules):
|
||||
AttrName = Node.attr
|
||||
ModuleSha1Map = getattr(Gen, 'ModuleSha1Map', {})
|
||||
@@ -1035,7 +1033,6 @@ class ExprAttrHandle(BaseHandle):
|
||||
imported_modules = getattr(self.Trans, '_ImportedModules', None)
|
||||
if not imported_modules:
|
||||
return None
|
||||
import_aliases = getattr(self.Trans, '_ImportAliases', {})
|
||||
parts = self._build_attr_path(Node)
|
||||
if len(parts) < 2:
|
||||
return None
|
||||
@@ -1046,7 +1043,7 @@ class ExprAttrHandle(BaseHandle):
|
||||
possible_keys.append(full_path)
|
||||
if module_parts:
|
||||
ModulePath = '.'.join(module_parts)
|
||||
resolved_first = import_aliases.get(module_parts[0], module_parts[0])
|
||||
resolved_first = self.Trans.SymbolTable.resolve_alias(module_parts[0])
|
||||
if resolved_first != module_parts[0]:
|
||||
resolved_parts = [resolved_first] + module_parts[1:]
|
||||
resolved_path = '.'.join(resolved_parts)
|
||||
@@ -1061,7 +1058,7 @@ class ExprAttrHandle(BaseHandle):
|
||||
if key not in possible_keys:
|
||||
possible_keys.append(key)
|
||||
for lookup_key in possible_keys:
|
||||
SymInfo = self.Trans.SymbolTable.get(lookup_key)
|
||||
SymInfo = self.Trans.SymbolTable.lookup(lookup_key)
|
||||
if SymInfo and SymInfo.IsDefine and SymInfo.DefineValue is not None:
|
||||
val = SymInfo.DefineValue
|
||||
if isinstance(val, int):
|
||||
@@ -1077,17 +1074,16 @@ class ExprAttrHandle(BaseHandle):
|
||||
imported_modules = getattr(self.Trans, '_ImportedModules', None)
|
||||
if not imported_modules:
|
||||
return None
|
||||
import_aliases = getattr(self.Trans, '_ImportAliases', {})
|
||||
resolved_module = import_aliases.get(module_alias, module_alias)
|
||||
resolved_module = self.Trans.SymbolTable.resolve_alias(module_alias)
|
||||
if resolved_module not in imported_modules and module_alias not in imported_modules:
|
||||
return None
|
||||
enum_keys = [enum_class_name, f"{resolved_module}.{enum_class_name}"]
|
||||
for enum_key in enum_keys:
|
||||
if enum_key in self.Trans.SymbolTable:
|
||||
if self.Trans.SymbolTable.has(enum_key):
|
||||
SymInfo = self.Trans.SymbolTable[enum_key]
|
||||
if SymInfo.IsEnum:
|
||||
for qname in (f"{enum_key}.{member_name}", f"{enum_key}_{member_name}"):
|
||||
if qname in self.Trans.SymbolTable:
|
||||
if self.Trans.SymbolTable.has(qname):
|
||||
info = self.Trans.SymbolTable[qname]
|
||||
if info.IsEnumMember and isinstance(info.value, int):
|
||||
return ir.Constant(ir.IntType(32), info.value)
|
||||
|
||||
Reference in New Issue
Block a user