- 删除 Handles 各模块已迁移至 Gen 的旧函数体,保留一行委托壳(25 文件 -798 行) - main.vp / BuildPipeline.vp 全局单例注入改为 _g_gen 直接赋值 - 机械化迁移测试前的基线备份
117 lines
5.6 KiB
Plaintext
117 lines
5.6 KiB
Plaintext
import t, c
|
||
from stdint import *
|
||
import ast
|
||
import llvmlite
|
||
import memhub
|
||
import string
|
||
import viperlib
|
||
import lib.core.Handles.HandlesExpr as HandlesExpr
|
||
import lib.core.Handles.HandlesVar as HandlesVar
|
||
import lib.core.Handles.HandlesTranslator as HT
|
||
import lib.core.Gen.Generator as Generator
|
||
|
||
# ============================================================
|
||
# HandlesExprOps - 二元运算处理(P3 对象化后的委托层)
|
||
#
|
||
# 全部函数已迁移为 lib.core.Gen.ExprGenMixin 的方法,本模块保留
|
||
# 同名模块级函数作为"一行委托":延迟 import Gen 取全局单例
|
||
# (BuildPipeline/main 创建后 set_global_gen 注册),再调用 gen
|
||
# 的对应方法。签名与旧函数完全一致,调用方零改动。
|
||
# ============================================================
|
||
|
||
|
||
# ============================================================
|
||
# 全局 gen 单例(模块级镜像,同 HandlesType/HandlesStruct 模式)
|
||
# ============================================================
|
||
_g_gen: Generator.Generator | t.CPtr = None
|
||
|
||
|
||
# ============================================================
|
||
# 委托函数:延迟 import Gen 取全局单例 → 调 gen 方法
|
||
# (gen 未注册时正常流程不会发生;有返回值函数返回默认值)
|
||
# ============================================================
|
||
|
||
|
||
# BinOp 运算符 → dunder 方法名
|
||
def _binop_to_dunder(op: int) -> str:
|
||
"""将 BinOp 运算符映射到 dunder 方法名,无映射时返回 None(委托到 gen._binop_to_dunder)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g._binop_to_dunder(op)
|
||
return None
|
||
|
||
|
||
# Compare 运算符 → dunder 方法名
|
||
def _cmpop_to_dunder(op: int) -> str:
|
||
"""将 Compare 运算符映射到 dunder 方法名,无映射时返回 None(委托到 gen._cmpop_to_dunder)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g._cmpop_to_dunder(op)
|
||
return None
|
||
|
||
|
||
# UnaryOp 运算符 → dunder 方法名
|
||
def _unaryop_to_dunder(op: int) -> str:
|
||
"""将 UnaryOp 运算符映射到 dunder 方法名,无映射时返回 None(委托到 gen._unaryop_to_dunder)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g._unaryop_to_dunder(op)
|
||
return None
|
||
|
||
|
||
# ============================================================
|
||
# try_operator_overload - 尝试运算符重载
|
||
#
|
||
# 检查 lhs 是否为结构体指针,并在该类(含继承链)中查找对应的
|
||
# dunder 方法。找到则生成方法调用 lhs.__dunder__(rhs),返回
|
||
# 调用结果;未找到返回 None,调用方回退到原生运算。
|
||
# ============================================================
|
||
def try_operator_overload(pool: memhub.MemBuddy | t.CPtr,
|
||
builder: llvmlite.IRBuilder | t.CPtr,
|
||
mod: llvmlite.LLVMModule | t.CPtr,
|
||
lhs: llvmlite.Value | t.CPtr,
|
||
rhs: llvmlite.Value | t.CPtr,
|
||
op: int,
|
||
trans: HT.Translator | t.CPtr,
|
||
is_compare: int) -> llvmlite.Value | t.CPtr:
|
||
"""尝试运算符重载:lhs 是结构体指针时调用 dunder 方法,否则返回 None(委托到 gen.try_operator_overload)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.try_operator_overload(pool, builder, mod, lhs, rhs, op, trans, is_compare)
|
||
return None
|
||
|
||
|
||
# ============================================================
|
||
# try_unary_operator_overload - 尝试一元运算符重载
|
||
#
|
||
# 检查 operand 是否为结构体指针,并在该类(含继承链)中查找对应的
|
||
# dunder 方法(__neg__/__pos__/__invert__)。找到则生成方法调用
|
||
# operand.__dunder__(),返回调用结果;未找到返回 None,调用方回退到原生运算。
|
||
# ============================================================
|
||
def try_unary_operator_overload(pool: memhub.MemBuddy | t.CPtr,
|
||
builder: llvmlite.IRBuilder | t.CPtr,
|
||
mod: llvmlite.LLVMModule | t.CPtr,
|
||
operand: llvmlite.Value | t.CPtr,
|
||
op: int,
|
||
trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr:
|
||
"""尝试一元运算符重载:operand 是结构体指针时调用 dunder 方法,否则返回 None(委托到 gen.try_unary_operator_overload)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.try_unary_operator_overload(pool, builder, mod, operand, op, trans)
|
||
return None
|
||
|
||
|
||
# ============================================================
|
||
# 翻译二元运算(自动类型提升)
|
||
# ============================================================
|
||
def translate_binop(pool: memhub.MemBuddy | t.CPtr,
|
||
builder: llvmlite.IRBuilder | t.CPtr,
|
||
mod: llvmlite.LLVMModule | t.CPtr,
|
||
node: ast.AST | t.CPtr,
|
||
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
|
||
"""翻译二元运算(自动类型提升)(委托到 gen.translate_binop)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.translate_binop(pool, builder, mod, node, trans)
|
||
return None
|