fix(renum): 返回类型按结构体指针解析
REnum 预登记为 IsRenum/IsStruct;类型解析先判 REnum;_EmitREnumLlvm 复用已有结构体实例,修复 LLVMType* 退化为 i32*。
This commit is contained in:
1 parent
b6d6d5ac6b
commit
fe10e4dcd2
3 files changed
+59
-9
No files matched your search
@@ -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)
|
||||
|
||||
|
||||
Reference in new issue
Block a user