Emit a Return opcode if the last one is not return.

This commit is contained in:
losfair 2019-02-15 02:21:04 +08:00
parent 8d8db4aa09
commit 1526d35872

View File

@ -1,7 +1,7 @@
use crate::codegen::{CodegenError, FunctionCodeGenerator, ModuleCodeGenerator}; use crate::codegen::{CodegenError, FunctionCodeGenerator, ModuleCodeGenerator};
use std::sync::Arc; use std::sync::Arc;
use wasmer_runtime_core::{ use wasmer_runtime_core::{
backend::Backend, backend::{Backend, ProtectedCaller},
module::{ module::{
DataInitializer, ExportIndex, ImportName, ModuleInfo, StringTable, StringTableBuilder, DataInitializer, ExportIndex, ImportName, ModuleInfo, StringTable, StringTableBuilder,
TableInitializer, TableInitializer,
@ -38,7 +38,11 @@ impl From<CodegenError> for LoadError {
} }
} }
pub fn read_module<MCG: ModuleCodeGenerator<FCG>, FCG: FunctionCodeGenerator>( pub fn read_module<
MCG: ModuleCodeGenerator<FCG, PC>,
FCG: FunctionCodeGenerator,
PC: ProtectedCaller,
>(
wasm: &[u8], wasm: &[u8],
backend: Backend, backend: Backend,
mcg: &mut MCG, mcg: &mut MCG,
@ -72,7 +76,6 @@ pub fn read_module<MCG: ModuleCodeGenerator<FCG>, FCG: FunctionCodeGenerator>(
loop { loop {
if reader.eof() { if reader.eof() {
mcg.finalize()?;
return Ok(info); return Ok(info);
} }
@ -285,10 +288,18 @@ pub fn read_module<MCG: ModuleCodeGenerator<FCG>, FCG: FunctionCodeGenerator>(
fcg.feed_local(ty, count as usize)?; fcg.feed_local(ty, count as usize)?;
} }
fcg.begin_body()?; fcg.begin_body()?;
let mut last_is_return = false;
for op in item.get_operators_reader()? { for op in item.get_operators_reader()? {
let op = op?; let op = op?;
last_is_return = match op {
Operator::Return => true,
_ => false,
};
fcg.feed_opcode(op)?; fcg.feed_opcode(op)?;
} }
if !last_is_return {
fcg.feed_opcode(Operator::Return)?;
}
fcg.finalize()?; fcg.finalize()?;
} }
} }