feat(mir): Phase 26-A-4完了 - is_parameter根本修正(名前ベース→ValueIdベース型安全化)
## 🎯 Phase 26-A-4: loop_builder.rs修正完了 ### ✅ 実装内容 1. **LoopFormOps trait修正** (`src/mir/phi_core/loopform_builder.rs:538`) - シグネチャ変更: `is_parameter(&self, name: &str)` → `is_parameter(&self, value_id: ValueId)` - Phase 26-A-4コメント追加 2. **MirBuilder実装修正** (`src/mir/loop_builder.rs:1172`) - `self.parent_builder.is_value_parameter(value_id)` 使用 - MirValueKindベースの型安全判定に変更 - GUARD Bug Prevention コメント追加 3. **JSON v0 Bridge実装** (`src/runner/json_v0_bridge/lowering/loop_.rs:96`) - ValueId → 変数名の逆引き実装 - 既存ヒューリスティック("me", "args")を維持 - Phase 26-A-4コメント追加 4. **テストMock実装×2** (`src/mir/phi_core/loopform_builder.rs:697, 848`) - MockOps: ValueId < params.len() で判定 - 第2Mock: 常にfalse(パラメータなし) 5. **呼び出し箇所修正×2** - `loop_builder.rs:237`: `self.is_parameter(*value)` - `loopform_builder.rs:143`: `ops.is_parameter(value)` ### 🏆 技術的成果 #### GUARDバグ完全根絶 ```rust // ❌ 旧実装(名前ベース、脆弱) fn is_parameter(&self, name: &str) -> bool { if name.starts_with("__pin$") { return false; } if name == "me" { return true; } self.parent_builder.function_param_names.contains(name) } // ✅ 新実装(ValueIdベース、型安全) fn is_parameter(&self, value_id: ValueId) -> bool { self.parent_builder.is_value_parameter(value_id) // ← MirValueKind::Parameter(_) で型安全判定! } ``` #### GUARD checkバグ再現防止 - **問題**: ValueId(0) を「常に未初期化」と誤判定 - **解決**: MirValueKind::Parameter(0) で正しく判定 - **効果**: パラメータ s=ValueId(0) も正しく処理可能に ### 📊 テスト結果 ``` test result: ok. 241 passed; 1 failed; 27 ignored ``` - ✅ **241テスト合格** - Phase 26-A-3と同じ(回帰なし) - ❌ **1テスト失敗** - `mir_funcscanner_skip_ws`(既存PHIバグ、無関係) - ✅ **ビルド成功** - 4 warnings(既存) ### 🔄 修正ファイル一覧 1. `src/mir/loop_builder.rs` - メイン実装(is_parameter実装+呼び出し) 2. `src/mir/phi_core/loopform_builder.rs` - trait定義+呼び出し+Mock×2 3. `src/runner/json_v0_bridge/lowering/loop_.rs` - JSON bridge実装 ### 🎯 次のステップ - Phase 26-A-5: 統合テスト作成 - Phase 26-A: 既存テスト全確認 - ドキュメント更新 ## 📚 関連Phase - Phase 26-A-1: MirValueKind + TypedValueId 実装 ✅ - Phase 26-A-2: MirBuilder統合 ✅ - Phase 26-A-3: パラメータ型自動登録 ✅ - **Phase 26-A-4: is_parameter根本修正 ✅ ← 今回**
This commit is contained in:
@ -139,7 +139,8 @@ impl LoopFormBuilder {
|
||||
|
||||
// Separate variables into carriers and pinned based on parameter status
|
||||
for (name, &value) in current_vars.iter() {
|
||||
if ops.is_parameter(name) {
|
||||
// Phase 26-A-4: ValueIdベース判定に変更(名前ベース → 型安全)
|
||||
if ops.is_parameter(value) {
|
||||
// Pinned variable (parameter, not modified in loop)
|
||||
let pinned = PinnedVariable {
|
||||
name: name.clone(),
|
||||
@ -531,8 +532,11 @@ pub trait LoopFormOps {
|
||||
/// Used to validate exit PHI inputs against actual control flow.
|
||||
fn get_block_predecessors(&self, block: BasicBlockId) -> std::collections::HashSet<BasicBlockId>;
|
||||
|
||||
/// Check if a variable is a function parameter
|
||||
fn is_parameter(&self, name: &str) -> bool;
|
||||
/// Phase 26-A-4: ValueIdベースのパラメータ判定(型安全化)
|
||||
///
|
||||
/// 旧実装(名前ベース)から新実装(ValueIdベース)に変更。
|
||||
/// MirValueKindによる型安全判定で、GUARDバグを根絶。
|
||||
fn is_parameter(&self, value_id: ValueId) -> bool;
|
||||
|
||||
/// Set current block for instruction emission
|
||||
fn set_current_block(&mut self, block: BasicBlockId) -> Result<(), String>;
|
||||
@ -686,8 +690,12 @@ mod tests {
|
||||
std::collections::HashSet::new()
|
||||
}
|
||||
|
||||
fn is_parameter(&self, name: &str) -> bool {
|
||||
self.params.iter().any(|p| p == name)
|
||||
/// Phase 26-A-4: ValueIdベースのパラメータ判定(Mock版)
|
||||
///
|
||||
/// テストモックでは、最初のN個のValueId(N=params.len())をパラメータとする。
|
||||
/// これは標準的な規約(%0, %1, ... がパラメータ)に従う。
|
||||
fn is_parameter(&self, value_id: ValueId) -> bool {
|
||||
value_id.0 < self.params.len() as u32
|
||||
}
|
||||
|
||||
fn set_current_block(&mut self, _block: BasicBlockId) -> Result<(), String> {
|
||||
@ -836,8 +844,9 @@ mod tests {
|
||||
std::collections::HashSet::new()
|
||||
}
|
||||
|
||||
fn is_parameter(&self, _name: &str) -> bool {
|
||||
false
|
||||
/// Phase 26-A-4: ValueIdベースのパラメータ判定(Mock版・パラメータなし)
|
||||
fn is_parameter(&self, _value_id: ValueId) -> bool {
|
||||
false // このテストにはパラメータなし
|
||||
}
|
||||
|
||||
fn set_current_block(&mut self, _block: BasicBlockId) -> Result<(), String> {
|
||||
|
||||
Reference in New Issue
Block a user