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

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

@@ -45,20 +45,18 @@ class ImportHandle(BaseHandle):
def _EmitImportDeclarationsLlvm(self, Node, Gen):
if not getattr(self.Trans, '_ImportedModules', None):
self.Trans._ImportedModules = set()
if not getattr(self.Trans, '_ImportAliases', None):
self.Trans._ImportAliases = {}
for alias in Node.names:
name = alias.name
if name in ('c', 't'):
continue
self.Trans._ImportedModules.add(name)
if alias.asname:
self.Trans._ImportAliases[alias.asname] = name
self.Trans.SymbolTable.import_aliases[alias.asname] = name
# 同时在符号表中注册模块别名,以便 CTypeInfo.FromNode 能解析
AliasInfo = CTypeInfo()
AliasInfo.IsModuleAlias = True
AliasInfo.ResolvedModule = name
self.Trans.SymbolTable[alias.asname] = AliasInfo
self.Trans.SymbolTable.insert(alias.asname, AliasInfo)
current_module = self._get_current_module_name()
self._EmitModuleDeclarationsLlvm(name, Gen, register_module_name=current_module)
@@ -73,14 +71,14 @@ class ImportHandle(BaseHandle):
# into _define_constants so they can be found by _HandleNameLlvm
if not asname or asname == name:
# Check if this name is a CDefine constant in SymbolTable
sym_info = self.Trans.SymbolTable.get(name)
sym_info = self.Trans.SymbolTable.lookup(name)
if sym_info and sym_info.IsDefine and sym_info.DefineValue is not None:
define_constants = vars(Gen).setdefault('_define_constants', {})
if name not in define_constants:
define_constants[name] = sym_info.DefineValue
# Also check with module prefix
for prefix_key in [f"{module}.{name}", name]:
sym_info2 = self.Trans.SymbolTable.get(prefix_key)
sym_info2 = self.Trans.SymbolTable.lookup(prefix_key)
if sym_info2 and sym_info2.IsDefine and sym_info2.DefineValue is not None:
define_constants = vars(Gen).setdefault('_define_constants', {})
if name not in define_constants:
@@ -94,8 +92,8 @@ class ImportHandle(BaseHandle):
Gen.functions[asname] = Gen.functions[name]
if name in Gen.structs:
Gen.structs[asname] = Gen.structs[name]
if name in self.Trans.SymbolTable:
self.Trans.SymbolTable[asname] = self.Trans.SymbolTable[name]
if self.Trans.SymbolTable.has(name):
self.Trans.SymbolTable.insert(asname, self.Trans.SymbolTable[name])
if name in Gen.variables:
Gen.variables[asname] = Gen.variables[name]
if name in Gen.global_vars:
@@ -107,7 +105,7 @@ class ImportHandle(BaseHandle):
for key in list(self.Trans.SymbolTable.keys()):
if key.startswith(f'{name}.'):
suffix = key[len(name):]
self.Trans.SymbolTable[f'{asname}{suffix}'] = self.Trans.SymbolTable[key]
self.Trans.SymbolTable.insert(f'{asname}{suffix}', self.Trans.SymbolTable[key])
for meta_dict in (Gen.class_members, Gen.class_member_defaults,
Gen.class_member_signeds, Gen.class_member_bitfields,
Gen.class_member_byteorders, Gen.class_member_bitoffsets,
@@ -127,8 +125,6 @@ class ImportHandle(BaseHandle):
if module in ('c', 't'):
if not getattr(self.Trans, '_ImportedModules', None):
self.Trans._ImportedModules = set()
if not getattr(self.Trans, '_ImportAliases', None):
self.Trans._ImportAliases = {}
self.Trans._ImportedModules.add(module)
if not hasattr(self.Trans, '_t_c_imported_names'):
self.Trans._t_c_imported_names = {}
@@ -139,8 +135,6 @@ class ImportHandle(BaseHandle):
return
if not getattr(self.Trans, '_ImportedModules', None):
self.Trans._ImportedModules = set()
if not getattr(self.Trans, '_ImportAliases', None):
self.Trans._ImportAliases = {}
current_module = self._get_current_module_name()
if Node.level and Node.level > 0:
current_file = getattr(self.Trans, 'CurrentFile', '') or ''
@@ -190,7 +184,7 @@ class ImportHandle(BaseHandle):
self.Trans._ImportedModules.add(alias.name)
self._LoadModuleDeclarationsFromFile(sub_path, Gen, module_name=alias.name, register_module_name=current_module)
if alias.asname:
self.Trans._ImportAliases[alias.asname] = alias.name
self.Trans.SymbolTable.import_aliases[alias.asname] = alias.name
found_sub = True
break
if not found_sub:
@@ -206,7 +200,7 @@ class ImportHandle(BaseHandle):
self.Trans._ImportedModules.add(sub_ModulePath)
self._LoadModuleDeclarationsFromFile(sha1_pyi, Gen, module_name=alias.name, register_module_name=current_module)
if alias.asname:
self.Trans._ImportAliases[alias.asname] = alias.name
self.Trans.SymbolTable.import_aliases[alias.asname] = alias.name
self._RegisterFromImportAliases(Node, Gen, module or pkg_name)
return
self.Trans._ImportedModules.add(module)
@@ -725,19 +719,19 @@ class ImportHandle(BaseHandle):
if isinstance(ValueTypeInfo, CTypeInfo) and (ValueTypeInfo.BaseType or ValueTypeInfo.PtrCount > 0):
ValueTypeInfo.IsTypedef = True
ValueTypeInfo.Name = VarName
self.Trans.SymbolTable[VarName] = ValueTypeInfo
self.Trans.SymbolTable.insert(VarName, ValueTypeInfo)
if module_name:
FullName = f"{module_name}.{VarName}"
self.Trans.SymbolTable[FullName] = ValueTypeInfo
self.Trans.SymbolTable.insert(FullName, ValueTypeInfo)
return
TTypeInfo = self.Trans.TypeMergeHandler.GetCTypeInfo(Node.annotation)
if TTypeInfo:
TTypeInfo.IsTypedef = True
TTypeInfo.Name = VarName
self.Trans.SymbolTable[VarName] = TTypeInfo
self.Trans.SymbolTable.insert(VarName, TTypeInfo)
if module_name:
FullName = f"{module_name}.{VarName}"
self.Trans.SymbolTable[FullName] = TTypeInfo
self.Trans.SymbolTable.insert(FullName, TTypeInfo)
return
if IsCDefine:
@@ -948,7 +942,7 @@ class ImportHandle(BaseHandle):
info.Lineno = lineno
info.file = FilePath
# 直接添加到 SymbolTable 字典
self.Trans.SymbolTable[FullName] = info
self.Trans.SymbolTable.insert(FullName, info)
def _check_annotation_for_state(self, annotation) -> bool:
import ast
@@ -1020,7 +1014,7 @@ class ImportHandle(BaseHandle):
ParamTypes = []
is_method = is_class_method or '.__' in FuncName
class_name_for_method = FuncName.split('.')[0] if '.' in FuncName else None
class_is_cpython = class_name_for_method and class_name_for_method in self.Trans.SymbolTable and self.Trans.SymbolTable[class_name_for_method].IsCpythonObject
class_is_cpython = class_name_for_method and self.Trans.SymbolTable.is_struct(class_name_for_method)
for i, Arg in enumerate(Node.args.args):
if i == 0 and is_method:
# self parameter of a method should always be a pointer to the struct
@@ -1107,12 +1101,12 @@ class ImportHandle(BaseHandle):
func_meta |= FuncMeta.PROPERTY_GETTER
elif d.attr == 'deleter':
func_meta |= FuncMeta.PROPERTY_DELETER
if FuncName not in self.Trans.SymbolTable:
if not self.Trans.SymbolTable.has(FuncName):
FuncInfo = CTypeInfo()
FuncInfo.Name = FuncName
FuncInfo.IsFunction = True
FuncInfo.MetaList = func_meta
self.Trans.SymbolTable[FuncName] = FuncInfo
self.Trans.SymbolTable.insert(FuncName, FuncInfo)
else:
existing = self.Trans.SymbolTable[FuncName]
if existing.MetaList == FuncMeta.NONE and func_meta != FuncMeta.NONE:
@@ -1120,16 +1114,16 @@ class ImportHandle(BaseHandle):
# 同时注册带模块前缀的符号,以便 module.func_name 查找能命中
if source_module_name and source_module_name not in ('c', 't'):
FullSymKey = f"{source_module_name}.{FuncName}"
if FullSymKey not in self.Trans.SymbolTable:
if not self.Trans.SymbolTable.has(FullSymKey):
FullFuncInfo = CTypeInfo()
FullFuncInfo.Name = FullSymKey
FullFuncInfo.IsFunction = True
FullFuncInfo.MetaList = func_meta
self.Trans.SymbolTable[FullSymKey] = FullFuncInfo
self.Trans.SymbolTable.insert(FullSymKey, FullFuncInfo)
# property setter/deleter: 在原始 PropKey不带后缀下注册 MetaList
if FuncMeta.PROPERTY_SETTER in func_meta or FuncMeta.PROPERTY_DELETER in func_meta:
BasePropKey = FuncName.replace('$set', '').replace('$del', '')
if BasePropKey in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(BasePropKey):
base_existing = self.Trans.SymbolTable[BasePropKey]
if func_meta != FuncMeta.NONE:
base_existing.MetaList = base_existing.MetaList | func_meta
@@ -1138,7 +1132,7 @@ class ImportHandle(BaseHandle):
PropInfo.Name = BasePropKey
PropInfo.IsFunction = True
PropInfo.MetaList = func_meta
self.Trans.SymbolTable[BasePropKey] = PropInfo
self.Trans.SymbolTable.insert(BasePropKey, PropInfo)
if register_module_name and register_module_name != source_module_name:
ReexportName = Gen._mangle_func_name(FuncName, module_name=register_module_name)
Gen.functions[ReexportName] = func
@@ -1208,14 +1202,14 @@ class ImportHandle(BaseHandle):
CInfo.IsStruct = True
if module_name:
FullName = f"{module_name}.{ClassName}"
self.Trans.SymbolTable[FullName] = CInfo
self.Trans.SymbolTable[ClassName] = CInfo
self.Trans.SymbolTable.insert(FullName, CInfo)
self.Trans.SymbolTable.insert(ClassName, CInfo)
if IsCenum:
EnumTypeNode = CTypeInfo()
EnumTypeNode.Name = ClassName
EnumTypeNode.BaseType = t.CEnum(ClassName)
EnumTypeNode.IsEnum = True
self.Trans.SymbolTable[ClassName] = EnumTypeNode
self.Trans.SymbolTable.insert(ClassName, EnumTypeNode)
for item in Node.body:
VarName = None
if isinstance(item, ast.AnnAssign) and isinstance(item.target, ast.Name):
@@ -1237,9 +1231,9 @@ class ImportHandle(BaseHandle):
MemberNode.EnumName = ClassName
MemberNode.Lineno = item.lineno
MemberNode.IsEnumMember = True
self.Trans.SymbolTable[VarName] = MemberNode
self.Trans.SymbolTable[f"{ClassName}.{VarName}"] = MemberNode
self.Trans.SymbolTable[f"{ClassName}_{VarName}"] = MemberNode
self.Trans.SymbolTable.insert(VarName, MemberNode)
self.Trans.SymbolTable.insert(f"{ClassName}.{VarName}", MemberNode)
self.Trans.SymbolTable.insert(f"{ClassName}_{VarName}", MemberNode)
return
self._TryLoadStructFromStub(ClassName, Gen)
source_sha1 = None
@@ -1334,19 +1328,19 @@ class ImportHandle(BaseHandle):
func_meta |= FuncMeta.PROPERTY_DELETER
# setter/deleter 的 SymKey 使用带后缀的函数名
SymKey = DeclFuncName
if SymKey not in self.Trans.SymbolTable:
if not self.Trans.SymbolTable.has(SymKey):
FuncInfo = CTypeInfo()
FuncInfo.Name = SymKey
FuncInfo.IsFunction = True
FuncInfo.MetaList = func_meta
self.Trans.SymbolTable[SymKey] = FuncInfo
self.Trans.SymbolTable.insert(SymKey, FuncInfo)
else:
existing = self.Trans.SymbolTable[SymKey]
if existing.MetaList == FuncMeta.NONE and func_meta != FuncMeta.NONE:
existing.MetaList = func_meta
# setter/deleter: 同时在原始 PropKey不带后缀下注册 MetaList
if is_item_prop_setter or is_item_prop_deleter:
if FuncFullName in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(FuncFullName):
base_existing = self.Trans.SymbolTable[FuncFullName]
if func_meta != FuncMeta.NONE:
base_existing.MetaList = base_existing.MetaList | func_meta
@@ -1355,7 +1349,7 @@ class ImportHandle(BaseHandle):
PropInfo.Name = FuncFullName
PropInfo.IsFunction = True
PropInfo.MetaList = func_meta
self.Trans.SymbolTable[FuncFullName] = PropInfo
self.Trans.SymbolTable.insert(FuncFullName, PropInfo)
if has_methods:
if IsCVTable:
Gen._cross_module_vtable_classes.add(ClassName)