fix(renum): 返回类型按结构体指针解析

REnum 预登记为 IsRenum/IsStruct;类型解析先判 REnum;_EmitREnumLlvm 复用已有结构体实例,修复 LLVMType* 退化为 i32*。
This commit is contained in:
TermiNexus committed 2026-10-18 21:17:03 +08:00
1 parent b6d6d5ac6b
commit fe10e4dcd2
3 files changed
+59 -9

No files matched your search

+23 -5
View File
@@ -276,15 +276,27 @@ class PythonParserMixin:
# 先把类名加入 GeneratedTypes,这样 GetTypeName 可以正确识别
self.GeneratedTypes.add(ClassName)
# 检测是否是 CEnum
# 检测是否是 CEnum / REnum。REnum 必须与 CEnum 区分开:
# REnum 是带标签联合(结构体布局 { i32 __tag, <max payload> }),
# 若这里只登记 IsEnum=True,前向声明阶段(类体尚未发射、
# _EmitREnumLlvm 的 PreTypeInfo 尚未插入)解析 `T*` 注解时会
# 命中 IsEnum 分支退化成 i32*,与 `new memgr(...) T.X(...)`
# 返回的 %"T"* 冲突(现场:includes/mlirlite/__types.vp)。
IsCenum: bool = False
IsRenum: bool = False
for base in node.bases:
if isinstance(base, ast.Attribute):
if base.attr in ('CEnum', 'REnum'):
if base.attr == 'REnum':
IsRenum = True
break
if base.attr == 'CEnum':
IsCenum = True
break
elif isinstance(base, ast.Name):
if base.id in ('CEnum', 'REnum'):
if base.id == 'REnum':
IsRenum = True
break
if base.id == 'CEnum':
IsCenum = True
break
@@ -323,11 +335,17 @@ class PythonParserMixin:
IsCpythonObject = True
break
if IsCenum:
# 注册为 enum 类型
if IsCenum or IsRenum:
# 注册为 enum / renum 类型
EnumNode: CTypeInfo = CTypeInfo()
EnumNode.Name = ClassName
EnumNode.IsEnum = True
if IsRenum:
# 与 SymbolTable._InsertClassSymbol 的 'renum' 分支同口径:
# REnum 是结构体布局,不是整数枚举。
EnumNode.BaseType = TypeSystem.REnum(ClassName)
EnumNode.IsRenum = True
EnumNode.IsStruct = True
EnumNode.set('file', '<stdin>')
self.SymbolTable.insert(ClassName, EnumNode)