feat(joinir): Phase 164 Pattern3 (If-Else PHI) validation complete

- Created 4 representative test cases for Pattern3 patterns:
  * test_pattern3_if_phi_no_break.hako - Core Pattern3 (if-else PHI, no break/continue)
  * test_pattern3_skip_whitespace.hako - Pattern3+break style (routed to Pattern2)
  * test_pattern3_trim_leading.hako - Pattern3+break style (routed to Pattern2)
  * test_pattern3_trim_trailing.hako - Pattern3+break style (routed to Pattern2)

- Validated Pattern3_WithIfPhi detection:
  * Pattern routing: Pattern3_WithIfPhi MATCHED confirmed
  * JoinIR lowering: 3 functions, 20 blocks → 8 blocks (successful)
  * [joinir/freeze] elimination: Complete (no errors on any test)

- Clarified pattern classification:
  * Pattern3_WithIfPhi handles if-else PHI without break/continue
  * Loops with "if-else PHI + break" are routed to Pattern2_WithBreak
  * Break takes priority over if-else PHI in pattern detection

- Cumulative achievement (Phase 162-164):
  * Pattern1: 6 loops working 
  * Pattern2: 5 loops working 
  * Pattern3 (no break): 1 loop working 
  * Pattern3+break (as Pattern2): 3 loops working 
  * Total: 15 loops covered, zero [joinir/freeze] errors

- Updated CURRENT_TASK.md with Phase 164 section and findings

Next: Phase 165 Pattern4 (continue) validation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-06 16:22:38 +09:00
parent ae61226691
commit 701f1fd650
17 changed files with 1570 additions and 11 deletions

View File

@ -0,0 +1,89 @@
# Phase 194: JoinLoopTrace / Debug Integration
**Status**: In Progresstrace.rs は実装済み、呼び出し置き換えと docs 反映が残り)
**Date**: 2025-12-06
## Goal
JoinIR / ループ周辺のデバッグ出力を `JoinLoopTrace` に集約し、環境変数ベースの制御と `logging_policy.md` の方針に沿った形に整理する。
---
## Implemented Infrastructure
### JoinLoopTrace モジュール
- File: `src/mir/builder/control_flow/joinir/trace.rs`
- 役割:
- JoinIR ループまわりの `eprintln!` を 1 箱に集約する。
- 環境変数からフラグを読み取り、どのカテゴリのトレースを出すかを制御する。
- 対応環境変数:
- `NYASH_TRACE_VARMAP=1` variable_map トレースvar → ValueId
- `NYASH_JOINIR_DEBUG=1` JoinIR 全般のデバッグ(パターン routing、merge 統計など)
- `NYASH_OPTION_C_DEBUG=1` PHI 生成Option C周りのトレース
- `NYASH_JOINIR_MAINLINE_DEBUG=1` mainline routing代表関数の routingトレース
- `NYASH_LOOPFORM_DEBUG=1` LoopForm 関連トレース(レガシー互換)
### 主なメソッド
- `pattern(tag, pattern_name, matched)` パターン検出・選択
- `varmap(tag, &BTreeMap<String, ValueId>)` variable_map の状態
- `joinir_stats(tag, func_count, block_count)` JoinIR モジュールの統計
- `phi(tag, msg)` PHI 関連の操作
- `merge(tag, msg)` JoinIR→MIR マージ進行
- `exit_phi(tag, var_name, old_id, new_id)` Exit PHI 接続
- `debug(tag, msg)` / `routing(tag, func_name, msg)` / `blocks(tag, msg)` / `instructions(tag, msg)` 汎用デバッグ
グローバルアクセサ:
```rust
pub fn trace() -> &'static JoinLoopTrace
```
でどこからでも呼び出せる。
---
## Remaining Work (Phase 194)
### Task 194-3: 生 `eprintln!` の JoinLoopTrace 置き換え
対象(例):
- `src/mir/builder/control_flow/joinir/patterns/pattern4_with_continue.rs`
- まだ 8 箇所程度 `eprintln!` ベースのログが残っている。
- ここを順次:
- varmap ログ → `trace().varmap(...)`
- パターン / ルーティング系 → `trace().pattern(...)` / `trace().routing(...)`
- それ以外の debug → `trace().debug(...)`
に差し替える。
同様に、他の JoinIR / loop 関連ファイルに散在している `[joinir/...]``eprintln!` も、必要に応じて `trace.rs` 経由に寄せる。
### Task 194-4: logging_policy.md 反映
- File: `docs/development/current/main/logging_policy.md`
- 追記内容:
- JoinIR / ループ系のトレースカテゴリを 1 セクションにまとめる:
- varmapNYASH_TRACE_VARMAP
- joinir-debugNYASH_JOINIR_DEBUG
- phi-debugNYASH_OPTION_C_DEBUG
- mainline-debugNYASH_JOINIR_MAINLINE_DEBUG
- 開発時のみ ON、本番パスでは OFF を前提とする運用メモ。
- `trace.rs` による prefix`[trace:pattern]`, `[trace:varmap]`, ...)を簡単に説明。
---
## Success Criteria
- JoinIR / ループ周辺の `eprintln!` が、意味あるかたちで `JoinLoopTrace` 経由に置き換わっている。
- `NYASH_TRACE_VARMAP=1``NYASH_JOINIR_DEBUG=1` の挙動が `logging_policy.md` に説明されている。
- デフォルトenv 未設定ではトレースは出ず、既存の代表テストPattern 1〜4はログ無しで PASS する。
---
## Notes
- Phase 194 は **挙動を変えない** リファクタフェーズ(観測レイヤーの整形)として扱う。
- Loop パターンや ExitBinding まわりは Phase 193/196/197 で安定しているので、それを壊さない形でログだけを寄せることが目的。