66fecd3d14
feat(joinir): Phase 34-2/34-3 JoinIR Frontend implementation
...
AST→JoinIR フロントエンド経路の基盤完成。simple/local pattern で
「値としての if」が同じ JoinIR Select に正規化されることを実証。
**Phase 34-2: Simple pattern 実装**
- AstToJoinIrLowerer::lower_program_json() 実装
- Program(JSON v0) → JoinModule 変換パイプライン確立
- IfSelectTest.test: if cond { return 10 } else { return 20 }
- 変数ID衝突バグ修正(params分スキップ)
**Phase 34-3: Local pattern 対応**
- lower_simple_if/lower_local_if 関数分岐実装
- IfSelectTest.local: 意味論的 local pattern 対応
- simple と local で JoinIR 出力が同じことを実証
**技術的成果**
- JoinIR = 意味論の SSOT: 構文の違いを Select に統一
- PHI 不要の証明: 値としての if は Select のみで表現可能
- テスト: 2 passed (simple + local)
**実装ファイル**
- src/mir/join_ir/frontend/ast_lowerer.rs (340 lines)
- src/mir/join_ir/frontend/mod.rs (46 lines)
- src/tests/joinir_frontend_if_select.rs (140 lines)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-27 15:31:12 +09:00
9e9e08eb84
feat(joinir): Phase 33-9.1 Loop/If lowering responsibility separation
...
Implement clear separation between Loop and If lowering responsibilities:
**Guard Implementation:**
- Add is_loop_lowered_function() to identify 6 Loop-dedicated functions
- Exclude Loop functions from If lowering path in try_lower_if_to_joinir()
- Enforce "1 function → 1 lowering" principle
**Documentation:**
- Add responsibility comments to loop_to_join.rs
- Add responsibility comments to if_select.rs and if_merge.rs
- Update if_joinir_design.md with Phase 33-9.1 section
**Testing:**
- Add unit test test_is_loop_lowered_function() (PASS)
- Verify no regression in existing JoinIR tests
**Loop-dedicated functions (6):**
- Main.skip/1
- FuncScannerBox.trim/1
- FuncScannerBox.append_defs/2
- Stage1UsingResolverBox.resolve_for_source/5
- StageBBodyExtractorBox.build_body_src/2
- StageBFuncScannerBox.scan_all_boxes/1
This prevents future conflicts when both Loop and If lowering expand.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-27 10:58:56 +09:00
517b20fe88
feat(joinir): Phase 33-8 Stage-1 rollout infrastructure
...
Add environment variable controls and debug logging for JoinIR lowering rollout.
Changes:
- Add HAKO_JOINIR_STAGE1 env var for Stage-1 function rollout control
- Add HAKO_JOINIR_DEBUG (0-3) for granular debug logging
- Level 0: Silent (default)
- Level 1: Basic lowering info
- Level 2: Pattern matching details
- Level 3: Full variable/instruction dump
- Implement 3-tier whitelist system:
- Tier 1: Test functions (always enabled)
- Tier 2: Stage-1 rollout (env-controlled)
- Tier 3: Explicit approvals (validated in Phase 33-4)
- Add A/B test automation script (tools/joinir_ab_test.sh)
- Update if_merge.rs and if_select.rs with debug_level support
Environment variables (with NYASH_* fallback for compatibility):
- HAKO_JOINIR_IF_SELECT: Enable JoinIR lowering
- HAKO_JOINIR_STAGE1: Enable Stage-1 function rollout
- HAKO_JOINIR_DEBUG: Debug log level (0-3)
A/B test verification: PASSED on joinir_if_merge_{simple,multiple}.hako
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-27 09:30:54 +09:00
5b7818f5c9
feat(joinir): Phase 33-7 IfMerge lowering for multiple-variable PHI
...
Implements IfMerge instruction lowering to support multiple variables
merging from if/else branches (Phase 33-7: return pattern only).
## Changes
- Add src/mir/join_ir/lowering/if_merge.rs (232 lines)
- IfMergeLowerer with pattern matching for common variables
- extract_written_vars() / find_written_value() helpers
- Phase 33-7 constraint: return pattern only (k_next=None)
- Update src/mir/join_ir/lowering/mod.rs
- Unified entry point: try_lower_if_to_joinir()
- Priority: IfMerge → Select → if_phi fallback
- Add IfMergeTest.* to whitelist
- Add unit tests in src/tests/mir_joinir_if_select.rs
- test_if_merge_simple_pattern (2 variables)
- test_if_merge_multiple_pattern (3 variables)
- All 7/7 tests PASS ✅
- Add reference test cases
- apps/tests/joinir_if_merge_simple.hako (2-var pattern)
- apps/tests/joinir_if_merge_multiple.hako (3-var pattern)
## Test Results
✅ Simple pattern (2 vars): merges=2, k_next=None
✅ Multiple pattern (3 vars): merges=3, k_next=None
✅ test result: ok. 7 passed; 0 failed
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-27 08:18:09 +09:00
2d30277e97
fix(joinir): Correct JsonShapeToMap function name and add Phase 33-5 test whitelist
...
Changes:
1. **Naming fix**: JsonShapeParser → JsonShapeToMap
- Updated function name in whitelist to match actual static box name
- Affected: JsonShapeToMap._read_value_from_pair/1 (lang/src/runtime/meta/json_shape_parser.hako)
2. **Phase 33-5 test whitelist**: Added Stage1JsonScannerTestBox.* pattern
- Enables A/B testing for Stage-B if/else patterns
- Test verified: Route A (if_phi) and Route B (Select) both RC=0 ✅
Testing:
- Route A (NYASH_JOINIR_IF_SELECT=0): RC 0 ✓
- Route B (NYASH_JOINIR_IF_SELECT=1): RC 0 ✓
- Pattern: simple if/else return (Stage1JsonScannerBox.value_start_after_key_pos/2 style)
Phase 33-5: Stage-B if/Select A/B testing実施完了
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-27 05:39:29 +09:00
79cbf26f98
Phase 33-4: Stage-1/Stage-B expansion complete (33-4.1 to 33-4.3)
...
## Code Changes
- Extended function name whitelist in try_lower_if_to_joinir()
- Added: JsonShapeParser._read_value_from_pair/1 (Stage-1)
- Added: Stage1JsonScannerBox.value_start_after_key_pos/2 (Stage-B)
## Validation
- A/B testing: Route A (if_phi) vs Route B (Select) → identical results (RC 0)
- Test cases: joinir_if_select_simple.hako, joinir_if_select_local.hako
- Build: cargo build --release successful
## Documentation (docs/private submodule)
- TASKS.md: Phase 33-4.1 to 33-4.3 marked complete
- if_joinir_design.md: Section 9 added (candidate analysis)
## Next Steps
- Phase 33-4.4: CI/smoke test updates (pending)
2025-11-27 04:58:01 +09:00
4ba3fcd615
Phase 33-3.2: phi_invariants/conservative の JoinIR 側への移譲
...
実装内容:
- verify_select_minimal() 実装(Select 命令の最小 invariant チェック)
- phi_invariants.rs / conservative.rs のエッセンス抽出・移譲
- 4 テスト追加(simple/local with verify, reject multiple selects, check invariants)
移譲した責務:
- phi_invariants.rs::ensure_if_values_exist() → 型一貫性・完全性チェック
- conservative.rs::ConservativeMerge → 単一 PHI チェック
テスト結果:
- ✅ 8/8 tests PASS
- ✅ simple/local パターン: Verifier PASS
- ✅ 不正パターン(複数 Select): Verifier REJECT
- ✅ invariant ログ: conservative.rs / phi_invariants.rs からの移譲を明記
制限事項:
- IfSelectTest.* のみ対象、本線 if_phi は保持
- 削除は Stage-1/Stage-B/selfhost への適用後に行う
Phase 33-3.2 完了(2025-11-27)
2025-11-27 03:55:45 +09:00
5cfb0e1d5b
Phase 33-3: If/PHI MIR pattern matching + Select lowering (minimal patterns)
...
Implementation:
- Implement MIR pattern matching in if_select.rs (simple/local patterns)
- Add try_lower_if_to_joinir() entry point in lowering/mod.rs
- Create comprehensive integration tests (4/4 passing)
Pattern Support:
- Simple pattern: if cond { return 1 } else { return 2 }
- Both blocks must have Return only (no instructions)
- Local pattern: if cond { x = a } else { x = b }; return x
- Each branch has exactly 1 Copy instruction
- Both branches jump to same merge block
- Merge block Returns the assigned variable
Safety Mechanisms:
- Dev toggle: NYASH_JOINIR_IF_SELECT=1 required
- Function name filter: Only IfSelectTest.* functions
- Fallback: Returns None on pattern mismatch
- Zero breaking changes: Existing if_phi path untouched
Tests (4/4 PASS):
- test_if_select_simple_pattern
- test_if_select_local_pattern
- test_if_select_disabled_by_default
- test_if_select_wrong_function_name
Files:
- Modified: src/mir/join_ir/lowering/if_select.rs (pattern matching)
- Modified: src/mir/join_ir/lowering/mod.rs (entry point)
- New: src/tests/mir_joinir_if_select.rs (integration tests)
- Modified: src/tests/mod.rs (module registration)
Phase 33-3.2/3.3 (legacy removal) pending
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-27 03:28:32 +09:00
35cd93a37a
Phase 33-2: JoinInst::Select implementation + minimal If JoinIR lowering
...
Implementation:
- Add JoinInst::Select variant to JoinIR schema
- Implement Select execution in JoinIR Runner (Bool/Int cond support)
- Add Select handling in JoinIR→MIR Bridge (4-block structure)
- Create test cases (joinir_if_select_simple/local.hako)
- Add dev toggle NYASH_JOINIR_IF_SELECT=1
- Create lowering infrastructure (if_select.rs, stub for Phase 33-3)
Tests:
- 3/3 unit tests pass (test_select_true/false/int_cond)
- Integration tests pass (RC: 0)
- A/B execution verified (existing if_phi vs JoinIR Select)
Files changed:
- New: apps/tests/joinir_if_select_{simple,local}.hako
- New: src/mir/join_ir/lowering/if_select.rs
- Modified: src/mir/join_ir/{mod,json,runner,vm_bridge}.rs
- Modified: src/config/env.rs (joinir_if_select_enabled)
- Modified: docs/reference/environment-variables.md
Phase 33-3 ready: MIR pattern recognition + auto-lowering pending
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-27 02:58:38 +09:00
b8893787dc
feat(joinir): L-5.3 Phase 1 - progress carrier guard for generic_case_a
...
## 実装内容
1. has_safe_progress() helper 追加 (loop_to_join.rs:186-195)
- Phase 1: scope.progress_carrier.is_some() をチェック (保守的)
- Phase 2 (future): MirQuery で Add 命令チェック予定
2. is_supported_case_a_loop_view() に progress guard 追加 (256-266)
- 無限ループの可能性があるループを事前にフォールバック
- デバッグログで reject 理由を出力
## テスト結果
✅ 25 passed; 0 failed - JoinIR 関連テスト全通過
✅ skip_ws / trim / append_defs / Stage‑1 UsingResolver 全ケース PASS
✅ 既存テストへの影響なし
## 技術メモ
- 保守的アプローチ: progress_carrier.is_some() のみチェック
- LoopScopeShape で progress_carrier を carriers の先頭として設定済み
- ignored テスト失敗は MIR 自体の PHI バグで、本変更とは無関係 (git stash で確認済み)
関連: Phase 29 L-5.3 (TASKS.md), CURRENT_TASK.md 1-00v
2025-11-26 16:08:49 +09:00
1eea40454f
test(joinir): L-2.2 Step-3 - Add Stage-B JoinIR→MIR structure tests
...
- Expose `convert_joinir_to_mir` as `pub(crate)` for test access
- Add `joinir_stageb_body_structure_test` and
`joinir_stageb_funcscanner_structure_test` to `joinir_json_min.rs`
- Verify: JoinIR lowering succeeds, JoinIR→MIR conversion succeeds,
function count matches, each function has >= 1 block
- Result: Both Stage-B functions produce 2 JoinIR functions
(entry + loop_step) with appropriate block counts
- Note: Current tests verify handwritten JoinIR→MIR bridge layer,
not full MIR→JoinIR roundtrip (future improvement)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 11:38:45 +09:00
e61e7a2be6
feat(joinir): L-2.2 Step-2 - Add Stage-B to VM bridge dispatch
...
Add Stage-B BodyExtractor and FuncScanner to JoinIR VM bridge dispatch:
- Import stageb_body and stageb_funcscanner lowering functions
- Add routing for StageBBodyExtractorBox.build_body_src/2
- Add routing for StageBFuncScannerBox.scan_all_boxes/1
- Add try_run_stageb_body() and try_run_stageb_funcscanner() (lowering verification only)
Also cleanup unused imports in funcscanner_trim.rs and stage1_using_resolver.rs
Note: Stage-B functions use lowering verification pattern (like Stage-1)
because ArrayBox/MapBox args are not yet supported in JoinValue.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 11:02:21 +09:00
9d769e9217
refactor(joinir): L-2.2 Step-1 - Unify Stage-B lowering via LoopToJoinLowerer
...
Stage-B minimal JoinIR lowering統一化:
1. Add Case-A helpers to loop_to_join.rs:
- lower_case_a_for_stageb_body (StageBBodyExtractorBox.build_body_src/2)
- lower_case_a_for_stageb_funcscanner (StageBFuncScannerBox.scan_all_boxes/1)
2. Update stageb_body.rs and stageb_funcscanner.rs:
- Replace manual LoopForm construction with construct_simple_while_loopform
- Route through LoopToJoinLowerer like other Case-A functions
- Remove unused imports (LoopForm, MirQuery)
Now all 6 JoinIR lowering modules use the same unified pattern:
- skip_ws, trim, append_defs, stage1_resolver, stageb_body, stageb_funcscanner
All route through LoopToJoinLowerer for consistency.
Test results: JSON snapshot 6/6 PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 10:47:35 +09:00
853cb36800
refactor(joinir): L-1.3 - Rename minimal helpers to Case-A helpers
...
LoopToJoinLowerer API cleanup:
1. Rename methods to reflect their purpose as Case-A helpers:
- lower_minimal_skip_ws_case_a → lower_case_a_for_skip_ws
- lower_minimal_trim_case_a → lower_case_a_for_trim
- lower_minimal_append_defs_case_a → lower_case_a_for_append_defs
- lower_minimal_stage1_case_a → lower_case_a_for_stage1_resolver
2. Update comments to clarify these are thin wrappers over `lower()`
- "Case-A 汎用 lowerer の薄いラッパー"
- Actual logic is centralized in `lower` method
3. Update all 4 call sites:
- skip_ws.rs
- funcscanner_trim.rs
- funcscanner_append_defs.rs
- stage1_using_resolver.rs
Test results: standalone (2/2), JSON snapshot (6/6) PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 10:28:03 +09:00
51ff558904
feat(phase32): L-2.1 Stage-1 UsingResolver JoinIR integration + cleanup
...
Phase 32 L-2.1 complete implementation:
1. Stage-1 UsingResolver main line JoinIR connection
- CFG-based LoopForm construction for resolve_for_source/5
- LoopToJoinLowerer integration with handwritten fallback
- JSON snapshot tests 6/6 PASS
2. JoinIR/VM Bridge improvements
- Simplified join_ir_vm_bridge.rs dispatch logic
- Enhanced json.rs serialization
- PHI core boxes cleanup (local_scope_inspector, loop_exit_liveness, loop_var_classifier)
3. Stage-1 CLI enhancements
- Extended args.rs, groups.rs, mod.rs for new options
- Improved stage1_bridge module (args, env, mod)
- Updated stage1_cli.hako
4. MIR builder cleanup
- Simplified if_form.rs control flow
- Removed dead code from loop_builder.rs
- Enhanced phi_merge.rs
5. Runner module updates
- json_v0_bridge/lowering.rs improvements
- dispatch.rs, selfhost.rs, modes/vm.rs cleanup
6. Documentation updates
- CURRENT_TASK.md, AGENTS.md
- Various docs/ updates
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 10:17:37 +09:00
7d0581c9a4
refactor(joinir): Extract construct_simple_while_loopform helper, delete legacy code
...
Phase 32 cleanup:
1. Delete legacy is_supported_case_a_loop function from loop_to_join.rs
- Replaced by is_supported_case_a_loop_view() in Phase 32 Step 3
2. Extract construct_simple_while_loopform helper to common.rs
- Unified LoopForm construction for simple while loops
- Parameters: entry_is_preheader (trim=true, stage1=false)
has_break (trim=true, stage1=false)
- Sets latch=body to satisfy is_simple_case_a_loop check
3. Update lowering modules to use the common helper:
- funcscanner_trim.rs: entry_is_preheader=true, has_break=true
- stage1_using_resolver.rs: entry_is_preheader=false, has_break=false
Test results: JSON snapshot 6/6 PASS, VM bridge trim 2/2 PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 10:15:31 +09:00
ec69b49446
feat(mir): Phase 32 Step 0-3B - LoopRegion/LoopControlShape view methods
...
Phase 32 introduces a "view pattern" for loop structures, enabling
gradual migration without breaking existing code.
Changes:
- control_form.rs: Add new ID types (LoopId, ExitEdgeId, ContinueEdgeId)
and structures (LoopRegion, LoopControlShape, ExitEdge, ContinueEdge)
- control_form.rs: Add view methods on LoopShape:
- to_region_view() - returns LoopRegion
- to_control_view() - returns LoopControlShape
- to_exit_edges() - returns Vec<ExitEdge>
- to_continue_edges() - returns Vec<ContinueEdge>
- loop_scope_shape.rs: Use views in from_existing_boxes_legacy()
- loop_to_join.rs: Add debug logging with Phase 32 views
All 4 minimal lowerers (skip_ws/trim/append_defs/stage1) now use
view-based block ID extraction via shared from_existing_boxes_legacy().
Tests: joinir_runner_standalone_*, joinir_vm_bridge_trim_* PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 08:01:32 +09:00
b35b477c9c
feat(phase32): L-1 - Enable JoinIR by default for FuncScannerBox.trim/1
...
Phase 32 L-1: Make JoinIR the default execution path for verified targets.
- Added is_default_joinir_target() function to check default-enabled functions
- FuncScannerBox.trim/1 is now enabled by default (break=[], Case-A verified)
- Main.skip/1 excluded from default (break=[2], needs Case-B support)
- Environment variable NYASH_JOINIR_VM_BRIDGE=1 still works for other targets
Test results:
- trim: Route C (JoinIR) returns correct value "abc"
- trim: Route A (VM) returns "void" due to PHI bug
- JoinIR correctly handles PHI issues that affect direct VM path
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 06:23:07 +09:00
acffd9974b
feat(phase31): Step 3-A/B - Add early return and structure checks to LoopToJoinLowerer
...
Phase 31 Step 3-A: Add early return using is_case_a_minimal_target() filter
- Check before LoopScopeShape construction for efficiency
- Returns None immediately for non-target functions
Phase 31 Step 3-B: Add structural validation to is_supported_case_a_loop()
- Single exit check: loop_form.break_targets.len() <= 1
- Variable presence check: !carriers.is_empty() || !pinned.is_empty()
- Debug logging for rejection reasons
Also refactored lower_with_scope() from if-else chain to match expression for clarity.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 06:02:52 +09:00
7a29ebd268
refactor(phase31): Connect 4 lowerers to LoopToJoinLowerer
...
Phase 31 Step 2 complete:
- skip_ws.rs: use LoopToJoinLowerer::lower_minimal_skip_ws_case_a()
- funcscanner_trim.rs: use LoopToJoinLowerer::lower_minimal_trim_case_a()
- funcscanner_append_defs.rs: use LoopToJoinLowerer::lower_minimal_append_defs_case_a()
- stage1_using_resolver.rs: use LoopToJoinLowerer::lower_minimal_stage1_case_a()
Eliminates direct generic_case_a calls, routing through unified box.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 02:36:43 +09:00
ef9fd4417a
feat(phase31): Add LoopToJoinLowerer unified box
...
Phase 31 Step 1 complete:
- Create src/mir/join_ir/lowering/loop_to_join.rs
- Add LoopToJoinLowerer struct with lower() method
- Implement lower_minimal_skip_ws_case_a() via generic_case_a
- Support for trim, append_defs, stage1 patterns
- Re-export from mod.rs
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 01:18:32 +09:00
bbafd9c8b1
refactor(phi_core): Phase 30 F-2.2 delete LoopSnapshotManager (test-only)
...
Remove LoopSnapshotManager which was only used by its own internal tests.
No external call sites existed.
- Delete loop_snapshot_manager.rs (~458 lines)
- Update mod.rs to remove module declaration
- Update PHI_BOX_INVENTORY.md and TASKS.md
Analysis showed all other F-2.2 candidates have production dependencies
and must wait for JoinIR coverage expansion:
- PhiBuilderBox - loop_builder.rs
- LoopSnapshotMergeBox - loopform_builder.rs, json_v0_bridge
- if_phi.rs - lifecycle.rs, if_form.rs, loop_builder.rs
- if_body_local_merge.rs - phi_builder_box.rs, loop_builder.rs
- phi_invariants.rs, conservative.rs, phi_input_collector.rs - multiple
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 00:44:11 +09:00
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
2b47f47061
refactor(phi_core): F-2.1 - 早期グループPHI箱削除(約2,500行削減)
...
## 削除したファイル
- header_phi_builder.rs (~628行) - バイパス関数を loopform_builder.rs に移動
- exit_phi_builder.rs (~1000行) - バイパス関数を loopform_builder.rs に移動
- body_local_phi_builder.rs (~550行) - 依存なし
- loop_phi.rs (~288行) - LoopPhiOps実装も削除
## 移動した関数
loopform_builder.rs に以下を移動:
- get_loop_bypass_flags() / LoopBypassFlags struct
- is_joinir_header_bypass_target()
- joinir_exit_bypass_enabled()
- is_joinir_exit_bypass_target()
## 修正したファイル
- loop_builder.rs: バイパス関数の参照先変更 + LoopPhiOps impl削除
- mod.rs: モジュール宣言削除
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-25 23:42:35 +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
ee2b3115ee
feat(joinir): FuncScannerBox.trim/1 JoinIR VM Bridge A/B test
...
Phase 30.x: JoinIR VM Bridge でPHI問題を設計で解決できることを実証
変更内容:
- src/runner/modes/vm.rs: FuncScannerBox.trim/1 検出時にJoinIR経由実行
- src/mir/join_ir_vm_bridge.rs: Non-tail call サポート追加
- dst=Some(id) の場合、結果を格納して次の命令へ継続
- src/tests/joinir_vm_bridge_trim.rs: A/Bテスト新規作成
- メインテスト: Route A (VM) → "void" (PHI bug), Route C (JoinIR) → "abc" ✅
- エッジケース: 5パターン全てPASS
- src/config/env.rs: joinir_vm_bridge_debug() 追加
- docs: Phase 30 TASKS.md に L-0.4 追加
テスト結果:
Route A (MIR→VM直接): "void" ← PHI バグ
Route C (MIR→JoinIR→VM): "abc" ← 正解 ✅
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-25 12:22:08 +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
98dadf446f
feat(joinir): S-5.2-improved - VM完全意味論統合完了
...
Phase 27-shortterm S-5.2-improved 実装完了:
## 実装内容
1. **execute_box_call() ラッパー追加**:
- src/backend/mir_interpreter/mod.rs に公開 API 実装
- 1_000_000 番台レジスタで一時値管理
- 適切なクリーンアップ処理実装
2. **handle_box_call 可視性変更**:
- src/backend/mir_interpreter/handlers/boxes.rs を pub に変更
- JoinIR Runner からアクセス可能に
3. **JoinIR Runner BoxCall 統合**:
- src/mir/join_ir_runner.rs の BoxCall 処理を書き換え
- StringBox 直接呼び出し削除
- VM の execute_box_call 経由に変更
- JoinValue ↔ VMValue 変換で統合
4. **不要な関数削除**:
- expect_str(), expect_int(), box_to_join_value() 削除
- VMValue 変換に一本化
5. **テスト更新**:
- joinir_runner_standalone.rs: VM インスタンス追加
- joinir_runner_min.rs: VM 再利用
## 期待される効果
✅ Void guards 完全対応 (Void.length() → 0)
✅ PluginBox/InstanceBox 将来対応可能
✅ VM の完全な BoxCall 意味論統一
✅ VM 2号機回避(ガードレール設計成功)
## テスト結果
✅ joinir_runner_standalone_skip_ws ... ok
✅ joinir_runner_standalone_trim ... ok
✅ ビルド成功(0エラー)
## 完了タスク
- [x] MirInterpreter::execute_box_call() 実装
- [x] 1_000_000 レジスタ帯域割り当て
- [x] regs クリーンアップ実装
- [x] JoinIR Runner BoxCall 書き換え
- [x] テスト更新&PASS確認
🎉 VM 完全意味論統合完了!
2025-11-24 08:37:59 +09:00
a8555e67d5
feat(joinir): S-5.2完了 - BoxCall → VM method_router 経由実装
...
実装内容:
- box_to_join_value() ヘルパー関数追加(VM Box → JoinValue 変換)
- StringBox.length/substring を VM 実装経由で呼び出し(hardcoded削除)
- safe_substring() 削除(不要になった)
技術的成果:
- ガードレール設計実現: 制御フローは JoinIR Runner、Box実装は VM に委譲
- VM 2号機 回避: Box実装の重複なし
- テスト全 PASS: joinir_runner_standalone_skip_ws/trim 両方成功
Phase 27-shortterm S-5.2 完了 ✅
2025-11-24 08:01:56 +09:00
03cb0a49c7
feat(joinir): Phase 27-shortterm S-5.1 完了 - JoinValue を VMValue ベースに統合
...
## 実装内容
### JoinValue 型の拡張
- **BoxRef variant 追加**: `BoxRef(Arc<dyn NyashBox>)` で VM と値を共有
- **Manual PartialEq 実装**: BoxRef は Arc::ptr_eq で比較
### VMValue との相互変換強化
- `to_vm_value()`: BoxRef サポート追加
- `into_vm_value()`: Zero-cost 変換(owned values)
- `from_vm_value()`: BoxRef サポート追加
### 後方互換性
- 既存の Int/Bool/Str/Unit variant は変更なし
- すべての既存コードがそのまま動作
- 16個の unit test 全て PASS ✅
### S-5.2 への準備
- BoxRef を method_router 経由で使用する準備完了
- 「VM 2号機」を避けるための基盤確立
## テスト結果
- join_ir_ops unit tests: 16 passed / 0 failed
2025-11-24 07:31:34 +09:00
bff223eff9
feat(joinir): Phase 27-shortterm S-4 完了 - JoinIR → Rust VM ブリッジ参考実装
...
## 実装内容
### S-4.1: VM インターフェース調査
- VMValue 定義調査(Integer/Float/Bool/String/Future/Void/BoxRef)
- execute_module() API 調査
### S-4.2: JoinValue ↔ VMValue 変換関数実装
- src/mir/join_ir_ops.rs に変換関数追加(+121行)
- to_vm_value()/from_vm_value() 実装
- Float/Future/BoxRef は非対応エラー
### S-4.3: join_ir_vm_bridge.rs 基本構造実装
- src/mir/join_ir_vm_bridge.rs 新規作成(362行)
- run_joinir_via_vm() API 実装
- convert_join_function_to_mir() 実装
- 7つのコンパイルエラー修正完了
### S-4.4-A: Call/Jump 命令実装(skip_ws パターンのみ)
- Call: 末尾呼び出しのみサポート
- Jump: Multi-block CFG 生成(Branch + Return)
- 非対応パターンは unimplemented!() で落とす
### S-4.4-B: A/B テスト作成
- src/tests/joinir_vm_bridge_skip_ws.rs 作成(104行)
- Route A: 直接 VM 実行
- Route C: JoinIR → VM bridge 経由
- skip_ws(" abc") → 3 の A/B 比較実装
## 戦略転換
ChatGPT 先生 + Task 先生の分析により、**Approach 2 (JoinIR Runner 本線化 + ガードレール)** への移行が決定。
本ブリッジ実装は参考実装として保持し、これ以上は太らせない方針。次フェーズで JoinIR Runner を method_router 経由で Rust VM と統合する。
2025-11-24 07:24:42 +09:00
7a9b23c9d1
feat(joinir): Phase 27-shortterm S-4.1~S-4.3 - JoinIR→VM Bridge基本実装
...
## S-4.1: VM インターフェース調査
- VMValue 型定義確認 (Integer, Bool, String, Void, BoxRef)
- VM API 確認 (execute_module, stats_counters)
- Task tool による詳細レポート取得
## S-4.2: JoinValue ↔ VMValue 変換関数実装
**新規追加**: src/mir/join_ir_ops.rs (+121行)
- JoinValue::to_vm_value() - 4型すべて対応
- JoinValue::from_vm_value() - エラーハンドリング付き
- Float/Future/BoxRef は非対応(エラー返却)
- 包括的テスト追加 (正常系・異常系)
## S-4.3: join_ir_vm_bridge.rs 基本構造実装
**新規ファイル**: src/mir/join_ir_vm_bridge.rs (350行)
### Public API
- run_joinir_via_vm() - JoinIR モジュールを VM で実行
### JoinIR → MIR 変換
- convert_joinir_to_mir() - JoinModule → MirModule
- convert_join_function_to_mir() - JoinFunction → MirFunction
- convert_mir_like_inst() - Compute命令変換
### 最小実装スコープ (Phase 27-shortterm)
✅ Compute 命令 (Const, BinOp, Compare, BoxCall)
✅ Ret 命令
⏳ Call/Jump 命令 (TODO: S-4.4 で実装)
### 設計方針
- JoinIR の正規化構造 (Pinned/Carrier, Exit φ) を保持
- マッピングだけで済ませる(正規化は消えない)
- VM の機能 (GC, plugins, error handling) を活用
## コンパイル
✅ 完全成功 (0エラー)
## 次のステップ
S-4.4: skip_ws で A/B テスト green 化
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-24 06:16:45 +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
a575b046ad
feat(joinir): Phase 27.8-4 完了 — MIR自動解析実装 by ChatGPT
...
## Phase 27.8-4: MIR→JoinIR 自動解析実装 ✅
**実装者**: ChatGPT(Claude が MirQuery API 修正)
### 実装内容
`lower_skip_ws_from_mir()` の完全実装:
- **MIR 構造チェック**: ブロック数の簡易検証
- **Entry Function 生成**: 初期化(`i=0`, `n=s.length()`)
- **Loop Step Function 生成**: 条件分岐+再帰呼び出し
- **手書き版互換**: 同じ ValueId レンジで既存テスト互換
### 生成する JoinIR 構造
**skip 関数(Entry)**:
```
i_init = const 0
n = s.length()
call loop_step(s, i_init, n)
```
**loop_step 関数**:
```
if i >= n { return i }
ch = s.substring(i, i+1)
if ch == " " {
call loop_step(s, i+1, n) // tail recursion
} else {
return i
}
```
### 技術的工夫
1. **簡易 CFG チェック**: ブロック数(< 3)でフォールバック判定
2. **ValueId 互換性**: 手書き版と同じレンジ(3000-4xxx)使用
3. **エラーハンドリング**: 不正な MIR は手書き版にフォールバック
### Claude の修正
- **MirQuery API 問題修正**: `query.succs()` → ブロック数チェックに変更
- minimal_ssa_skip_ws.hako 固定パターンとしてシンプル化
## テスト結果
✅ コンパイル成功: 0 errors, 18 warnings
✅ テスト改善: **+3 tests** (381→384 passed, 13→10 failed)
✅ 退行なし
## 変更ファイル
- `src/mir/join_ir.rs`: `lower_skip_ws_from_mir()` 本実装(約160行)
## 次のステップ
**Phase 27.8-5**: Toggle ON/OFF テスト実行
**Phase 27.8-6**: ドキュメント更新
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: ChatGPT <chatgpt@openai.com >
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-23 15:08:18 +09:00
78c9d4d7fc
feat(joinir): Phase 27.8-1~3 — Ops Box導入 + Toggle対応完了
...
## Phase 27.8-1: JoinIR 命令意味箱(Ops Box)作成 ✅
**新規ファイル**: `src/mir/join_ir_ops.rs`
- `eval_binop()`: Add, Sub, Mul, Div, Or, And の評価ロジック一元化
- `eval_compare()`: Lt, Le, Gt, Ge, Eq, Ne の比較ロジック一元化
- エラー処理: `JoinIrOpError` 型で型安全
- 完全テストカバレッジ: 13個のユニットテスト
**効果**:
- BinOp/Compare の評価ロジックを一箇所に集約
- 再利用可能な API で将来の拡張が容易
- テスタビリティ向上
## Phase 27.8-2: join_ir_runner.rs の Ops Box 統合 ✅
**変更**: `src/mir/join_ir_runner.rs`
- BinOp/Compare の実装を ops box に完全移譲(約70行削減)
- `JoinValue` / `JoinIrOpError` を ops box から再エクスポート
- 後方互換性維持: `JoinRuntimeError = JoinIrOpError`
**効果**:
- コード重複削減(約70行)
- 実装の一貫性保証(ops box の単一実装を使用)
## Phase 27.8-3: MIR→JoinIR Toggle 対応 ✅
**変更**: `src/mir/join_ir.rs`
- `lower_skip_ws_to_joinir()`: トグル対応ディスパッチャー
- `lower_skip_ws_handwritten()`: 既存実装をリネーム(Phase 27.1-27.7)
- `lower_skip_ws_from_mir()`: MIR自動解析版スタブ(Phase 27.8-4 で実装予定)
**環境変数制御**:
```bash
# 手書き版(デフォルト)
./target/release/hakorune program.hako
# MIR自動解析版(Phase 27.8-4 実装予定)
NYASH_JOINIR_LOWER_FROM_MIR=1 ./target/release/hakorune program.hako
```
**効果**:
- 段階的な移行が可能(既存動作を完全に維持)
- A/B テストによる検証が容易
## 変更ファイル
- `src/mir/join_ir_ops.rs` (新規): Ops Box 実装
- `src/mir/join_ir_runner.rs`: Ops Box 使用に変更
- `src/mir/join_ir.rs`: Toggle 対応ディスパッチャー追加
- `src/mir/mod.rs`: join_ir_ops モジュール追加
## コンパイル結果
✅ 0 errors, 18 warnings(既存警告のみ)
✅ ビルド成功
## 次のステップ
**Phase 27.8-4**: `lower_skip_ws_from_mir()` 本実装
- MirQuery を使った MIR 解析
- パターンマッチング(init, header, break checks, body)
- JoinIR 自動生成(entry function + loop_step function)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-23 14:47:00 +09:00