进行了优化,减少了上帝结构体的符号表占用

This commit is contained in:
2026-06-18 22:12:14 +08:00
parent d7b98cc9c5
commit 19f2787db0
32 changed files with 1245 additions and 1083 deletions

View File

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