use edlc_core::prelude::mir_expr::mir_call::MirCall;
use edlc_core::prelude::{MirError, MirPhase};
use log::info;
use crate::codegen::{Compilable, FunctionTranslator};
use crate::codegen::variable::AggregateValue;
use crate::compiler::JIT;
impl<Runtime> Compilable<Runtime> for MirCall {
fn compile(
self,
backend: &mut FunctionTranslator<Runtime>,
phase: &mut MirPhase
) -> Result<AggregateValue, MirError<JIT<Runtime>>> {
info!("translating function call at position {} ...", self.pos);
let mut values = Vec::new();
for arg in self.args.into_iter() {
values.push(arg.compile(backend, phase)?);
}
values.into_iter().for_each(|value| backend.add_call_arg(value));
backend.put_call_return(self.ret, self.pos);
backend.func_reg.clone()
.borrow_mut()
.generate_call_code(self.func, backend, phase)?;
Ok(backend.get_call_result().unwrap())
}
}