Files
hakorune/docs/development/current/main/phases/phase-136
nyash-codex 1adf57ec54 refactor(mir): Extract BindingContext from MirBuilder (Phase 136 follow-up 4/7)
## Summary
Extracted binding management into dedicated BindingContext struct,
completing step 4 of 7 in the Context Box refactoring plan.

## Changes
- NEW: src/mir/builder/binding_context.rs (BindingContext struct + helpers)
- Modified 7 files to use binding_ctx (SSOT pattern with legacy sync)
- Added comprehensive unit tests for BindingContext

## Extracted Fields
- binding_map: BTreeMap<String, BindingId> → binding_ctx.binding_map

## Benefits
- Clear separation: BindingId mapping isolated from MirBuilder
- Better testability: BindingContext can be tested independently
- Consistent pattern: Same SSOT + legacy sync approach as previous steps

## Tests
- cargo test --release --lib: 1008/1008 passed
- phase135_trim_mir_verify.sh: PASS
- Backward compatibility: 100% maintained (deprecated fields synced)

## Progress
Phase 136 Context Extraction: 4/7 complete (57%)
-  Step 1: TypeContext
-  Step 2: CoreContext
-  Step 3: ScopeContext
-  Step 4: BindingContext (this commit)
-  Step 5: VariableContext
-  Step 6: MetadataContext
-  Step 7: RegionContext

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-15 20:40:23 +09:00
..

Phase 136: ValueId allocator SSOT 徹底(残存 value_gen.next() 掃討)

Status

  • 状態: P0 完了
  • スコープ: 関数内 ValueId 発行を MirBuilder::next_value_id() に一本化し、予約PHI/引数/ローカルとの衝突余地を消す

Problem

Phase 135 で契約allocator SSOTは固まったが、一部のコードで builder.value_gen.next() を直接使用していた。 これは関数内で走る場合、予約PHI dst や関数引数との ValueId 衝突を引き起こす可能性がある。

Fix

SSOT 化対象

  1. src/mir/builder.rs:new_typed_value() - 型付きValueId発行API

    • Before: let id = self.value_gen.next();
    • After: let id = self.next_value_id(); (関数コンテキストを尊重)
  2. テストコード内の value_gen.next() - 関数スコープをシミュレート

    • test_shadowing_binding_restore: 関数スコープシミュレーションで next_value_id() を使用
    • test_valueid_binding_parallel_allocation: SSOT allocator を使用Module context フォールバック維持)

OKModule context フォールバック)

以下は既に if current_function.is_some() で関数コンテキストを判定しており、Module context のフォールバックとして value_gen.next() を使用OK

  • src/mir/builder/utils.rs:next_value_id() - SSOT allocator 自体43行目
  • src/mir/builder/utils.rs:pin_to_slot() - 436行目
  • src/mir/builder/utils.rs:materialize_local() - 467行目
  • src/mir/utils/phi_helpers.rs:insert_phi_unified() - 69行目

Acceptance

  • rg -n "value_gen\.next\(" src/mir で関数内経路から消える
  • cargo test --release --lib - 997 passed
  • phase135_trim_mir_verify.sh - PASS
  • phase132_exit_phi_parity.sh - 3/3 PASS

Remaining Tasks残課題

なし。全ての関数内経路から value_gen.next() を排除完了。Module context のフォールバックは意図的に残す。