From 9decdca525a972276720c5f09a2ebb2f8b287730 Mon Sep 17 00:00:00 2001 From: Jef Date: Wed, 19 Dec 2018 16:39:20 +0000 Subject: [PATCH] Add `Return` --- src/backend.rs | 3 ++- src/function_body.rs | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/backend.rs b/src/backend.rs index 6b263c5c10..2126597580 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -597,7 +597,8 @@ pub fn drop(ctx: &mut Context) { ); } StackValue::Temp(gpr) => free_value(ctx, Value::Temp(gpr)), - _ => {} + StackValue::Local(loc) => free_value(ctx, Value::Local(loc)), + StackValue::Immediate(imm) => free_value(ctx, Value::Immediate(imm)), } } diff --git a/src/function_body.rs b/src/function_body.rs index b414da0260..b3a98aedda 100644 --- a/src/function_body.rs +++ b/src/function_body.rs @@ -169,6 +169,18 @@ pub fn translate( ty, )); } + Operator::Return => { + control_frames + .last_mut() + .expect("control stack is never empty") + .mark_unreachable(); + + let control_frame = control_frames.get(0).expect("control stack is never empty"); + + return_from_block(ctx, control_frame.arity(), true); + + br(ctx, control_frame.kind.branch_target()); + } Operator::Br { relative_depth } => { control_frames .last_mut()