feat(joinir): Phase 94 - P5b escape full E2E (derived ch + +1/+2)

This commit is contained in:
nyash-codex
2025-12-17 00:59:33 +09:00
parent c213ecc3c0
commit 7ab459503b
25 changed files with 1498 additions and 238 deletions

View File

@ -45,6 +45,8 @@ JoinIR の箱構造と責務、ループ/if の lowering パターンを把握
- 実装Phase 137-2: `src/mir/loop_canonicalizer/mod.rs`
6. Phase 93: ConditionOnly Derived SlotTrim / body-local
- `docs/development/current/main/phases/phase-93/README.md`
7. Phase 94: P5b “完全E2E”escape skip / derived
- `docs/development/current/main/phases/phase-94/README.md`
6. MIR BuilderContext 分割の入口)
- `src/mir/builder/README.md`
7. Scope/BindingIdshadowing・束縛同一性の段階移行

View File

@ -49,6 +49,13 @@
- schedule: `body-init → derived → break` を評価順SSOTとして強制
- Phase 記録(入口): `docs/development/current/main/phases/phase-93/README.md`
## 20251216Phase 94短報
- P5b escape`ch` 再代入 + `i` の +1/+2を “derivedSelect” として扱い、VM E2E を固定。
- 新箱: `BodyLocalDerivedEmitter` + 明示ポリシーstrict で理由付き Fail-Fast
- integration smoke: `tools/smokes/v2/profiles/integration/apps/phase94_p5b_escape_e2e.sh`
- Phase 記録(入口): `docs/development/current/main/phases/phase-94/README.md`
## 20251214現状サマリ
補足docs が増えて迷子になったときの「置き場所ルールSSOT」:

View File

@ -9,8 +9,8 @@ Related:
## 直近JoinIR/selfhost
- **P5b “完全E2E”**escape skip の実ループを end-to-end で固定)
- 現状: 認識(Phase 91+ lowering基盤Phase 92は完了、promotion が未整備で E2E を保留
- 入口: `docs/development/current/main/phases/phase-92/README.md`
- 現状: Phase 94 で VM E2E まで固定済み。次は selfhost 実コード(`apps/selfhost-vm/json_loader.hako`)へ横展開して回帰を減らす。
- 入口: `docs/development/current/main/phases/phase-94/README.md`
- **制御の再帰合成docs-only → dev-only段階投入**
- ねらい: `loop/if` ネストの “構造” を SSOTControlTree/StepTreeで表せるようにする
- 注意: canonicalizer は観測/構造SSOTまでValueId/PHI配線は Normalized 側へ)

View File

@ -107,6 +107,7 @@ flowchart LR
- Error tagsSSOT: [`src/mir/join_ir/lowering/error_tags.rs`](../../../../../src/mir/join_ir/lowering/error_tags.rs)
- Loop Canonicalizer前処理 SSOT: [`src/mir/loop_canonicalizer/mod.rs`](../../../../../src/mir/loop_canonicalizer/mod.rs)
- ConditionOnly Derived SlotPhase 93: [`src/mir/join_ir/lowering/common/condition_only_emitter.rs`](../../../../../src/mir/join_ir/lowering/common/condition_only_emitter.rs)
- BodyLocalDerived SlotPhase 94 / P5b: [`src/mir/join_ir/lowering/common/body_local_derived_emitter.rs`](../../../../../src/mir/join_ir/lowering/common/body_local_derived_emitter.rs)
---

View File

@ -1,6 +1,6 @@
# Phase 93: ConditionOnly Derived SlotTrim / body-local
Status: Active
Status: ✅ DoneP0+P1
Scope: Pattern2Loop with Breakで「ConditionOnlyPHIで運ばない派生値」を毎イテレーション再計算できるようにする。
Related:
- 設計地図(入口): `docs/development/current/main/design/joinir-design-map.md`
@ -27,6 +27,19 @@ JoinIR で “初回の計算値が固定される” 事故を避ける。
- Trim: `src/mir/builder/control_flow/joinir/patterns/trim_loop_lowering.rs`
- ConditionOnly 用 break 生成(反転の有無を明示)
## 成果P1: 箱化・語彙のSSOT化
コミット: `c213ecc3 refactor(mir): Phase 93 リファクタリング - 箱化モジュール化`
- schedule:
- `decide_pattern2_schedule()` に判定を集約し、理由ConditionOnly / body-local / loop-local / defaultをSSOT化
- 決定→生成を分離decision→buildしてテスト容易性を上げた
- ConditionOnlyRecipe:
- `BreakSemantics`WhenMatch / WhenNotMatchを recipe に保持し、break 条件生成の責務を recipe 側へ移動
- `trim_loop_lowering.rs` 側の重複ヘルパーを削除
- Debug新 env 追加なし):
- 既存の `NYASH_JOINIR_DEBUG=1` の範囲で、`[phase93/*]` prefix に統一
## 受け入れ基準P0
- `apps/tests/loop_min_while.hako` が退行しないPattern2 baseline

View File

@ -0,0 +1,6 @@
# Phase 94: P5b “完全E2E” のための `ch` 再代入対応
- 目的: `tools/selfhost/test_pattern5b_escape_minimal.hako` を JoinIRPattern2Breakで VM E2E PASS に固定する。
- 新箱: `BodyLocalDerivedEmitter``src/mir/join_ir/lowering/common/body_local_derived_emitter.rs`)で `ch` を Select ベースの derived 値として表現する。
- 契約: `escape_cond` は base 値で評価し、override は副作用なし・評価順を SSOT 化。`HAKO_JOINIR_STRICT=1` では未対応形を理由付き Fail-Fast。