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