mirror of
https://github.com/fluencelabs/wasmer
synced 2025-05-29 09:51:19 +00:00
Hook up wasi exit code to wasmer cli
This commit is contained in:
parent
b7f98c8401
commit
76f4798436
11
examples/exit.wat
Normal file
11
examples/exit.wat
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
(module
|
||||||
|
(import "wasi_unstable" "proc_exit" (func $proc_exit (param i32)))
|
||||||
|
(export "_start" (func $_start))
|
||||||
|
|
||||||
|
(memory 10)
|
||||||
|
(export "memory" (memory 0))
|
||||||
|
|
||||||
|
(func $_start
|
||||||
|
(call $proc_exit (i32.const 7))
|
||||||
|
)
|
||||||
|
)
|
@ -11,12 +11,14 @@ use std::str::FromStr;
|
|||||||
use hashbrown::HashMap;
|
use hashbrown::HashMap;
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
|
|
||||||
use wasmer::webassembly::InstanceABI;
|
|
||||||
use wasmer::*;
|
use wasmer::*;
|
||||||
use wasmer_clif_backend::CraneliftCompiler;
|
use wasmer_clif_backend::CraneliftCompiler;
|
||||||
#[cfg(feature = "backend:llvm")]
|
#[cfg(feature = "backend:llvm")]
|
||||||
use wasmer_llvm_backend::LLVMCompiler;
|
use wasmer_llvm_backend::LLVMCompiler;
|
||||||
use wasmer_runtime::cache::{Cache as BaseCache, FileSystemCache, WasmHash, WASMER_VERSION_HASH};
|
use wasmer_runtime::{
|
||||||
|
cache::{Cache as BaseCache, FileSystemCache, WasmHash, WASMER_VERSION_HASH},
|
||||||
|
Func, Value, error::RuntimeError,
|
||||||
|
};
|
||||||
use wasmer_runtime_core::{
|
use wasmer_runtime_core::{
|
||||||
self,
|
self,
|
||||||
backend::{Compiler, CompilerConfig},
|
backend::{Compiler, CompilerConfig},
|
||||||
@ -295,18 +297,27 @@ fn execute_wasm(options: &Run) -> Result<(), String> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// TODO: refactor this
|
// TODO: refactor this
|
||||||
let (abi, import_object, _em_globals) = if wasmer_emscripten::is_emscripten_module(&module) {
|
if wasmer_emscripten::is_emscripten_module(&module) {
|
||||||
let mut emscripten_globals = wasmer_emscripten::EmscriptenGlobals::new(&module);
|
let mut emscripten_globals = wasmer_emscripten::EmscriptenGlobals::new(&module);
|
||||||
(
|
let import_object = wasmer_emscripten::generate_emscripten_env(&mut emscripten_globals);
|
||||||
InstanceABI::Emscripten,
|
let mut instance = module
|
||||||
wasmer_emscripten::generate_emscripten_env(&mut emscripten_globals),
|
.instantiate(&import_object)
|
||||||
Some(emscripten_globals), // TODO Em Globals is here to extend, lifetime, find better solution
|
.map_err(|e| format!("Can't instantiate module: {:?}", e))?;
|
||||||
|
|
||||||
|
wasmer_emscripten::run_emscripten_instance(
|
||||||
|
&module,
|
||||||
|
&mut instance,
|
||||||
|
if let Some(cn) = &options.command_name {
|
||||||
|
cn
|
||||||
|
} else {
|
||||||
|
options.path.to_str().unwrap()
|
||||||
|
},
|
||||||
|
options.args.iter().map(|arg| arg.as_str()).collect(),
|
||||||
)
|
)
|
||||||
|
.map_err(|e| format!("{:?}", e))?;
|
||||||
} else {
|
} else {
|
||||||
if cfg!(feature = "wasi") && wasmer_wasi::is_wasi_module(&module) {
|
if cfg!(feature = "wasi") && wasmer_wasi::is_wasi_module(&module) {
|
||||||
(
|
let import_object = wasmer_wasi::generate_import_object(
|
||||||
InstanceABI::WASI,
|
|
||||||
wasmer_wasi::generate_import_object(
|
|
||||||
if let Some(cn) = &options.command_name {
|
if let Some(cn) = &options.command_name {
|
||||||
[cn.clone()]
|
[cn.clone()]
|
||||||
} else {
|
} else {
|
||||||
@ -321,34 +332,46 @@ fn execute_wasm(options: &Run) -> Result<(), String> {
|
|||||||
.map(|(k, v)| format!("{}={}", k, v).into_bytes())
|
.map(|(k, v)| format!("{}={}", k, v).into_bytes())
|
||||||
.collect(),
|
.collect(),
|
||||||
options.pre_opened_directories.clone(),
|
options.pre_opened_directories.clone(),
|
||||||
),
|
);
|
||||||
None,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
(
|
|
||||||
InstanceABI::None,
|
|
||||||
wasmer_runtime_core::import::ImportObject::new(),
|
|
||||||
None,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut instance = module
|
let instance = module
|
||||||
.instantiate(&import_object)
|
.instantiate(&import_object)
|
||||||
.map_err(|e| format!("Can't instantiate module: {:?}", e))?;
|
.map_err(|e| format!("Can't instantiate module: {:?}", e))?;
|
||||||
|
|
||||||
webassembly::run_instance(
|
let start: Func<(), ()> = instance.func("_start").map_err(|e| format!("{:?}", e))?;
|
||||||
&module,
|
|
||||||
&mut instance,
|
let result = start.call();
|
||||||
abi,
|
|
||||||
if let Some(cn) = &options.command_name {
|
if let Err(ref err) = result {
|
||||||
cn
|
match err {
|
||||||
|
RuntimeError::Trap { msg } => panic!("wasm trap occured: {}", msg),
|
||||||
|
RuntimeError::Error { data } => {
|
||||||
|
if let Some(error_code) = data.downcast_ref::<wasmer_wasi::ExitCode>() {
|
||||||
|
std::process::exit(error_code.code as i32)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panic!("error: {:?}", err)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
options.path.to_str().unwrap()
|
let import_object = wasmer_runtime_core::import::ImportObject::new();
|
||||||
},
|
let instance = module
|
||||||
options.args.iter().map(|arg| arg.as_str()).collect(),
|
.instantiate(&import_object)
|
||||||
)
|
.map_err(|e| format!("Can't instantiate module: {:?}", e))?;
|
||||||
|
|
||||||
|
let args: Vec<Value> = options
|
||||||
|
.args
|
||||||
|
.iter()
|
||||||
|
.map(|arg| arg.as_str())
|
||||||
|
.map(|x| Value::I32(x.parse().unwrap()))
|
||||||
|
.collect();
|
||||||
|
instance
|
||||||
|
.dyn_func("main")
|
||||||
|
.map_err(|e| format!("{:?}", e))?
|
||||||
|
.call(&args)
|
||||||
.map_err(|e| format!("{:?}", e))?;
|
.map_err(|e| format!("{:?}", e))?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user