进行了优化,减少了上帝结构体的符号表占用
This commit is contained in:
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user