mirror of
https://github.com/fluencelabs/marine.git
synced 2024-12-12 14:55:32 +00:00
move wasi initialization inside fce
This commit is contained in:
parent
8921535f0b
commit
1254b64b9d
@ -45,7 +45,13 @@ fn main() {
|
|||||||
println!("ipfs node interface is\n{}", ipfs_node.get_interface());
|
println!("ipfs node interface is\n{}", ipfs_node.get_interface());
|
||||||
|
|
||||||
let result = ipfs_node
|
let result = ipfs_node
|
||||||
.rpc_call(&ipfs_rpc, "put", &[IValue::String("QmdHsYnAvbrvXg3iwr6bLaqooVT31E8CMpZRWc9wX2Fbt8".to_string())])
|
.rpc_call(
|
||||||
|
&ipfs_rpc,
|
||||||
|
"put",
|
||||||
|
&[IValue::String(
|
||||||
|
"QmdHsYnAvbrvXg3iwr6bLaqooVT31E8CMpZRWc9wX2Fbt8".to_string(),
|
||||||
|
)],
|
||||||
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
println!("execution result {:?}", result);
|
println!("execution result {:?}", result);
|
||||||
|
@ -19,14 +19,12 @@ use crate::config::ModuleConfig;
|
|||||||
use crate::node_public_interface::NodePublicInterface;
|
use crate::node_public_interface::NodePublicInterface;
|
||||||
use crate::node_public_interface::NodeModulePublicInterface;
|
use crate::node_public_interface::NodeModulePublicInterface;
|
||||||
|
|
||||||
use wasmer_core::import::ImportObject;
|
|
||||||
use wasmer_runtime::func;
|
|
||||||
use fce::FCE;
|
use fce::FCE;
|
||||||
use fce::WasmProcess;
|
use fce::WasmProcess;
|
||||||
use fce::IValue;
|
use fce::IValue;
|
||||||
use fce::FCEModuleConfig;
|
use fce::FCEModuleConfig;
|
||||||
|
use wasmer_core::import::ImportObject;
|
||||||
use wasmer_wasi::generate_import_object_for_version;
|
use wasmer_runtime::func;
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
@ -118,7 +116,6 @@ impl IpfsNode {
|
|||||||
use crate::imports::create_host_import_func;
|
use crate::imports::create_host_import_func;
|
||||||
use crate::imports::log_utf8_string;
|
use crate::imports::log_utf8_string;
|
||||||
use wasmer_core::import::Namespace;
|
use wasmer_core::import::Namespace;
|
||||||
use wasmer_wasi::WasiVersion;
|
|
||||||
|
|
||||||
let mut wasm_module_config = FCEModuleConfig::default();
|
let mut wasm_module_config = FCEModuleConfig::default();
|
||||||
|
|
||||||
@ -139,7 +136,7 @@ impl IpfsNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut import_object = if let Some(wasi) = module_config.wasi {
|
if let Some(wasi) = module_config.wasi {
|
||||||
if let Some(envs) = wasi.envs {
|
if let Some(envs) = wasi.envs {
|
||||||
wasm_module_config.wasi_envs = envs;
|
wasm_module_config.wasi_envs = envs;
|
||||||
}
|
}
|
||||||
@ -157,16 +154,6 @@ impl IpfsNode {
|
|||||||
.map(|(from, to)| (from, PathBuf::from(to)))
|
.map(|(from, to)| (from, PathBuf::from(to)))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_import_object_for_version(
|
|
||||||
WasiVersion::Latest,
|
|
||||||
vec![],
|
|
||||||
wasm_module_config.wasi_envs.clone(),
|
|
||||||
wasm_module_config.wasi_preopened_files.clone(),
|
|
||||||
wasm_module_config.wasi_mapped_dirs.clone(),
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
ImportObject::new()
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let _mapped_dirs = wasm_module_config
|
let _mapped_dirs = wasm_module_config
|
||||||
@ -182,10 +169,11 @@ impl IpfsNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut import_object = ImportObject::new();
|
||||||
import_object.register("host", namespace);
|
import_object.register("host", namespace);
|
||||||
|
|
||||||
wasm_module_config.imports = import_object;
|
wasm_module_config.imports = import_object;
|
||||||
wasm_module_config.wasi_version = WasiVersion::Latest;
|
wasm_module_config.wasi_version = wasmer_wasi::WasiVersion::Latest;
|
||||||
|
|
||||||
Ok(wasm_module_config)
|
Ok(wasm_module_config)
|
||||||
}
|
}
|
||||||
|
@ -68,7 +68,7 @@ impl WasmProcess for FCE {
|
|||||||
let _prepared_wasm_bytes =
|
let _prepared_wasm_bytes =
|
||||||
super::prepare::prepare_module(wasm_bytes, config.mem_pages_count)?;
|
super::prepare::prepare_module(wasm_bytes, config.mem_pages_count)?;
|
||||||
|
|
||||||
let module = FCEModule::new(&wasm_bytes, config.imports, &self.modules)?;
|
let module = FCEModule::new(&wasm_bytes, config, &self.modules)?;
|
||||||
|
|
||||||
match self.modules.entry(module_name.into()) {
|
match self.modules.entry(module_name.into()) {
|
||||||
Entry::Vacant(entry) => {
|
Entry::Vacant(entry) => {
|
||||||
|
@ -28,6 +28,7 @@ use std::collections::HashMap;
|
|||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::mem::MaybeUninit;
|
use std::mem::MaybeUninit;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use crate::FCEModuleConfig;
|
||||||
|
|
||||||
type WITInterpreter =
|
type WITInterpreter =
|
||||||
Interpreter<WITInstance, WITExport, WITFunction, WITMemory, WITMemoryView<'static>>;
|
Interpreter<WITInstance, WITExport, WITFunction, WITMemory, WITMemoryView<'static>>;
|
||||||
@ -64,13 +65,18 @@ pub struct FCEModule {
|
|||||||
// wasmer_instance is needed because WITInstance contains dynamic functions
|
// wasmer_instance is needed because WITInstance contains dynamic functions
|
||||||
// that internally keep pointer to Wasmer instance.
|
// that internally keep pointer to Wasmer instance.
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
wamser_instance: Box<WasmerInstance>,
|
wasmer_instance: Box<WasmerInstance>,
|
||||||
|
|
||||||
// import_object is needed because ImportObject::extend doesn't really deep copy
|
// import_object is needed because ImportObject::extend doesn't really deep copy
|
||||||
// imports, so we need to store imports of this module to prevent their removing.
|
// imports, so we need to store imports of this module to prevent their removing.
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
import_object: ImportObject,
|
import_object: ImportObject,
|
||||||
|
|
||||||
|
// host_import_object is needed because ImportObject::extend doesn't really deep copy
|
||||||
|
// imports, so we need to store imports of this module to prevent their removing.
|
||||||
|
#[allow(unused)]
|
||||||
|
host_import_object: ImportObject,
|
||||||
|
|
||||||
// TODO: replace with dyn Trait
|
// TODO: replace with dyn Trait
|
||||||
exports_funcs: HashMap<String, Arc<Callable>>,
|
exports_funcs: HashMap<String, Arc<Callable>>,
|
||||||
}
|
}
|
||||||
@ -78,20 +84,28 @@ pub struct FCEModule {
|
|||||||
impl FCEModule {
|
impl FCEModule {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
wasm_bytes: &[u8],
|
wasm_bytes: &[u8],
|
||||||
mut fce_imports: ImportObject,
|
fce_module_config: FCEModuleConfig,
|
||||||
modules: &HashMap<String, FCEModule>,
|
modules: &HashMap<String, FCEModule>,
|
||||||
) -> Result<Self, FCEError> {
|
) -> Result<Self, FCEError> {
|
||||||
use wasmer_runtime::Func;
|
|
||||||
|
|
||||||
let wasmer_module = compile(&wasm_bytes)?;
|
let wasmer_module = compile(&wasm_bytes)?;
|
||||||
let wit = extract_wit(&wasmer_module)?;
|
let wit = extract_wit(&wasmer_module)?;
|
||||||
let fce_wit = FCEWITInterfaces::new(wit);
|
let fce_wit = FCEWITInterfaces::new(wit);
|
||||||
|
|
||||||
let mut wit_instance = Arc::new_uninit();
|
let mut wit_instance = Arc::new_uninit();
|
||||||
let import_object = Self::adjust_wit_imports(&fce_wit, wit_instance.clone())?;
|
let import_object = Self::adjust_wit_imports(&fce_wit, wit_instance.clone())?;
|
||||||
fce_imports.extend(import_object.clone());
|
|
||||||
|
|
||||||
let wasmer_instance = wasmer_module.instantiate(&fce_imports)?;
|
let mut wasi_import_object = wasmer_wasi::generate_import_object_for_version(
|
||||||
|
fce_module_config.wasi_version,
|
||||||
|
vec![],
|
||||||
|
fce_module_config.wasi_envs.clone(),
|
||||||
|
fce_module_config.wasi_preopened_files.clone(),
|
||||||
|
fce_module_config.wasi_mapped_dirs.clone(),
|
||||||
|
);
|
||||||
|
|
||||||
|
wasi_import_object.extend(import_object.clone());
|
||||||
|
wasi_import_object.extend(fce_module_config.imports.clone());
|
||||||
|
|
||||||
|
let wasmer_instance = wasmer_module.instantiate(&wasi_import_object)?;
|
||||||
let wit_instance = unsafe {
|
let wit_instance = unsafe {
|
||||||
// get_mut_unchecked here is safe because currently only this modules have reference to
|
// get_mut_unchecked here is safe because currently only this modules have reference to
|
||||||
// it and the environment is single-threaded
|
// it and the environment is single-threaded
|
||||||
@ -102,13 +116,16 @@ impl FCEModule {
|
|||||||
|
|
||||||
let exports_funcs = Self::instantiate_wit_exports(wit_instance, &fce_wit)?;
|
let exports_funcs = Self::instantiate_wit_exports(wit_instance, &fce_wit)?;
|
||||||
|
|
||||||
if let Ok(start_func) = wasmer_instance.exports.get::<Func<'_, (), ()>>("_start") {
|
// call _start to populate the WASI state of the module
|
||||||
|
#[rustfmt::skip]
|
||||||
|
if let Ok(start_func) = wasmer_instance.exports.get::<wasmer_runtime::Func<'_, (), ()>>("_start") {
|
||||||
start_func.call()?;
|
start_func.call()?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
wamser_instance: Box::new(wasmer_instance),
|
wasmer_instance: Box::new(wasmer_instance),
|
||||||
import_object,
|
import_object,
|
||||||
|
host_import_object: fce_module_config.imports,
|
||||||
exports_funcs,
|
exports_funcs,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user