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;
|
let label = &ctx.func_starts[index as usize].1;
|
||||||
dynasm!(ctx.asm
|
dynasm!(ctx.asm
|
||||||
; call =>*label
|
; 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) {
|
pub fn prologue(ctx: &mut Context, stack_slots: u32) {
|
||||||
|
|||||||
@@ -222,13 +222,11 @@ pub fn translate(
|
|||||||
}
|
}
|
||||||
Operator::Call { function_index } => {
|
Operator::Call { function_index } => {
|
||||||
let callee_ty = translation_ctx.func_type(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
|
// TODO: this implementation assumes that this function is locally defined.
|
||||||
// We would like to support imported functions at some point
|
|
||||||
|
|
||||||
pass_outgoing_args(&mut ctx, callee_ty.params.len() as u32);
|
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);
|
trap(&mut ctx);
|
||||||
|
|||||||
Reference in New Issue
Block a user