feat(joinir): Phase 213-2 Step 2-2 & 2-3 Data structure extensions
Extended PatternPipelineContext and CarrierUpdateInfo for Pattern 3 AST-based generalization. Changes: 1. PatternPipelineContext: - Added loop_condition: Option<ASTNode> - Added loop_body: Option<Vec<ASTNode>> - Added loop_update_summary: Option<LoopUpdateSummary> - Updated build_pattern_context() for Pattern 3 2. CarrierUpdateInfo: - Added then_expr: Option<ASTNode> - Added else_expr: Option<ASTNode> - Updated analyze_loop_updates() with None defaults Status: Phase 213-2 Steps 2-2 & 2-3 complete Next: Create Pattern3IfAnalyzer to extract if statement and populate update summary
This commit is contained in:
@ -62,9 +62,13 @@ JoinIR ラインで守るべきルールを先に書いておくよ:
|
||||
- ExitLineReconnector は Condition 役の変数を exit_bindings から除外
|
||||
- **ParamRole の分類**:
|
||||
- `LoopParam`: ループ制御変数(例: `i` in `loop(i < len)`)→ header PHI + exit_bindings
|
||||
- `Condition`: 条件専用変数(例: `digits` in `digits.indexOf(ch)`)→ condition_bindings のみ
|
||||
- `Carrier`: 状態更新変数(例: `sum`, `count`)→ header PHI + exit_bindings
|
||||
- `ExprResult`: ループ戻り値 → exit_phi_builder で処理
|
||||
- `Condition`: 条件専用変数(例: `digits` in `digits.indexOf(ch)`)→ condition_bindings のみ
|
||||
- `Carrier`: 状態更新変数(例: `sum`, `count`)→ header PHI + exit_bindings
|
||||
- `ExprResult`: ループ戻り値 → exit_phi_builder で処理
|
||||
|
||||
10. **JoinIR Core は常時 ON**
|
||||
- LoopBuilder は物理削除済み。JoinIR を OFF にする経路やフォールバックは存在しない。
|
||||
- `NYASH_JOINIR_CORE` は deprecated(0 を指定しても警告して無視)。JoinIR の OFF トグルは提供しない。
|
||||
|
||||
---
|
||||
|
||||
@ -132,7 +136,44 @@ Local Region (1000+):
|
||||
- `JoinValueSpace`: **lowering 内部の分離**(param vs local vs PHI)
|
||||
- 両者は相補的な役割
|
||||
|
||||
詳細は `src/mir/join_ir/lowering/join_value_space.rs` と `phase201-join-value-space-design.md` を参照。
|
||||
### 1.9.5 Phase 205: 領域契約の検証強化
|
||||
|
||||
**追加された Box-First 機能**:
|
||||
|
||||
1. **衝突検出(debug-only)**
|
||||
- 全ての割り当てられた ValueId を追跡(`allocated_ids: HashSet<u32>`)
|
||||
- 重複割り当てを即座に検出し panic(Fail-Fast 原則)
|
||||
- `check_collision()` で実装
|
||||
|
||||
2. **領域検証(debug-only)**
|
||||
- `verify_region(id, expected_region)` で ValueId が期待される領域にいるか検証
|
||||
- 違反時は明確なエラーメッセージと修正ヒントを提供
|
||||
- 例: "ValueId(500) is in Param region, expected Local. Hint: Use alloc_local() for JoinIR values"
|
||||
|
||||
3. **RegionVerifier Box**
|
||||
- 場所: `src/mir/builder/control_flow/joinir/merge/mod.rs::verify_valueid_regions()`
|
||||
- 責務: merge 時に boundary と loop_info の ValueId 領域契約を検証
|
||||
- 検証項目:
|
||||
- 全ての `boundary.join_inputs` が Param 領域(100-999)にいる
|
||||
- 全ての `condition_bindings[].join_value` が Param 領域にいる
|
||||
- 全ての `carrier_phis[].phi_dst` が有効範囲(<= LOCAL_MAX)内
|
||||
|
||||
4. **明示的な領域定数**
|
||||
```rust
|
||||
pub const PHI_RESERVED_MIN: u32 = 0;
|
||||
pub const PHI_RESERVED_MAX: u32 = 99;
|
||||
pub const PARAM_MIN: u32 = 100;
|
||||
pub const PARAM_MAX: u32 = 999;
|
||||
pub const LOCAL_MIN: u32 = 1000;
|
||||
pub const LOCAL_MAX: u32 = 100000;
|
||||
```
|
||||
|
||||
**Fail-Fast 原則の実装**:
|
||||
- 領域違反は即座に panic(デバッグモード)
|
||||
- フォールバックやサイレント修正は一切行わない
|
||||
- エラーメッセージに具体的な修正方法を含める
|
||||
|
||||
詳細は `src/mir/join_ir/lowering/join_value_space.rs` と `phase205-valueid-regions-design.md` を参照。
|
||||
|
||||
---
|
||||
|
||||
@ -534,12 +575,43 @@ Pattern2/4 への統合(実際に Body-local 更新を使うループを JoinI
|
||||
|
||||
方針:
|
||||
|
||||
- **ループの「形」は P1–P4 から増やさない**。
|
||||
- **ループの「形」は P1–P4 から増やさない**。
|
||||
複雑さ(LoopBodyLocal 条件、OR chain、continue 多用など)は BoolExprLowerer /
|
||||
ContinueBranchNormalizer / TrimLoopLowerer (P5) といった補助箱側で吸収する。
|
||||
- JsonParser 側の P5 適用(Trim / `_skip_whitespace` / `_parse_string` 最小版)は実証済み。
|
||||
- JsonParser 側の P5 適用(Trim / `_skip_whitespace` / `_parse_string` 最小版)は実証済み。
|
||||
残りのループは Phase 17x–18x で、P1–P4+P5 の組み合わせとして段階的に実装していく。
|
||||
|
||||
### 4.3 JsonParser 実戦カバレッジ(Phase 210 時点)
|
||||
|
||||
Phase 210 で「軽量ループ 3 本」を実戦投入し、JoinIR インフラが **本番級に動作する** ことを確認したよ:
|
||||
|
||||
- **実戦確認済みループ**(7/13 loops ≒ 54%):
|
||||
- ✅ `_skip_whitespace` (P2 + P5 Trim, Phase 173)
|
||||
- ✅ `_trim` leading/trailing (P2 + P5 Trim, Phase 171/172)
|
||||
- ✅ `_match_literal` 最小版 (P1 Simple, Phase 210)
|
||||
- ✅ `_atoi` 最小版 (P2 Break, NumberAccumulation, Phase 210)
|
||||
- ✅ `_parse_number` 最小版 (P2 Break, Multi-carrier, Phase 210)
|
||||
|
||||
- **Phase 210 の成果**:
|
||||
- 3 本すべて JoinIR → MIR → Runtime 完全成功(RC 正常)
|
||||
- Pattern1 & Pattern2 自動ルーティング正常動作
|
||||
- NumberAccumulation (Mul+Add 2命令), Multi-carrier, PHI Contract, ValueId Regions すべて正常
|
||||
- **制約発見ゼロ** - Phase 190/201/204/205 の統合が完璧に機能
|
||||
|
||||
- **Phase 211/212 の発見** (2025-12-09):
|
||||
- Phase 211: if-sum パターン(ループ内 if 条件付き更新)の設計完了
|
||||
- Phase 212: ⚠️ **AST→MIR 層の制約発見** - ループ内 if/else が MIR に変換されない問題を検出
|
||||
- JoinIR Pattern3 (IfPHI) は動作可能だが、その前段階(AST→MIR)で if が消失
|
||||
- Phase 212.5 で AST→MIR ループ内 if 修正が必要と判明
|
||||
|
||||
- **残りループ** (Phase 211+ で段階的対応予定):
|
||||
- `_parse_array`, `_parse_object` (MethodCall 複数)
|
||||
- `_unescape_string` (複雑なキャリア処理)
|
||||
- その他 6 ループ(Phase 195/200+ 系設計で順次対応)
|
||||
|
||||
**結論**: JoinIR インフラ(P1-P5/JoinValueSpace/PHI契約)は **実戦投入可能な成熟度** に到達 ✨
|
||||
**Phase 212 制約**: AST→MIR 層のループ内 if 変換修正が次の課題
|
||||
|
||||
---
|
||||
|
||||
## 5. selfhost / .hako JoinIR Frontend との関係
|
||||
|
||||
Reference in New Issue
Block a user