Files
hakorune/src/mir/builder/exprs_call.rs

45 lines
1.5 KiB
Rust
Raw Normal View History

use super::ValueId;
use crate::ast::ASTNode;
impl super::MirBuilder {
// Indirect call: (callee)(args...)
pub(super) fn build_indirect_call_expression(
&mut self,
callee: ASTNode,
arguments: Vec<ASTNode>,
) -> Result<ValueId, String> {
let callee_id = self.build_expression_impl(callee)?;
let mut arg_ids: Vec<ValueId> = Vec::new();
for a in arguments {
arg_ids.push(self.build_expression_impl(a)?);
}
// Phase 3.1: Use unified call with CallTarget::Value for indirect calls
let use_unified = super::calls::call_unified::is_unified_call_enabled();
if use_unified {
// New unified path - use emit_unified_call with Value target
let dst = self.next_value_id();
self.emit_unified_call(
Some(dst),
super::builder_calls::CallTarget::Value(callee_id),
arg_ids,
)?;
Ok(dst)
} else {
// Unified-off path: still encode callee as Value to avoid by-name resolution
let dst = self.next_value_id();
self.emit_instruction(super::MirInstruction::Call {
dst: Some(dst),
func: callee_id,
callee: Some(crate::mir::definitions::call_unified::Callee::Value(
callee_id,
)),
args: arg_ids,
effects: super::EffectMask::PURE,
})?;
Ok(dst)
}
}
}