diff --git a/src/mir/builder/calls/lowering.rs b/src/mir/builder/calls/lowering.rs index 067bfb20..c0f4cdd7 100644 --- a/src/mir/builder/calls/lowering.rs +++ b/src/mir/builder/calls/lowering.rs @@ -94,9 +94,24 @@ impl MirBuilder { fn setup_function_params(&mut self, params: &[String]) { self.function_param_names.clear(); if let Some(ref mut f) = self.current_function { - for p in params { - let pid = f.next_value_id(); - f.params.push(pid); + // 📦 Hotfix 5: Use pre-populated params from MirFunction::new() + // Static methods have implicit receiver at params[0], so actual parameters start at offset + let receiver_offset = if f.params.is_empty() { 0 } else { + // If params already populated (by Hotfix 4+5), use them + if f.params.len() > params.len() { 1 } else { 0 } + }; + + for (idx, p) in params.iter().enumerate() { + let param_idx = receiver_offset + idx; + let pid = if param_idx < f.params.len() { + // Use pre-allocated ValueId from MirFunction::new() + f.params[param_idx] + } else { + // Allocate new ValueId (fallback for non-static methods) + let new_pid = f.next_value_id(); + f.params.push(new_pid); + new_pid + }; self.variable_map.insert(p.clone(), pid); self.function_param_names.insert(p.clone()); } diff --git a/src/mir/function.rs b/src/mir/function.rs index d49160f6..03d10713 100644 --- a/src/mir/function.rs +++ b/src/mir/function.rs @@ -104,9 +104,17 @@ impl MirFunction { let total_value_ids = param_count + receiver_count; let initial_counter = total_value_ids.max(1); // At least 1 to reserve ValueId(0) as sentinel + // 🔥 Hotfix 5: Pre-populate params vector with reserved ValueIds + // Without this, setup_function_params() will allocate NEW ValueIds starting from + // the already-incremented counter, causing signature/body mismatch. + let mut pre_params = Vec::new(); + for i in 0..total_value_ids { + pre_params.push(ValueId::new(i)); + } + if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() { - eprintln!("[MirFunction::new] fn='{}' params={}, receiver={}, total={}, initial_counter={}", - signature.name, param_count, receiver_count, total_value_ids, initial_counter); + eprintln!("[MirFunction::new] fn='{}' params={}, receiver={}, total={}, initial_counter={}, pre_params={:?}", + signature.name, param_count, receiver_count, total_value_ids, initial_counter, pre_params); } Self { @@ -114,7 +122,7 @@ impl MirFunction { blocks, entry_block, locals: Vec::new(), - params: Vec::new(), + params: pre_params, // ✅ Pre-populate instead of empty Vec next_value_id: initial_counter, metadata: FunctionMetadata::default(), }