📦 Hotfix 1 & 2: Parameter ValueId Reservation + Exit PHI Validation (Box-First Theory)
**箱理論に基づく根治的修正**: ## 🎯 Hotfix 1: Parameter ValueId Reservation (パラメータ ValueId 予約) ### 根本原因 - MirFunction counter が params.len() を考慮していなかった - local variables が parameter ValueIds を上書き ### 箱理論的解決 1. **LoopFormContext Box** - パラメータ予約を明示的に管理 - 境界をはっきりさせる 2. **MirFunction::new() 改善** - `initial_counter = param_count.max(1)` でパラメータ予約 - Parameters are %0, %1, ..., %N-1 3. **ensure_counter_after() 強化** - パラメータ数 + 既存 ValueIds 両方を考慮 - `min_counter = param_count.max(max_id + 1)` 4. **reserve_parameter_value_ids() 追加** - 明示的な予約メソッド(Box-First) ## 🎯 Hotfix 2: Exit PHI Predecessor Validation (Exit PHI 検証) ### 根本原因 - LoopForm builder が存在しないブロックを PHI predecessor に追加 - 「幽霊ブロック」問題 ### 箱理論的解決 1. **LoopFormOps.block_exists() 追加** - CFG 存在確認メソッド - 境界を明確化 2. **build_exit_phis() 検証** - 非存在ブロックをスキップ - デバッグログ付き ### 実装ファイル - `src/mir/function.rs`: Parameter reservation - `src/mir/phi_core/loopform_builder.rs`: Context + validation - `src/mir/loop_builder.rs`: LoopFormOps impl - `src/mir/builder/stmts.rs`: Local variable allocation ### 業界標準準拠 - ✅ LLVM IR: Parameters are %0, %1, ... - ✅ SSA Form: PHI predecessors must exist in CFG - ✅ Cytron et al. (1991): Parameter reservation principle 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -46,7 +46,7 @@ impl MirInterpreter {
|
||||
}
|
||||
let fn_name = self.cur_fn.as_deref().unwrap_or("<unknown>");
|
||||
Err(VMError::InvalidValue(format!(
|
||||
"use of undefined value {:?} (fn={}, last_block={:?}, last_inst={:?})",
|
||||
"[rust-vm] use of undefined value {:?} (fn={}, last_block={:?}, last_inst={:?})",
|
||||
id,
|
||||
fn_name,
|
||||
self.last_block,
|
||||
|
||||
@ -1,7 +1,14 @@
|
||||
/*!
|
||||
* Method router for MirInterpreter — centralized cross-class reroute and
|
||||
* narrow special-method fallbacks. Phase 1: minimal extraction from exec.rs
|
||||
* to keep behavior unchanged while making execution flow easier to reason about.
|
||||
* 標準ランタイムメソッドルーター(MirInterpreter ライン)
|
||||
*
|
||||
* 責務:
|
||||
* - MIR Interpreter 実行時のメソッド解決を一箇所に集約する
|
||||
* - クラス名の補正(Instance → 基底クラスなど)や toString/equals などの特殊メソッドの再ルーティングを担当する
|
||||
*
|
||||
* メモ:
|
||||
* - ここは「temporary/minimal bridge」ではなく、Interpreter ラインにおける標準のメソッドルーター層だとみなす。
|
||||
* - 実行意味論は backend 側の Box 実装にあり、このファイルはあくまで「どの関数を呼ぶか」の選択だけを見る。
|
||||
* - 元の exec.rs から挙動を変えずに抽出したフェーズ 1 の箱として維持する。
|
||||
*/
|
||||
|
||||
use super::{MirFunction, MirInterpreter};
|
||||
|
||||
Reference in New Issue
Block a user