- 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)待编译器缺陷修复后删
56 lines
2.5 KiB
Plaintext
56 lines
2.5 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
|
||
|
||
|
||
# ============================================================
|
||
# HandlesFor - for 循环语句处理(迁移完成,保留跨 Mixin 委托壳)
|
||
#
|
||
# P6 机械化迁移:ForHandle/ForHandleBase/ForHandleIter 全部方法 →
|
||
# StmtGenCifMixin.translate_for 及辅助方法(_handle_ptr_iter/
|
||
# _handle_array_iter/_handle_list_literal_iter/_handle_list_iter/
|
||
# _handle_dict_iter/_handle_oop_iter/_handle_enumerate_iter/
|
||
# _handle_zip_iter/_extract_tuple_names/_seq_kind/_build_seq_loop)。
|
||
# SEQ_KIND_* 常量保留:StmtGenCifMixin._seq_kind/_build_seq_loop 经
|
||
# HandlesFor.SEQ_KIND_* 访问。
|
||
# 分派中枢(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
|
||
|
||
|
||
# ============================================================
|
||
# 序列迭代源类型码(for x in ... / enumerate / zip 迭代源分类)
|
||
# RANGE: range(start, stop, step)
|
||
# STR: 字符串(常量或 str 变量)
|
||
# LIST: list[T] 容器(按 __count__ + __data__ 迭代)
|
||
# ============================================================
|
||
SEQ_KIND_RANGE: t.CDefine = 1
|
||
SEQ_KIND_STR: t.CDefine = 2
|
||
SEQ_KIND_LIST: t.CDefine = 3
|
||
|
||
|
||
# ============================================================
|
||
# translate_for - for 循环语句翻译(委托到 gen.translate_for)
|
||
# ============================================================
|
||
def translate_for(trans: HT.Translator | t.CPtr,
|
||
node: ast.AST | t.CPtr) -> int:
|
||
"""翻译 for 循环语句(委托到 gen.translate_for)"""
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.translate_for(trans, node)
|
||
return 0
|