Phase 25.1b: Step3完了(LoopForm対応)
Step3実装内容(LoopForm → MIR導線確立): - FuncBodyBasicLowerBox._try_lower_loop追加: - Loop判定 → LowerLoopSumBcBox → LowerLoopSimpleBox の順に試行 - 成功時は_rebindで関数名をBox.method/arityに付け替え - 失敗時は[builder/funcs:unsupported:loopform]でFail-Fast - lowerメソッド冒頭でLoop優先処理: - Loop含む場合は_try_lower_loopを呼び、成功/失敗で明確に分岐 - Loopが無い場合のみ既存のLocal/If/Return処理に進む - PHI地獄防止ポリシー徹底: - FuncBodyBasicLowerBox/FuncLowering側でPHIやキャリアを直接いじらない - LoopForm制約外は必ずタグ付きでFail-Fast(Rust providerに退避可能) ドキュメント更新: - Phase 25.1b README: Step3をinitial-implementedに更新 - builder README: [builder/funcs:unsupported:loopform]タグ追加 - CURRENT_TASK.md: Step3進捗記録 スモークテスト: - selfhost_mir_loopform_basic_vm.sh追加(基本構造実装済み) - defs生成経路の詳細調整は継続タスク Next: Step4(MethodCall/ExternCall対応) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -14,6 +14,7 @@ Tags (Fail‑Fast, stable)
|
||||
- `[mirbuilder/internal/unsupported] ...` — Program(JSON) shape not yet supported by internal lowers
|
||||
- `[builder/selfhost-first:unsupported:defs_only]` — only defs を lowering できる状態(main なし)のため中止
|
||||
- `[builder/selfhost-first:unsupported:no_match]` — internal lowers / defs のどちらにもマッチせず中止
|
||||
- `[builder/funcs:unsupported:loopform]` — Loop を含むが LoopForm 制約に当てはまらないか、selfhost builder ではまだ扱えない Loop 構造のため中止(Rust provider に退避可能)
|
||||
- `[builder/funcs:fail:no-main]` — inject_funcs が main を含まない MIR に defs を差し込もうとしたため拒否(`HAKO_MIR_BUILDER_REQUIRE_MAIN=1` 時)
|
||||
- `[mirbuilder/delegate]` — delegate path selected(Runner/extern provider 経由)
|
||||
- `[mirbuilder/delegate/missing]` — delegate/provider not wired yet
|
||||
|
||||
@ -14,6 +14,8 @@ using "hako.mir.builder.internal.lower_if_compare_fold_binints" as LowerIfCompar
|
||||
using "hako.mir.builder.internal.lower_if_compare_fold_varint" as LowerIfCompareFoldVarIntBox
|
||||
using "hako.mir.builder.internal.lower_if_compare_varint" as LowerIfCompareVarIntBox
|
||||
using "hako.mir.builder.internal.lower_if_compare_varvar" as LowerIfCompareVarVarBox
|
||||
using "hako.mir.builder.internal.lower_loop_simple_box" as LowerLoopSimpleBox
|
||||
using "hako.mir.builder.internal.lower_loop_sum_bc_box" as LowerLoopSumBcBox
|
||||
|
||||
static box FuncBodyBasicLowerBox {
|
||||
lower(func_name, box_name, params_arr, body_json) {
|
||||
@ -21,6 +23,18 @@ static box FuncBodyBasicLowerBox {
|
||||
local s = "" + body_json
|
||||
if !(s.contains("\"version\"")) || !(s.contains("\"kind\"")) { return null }
|
||||
|
||||
// 1) Loop priority: delegate to LoopForm lowers if Loop is present
|
||||
if s.contains("\"type\":\"Loop\"") {
|
||||
local loop_result = me._try_lower_loop(func_name, box_name, params_arr, s)
|
||||
if loop_result != null { return loop_result }
|
||||
// Fail-Fast: Loop present but not supported by selfhost builder
|
||||
if env.get("HAKO_SELFHOST_TRACE") == "1" {
|
||||
print("[builder/funcs:unsupported:loopform] func=" + func_name)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
// 2) Non-Loop processing: Local/If/Return patterns only
|
||||
local lowered = me._try_lower_local_if_return(func_name, box_name, params_arr, s)
|
||||
if lowered != null { return lowered }
|
||||
|
||||
@ -37,9 +51,6 @@ static box FuncBodyBasicLowerBox {
|
||||
{ local out = LowerIfCompareVarVarBox.try_lower(s); if out != null { return me._rebind(out, func_name, box_name, params_arr, "[funcs/basic:if.compare.varvar]") } }
|
||||
{ local out = LowerIfCompareBox.try_lower(s); if out != null { return me._rebind(out, func_name, box_name, params_arr, "[funcs/basic:if.compare.intint]") } }
|
||||
{ local out = LowerReturnIntBox.try_lower(s); if out != null { return me._rebind(out, func_name, box_name, params_arr, "[funcs/basic:return.int]") } }
|
||||
if s.contains("\"type\":\"Loop\"") && env.get("HAKO_SELFHOST_TRACE") == "1" {
|
||||
print("[builder/funcs:unsupported:loop]")
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
@ -341,4 +352,20 @@ static box FuncBodyBasicLowerBox {
|
||||
}
|
||||
return "{\"functions\":[{\"name\":\"" + target + "\",\"params\":" + params_json + ",\"locals\":[],\"blocks\":[" + blocks + "]}]}"
|
||||
}
|
||||
|
||||
method _try_lower_loop(func_name, box_name, params_arr, body_json) {
|
||||
// 1) LoopForm の Loop を持つ Program(JSON) であることを軽く確認
|
||||
if !(body_json.contains("\"type\":\"Loop\"")) { return null }
|
||||
|
||||
// 2) まず sum_bc 用の lower を試す
|
||||
{ local out = LowerLoopSumBcBox.try_lower(body_json)
|
||||
if out != null { return me._rebind(out, func_name, box_name, params_arr, "[funcs/basic:loop.sum_bc]") } }
|
||||
|
||||
// 3) 次に simple loop 用 lower を試す
|
||||
{ local out2 = LowerLoopSimpleBox.try_lower(body_json)
|
||||
if out2 != null { return me._rebind(out2, func_name, box_name, params_arr, "[funcs/basic:loop.simple]") } }
|
||||
|
||||
// 4) ここまででダメなら selfhost 側では未対応
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user