Files
hakorune/docs/development/roadmap/phases/phase-25.1d/README.md

74 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 25.1d — Rust MIR SSA / PHI Smokes
Status: planning構造バグ切り出しフェーズ・挙動は変えないRust側のみ
## ゴール
- Rust MIR builder`MirBuilder` + `LoopBuilder` + IfFormの SSA / PHI 周りのバグを「Rust テスト/スモーク」で淡々と炙り出して潰すフェーズ。
- StageB / Stage1 / selfhost で見えている ValueId 未定義問題を、Rust 側の最小ケースに還元してから直す。
- Nyash 側 MirBuilder.hako 実装)は Phase 25.1c / 25.1e 以降に扱い、まずは Rust 層の PHI 不整合を止血する。
## 方針
- 新機能追加ではなく **テスト+バグ修正のみ**
- 1バグ1テストの原則で、「再現用 Hako もしくは AST 構築 → MirCompiler → MirVerifier」のパターンを増やしていく。
- 既に報告されている Undefined Value / nondominating use / Phi 不足を、そのまま Rust テストケースに落とし込む。
## タスク粒度(やることリスト)
1. **StageB 最小ハーネスの Rust テスト化**
- 既存: `lang/src/compiler/tests/stageb_min_sample.hako` + `tools/test_stageb_min.sh`
- やること:
- Rust 側に小さなテストを追加(例: `src/tests/stageb_min_mir_verify.rs`:
- `Hako``AST``MirCompiler::compile(ast)``MirVerifier::verify_module`
- 期待: StageB 最小サンプルのみを対象に Undefined Value が 0 件であること。
- 目的: shell スクリプトに依存せず、`cargo test` ベースで StageB 由来の MIR を検証できる足場を作る。
2. **単一関数向け PHI スモークの追加**
- 対象関数Rust 側で直接 AST を組むHako を読む):
- `TestArgs.process(args)` 型: `if args != null { local n = args.length(); loop(i < n) { ... } }`
- `TestNested.complex(data)` 型: if + nested loop + method call。
- やること:
- 簡単な Hako を `tests/mir_phi_*` ディレクトリか `src/tests/*` に置き、MirCompiler でコンパイルして verifier を通すテストを書く。
- ここでは StageB を通さず、直接 Rust MirBuilder に食わせて PHI / recv の挙動を見る。
3. **LoopBuilder / IfForm の PHI 不整合の切り出し**
- すでに verifier が報告している場所:
- `JsonScanBox.seek_array_end/2` の nondominating use。
- `Stage1UsingResolverBox._collect_using_entries/1` / `resolve_for_source/1` の Phi 不足。
- `ParserBox.parse_program2/1` の merge block Phi 不足。
- やること:
- 各関数について「最小に削った MIR 再現ケース」を Rust テストとして切り出しAST 直書きでもよい)、`MirVerifier` が通るように LoopBuilder / IfForm / PHI 挿入コードを修正する。
- ポイント:
- 1 関数ずつ、小さなテスト+小さな修正で前に進める(大量に一気にいじらない)。
4. **StageB 関数群の Rust スモーク**
- `compiler_stageb.hako` から抜き出された関数:
- `StageBArgsBox.resolve_src/1`
- `StageBBodyExtractorBox.build_body_src/2`
- `StageBDriverBox.main/1`
- やること:
- AST もしくは Hako→AST 変換経由で、これらの関数だけを MirCompiler にかけるテストを用意。
- 各テストで `MirVerifier::verify_function` を呼び、Undefined Value / Phi 不足が無い状態を目標に、Loop/If lowering を順番に修正していく。
5. **Verifier 強化Method recv / PHI に特化したチェック)**
- 追加したいチェック:
- `MirInstruction::Call``callee = Method{receiver: Some(r)}` のとき、`r` がその関数内で一度以上 `dst` として定義されているか。
- Merge block で predecessor 定義値をそのまま読む場合に「Phi が必須」な箇所を強制エラーにする。
- これを入れた上で、上記の小さなテストが全部緑になるように MirBuilder 側を直す。
## スコープ外
- Nyash 側 MirBuilder`lang/src/mir/builder/*.hako`)の本格リファクタ。
- ここは Phase 25.1c / 25.1e で箱化・モジュール化しつつ直す想定receiver=0 ハードコード撤去など)。
- 新しい MIR 命令追加や意味論変更。
- 既存の MIR 命令セットの範囲で SSA / PHI の整合性を取る。
## まとめ
- Phase 25.1d は「Rust MIR SSA / PHI のスモークを増やしてコツコツ直す」フェーズ。
- やることは単純で、やる量は多い:
- 小さいテストを書く → verifier で赤を出す → LoopBuilder / IfForm / MirBuilder を直す → 緑になるまで繰り返す。
- これにより、StageB / Stage1 / selfhost の土台となる Rust MIR 層が安定し、その上に Nyash selfhost 側の MirBuilder を載せやすくする。
- なお、StageB 最小ハーネス(`stageb_min_sample.hako`については、Rust MIR builder 経由の直接 VM / MIR verify は既に緑であり、残っている stack overflow は `compiler_stageb.hako` 側の Nyash ボックス連鎖に起因するものと考えられる。Rust 層では `emit_unified_call` / BoxCall / legacy 警戒の再入防止フラグと再帰深度カウンタを導入済みであり、以降は Nyash 側に浅い再帰ガードを置いて原因ボックスを特定するフェーズへ引き継ぐ。