Implement returns.
This commit is contained in:
@@ -361,11 +361,20 @@ pub fn pass_outgoing_args(ctx: &mut Context, arity: u32) {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn call_direct(ctx: &mut Context, index: u32) {
|
||||
pub fn call_direct(ctx: &mut Context, index: u32, return_arity: u32) {
|
||||
assert!(return_arity == 0 || return_arity == 1);
|
||||
|
||||
let label = &ctx.func_starts[index as usize].1;
|
||||
dynasm!(ctx.asm
|
||||
; call =>*label
|
||||
);
|
||||
|
||||
if return_arity == 1 {
|
||||
dynasm!(ctx.asm
|
||||
; push rax
|
||||
);
|
||||
ctx.sp_depth.reserve(1);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn prologue(ctx: &mut Context, stack_slots: u32) {
|
||||
|
||||
@@ -222,13 +222,11 @@ pub fn translate(
|
||||
}
|
||||
Operator::Call { function_index } => {
|
||||
let callee_ty = translation_ctx.func_type(function_index);
|
||||
assert!(callee_ty.returns.len() == 0, "is not supported");
|
||||
|
||||
// TODO: ensure that this function is locally defined
|
||||
// We would like to support imported functions at some point
|
||||
// TODO: this implementation assumes that this function is locally defined.
|
||||
|
||||
pass_outgoing_args(&mut ctx, callee_ty.params.len() as u32);
|
||||
call_direct(&mut ctx, function_index);
|
||||
call_direct(&mut ctx, function_index, callee_ty.returns.len() as u32);
|
||||
}
|
||||
_ => {
|
||||
trap(&mut ctx);
|
||||
|
||||
Reference in New Issue
Block a user