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

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

@@ -55,7 +55,7 @@ class AnnotationLoaderMixin:
EnumNode.set('source', 'annotation_module')
EnumNode.library_name = lib_name
EnumNode.file = source_file
self.SymbolTable[AttrName] = EnumNode
self.SymbolTable.insert(AttrName, EnumNode)
if lib_name:
FullName = f'{lib_name}.{AttrName}'
full_EnumNode = CTypeInfo()
@@ -65,7 +65,7 @@ class AnnotationLoaderMixin:
full_EnumNode.set('source', 'annotation_module')
full_EnumNode.library_name = lib_name
full_EnumNode.file = source_file
self.SymbolTable[FullName] = full_EnumNode
self.SymbolTable.insert(FullName, full_EnumNode)
# 枚举成员也需要注册
for MemberName in dir(attr):
if not MemberName.startswith('_'):
@@ -78,12 +78,12 @@ class AnnotationLoaderMixin:
MemberNode.EnumName = AttrName
MemberNode.library_name = lib_name
MemberNode.IsEnumMember = True
self.SymbolTable[MemberName] = MemberNode
self.SymbolTable[f"{AttrName}.{MemberName}"] = MemberNode
self.SymbolTable[f"{AttrName}_{MemberName}"] = MemberNode
self.SymbolTable.insert(MemberName, MemberNode)
self.SymbolTable.insert(f"{AttrName}.{MemberName}", MemberNode)
self.SymbolTable.insert(f"{AttrName}_{MemberName}", MemberNode)
if lib_name:
self.SymbolTable[f"{lib_name}.{AttrName}.{MemberName}"] = MemberNode
self.SymbolTable[f"{lib_name}_{AttrName}_{MemberName}"] = MemberNode
self.SymbolTable.insert(f"{lib_name}.{AttrName}.{MemberName}", MemberNode)
self.SymbolTable.insert(f"{lib_name}_{AttrName}_{MemberName}", MemberNode)
count += 1
# 检查是否是 CType 子类typedef 别名)
elif isinstance(attr, type) and issubclass(attr, CType) and attr is not CType:
@@ -101,7 +101,7 @@ class AnnotationLoaderMixin:
TypedefNode.set('source', 'annotation_module')
TypedefNode.library_name = lib_name
TypedefNode.file = source_file
self.SymbolTable[AttrName] = TypedefNode
self.SymbolTable.insert(AttrName, TypedefNode)
if lib_name and FullName != AttrName:
FullTypedef_node = CTypeInfo()
FullTypedef_node.Name = FullName
@@ -110,7 +110,7 @@ class AnnotationLoaderMixin:
FullTypedef_node.set('source', 'annotation_module')
FullTypedef_node.library_name = lib_name
FullTypedef_node.file = source_file
self.SymbolTable[FullName] = FullTypedef_node
self.SymbolTable.insert(FullName, FullTypedef_node)
count += 1
# 检查是否是下划线前缀的 CType 子类(如 _CTypedef -> CTypedef
elif AttrName.startswith('_') and len(AttrName) > 1:
@@ -119,7 +119,7 @@ class AnnotationLoaderMixin:
if PublicAttr is not None and not isinstance(attr, type):
continue
if isinstance(attr, type) and issubclass(attr, CType) and attr is not CType:
if PublicName not in self.SymbolTable:
if not self.SymbolTable.has(PublicName):
if lib_name:
FullName = f'{lib_name}.{PublicName}'
else:
@@ -131,7 +131,7 @@ class AnnotationLoaderMixin:
TypedefNode.set('source', 'annotation_module')
TypedefNode.library_name = lib_name
TypedefNode.file = source_file
self.SymbolTable[PublicName] = TypedefNode
self.SymbolTable.insert(PublicName, TypedefNode)
if lib_name and FullName != PublicName:
FullTypedef_node = CTypeInfo()
FullTypedef_node.Name = FullName
@@ -140,7 +140,7 @@ class AnnotationLoaderMixin:
FullTypedef_node.set('source', 'annotation_module')
FullTypedef_node.library_name = lib_name
FullTypedef_node.file = source_file
self.SymbolTable[FullName] = FullTypedef_node
self.SymbolTable.insert(FullName, FullTypedef_node)
count += 1
return count
@@ -208,14 +208,14 @@ class AnnotationLoaderMixin:
if isinstance(base, ast.Name) and base.id == 'CType':
# 这个类继承自 CType是 typedef 别名
# 更新符号表中的类型为 typedef
if ClassName in self.SymbolTable:
if self.SymbolTable.has(ClassName):
TypedefNode = CTypeInfo()
TypedefNode.Name = ClassName
TypedefNode.IsTypedef = True
TypedefNode.OriginalType = self.SymbolTable[ClassName].get('OriginalType', f'struct {ClassName}')
TypedefNode.set('source', 'annotation_module')
TypedefNode.set('is_ctype_subclass', True)
self.SymbolTable[ClassName] = TypedefNode
self.SymbolTable.insert(ClassName, TypedefNode)
except Exception as _e:
from lib.core.VLogger import get_logger as _vlog
from lib.constants.config import mode as _ConfigMode
@@ -230,7 +230,7 @@ class AnnotationLoaderMixin:
TypeInfo = self.SymbolTable[TypeName].copy()
TypeInfo['source'] = 'annotation_module'
TypeInfo['original_name'] = TypeName
self.SymbolTable[FullName] = TypeInfo
self.SymbolTable.insert(FullName, TypeInfo)
count += 1
# 再次遍历 AST查找注解文件中的 typedef 语句AnnAssign with t.CTypedef
@@ -283,9 +283,9 @@ class AnnotationLoaderMixin:
MemberNode.EnumName = TypePrefix
MemberNode.library_name = TypePrefix
MemberNode.IsEnumMember = True
self.SymbolTable[TargetName] = MemberNode
self.SymbolTable[f"{TypePrefix}.{TargetName}"] = MemberNode
self.SymbolTable[f"{TypePrefix}_{TargetName}"] = MemberNode
self.SymbolTable.insert(TargetName, MemberNode)
self.SymbolTable.insert(f"{TypePrefix}.{TargetName}", MemberNode)
self.SymbolTable.insert(f"{TypePrefix}_{TargetName}", MemberNode)
try:
with open(ModuleName, 'r', encoding='utf-8') as f:
@@ -315,13 +315,13 @@ class AnnotationLoaderMixin:
for TargetName, original_name in typedef_annots:
# 检查原始类型是否在符号表中(带前缀或不带前缀)
orig_with_prefix = f'{TypePrefix}.{original_name}'
if orig_with_prefix in self.SymbolTable:
if self.SymbolTable.has(orig_with_prefix):
# 添加带前缀的 typedef 别名
FullTypedef_name = f'{TypePrefix}.{TargetName}'
TypedefNode = CTypeInfo()
TypedefNode.Name = FullTypedef_name
TypedefNode.IsTypedef = True
orig_entry = self.SymbolTable.get(orig_with_prefix, {})
orig_entry = self.SymbolTable.lookup(orig_with_prefix)
orig_type_str = f'struct {original_name}'
if isinstance(orig_entry, dict):
if orig_entry.get('type') == 'typedef':
@@ -335,7 +335,7 @@ class AnnotationLoaderMixin:
TypedefNode.OriginalType = orig_type_str
TypedefNode.set('source', 'annotation_module')
TypedefNode.set('original_name', TargetName)
self.SymbolTable[FullTypedef_name] = TypedefNode
self.SymbolTable.insert(FullTypedef_name, TypedefNode)
count += 1
self.AnnotationModules.add(lib_name)

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

View File

@@ -328,7 +328,7 @@ class PythonParserMixin:
EnumNode.Name = ClassName
EnumNode.IsEnum = True
EnumNode.set('file', '<stdin>')
self.SymbolTable[ClassName] = EnumNode
self.SymbolTable.insert(ClassName, EnumNode)
# 注册 enum 成员
for item in node.body:
@@ -341,9 +341,9 @@ class PythonParserMixin:
MemberNode.EnumName = ClassName
MemberNode.library_name = None
MemberNode.IsEnumMember = True
self.SymbolTable[MemberName] = MemberNode
self.SymbolTable[f"{ClassName}.{MemberName}"] = MemberNode
self.SymbolTable[f"{ClassName}_{MemberName}"] = MemberNode
self.SymbolTable.insert(MemberName, MemberNode)
self.SymbolTable.insert(f"{ClassName}.{MemberName}", MemberNode)
self.SymbolTable.insert(f"{ClassName}_{MemberName}", MemberNode)
continue
@@ -397,14 +397,14 @@ class PythonParserMixin:
StructNode.set('file', '<stdin>')
StructNode.set('IsAnonymous', IsAnonymous)
StructNode.set('IsCpythonObject', IsCpythonObject)
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.set('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
@@ -443,7 +443,7 @@ class PythonParserMixin:
var_node.IsVariable = True
var_node.set('IsPtr', IsPtr)
var_node.set('file', '<stdin>')
self.SymbolTable[VarName] = var_node
self.SymbolTable.insert(VarName, var_node)
except Exception as e:
print(f'Warning: Failed to parse Python file {FilePath}: {e}')