Files
hakorune/docs/development/current/main/10-Now.md
nyash-codex 568619df89 feat(mir): Phase 92 P2-2 - Body-local variable support for ConditionalStep
Phase 92 P2-2完了:ConditionalStepのcondition(ch == '\\'など)でbody-local変数をサポート

## 主要変更

### 1. condition_lowerer.rs拡張
- `lower_condition_to_joinir`に`body_local_env`パラメータ追加
- 変数解決優先度:ConditionEnv → LoopBodyLocalEnv
- すべての再帰ヘルパー(comparison, logical_and, logical_or, not, value_expression)対応

### 2. conditional_step_emitter.rs修正
- `emit_conditional_step_update`に`body_local_env`パラメータ追加
- condition loweringにbody-local環境を渡す

### 3. loop_with_break_minimal.rs修正
- break condition loweringをbody-local init の**後**に移動(line 411)
- header_break_lowering::lower_break_conditionにbody_local_env渡す
- emit_conditional_step_updateにbody_local_env渡す(line 620)

### 4. header_break_lowering.rs修正
- `lower_break_condition`に`body_local_env`パラメータ追加
- scope_managerにbody-local環境を渡す

### 5. 全呼び出し箇所修正
- expr_lowerer.rs (2箇所)
- method_call_lowerer.rs (2箇所)
- loop_with_if_phi_if_sum.rs (3箇所)
- loop_with_continue_minimal.rs (1箇所)
- carrier_update_emitter.rs (1箇所・legacy)

## アーキテクチャ改善

### Break Condition Lowering順序修正
旧: Header → **Break Cond** → Body-local Init
新: Header → **Body-local Init** → Break Cond

理由:break conditionが`ch == '\"'`のようにbody-local変数を参照する場合、body-local initが先に必要

### 変数解決優先度(Phase 92 P2-2)
1. ConditionEnv(ループパラメータ、captured変数)
2. LoopBodyLocalEnv(body-local変数like `ch`)

## テスト

### ビルド
 cargo build --release成功(30 warnings、0 errors)

### E2E
⚠️ body-local promotion問題でブロック(Phase 92範囲外)
- Pattern2はbody-local変数をcarrier promotionする必要あり
- 既存パターン(A-3 Trim, A-4 DigitPos)に`ch = get_char(i)`が該当しない
- **Phase 92 P2-2目標(condition loweringでbody-local変数サポート)は達成**

## 次タスク(Phase 92 P3以降)
- body-local variable promotion拡張(Pattern2で`ch`のような変数を扱う)
- P5b E2Eテスト完全動作確認

## Phase 92 P2-2完了
 Body-local変数のcondition lowering対応完了
 ConditionalStepでbody-local変数参照可能
 Break condition lowering順序修正
2025-12-16 17:08:15 +09:00

152 lines
9.2 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.

# Self Current Task — Now (main)
## 20251215Phase 132 完了 ✅
**Phase 132: LLVM Exit PHI=0 根治修正 完了!**
- ループ exit PHI が 0 を返す問題を根治解決
- 原因2層: (1) JoinIR/Boundary が exit 値を境界に渡していない、(2) LLVM Python が PHI を落とす/上書きする
- 修正: Pattern 1 で exit 値を明示的に渡す + `predeclared_ret_phis` 使用 + `builder.vmap` の PHI 保護
- 結果: `/tmp/p1_return_i.hako` が 3 を返すVM 一致)
- 詳細: `investigations/phase132-llvm-exit-phi-wrong-result.md`
**追加Phase 132-P2: Case C の Exit PHI ValueId 衝突を修正**
- 原因: `exit_phi_builder.rs` が module-level allocator を使い、同一関数内で ValueId が衝突し得た
- 修正: `func.next_value_id()`function-levelへ統一`bd07b7f4`
- 結果: `apps/tests/llvm_stage3_loop_only.hako` が LLVM EXE でも `Result: 3`VM 一致)
- 詳細: `investigations/phase132-case-c-llvm-exe.md`
**追加Phase 132-P3: Exit PHI collision の早期検出debug-only**
- `verify_exit_phi_no_collision()``contract_checks.rs` に追加し、ValueId 衝突を JoinIR merge の段階で Fail-Fast する
## 20251215Phase 133136短報
- Phase 133: promoted carrierTrim`join_id` 解決を SSOT に寄せて修正smoke は compile-only
- Phase 134: plugin loader best-effort loading を導入(決定的順序 + failure 集約 + 継続)。
- Phase 135: ConditionLoweringBox が allocator SSOT を無視して ValueId 衝突を起こす問題を根治。
- 詳細: `docs/development/current/main/phases/phase-135/README.md`
- Phase 136: MirBuilder の Context 分割を完了し、状態の SSOT を Context に一本化。
- 詳細: `docs/development/current/main/phases/phase-136/README.md`
## 20251216Phase 137141短報
- Loop Canonicalizer前処理 SSOTは Phase 141 まで完了既定挙動は不変、dev-only 観測/strict parity あり)。
- 設計 SSOT: `docs/development/current/main/design/loop-canonicalizer.md`
- 実装: `src/mir/loop_canonicalizer/mod.rs`+ 観測: `src/mir/builder/control_flow/joinir/routing.rs`
- Phase 記録: `docs/development/current/main/phases/phase-137/README.md`
## 20251216Phase 92短報
- P5b escape の lowering を進行中。P1 で `ConditionalStep` emitter を箱化して、Pattern2 本体の肥大化を防いだ。
- Phase 記録: `docs/development/current/main/phases/phase-92/README.md`
## 20251214現状サマリ
補足docs が増えて迷子になったときの「置き場所ルールSSOT」:
- `docs/development/current/main/DOCS_LAYOUT.md`
### JoinIR / Loop / If ライン
- LoopBuilder は Phase 186187 で完全削除済み。**JoinIR が唯一の loop lowering 経路**。
- LoopPattern 系は Pattern14 まで実装・本線化済み:
- Pattern1: Simple While
- Pattern2: Loop with Break
- Pattern3: Loop with IfElse PHIbreak/continue なし)
- Pattern4: Loop with Continuemulticarrier 対応)
- Exit/Carrier/Boundary ラインは次の箱で SSOT 化:
- `CarrierInfo` / `ExitMeta` / `ExitBindingBuilder`
- `JoinInlineBoundary` + `LoopExitBinding`
- If lowering は IfSelectLowerer/IfMergeLowerer を中心に整理済み。Select/PHI の扱いも Phase 189 系で橋渡し済み。
- 残課題JoinIR ライン):
- JoinIR→MIR merge の一般化(複雑な Select/PHI パターンの統合)
- JsonParserBox など実アプリ側での長期運用テスト
- Phase 8690Loop frontendsまとめ1枚:
- `docs/development/current/main/phase86-90-loop-frontends-summary.md`
### Phase 8690: Loop frontends要約
- Phase 8690 は “dev-only fixtures + shape guard + fail-fast” で段階的に固定済み。
- 具体の fixture / shape / 未検証は `docs/development/current/main/phase86-90-loop-frontends-summary.md` を SSOT とする。
### Scope / BindingIddev-only の段階移行ライン)
- MIR builder 側で lexical scope / shadowing を実在化し、言語仕様の “local はブロック境界で分離” を SSOT に揃えた。
- JoinIR lowering 側は name-based から BindingId-based へ段階移行中:
- `ScopeManager.lookup_with_binding()` / `ConditionEnv.binding_id_map` を導入し、shadowing を壊さずに解決できる足場を作った。
- promoted carriersDigitPos/Trimについては `BindingId(original) → BindingId(promoted) → ValueId(join)` の鎖を dev-only で整備中。
- Phase 86 で `carrier_init_builder` / `error_tags` を SSOT 化し、段階移行ラインの基盤ValueId 生成とエラー語彙)が確立した。
- これにより、BindingId dual-path の拡張・統合時に「生成」と「表示」の責務が混ざらない構造が固定された。
- Phase 81 で Pattern2DigitPos/Trimの ExitLine 契約ConditionOnly を exit PHI から除外、LoopState のみを reconnectを E2E で固定した。
- 参照:
- `docs/development/current/main/phase73-scope-manager-design.md`
- `docs/development/current/main/phase78-bindingid-promoted-carriers.md`
- `docs/development/current/main/phase80-bindingid-p3p4-plan.md`
- `docs/development/current/main/phase81-pattern2-exitline-contract.md`
- `docs/development/current/main/phase78-85-boxification-feedback.md`
### JsonParser / Selfhost depth2 ライン
- `selfhost_build.sh --json` で Program JSON v0 emit は安定。
`.hako` 側から env 経由で JSON を読む最小ループ(`program_read_min.hako`)は動作確認済み。
- JsonParserBox / BundleResolver のループ 21 本のうち:
- 18 本は Pattern14 で JoinIR 対応済みPhase 162165
- `_trim` を含む一部の複合ループは、ValueId 境界や Box 登録など残課題あり。
- BoolExprLowerer / condition_to_joinir で OR/AND/NOT 付き条件式の lowering は実装完了Phase 168169
- 残課題JsonParser/selfhost depth2
- JoinIR→MIR ValueId boundary の完全一般化(条件用 ValueId を含める)
- JsonParserBox の using / Box 登録Rust VM 側での認識)
- Program JSON v0 を JsonParserBox 経由でフル解析する line の仕上げ
### Ring0 / Runtime / CoreServices ライン
- Ring0Context + Ring0Registry で OS API 抽象化レイヤ完成:
- MemApi / IoApi / TimeApi / LogApi / FsApi / ThreadApi
- RuntimeProfile(Default / NoFs) で条件付き必須を制御。
- CoreServicesring1coreとして次を実装済み
- StringService / IntegerService / BoolService
- ArrayService / MapService / ConsoleService
- PluginHost 統合 + UnifiedBoxRegistry からの自動初期化
- FileBox / FileHandleBox ライン:
- Ring0FsFileIo 経由で read / write / append / metadata 完全対応
- Default プロファイルでは必須、NoFs プロファイルでは disabled。
- Logging ライン:
- ConsoleServiceuserfacing
- Ring0.loginternal/dev
- println!test 専用)
の 3 層が `logging_policy.md` で整理済み。JoinIR/Loop trace も同ドキュメントに集約。
- VM backend の Box 解決UnifiedBoxRegistry / BoxFactoryRegistryの経路図:
- `docs/development/current/main/phase131-2-box-resolution-map.md`
- LLVMPython llvmlitelowering の棚卸しPhase 131-3..10:
- `docs/development/current/main/phase131-3-llvm-lowering-inventory.md`
- 状態: Case BPattern1/loop_min_whileは EMIT/LINK/RUN まで復旧済み。Phase 132 で `return i` の VM/LLVM parity を固定。
- Case C は別途 “Case C docs” を SSOT にして追跡する(状況は更新されるので、この箇所では断定しない)
- Case C の調査と実装計画:
- `docs/development/current/main/phase131-11-case-c-summary.md`
- `docs/development/current/main/case-c-infinite-loop-analysis.md`
---
## 20250908旧スナップショット参考
- LLVM 側 P0 完了BitOps/Array/Echo/Map 緑。VInvoke(byname/byid vector) は戻り値マッピングの暫定課題を確認中Decisions 参照)。
- selfhosting-dev の作業を main に順次取り込み。VM/MIR 基盤は main で先に整える方針。
直近タスク(当時)
1) continue/break の loweringBuilder 修正のみで表現)
- ループ文脈スタック {head, exit} を導入。
- continue に遭遇 → headまたは latchへ br を emit し終端。
- break に遭遇 → exit へ br を emit し終端。
- postterminated 後に emit しない制御を徹底。
2) ループ CFG の厳密化
- 単一 exit ブロックの徹底。
- Phi はヘッダでキャリー変数を合流SSA/支配関係が崩れない形)。
3) 検証とスモーク
- Verifier 緑dominance/SSA
- VM のループ代表(単純/ネスト/早期継続・脱出)。
- LLVM/Cranelift EXE に綺麗に降りるbr/phi ベースで問題なし)。
代表コマンド(例)
- ビルド: `cargo build --release`
- LLVM smoke: `LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) NYASH_LLVM_BITOPS_SMOKE=1 ./tools/llvm_smoke.sh release`
- VInvoke 調査: `NYASH_LLVM_VINVOKE_TRACE=1 NYASH_LLVM_VINVOKE_SMOKE=1 ./tools/llvm_smoke.sh release`