From 1526d358725a18f5b95d4cbf9b0cface8ebcfaff Mon Sep 17 00:00:00 2001 From: losfair Date: Fri, 15 Feb 2019 02:21:04 +0800 Subject: [PATCH] Emit a Return opcode if the last one is not return. --- lib/dynasm-backend/src/parse.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/dynasm-backend/src/parse.rs b/lib/dynasm-backend/src/parse.rs index 73e2e0a8e..51b17417f 100644 --- a/lib/dynasm-backend/src/parse.rs +++ b/lib/dynasm-backend/src/parse.rs @@ -1,7 +1,7 @@ use crate::codegen::{CodegenError, FunctionCodeGenerator, ModuleCodeGenerator}; use std::sync::Arc; use wasmer_runtime_core::{ - backend::Backend, + backend::{Backend, ProtectedCaller}, module::{ DataInitializer, ExportIndex, ImportName, ModuleInfo, StringTable, StringTableBuilder, TableInitializer, @@ -38,7 +38,11 @@ impl From for LoadError { } } -pub fn read_module, FCG: FunctionCodeGenerator>( +pub fn read_module< + MCG: ModuleCodeGenerator, + FCG: FunctionCodeGenerator, + PC: ProtectedCaller, +>( wasm: &[u8], backend: Backend, mcg: &mut MCG, @@ -72,7 +76,6 @@ pub fn read_module, FCG: FunctionCodeGenerator>( loop { if reader.eof() { - mcg.finalize()?; return Ok(info); } @@ -285,10 +288,18 @@ pub fn read_module, FCG: FunctionCodeGenerator>( fcg.feed_local(ty, count as usize)?; } fcg.begin_body()?; + let mut last_is_return = false; for op in item.get_operators_reader()? { let op = op?; + last_is_return = match op { + Operator::Return => true, + _ => false, + }; fcg.feed_opcode(op)?; } + if !last_is_return { + fcg.feed_opcode(Operator::Return)?; + } fcg.finalize()?; } }