bf3893b2cc
feat(mir): Phase 30 F-3.0.7 LoopScopeShape Case-A minimal routing
...
Add func_name-based routing in LoopScopeShape::from_existing_boxes()
to prepare for MIR-based independent analysis:
- Add is_case_a_minimal_target() helper for 4 Case-A targets
- Add analyze_case_a() method (delegates to legacy, future MIR-based)
- Add from_existing_boxes_legacy() for backward compatibility
- Update from_existing_boxes() with func_name: Option<&str> parameter
- Update 4 production call sites with specific func_name
- Update 6 test cases with None for legacy path
- Update module documentation with routing logic diagram
Tests: 10/10 LoopScopeShape tests PASS, 6/7 JoinIR VM bridge tests PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 00:36:41 +09:00
a898ff3f83
refactor(joinir): Phase 30 F-2.0/F-3 - PHI箱インベントリと旧APIレガシー削除
...
F-3 レガシー削除:
- generic_case_a.rs: 旧API関数4個削除(_with_scope 移行完了)
- loop_scope_shape.rs: CaseAContext::new() 削除(from_scope() に統一)
- mod.rs: 不要な pub use 削除
- #[allow(dead_code)] 除去(5関数)
- 未使用import削除(コード削減約150行)
F-2.0 PHI箱インベントリ:
- PHI_BOX_INVENTORY.md 作成: 13箱+11補助構造体の棚卸し
- 削除順ポリシー: 早期/中期/最終の3段階
- TASKS.md/CURRENT_TASK.md 更新
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-25 23:25:39 +09:00
6598cd3272
refactor(joinir): F-3 add _with_scope variant for skip_ws lowering
...
Phase 30 F-3: LoopScopeShape 実データ運用の一歩目
変更内容:
- lower_case_a_skip_ws_with_scope(scope) 追加
- LoopScopeShape を直接受け取る新 API
- CaseAContext::from_scope() 経由で ctx 構築
- lower_case_a_skip_ws_core(ctx) 抽出
- 共通ロジックを分離
- _for_minimal_skip_ws と _with_scope で共有
設計意図:
- lowerer が scope を明示的に構築できる API を提供
- 将来の boxes 削除時に移行しやすい構造を準備
- 既存 API は後方互換性を維持
テスト結果:
- JoinIR 関連テスト: 全 PASS
- loop_scope_shape テスト: 10/10 PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-25 15:48:00 +09:00
de5d5fae52
feat(mir): Phase 30 F-1 LoopScopeShape SSOT preparation
...
LoopScopeShape を変数分類の唯一の情報源 (SSOT) にするための準備:
F-1.1 LoopVarClassBox:
- 4分類(Pinned/Carrier/BodyLocalExit/BodyLocalInternal)の仕様を
loop_scope_shape.rs にドキュメント化(PHI生成ルール表付き)
- LoopScopeShape.classify() / classify_all() メソッド追加
- LoopVarClassBox.classify_with_scope() 委譲メソッド追加
- 旧APIにPhase 30 TODOコメント追加
F-1.2 LoopExitLivenessBox:
- exit_live フィールドにSSOT説明ドキュメント追加
- get_exit_live_from_scope() 委譲メソッド追加
F-1.3 LocalScopeInspectorBox:
- Phase 30移行中のTODOコメント追加
- is_available_in_all_with_scope() 委譲メソッド追加
未使用フィールド削除:
- CaseAContext::scope フィールド削除
- LoopBypassFlags::exit フィールド削除
- PhiBuilderBox::loop_context / LoopPhiContext 削除
テスト結果: 37テスト全てPASS
- loop_scope_shape: 12 PASS (+2 new)
- loop_var_classifier: 11 PASS
- loop_exit_liveness: 3 PASS
- local_scope_inspector: 11 PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-25 15:14:54 +09:00
e93727dd37
fix(joinir): Stage-1 string concat BinOp::Or → Add + ArrayBox support
...
Fixes:
1. BinOp::Or → BinOp::Add for string concatenation in Stage-1 lowering
2. ArrayBox/MapBox support via JoinValue::BoxRef (ChatGPT implementation)
Results:
- n=0: JoinIR → "init" ✅ (VM → "void" PHI bug)
- n=3: JoinIR → "ABC" ✅ (VM → "void" PHI bug)
Stage-1 JoinIR VM Bridge now fully working!
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-25 13:33:01 +09:00
e9c7d27a7f
feat(joinir): Phase 30.x jsonir v0 - JoinIR JSON serialization
...
Implement JSON serialization for JoinIR module.
Implementation:
- src/mir/join_ir/json.rs: JSON serializer (~250 lines, no external deps)
- src/tests/joinir_json_min.rs: Integration tests (8 unit + 2 integration)
- 10 tests total, all passing
Features:
- JoinModule → JSON serialization
- All instruction types: Call, Jump, Ret, Compute
- All MirLikeInst types: Const, BinOp, Compare, BoxCall
- Full ConstValue support: Integer, Bool, String, Null
- Full operator coverage: Add/Sub/Mul/Div/Or/And, Lt/Le/Gt/Ge/Eq/Ne
- JSON string escaping for special characters
Usage:
use crate::mir::join_ir::json::join_module_to_json_string;
let json = join_module_to_json_string(&module);
Non-goals (this phase):
- CLI flag (--emit-joinir-json)
- JSON → JoinIR reverse conversion
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-25 09:53:26 +09:00
96ce02eef4
feat(joinir): add progress carrier verification for skip_ws (Phase 29 L-5.2)
...
Implement zero-progress backedge detection for JoinIR loops:
- Create verify.rs module with ProgressError enum
- verify_progress_for_skip_ws() checks BinOp::Add before recursive calls
- Hook into joinir_runner_standalone_skip_ws test (NYASH_JOINIR_EXPERIMENT=1)
- Currently warning-only, will upgrade to error in Phase 30
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-25 06:38:43 +09:00
31e458e7fa
refactor(joinir): introduce CaseAContext to consolidate common lowering logic
...
- Add CaseAContext struct in loop_scope_shape.rs to centralize:
- LoopForm validation
- intake_loop_form invocation
- LoopScopeShape construction
- Variable name → ValueId mapping
- pinned_ids/carrier_ids/exit_args resolution
- Refactor all 4 generic_case_a.rs functions to use CaseAContext:
- lower_case_a_loop_to_joinir_for_minimal_skip_ws
- lower_case_a_loop_to_joinir_for_trim_minimal
- lower_case_a_loop_to_joinir_for_append_defs_minimal
- lower_case_a_loop_to_joinir_for_stage1_usingresolver_minimal
- Remove unused name_to_header_id field from LoopFormIntake
(was duplicate of header_snapshot)
Code reduction: ~200 lines of duplicated pattern → 4 lines
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-25 06:32:08 +09:00
da1a5558e5
Normalize passes keep spans and clean warnings
2025-11-24 15:02:51 +09:00
466e636af6
Span trace utilities and runner source hint
2025-11-24 14:17:02 +09:00
b7c7e48526
feat(joinir): Phase 27.14 - FuncScannerBox._append_defs JoinIR lowering完了 + コード品質改善
...
## Phase 27.14: FuncScannerBox._append_defs/2 JoinIR lowering
- **新規実装**: `funcscanner_append_defs.rs` (322行)
- Shared Builder Pattern採用
- MIR-based lowering with CFG sanity checks
- ValueId range 9000-10999 割り当て
- **テスト**: `mir_joinir_funcscanner_append_defs.rs` (3テスト)
- type_sanity, empty_module_returns_none, auto_lowering (ignored)
- **最小.hako**: `funcscanner_append_defs_minimal.hako`
## コード品質改善 (5項目完了)
1. **CFG Sanity Checks強化** (`common.rs`)
- `has_array_method()`: ArrayBox操作検出
- `has_loop_increment()`: i+1パターン検出
2. **ValueIdテスト自動化** (`value_id_ranges.rs`)
- マクロ化 + 自動overlap検証で30→15行に削減
3. **モジュール名統一確認** (作業不要、既に統一済み)
4. **Shared Builder命名統一** (`funcscanner_trim.rs`)
- `build_trim_joinir` → `build_funcscanner_trim_joinir`
5. **全テストPASS確認**
- value_id_ranges, funcscanner_trim, funcscanner_append_defs全てPASS ✅
## 効果
- CFG検証関数: 1個 → 3個 (200%↑)
- テストコード: 50%削減 (保守性向上)
- 命名一貫性: 75% → 100%
- ビルド成功率: 100%維持
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-24 05:23:26 +09:00
49864983bd
feat(joinir): Phase 27.13 最小.hakoファイル作成とauto_loweringテスト完全動作
...
## 実装内容
- 新規ファイル作成: apps/tests/stage1_usingresolver_minimal.hako
- using文、@記法、FileBoxを含まない最小構成
- 関数シグネチャ: resolve_for_source/5 (5パラメータ)
- シンプルなloop(i < n)構造でJoinIRテスト用
- テストファイル更新: src/tests/mir_joinir_stage1_using_resolver_min.rs
- test_file パスを minimal.hako に変更
- パーサーエラー回避(using文問題の対策)
- 関数名修正: src/mir/join_ir/lowering/stage1_using_resolver.rs
- /1 → /5 に修正(2箇所: build関数とlower_from_mir関数)
- 5パラメータ関数シグネチャに対応
## テスト結果
✅ auto_lowering テスト完全成功
- NYASH_JOINIR_EXPERIMENT=1 + NYASH_JOINIR_LOWER_FROM_MIR=1
- MIR → JoinIR 自動変換動作
- CFG sanity checks passed
- 2関数生成確認(resolve_entries + loop_step)
- ValueId range 7000-8999 正常動作
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-24 04:13:41 +09:00
a554109b8e
refactor(phase27.13): Introduce ValueId range management system
...
Introduce centralized ValueId range allocation to prevent ID conflicts
between lowering modules.
Changes:
1. New file: src/mir/join_ir/lowering/value_id_ranges.rs
- Base address constants for each lowering module
- Helper functions: entry(offset), loop_step(offset)
- Range validation test: test_value_id_ranges_no_overlap
2. Range allocation (resolved conflict):
- min_loop: 1000-2999 (entry: 1000+, loop: 2000+)
- skip_ws: 3000-4999 (entry: 3000+, loop: 4000+)
- funcscanner_trim: 5000-6999 (entry: 5000+, loop: 6000+)
- stage1_using_resolver: 7000-8999 (entry: 7000+, loop: 8000+) ← CHANGED
3. Updated stage1_using_resolver.rs to use value_id_ranges helpers
- ValueId(5000) → vid::entry(0) // 7000
- ValueId(6000) → vid::loop_step(0) // 8000
4. Updated lowering/mod.rs to include value_id_ranges module
Results:
- ✅ Build success (warnings only, no errors)
- ✅ Tests: 2/2 existing tests pass (type_sanity, empty_module_returns_none)
- ✅ value_id_ranges test pass (range overlap validation)
- ✅ ValueId conflict resolved (trim vs stage1_using_resolver)
Benefits:
- Centralized range management prevents conflicts
- Type-safe: const fn for compile-time calculation
- Self-documenting: comments clarify ranges
- Easy extension: future lowerings can use 9000+, 11000+, etc.
2025-11-24 03:58:30 +09:00
f257070668
feat(joinir): Phase 27.12 完了 - Stage1UsingResolver 骨格+テスト実装
...
Phase 27.12 実装内容:
- ✅ JoinIR lowering 骨格実装 (169行)
- stage1_using_resolver.rs 新規作成
- Shared Builder Pattern 適用
- MIR-based/handwritten 両経路対応
- ✅ テスト基盤整備 (3本)
- auto_lowering テスト (#[ignore] + トグル)
- type_sanity テスト (常時実行)
- no_panic テスト (軽量)
- ✅ ドキュメント更新
- 論文に Phase 27.12 完了記録
- IMPLEMENTATION_LOG.md 完了マーク
- TASKS.md チェックボックス更新
技術詳細:
- LoopForm Case A (loop(i < n))
- Pinned: entries/n/modules/seen
- Carrier: i/prefix
- Exit: prefix
- CFG sanity checks 骨格実装
- Graceful degradation 設計
ビルド: ✅ 成功 (0 エラー)
次: Phase 27.13 JoinIR 本実装
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-24 02:34:36 +09:00
b0311e4bd2
feat(joinir): Phase 27.11.1 - skip_ws.rs Shared Builder Pattern 完了
...
## 成果
- **コード削減**: 444行 → 310行 (134行削除、30%削減)
- **重複コード根絶**: handwritten版とMIR版の重複JoinIR生成を統一
- **テスト結果**:
- Baseline (toggle OFF): 380 passed
- MIR-based (toggle ON): 385 passed ✅ (5件改善!)
## 実装内容
1. `lower_skip_ws_handwritten()` → `build_skip_ws_joinir()` にリネーム
- 共通JoinIRビルダー化
2. 新しい thin wrapper `lower_skip_ws_handwritten()` を作成
3. `lower_skip_ws_from_mir()` の重複コード (140行) を削除
- CFGチェック後に `build_skip_ws_joinir()` を呼び出す構造に変更
## 設計パターン
- **Shared Builder Pattern**: funcscanner_trim.rs と同じパターン適用
- **CFG Sanity Checks**: MIR解析は軽量パターンマッチのみ
- **Graceful Degradation**: CFGチェック失敗時は自動フォールバック
Phase 27.11シリーズ 100%完了!
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-24 01:59:48 +09:00
bc42da30b0
feat(joinir): Phase 27.11 - FuncScannerBox.trim/1 MIR-based lowering 完了
...
実装内容:
- build_trim_joinir() 共通関数を作成 (handwritten/MIR 両方から使用)
- lower_trim_handwritten() を薄いラッパーに変更
- lower_trim_from_mir() が CFG checks 後に build_trim_joinir() を呼ぶように更新
技術成果:
- Shared Builder Pattern の確立
- テスト退行なし (baseline/MIR 両方で PASS)
- コード重複ゼロ (448行の実装が1箇所に集約)
テスト結果:
- cargo build --release: ✅ 成功
- cargo test (toggle OFF): ✅ PASS
- NYASH_JOINIR_LOWER_FROM_MIR=1 cargo test (toggle ON): ✅ PASS
2025-11-23 23:18:49 +09:00
ff9ea58e59
refactor(joinir): Phase 27.10 - CFG sanity checks + dispatcher pattern 共通化
...
- common.rs 新規作成(162行):
- CFG sanity check helpers: ensure_entry_has_succs, has_const_int, has_const_string, has_string_method, has_binop
- Logging helper: log_fallback
- Dispatcher: dispatch_lowering
- skip_ws.rs: CFG checks (-25行) + dispatcher (-2行) = -27行削減
- funcscanner_trim.rs: CFG checks (-25行) + dispatcher (-4行) = -29行削減
- mod.rs: pub mod common 追加
設計原則:
- 軽量パターンマッチング(命令の存在確認のみ)
- Graceful degradation(予期しない構造で即座にfallback)
- DRY原則(重複コード1箇所に集約)
🎉 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-23 22:51:30 +09:00
c1aa3c8c2b
feat(joinir): Phase 27.8-4/5 — skip_ws CFG sanity checks + fallback design
...
- MirQuery API を使用した軽量 CFG チェック実装
- Entry block successors >= 1
- Const(0) 存在確認
- String.length() 存在確認
- 予期しない MIR 構造時の手書き版 fallback 設計
- A/B テスト完了: 手書き版・MIR-based 版両方 PASS ✅
- ドキュメント更新: joinir_coverage.md + IMPLEMENTATION_LOG.md
Phase 27.9 modular refactoring: commit 3d5979c7
Phase 27.8-4/5 verification: CFG checks + docs updates
2025-11-23 18:03:33 +09:00
3d5979c78e
refactor(joinir): Phase 27.9 - Modular separation of join_ir.rs into directory structure
...
Phase 27.9 で join_ir.rs (~1,336行) を以下のモジュール構造に分離:
## 新規ディレクトリ構造:
```
src/mir/join_ir/
├── mod.rs # 型定義・共通ユーティリティ (~330行)
└── lowering/
├── mod.rs # lowering インターフェース
├── min_loop.rs # lower_min_loop_to_joinir (~140行)
├── skip_ws.rs # skip_ws lowering 3関数 (~390行)
└── funcscanner_trim.rs # trim lowering (~480行)
```
## 技術的変更:
- **型定義統一**: JoinFuncId, JoinInst, JoinModule 等を mod.rs に集約
- **lowering 分離**: 3つの lowering 関数を個別モジュールに移動
- **後方互換性**: pub use で lowering 関数を re-export(既存コード影響なし)
- **削除**: src/mir/join_ir.rs (旧単一ファイル)
## テスト結果:
- **385 passed** (+1 from 384)
- **9 failed** (-1 from 10)
- **ビルド成功**: 0 errors, 18 warnings (変化なし)
## 効果:
- **保守性向上**: 1,336行 → 4ファイル(各300-500行)で可読性向上
- **モジュール境界明確化**: 型定義 vs lowering 実装の責務分離
- **将来の拡張容易**: 新 lowering 関数追加が簡単に
Phase 27.8 で実装した MIR 自動解析 lowering の基盤整備完了。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-23 16:49:49 +09:00