阶段 2 完成
This commit is contained in:
@@ -567,10 +567,18 @@ class ExprCallHandle(BaseHandle):
|
||||
LastPart in ModuleSha1Map)
|
||||
# 最后尝试: 用 FuncAttr 直接查找 Gen.functions(_find_function 会遍历 SHA1 前缀)
|
||||
if FuncAttr and ModulePath and ModulePath not in {'t', 'c'}:
|
||||
# 先检查 FuncAttr 是否是函数/变量,如果是则跳过 struct 声明
|
||||
_attr_sym = self.Trans.SymbolTable.get(FuncAttr)
|
||||
_is_func_or_var = _attr_sym and (getattr(_attr_sym, 'IsFunction', False) or getattr(_attr_sym, 'IsVariable', False))
|
||||
if not _is_func_or_var and ModulePath:
|
||||
_full_key = f"{ModulePath}.{FuncAttr}"
|
||||
_full_sym = self.Trans.SymbolTable.get(_full_key)
|
||||
if _full_sym and (getattr(_full_sym, 'IsFunction', False) or getattr(_full_sym, 'IsVariable', False)):
|
||||
_is_func_or_var = True
|
||||
# 优先检查 FuncAttr 是否为 struct/类构造器
|
||||
if FuncAttr not in Gen.structs:
|
||||
if not _is_func_or_var and FuncAttr not in Gen.structs:
|
||||
self._ensure_struct_declared(FuncAttr)
|
||||
if FuncAttr in Gen.structs:
|
||||
if not _is_func_or_var and FuncAttr in Gen.structs:
|
||||
result = self._HandleClassNewLlvm(Node, FuncAttr)
|
||||
if result is not None:
|
||||
return result
|
||||
@@ -639,6 +647,10 @@ class ExprCallHandle(BaseHandle):
|
||||
|
||||
def _ensure_struct_declared(self, class_name):
|
||||
Gen = self.Trans.LlvmGen
|
||||
# 如果名称是函数或变量,不应创建 struct
|
||||
SymInfo = self.Trans.SymbolTable.get(class_name)
|
||||
if SymInfo and (getattr(SymInfo, 'IsFunction', False) or getattr(SymInfo, 'IsVariable', False)):
|
||||
return
|
||||
if class_name in Gen.structs:
|
||||
existing = Gen.structs[class_name]
|
||||
if isinstance(existing, ir.IdentifiedStructType) and (existing.elements is None or len(existing.elements) == 0):
|
||||
|
||||
Reference in New Issue
Block a user