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

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)