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