- 10 个 Handler 类主方法迁入 Gen:Assign/AnnAssign/AugAssign→AssignGenMixin, If/While/For/Return→StmtGenCifMixin,Match→新建 MatchGenMixin(注册 Generator MRO), Imports→ImportsGenMixin;方法体 self.Trans→trans,签名加 trans 首参 - 分派改:StmtGenMixin.translate_stmt 同链 self.translate_xxx + 跨链经 Handles 委托壳 (NoVTable 静态绑定约束);ExprCall 分派改走 ExprCallCall 壳 - 清理:HandlesTranslator 删 11 个 Handler 字段与 _init_state 创建段; StmtGenCifMixin 删 5 个 NewXxxHandle 工厂;main/BuildPipeline 补 HandlesAssign._g_gen 注入 - 委托壳保留:跨 Mixin 桥(Assign/AnnAssign/AugAssign/Match/Imports)待编译器缺陷修复后删
41 lines
1.8 KiB
Plaintext
41 lines
1.8 KiB
Plaintext
import t, c
|
||
from stdint import *
|
||
import ast
|
||
import memhub
|
||
import lib.core.Handles.HandlesTranslator as HT
|
||
import lib.core.Gen.Generator as Generator
|
||
|
||
|
||
# ============================================================
|
||
# HandlesWhile - while 循环语句处理(迁移完成,保留跨 Mixin 委托壳)
|
||
#
|
||
# P6 机械化迁移:WhileHandle 类 → StmtGenCifMixin.translate_while;
|
||
# 模块级辅助 _IsConstTrue/_NodeHasBreak/_StmtHasBreak → StmtGenCifMixin
|
||
# 方法(merge 可达性判定)。
|
||
# 分派中枢(StmtGenMixin)经本壳跨链调用(Viper @t.NoVTable 静态绑定下
|
||
# 跨 Mixin self. 调用 mangle 失败,须经模块级委托壳桥回 gen 单例)。
|
||
# 迁移收尾(编译器缺陷修复)后统一删除。
|
||
# ============================================================
|
||
|
||
|
||
# ============================================================
|
||
# 全局 gen 单例(模块级镜像,同 HandlesType/HandlesStruct 模式)
|
||
#
|
||
# 由 BuildPipeline/main 在 gen 创建后调用 set_global_gen 注入。
|
||
# 委托函数用本地 _g_gen(cast 成 Generator 类型)调
|
||
# StmtGenCifMixin 方法,避免函数体 import 包模块与类/模块名歧义。
|
||
# ============================================================
|
||
_g_gen: Generator.Generator | t.CPtr = None
|
||
|
||
|
||
# ============================================================
|
||
# translate_while - while 循环语句翻译(委托到 gen.translate_while)
|
||
# ============================================================
|
||
def translate_while(trans: HT.Translator | t.CPtr,
|
||
node: ast.AST | t.CPtr) -> int:
|
||
"""翻译 while 循环语句(委托到 gen.translate_while)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.translate_while(trans, node)
|
||
return 0
|