- 删除 Handles 各模块已迁移至 Gen 的旧函数体,保留一行委托壳(25 文件 -798 行) - main.vp / BuildPipeline.vp 全局单例注入改为 _g_gen 直接赋值 - 机械化迁移测试前的基线备份
167 lines
7.1 KiB
Plaintext
167 lines
7.1 KiB
Plaintext
import t, c
|
||
from stdint import *
|
||
import memhub
|
||
import string
|
||
import llvmlite
|
||
import stdio
|
||
import viperlib
|
||
import lib.core.VLogger as VLogger
|
||
import lib.core.Gen.Generator as Generator
|
||
|
||
|
||
# ============================================================
|
||
# HandlesEnum - 枚举类型注册和成员查找(P6 对象化后的委托层)
|
||
#
|
||
# 全部模块级函数已迁移为 lib.core.Gen.StmtGenMixin 的方法
|
||
# (模块级全局 _enum_table/_enum_count → gen 实例字段
|
||
# EnumTable/EnumCount),本模块保留同名模块级函数作为"一行委托":
|
||
# 延迟 import Gen 取全局单例(BuildPipeline/main 创建后
|
||
# set_global_gen 注册),再调用 gen 的对应方法。签名与旧函数
|
||
# 完全一致,调用方零改动。
|
||
#
|
||
# EnumEntry/EnumMember 类型保留在本模块(gen 字段类型引用)。
|
||
# 管理 t.CEnum 派生类的成员信息:
|
||
# - 枚举名 → EnumEntry(基准类型 + 成员表)
|
||
# - 成员名 → EnumMember(值、类型)
|
||
#
|
||
# 使用全局数组存储,线性查找(枚举数量通常很少)
|
||
# ============================================================
|
||
|
||
ENUM_MAX: t.CDefine = 64
|
||
ENUM_MEMBER_MAX: t.CDefine = 128
|
||
|
||
|
||
# ============================================================
|
||
# EnumMember - 枚举成员条目
|
||
# ============================================================
|
||
@t.NoVTable
|
||
class EnumMember:
|
||
Name: str # 成员名(字符串)
|
||
Value: t.CInt64T # 成员的整数值
|
||
Ty: llvmlite.LLVMType | t.CPtr # 成员的 LLVM 类型(用于混用类型场景)
|
||
|
||
|
||
# ============================================================
|
||
# EnumEntry - 枚举类型条目
|
||
# ============================================================
|
||
@t.NoVTable
|
||
class EnumEntry:
|
||
Name: str # 枚举类名
|
||
BaseTy: llvmlite.LLVMType | t.CPtr # 基准类型(所有成员类型中最大的)
|
||
MemberCount: int # 成员数量
|
||
Members: EnumMember | t.CPtr # 成员数组(ENUM_MEMBER_MAX 个槽位)
|
||
|
||
|
||
# ============================================================
|
||
# 全局 gen 单例(模块级镜像,同 HandlesStruct 模式)
|
||
# ============================================================
|
||
_g_gen: Generator.Generator | t.CPtr = None
|
||
|
||
|
||
# ============================================================
|
||
# init_enum_table — 初始化枚举注册表
|
||
# ============================================================
|
||
def init_enum_table(pool: memhub.MemBuddy | t.CPtr) -> int:
|
||
"""初始化枚举注册表,返回 1 成功(委托到 gen.init_enum_table)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.init_enum_table(pool)
|
||
return 0
|
||
|
||
|
||
# ============================================================
|
||
# _get_enum_entry — 获取第 i 个 EnumEntry 槽位
|
||
# ============================================================
|
||
def _get_enum_entry(i: int) -> EnumEntry | t.CPtr:
|
||
"""获取第 i 个枚举条目(委托到 gen._get_enum_entry)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g._get_enum_entry(i)
|
||
return None
|
||
|
||
|
||
# ============================================================
|
||
# _get_enum_member — 获取枚举中第 i 个 EnumMember 槽位
|
||
# ============================================================
|
||
def _get_enum_member(enum_entry: EnumEntry | t.CPtr, i: int) -> EnumMember | t.CPtr:
|
||
"""获取枚举中第 i 个成员条目(委托到 gen._get_enum_member)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g._get_enum_member(enum_entry, i)
|
||
return None
|
||
|
||
|
||
# ============================================================
|
||
# register_enum — 注册枚举类型
|
||
#
|
||
# 返回 EnumEntry 指针,可用于添加成员
|
||
# ============================================================
|
||
def register_enum(pool: memhub.MemBuddy | t.CPtr,
|
||
name: str,
|
||
base_ty: llvmlite.LLVMType | t.CPtr) -> EnumEntry | t.CPtr:
|
||
"""注册枚举类型,返回 EnumEntry 指针(委托到 gen.register_enum)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.register_enum(pool, name, base_ty)
|
||
return None
|
||
|
||
|
||
# ============================================================
|
||
# add_enum_member — 向枚举添加成员
|
||
# ============================================================
|
||
def add_enum_member(pool: memhub.MemBuddy | t.CPtr,
|
||
enum_entry: EnumEntry | t.CPtr,
|
||
member_name: str,
|
||
member_val: t.CInt64T,
|
||
member_ty: llvmlite.LLVMType | t.CPtr) -> int:
|
||
"""向枚举添加成员,返回成员索引(-1 失败,委托到 gen.add_enum_member)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.add_enum_member(pool, enum_entry, member_name, member_val, member_ty)
|
||
return 0
|
||
|
||
|
||
# ============================================================
|
||
# find_enum — 按枚举类名查找
|
||
# ============================================================
|
||
def find_enum(name: str) -> EnumEntry | t.CPtr:
|
||
"""按枚举类名查找,返回 EnumEntry 或 None(委托到 gen.find_enum)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.find_enum(name)
|
||
return None
|
||
|
||
|
||
# ============================================================
|
||
# lookup_enum_member — 按枚举类名和成员名查找
|
||
# ============================================================
|
||
def lookup_enum_member(enum_name: str,
|
||
member_name: str) -> EnumMember | t.CPtr:
|
||
"""按枚举类名和成员名查找,返回 EnumMember 或 None(委托到 gen.lookup_enum_member)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.lookup_enum_member(enum_name, member_name)
|
||
return None
|
||
|
||
|
||
# ============================================================
|
||
# is_enum_class — 检查类名是否为已注册枚举
|
||
# ============================================================
|
||
def is_enum_class(name: str) -> int:
|
||
"""检查类名是否为已注册枚举,返回 1=是 / 0=否(委托到 gen.is_enum_class)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.is_enum_class(name)
|
||
return 0
|
||
|
||
|
||
# ============================================================
|
||
# get_enum_base_type — 按枚举类名获取基准类型
|
||
# ============================================================
|
||
def get_enum_base_type(enum_name: str) -> llvmlite.LLVMType | t.CPtr:
|
||
"""按枚举类名获取基准类型(委托到 gen.get_enum_base_type)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.get_enum_base_type(enum_name)
|
||
return None
|