Files
hakorune/docs/development/current/main/phase222-5-d-hashmap-inventory.md
nyash-codex d4f90976da refactor(joinir): Phase 244 - ConditionLoweringBox trait unification
Unify condition lowering logic across Pattern 2/4 with trait-based API.

New infrastructure:
- condition_lowering_box.rs: ConditionLoweringBox trait + ConditionContext (293 lines)
- ExprLowerer implements ConditionLoweringBox trait (+51 lines)

Pattern migrations:
- Pattern 2 (loop_with_break_minimal.rs): Use trait API
- Pattern 4 (loop_with_continue_minimal.rs): Use trait API

Benefits:
- Unified condition lowering interface
- Extensible for future lowering strategies
- Clean API boundary between patterns and lowering logic
- Zero code duplication

Test results: 911/911 PASS (+2 new tests)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-11 02:35:31 +09:00

197 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 222.5-D: HashMap/BTreeMap Inventory
**作成日**: 2025-12-10
**目的**: JoinIR パイプライン周辺の HashMap を BTreeMap に統一し、決定性を保証する
---
## 📊 全体サマリー
- **HashMap 使用箇所**: 74 箇所src/mir 配下)
- **BTreeMap 使用箇所**: 50+ 箇所Phase 25.1 で PHI 周辺は移行済み)
- **変更対象**: JoinIR パイプライン周辺の HashMap推定 15-20 箇所)
---
## 🎯 カテゴリ分類
### ✅ Category A: Already BTreeMap (Phase 25.1 完了)
**PHI / Loop / Snapshot 周辺** - 決定性保証済み
- `builder.rs:93` - `variable_map: BTreeMap<String, ValueId>`
- `builder/context.rs:28` - `variable_map: BTreeMap<String, ValueId>`
- `builder/context.rs:35` - `value_origin_newbox: BTreeMap<ValueId, String>`
- `builder/context.rs:42` - `value_types: BTreeMap<ValueId, MirType>`
- `phi_core/phi_builder_box.rs` - 全 PHI 関連マップ ✅
- `phi_core/loop_snapshot_merge.rs` - 全スナップショットマップ ✅
- `phi_core/loopform/builder_core.rs` - 全ループフォームマップ ✅
### 🔶 Category B: JoinIR Pipeline - 要 BTreeMap 化
**JoinIR パイプラインPattern/Merge/Boundary/ValueId周辺**
#### 🔴 優先度高PHI/ValueId 割り当てに直接影響)
1. **exit_binding 系** (3 箇所)
- `exit_binding.rs:35` - `variable_map: &'a mut HashMap<String, ValueId>`
- `exit_binding_constructor.rs:30` - `variable_map: &mut HashMap<String, ValueId>`
- `exit_binding_applicator.rs:33` - `variable_map: &HashMap<String, ValueId>`
2. **carrier_info 系** (2 箇所)
- `carrier_info.rs:77` - `variable_map: &HashMap<String, ValueId>`
- `carrier_info.rs:142` - `variable_map: &HashMap<String, ValueId>`
3. **pattern_pipeline 系** (1 箇所)
- `pattern_pipeline.rs:105` - `carrier_updates: Option<HashMap<String, UpdateExpr>>`
4. **loop update analyzer 系** (2 箇所)
- `loop_update_analyzer.rs:84` - `HashMap<String, UpdateExpr>`
- `loop_update_analyzer.rs:103` - `updates: &mut HashMap<String, UpdateExpr>`
5. **loop with break/continue 系** (2 箇所)
- `loop_with_break_minimal.rs:142` - `carrier_updates: &HashMap<String, UpdateExpr>`
- `loop_with_continue_minimal.rs:125` - `carrier_updates: &HashMap<String, UpdateExpr>`
6. **pattern4 carrier analyzer** (1 箇所)
- `pattern4_carrier_analyzer.rs:89` - `HashMap<String, UpdateExpr>`
7. **condition_env 系** (2 箇所)
- `condition_env.rs:47` - `name_to_join: HashMap<String, ValueId>`
- `condition_env.rs:56` - `captured: HashMap<String, ValueId>`
#### 🟡 優先度中Merge/Boundary 処理)
8. **merge 系** (6 箇所)
- `instruction_rewriter.rs:47` - `value_to_func_name: &HashMap<ValueId, String>`
- `instruction_rewriter.rs:48` - `function_params: &HashMap<String, Vec<ValueId>>`
- `instruction_rewriter.rs:71` - `function_entry_map: HashMap<String, BasicBlockId>`
- `instruction_rewriter.rs:124` - `local_block_map: HashMap<BasicBlockId, BasicBlockId>`
- `value_collector.rs:24-25` - 2 HashMap (ValueId → String, String → Vec<ValueId>)
- `value_collector.rs:36-37` - 2 HashMap (初期化)
9. **joinir_id_remapper 系** (2 箇所)
- `joinir_id_remapper.rs:14` - `block_map: HashMap<(String, BasicBlockId), BasicBlockId>`
- `joinir_id_remapper.rs:16` - `value_map: HashMap<ValueId, ValueId>`
10. **boundary injector 系** (2 箇所)
- `joinir_inline_boundary_injector.rs:58` - `value_map: &HashMap<ValueId, ValueId>`
- `joinir_inline_boundary_injector.rs:61` - `HashMap<ValueId, ValueId>` (戻り値)
### 🟢 Category C: Keep HashMap変更不要
**Builder 内部状態・キャッシュ・最適化パス**
#### Builder 内部(変更不要)
- `builder.rs:109` - `weak_fields_by_box: HashMap<String, HashSet<String>>` - 箱フィールド弱参照管理
- `builder.rs:112` - `property_getters_by_box: HashMap<String, HashMap<String, PropertyKind>>` - プロパティゲッター
- `builder.rs:115` - `field_origin_class: HashMap<(ValueId, String), String>` - フィールド起源追跡
- `builder.rs:117` - `field_origin_by_box: HashMap<(String, String), String>` - 箱別フィールド起源
- `builder.rs:128` - `value_kinds: HashMap<ValueId, MirValueKind>` - 値種別管理
- `builder.rs:140` - `plugin_method_sigs: HashMap<(String, String), MirType>` - プラグインメソッドシグネチャ
- `builder.rs:144` - `static_method_index: HashMap<String, Vec<(String, usize)>>` - 静的メソッドインデックス
- `builder.rs:151` - `method_tail_index: HashMap<String, Vec<String>>` - メソッドテールインデックス
- `builder.rs:218` - `local_ssa_map: HashMap<(BasicBlockId, ValueId, u8), ValueId>` - ローカル SSA マップ
- `builder.rs:220` - `schedule_mat_map: HashMap<(BasicBlockId, ValueId), ValueId>` - スケジュールマット
- `builder.rs:223` - `pin_slot_names: HashMap<ValueId, String>` - ピンスロット名
- `builder.rs:253` - `static_box_singletons: HashMap<String, ValueId>` - 静的箱シングルトン
#### 最適化パス(順序無関係)
- `passes/cse.rs:20` - `expression_map: HashMap<String, ValueId>` - 共通部分式除去
- `passes/method_id_inject.rs:27` - `origin: HashMap<ValueId, String>` - メソッド ID 注入
- `passes/escape.rs:12` - `analysis: HashMap<String, EscapeInfo>` - エスケープ解析
- `optimizer.rs:241` - `def_map` - 定義マップ(最適化パス内)
- `optimizer.rs:293` - `def_map` - 定義マップ(最適化パス内)
#### Verification / Diagnostics順序無関係
- `verification/barrier.rs:9` - `def_map` - バリア検証
- `verification/ssa.rs:9` - `definitions: HashMap<ValueId, (BasicBlockId, usize)>` - SSA 定義検証
- `verification/cfg.rs:42` - `phi_dsts_in_block` - CFG 検証
- `verification/utils.rs:4-32` - 全ユーティリティ関数predecessors, def_blocks, dominators
- `optimizer_passes/diagnostics.rs:13` - `def_map` - 診断用
#### Runtime / VM実行時性能優先
- `join_ir_runner.rs:70` - `locals: HashMap<VarId, JoinValue>` - JoinIR 実行時ローカル変数
- `join_ir_runner.rs:264` - `locals` - 実行時引数
- `join_ir_runner.rs:403` - `locals` - 変数読み取り
- `join_ir_runner.rs:412` - `locals` - 変数引数
- `function.rs:34` - `blocks: HashMap<BasicBlockId, BasicBlock>` - 関数ブロックMIR 構造)
- `function.rs:388` - `globals: HashMap<String, ConstValue>` - グローバル定数
#### Type Registry型システム
- `builder/type_registry.rs:25` - `origins: HashMap<ValueId, String>` - 型起源
- `builder/type_registry.rs:28` - `types: HashMap<ValueId, MirType>` - 型マップ
#### Miscその他
- `region/function_slot_registry.rs:39` - `name_to_slot: HashMap<String, SlotId>` - スロットレジストリ
- `slot_registry.rs:18` - `TYPE_IDS: HashMap<String, BoxTypeId>` - グローバル型 ID
- `slot_registry.rs:22` - `EXPLICIT_SLOTS: HashMap<...>` - グローバルスロット
- `slot_registry.rs:28` - `BUILTIN_SLOTS: HashMap<...>` - ビルトインスロット
- `builder/plugin_sigs.rs:8` - `HashMap<(String, String), MirType>` - プラグインシグネチャ
- `join_ir_vm_bridge/joinir_block_converter.rs:20` - `func_name_to_value_id` - VM ブリッジ
- `builder/lifecycle.rs:165` - `main_static` - ライフサイクル管理
- `builder/decls.rs:14,146,205` - 宣言処理methods HashMap
- `trim_pattern_lowerer.rs:171` - `variable_map` - テスト用Empty HashMap
---
## 🎯 Phase 222.5-D 実装計画
### Step 1: 優先度高PHI/ValueId 直接影響)- 13 箇所
1. **exit_binding 系** (3 箇所) - `HashMap<String, ValueId>``BTreeMap<String, ValueId>`
2. **carrier_info 系** (2 箇所) - `HashMap<String, ValueId>``BTreeMap<String, ValueId>`
3. **pattern_pipeline 系** (1 箇所) - `HashMap<String, UpdateExpr>``BTreeMap<String, UpdateExpr>`
4. **loop_update_analyzer 系** (2 箇所) - `HashMap<String, UpdateExpr>``BTreeMap<String, UpdateExpr>`
5. **loop with break/continue 系** (2 箇所) - `HashMap<String, UpdateExpr>``BTreeMap<String, UpdateExpr>`
6. **pattern4_carrier_analyzer** (1 箇所) - `HashMap<String, UpdateExpr>``BTreeMap<String, UpdateExpr>`
7. **condition_env 系** (2 箇所) - `HashMap<String, ValueId>``BTreeMap<String, ValueId>`
### Step 2: 優先度中Merge/Boundary- 10 箇所
8. **merge 系** (6 箇所) - ValueId/String マップの BTreeMap 化
9. **joinir_id_remapper 系** (2 箇所) - ValueId マップの BTreeMap 化
10. **boundary injector 系** (2 箇所) - ValueId マップの BTreeMap 化
### Step 3: テスト・検証
- `cargo test --release --lib` で全テスト PASS 確認
- PHI 決定性テスト3 回実行で一貫性確認)
- 既存の Phase 222.5-B/C のテストが通ることを確認
---
## 📝 実装ルール
1. **import 統一**: `use std::collections::BTreeMap;` に変更
2. **初期化統一**: `HashMap::new()``BTreeMap::new()`
3. **シグネチャ統一**: 関数引数・戻り値の型も BTreeMap に変更
4. **テスト維持**: 既存テストは全て通すこと
5. **段階的実装**: 優先度高から順に実装し、各段階でテスト
---
## 🎯 期待効果
- **決定性保証**: JoinIR パイプライン全体で ValueId 割り当てが決定的に
- **PHI 安定性**: Phase 25.1 の PHI 決定性と統一
- **デバッグ容易性**: ValueId/carrier 順序が予測可能に
- **テスト安定性**: 非決定的テスト失敗の根絶
---
## 📌 注意事項
- **Category C (Keep HashMap) は変更しない** - 性能・順序無関係な箇所
- **Runtime (join_ir_runner.rs) は変更しない** - 実行時性能優先
- **Verification は変更しない** - 検証ツールは順序無関係
- **Builder 内部状態は変更しない** - キャッシュ・インデックスは順序無関係
Status: Active
Scope: HashMap 在庫調査JoinIR/JsonParser ライン)