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

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

@@ -57,7 +57,7 @@ class LlvmGeneratorMixin:
sym_info = _CTypeInfo()
sym_info.IsDefine = True
sym_info.DefineValue = val
self.SymbolTable[Node.target.id] = sym_info
self.SymbolTable.insert(Node.target.id, sym_info)
elif isinstance(Node, ast.Assign):
for target in Node.targets:
if isinstance(target, ast.Name):
@@ -86,7 +86,7 @@ class LlvmGeneratorMixin:
sym_info = _CTypeInfo()
sym_info.IsDefine = True
sym_info.DefineValue = val
self.SymbolTable[target.id] = sym_info
self.SymbolTable.insert(target.id, sym_info)
# 预扫描所有顶层函数定义,填充 FunctionDefCache不创建 LLVM 声明)
# 这样类方法编译时遇到未声明的函数可以按需前向声明
@@ -287,8 +287,6 @@ class LlvmGeneratorMixin:
self.VarScopes = [{}] # 全局作用域
# 预扫描 import 语句,注册别名,确保类型解析时能正确解析模块别名
if not getattr(self, '_ImportAliases', None):
self._ImportAliases = {}
if not getattr(self, '_ImportedModules', None):
self._ImportedModules = set()
for Node in ast.iter_child_nodes(Tree):
@@ -299,14 +297,14 @@ class LlvmGeneratorMixin:
continue
self._ImportedModules.add(name)
if alias.asname:
self._ImportAliases[alias.asname] = name
self.SymbolTable.import_aliases[alias.asname] = name
elif isinstance(Node, ast.ImportFrom):
module_name = Node.module
if module_name and module_name not in ('c', 't'):
self._ImportedModules.add(module_name)
for alias in Node.names:
if alias.asname:
self._ImportAliases[alias.asname] = f"{module_name}.{alias.name}"
self.SymbolTable.import_aliases[alias.asname] = f"{module_name}.{alias.name}"
for Node in ast.iter_child_nodes(Tree):
if isinstance(Node, ast.ClassDef):
@@ -373,7 +371,7 @@ class LlvmGeneratorMixin:
TypedefNode.OriginalType = f'struct {ClassName}'
TypedefNode.set('IsComplete', True)
TypedefNode.file = '<stdin>'
self.SymbolTable[TypedefKey] = TypedefNode
self.SymbolTable.insert(TypedefKey, TypedefNode)
for item in Node.body:
if isinstance(item, ast.AnnAssign) and isinstance(item.target, ast.Name):
@@ -414,18 +412,18 @@ class LlvmGeneratorMixin:
StructNode.IsStruct = True
StructNode.Members = members or {}
StructNode.file = '<stdin>'
if ClassName in self.SymbolTable:
if self.SymbolTable.has(ClassName):
existing = self.SymbolTable[ClassName]
if hasattr(existing, 'IsCpythonObject') and existing.IsCpythonObject:
StructNode.IsCpythonObject = True
self.SymbolTable[ClassName] = StructNode
self.SymbolTable.insert(ClassName, StructNode)
elif isinstance(Node, ast.FunctionDef):
FuncName = Node.name
FuncNode = CTypeInfo()
FuncNode.Name = FuncName
FuncNode.IsFunction = True
FuncNode.file = '<stdin>'
self.SymbolTable[FuncName] = FuncNode
self.SymbolTable.insert(FuncName, FuncNode)
elif isinstance(Node, ast.AnnAssign):
if isinstance(Node.target, ast.Name):
VarName = Node.target.id
@@ -447,7 +445,7 @@ class LlvmGeneratorMixin:
if isinstance(Node.value, ast.Name):
OriginalType = Node.value.id
if OriginalType in self.GeneratedTypes:
if OriginalType in self.SymbolTable:
if self.SymbolTable.has(OriginalType):
OriginalInfo = self.SymbolTable[OriginalType]
if isinstance(OriginalInfo, dict):
actual_type = OriginalInfo.get('type', 'struct')
@@ -468,7 +466,7 @@ class LlvmGeneratorMixin:
TypedefNode.IsTypedef = True
TypedefNode.OriginalType = f'enum {OriginalType}'
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
self.SymbolTable.insert(VarName, TypedefNode)
elif actual_type == 'typedef':
TypedefNode = CTypeInfo()
TypedefNode.Name = VarName
@@ -481,7 +479,7 @@ class LlvmGeneratorMixin:
TypedefNode.OriginalType = f'struct {OriginalType}'
TypedefNode.set('PendingTypedef', True)
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
self.SymbolTable.insert(VarName, TypedefNode)
else:
TypedefNode = CTypeInfo()
TypedefNode.Name = VarName
@@ -489,11 +487,11 @@ class LlvmGeneratorMixin:
TypedefNode.OriginalType = f'struct {OriginalType}'
TypedefNode.set('PendingTypedef', True)
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
self.SymbolTable.insert(VarName, TypedefNode)
self.GeneratedTypes.add(VarName)
continue
else:
if OriginalType in self.SymbolTable:
if self.SymbolTable.has(OriginalType):
OriginalInfo = self.SymbolTable[OriginalType]
if isinstance(OriginalInfo, dict):
actual_type = OriginalInfo.get('type', 'struct')
@@ -520,7 +518,7 @@ class LlvmGeneratorMixin:
TypedefNode.OriginalType = f'struct {OriginalType}'
TypedefNode.set('PendingTypedef', True)
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
self.SymbolTable.insert(VarName, TypedefNode)
self.GeneratedTypes.add(VarName)
if isinstance(OriginalInfo, dict):
OriginalInfo['skip_generation'] = True
@@ -532,7 +530,7 @@ class LlvmGeneratorMixin:
TypedefNode.OriginalType = f'struct {OriginalType}'
TypedefNode.set('PendingTypedef', True)
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
self.SymbolTable.insert(VarName, TypedefNode)
self.GeneratedTypes.add(VarName)
if isinstance(OriginalInfo, dict):
OriginalInfo['skip_generation'] = True
@@ -544,7 +542,7 @@ class LlvmGeneratorMixin:
TypedefNode.OriginalType = f'enum {OriginalType}'
TypedefNode.set('PendingTypedef', True)
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
self.SymbolTable.insert(VarName, TypedefNode)
self.GeneratedTypes.add(VarName)
if isinstance(OriginalInfo, dict):
OriginalInfo['skip_generation'] = True
@@ -558,7 +556,7 @@ class LlvmGeneratorMixin:
TypedefNode.IsTypedef = True
TypedefNode.OriginalType = CName
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
self.SymbolTable.insert(VarName, TypedefNode)
self.GeneratedTypes.add(VarName)
continue
@@ -574,7 +572,7 @@ class LlvmGeneratorMixin:
var_node.IsVariable = True
var_node.PtrCount = 1 if IsPtr else 0
var_node.file = '<stdin>'
self.SymbolTable[VarName] = var_node
self.SymbolTable.insert(VarName, var_node)
self.LlvmGen = LlvmCodeGenerator(
triple=getattr(self, 'triple', None),