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

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

@@ -139,10 +139,9 @@ class AssignHandle:
StructType = Gen.structs[ClassName]
IsUnion = False
if ClassName in self.Trans.SymbolTable:
TypeInfo = self.Trans.SymbolTable[ClassName]
if TypeInfo.IsUnion:
IsUnion = True
TypeInfo = self.Trans.SymbolTable.lookup(ClassName)
if TypeInfo and TypeInfo.IsUnion:
IsUnion = True
if IsUnion:
Value = self.HandleExprLlvm(Node.value)
@@ -435,10 +434,10 @@ class AssignHandle:
CReturnTypes = [None] * len(ret_type.elements)
if not CReturnTypes:
sym_key = FuncName
if sym_key not in self.Trans.SymbolTable:
if not self.Trans.SymbolTable.has(sym_key):
if ModulePath:
sym_key = f"{ModulePath}.{FuncName}"
sym_info = self.Trans.SymbolTable.get(sym_key)
sym_info = self.Trans.SymbolTable.lookup(sym_key)
if sym_info and sym_info.IsFunction:
ret_type_info = sym_info.FuncPtrReturn
param_type_infos = [pt for _, pt in (sym_info.FuncPtrParams or [])]
@@ -615,7 +614,7 @@ class AssignHandle:
ClassName = self.Trans._CurrentCpythonObjectClass
if ClassName and ClassName in Gen.structs:
PropKey = f'{ClassName}.{AttrName}'
PropInfo = self.Trans.SymbolTable.get(PropKey)
PropInfo = self.Trans.SymbolTable.lookup(PropKey)
if PropInfo and PropInfo.MetaList and FuncMeta.PROPERTY_SETTER in PropInfo.MetaList:
SelfVar = Gen._get_var_ptr('self')
if SelfVar:
@@ -726,14 +725,13 @@ class AssignHandle:
ClassName = CN
IsUnion = False
if ClassName and ClassName in self.Trans.SymbolTable:
TypeInfo = self.Trans.SymbolTable[ClassName]
if TypeInfo.IsUnion:
IsUnion = True
TypeInfo = self.Trans.SymbolTable.lookup(ClassName)
if TypeInfo and TypeInfo.IsUnion:
IsUnion = True
if ClassName and ClassName in Gen.structs:
PropKey = f'{ClassName}.{AttrName}'
PropInfo = self.Trans.SymbolTable.get(PropKey)
PropInfo = self.Trans.SymbolTable.lookup(PropKey)
if PropInfo and PropInfo.MetaList and FuncMeta.PROPERTY_SETTER in PropInfo.MetaList:
ObjVal = self.Trans.ExprHandler.HandleExprLlvm(Target.value)
SetterFunc = Gen._get_function(PropKey + '$set')
@@ -856,8 +854,7 @@ class AssignHandle:
self._StoreWithCoerce(Value, MemberPtr)
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):
PossibleKeys = [f"{VarName}.{AttrName}", AttrName]
for mod_name in imported_modules:
@@ -1185,7 +1182,7 @@ class AssignHandle:
if isinstance(Node.target, ast.Name):
VarName = Node.target.id
EffectiveAnnotation = Node.annotation
if VarName in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(VarName):
Info = self.Trans.SymbolTable[VarName]
if Info.get('type') == 'typedef':
return
@@ -1200,7 +1197,7 @@ class AssignHandle:
elem_type_node = slice_node.elts[0]
count_node = slice_node.elts[1]
if isinstance(elem_type_node, ast.Name) and elem_type_node.id in Gen.structs:
SymEntry = self.Trans.SymbolTable.get(elem_type_node.id)
SymEntry = self.Trans.SymbolTable.lookup(elem_type_node.id)
if SymEntry and isinstance(SymEntry, CTypeInfo) and SymEntry.IsFuncPtr:
ElemType = ir.IntType(8).as_pointer()
else:
@@ -1220,7 +1217,7 @@ class AssignHandle:
if isinstance(count_node, ast.Constant) and isinstance(count_node.value, int):
ArrayCount = count_node.value
elif isinstance(count_node, ast.Name):
if count_node.id in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(count_node.id):
SymInfo = self.Trans.SymbolTable[count_node.id]
if isinstance(SymInfo.value, int):
ArrayCount = SymInfo.value
@@ -1324,7 +1321,7 @@ class AssignHandle:
if TTypeInfo:
TTypeInfo.IsTypedef = True
TTypeInfo.Name = VarName
self.Trans.SymbolTable[VarName] = TTypeInfo
self.Trans.SymbolTable.insert(VarName, TTypeInfo)
if IsCDefine:
if Node.value:
define_constants = vars(Gen).setdefault('_define_constants', {})
@@ -1494,12 +1491,12 @@ class AssignHandle:
enum_class_name = parts[-2]
member_name = parts[-1]
qualified_name = f"{enum_class_name}.{member_name}"
if qualified_name in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(qualified_name):
info = self.Trans.SymbolTable[qualified_name]
if info.IsEnumMember and info.EnumName:
return info.EnumName
under_name = f"{enum_class_name}_{member_name}"
if under_name in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(under_name):
info = self.Trans.SymbolTable[under_name]
if info.IsEnumMember and info.EnumName:
return info.EnumName
@@ -1529,7 +1526,7 @@ class AssignHandle:
FuncName = Node.value.func.id
if FuncName in Gen.structs:
IsUnion = False
if FuncName in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(FuncName):
TypeInfo = self.Trans.SymbolTable[FuncName]
if TypeInfo.IsUnion:
IsUnion = True