mirror of
https://github.com/fluencelabs/parity-wasm
synced 2025-05-24 13:11:34 +00:00
instantiate env module
This commit is contained in:
parent
a5da7d604b
commit
2f73f02831
@ -81,7 +81,8 @@ pub struct EnvModuleInstance {
|
|||||||
|
|
||||||
impl EnvModuleInstance {
|
impl EnvModuleInstance {
|
||||||
pub fn new(params: EnvParams, module: Module) -> Result<Self, Error> {
|
pub fn new(params: EnvParams, module: Module) -> Result<Self, Error> {
|
||||||
let instance = ModuleInstance::new(Weak::default(), "env".into(), module)?;
|
let mut instance = ModuleInstance::new(Weak::default(), "env".into(), module)?;
|
||||||
|
instance.instantiate(false, None)?;
|
||||||
|
|
||||||
Ok(EnvModuleInstance {
|
Ok(EnvModuleInstance {
|
||||||
_params: params,
|
_params: params,
|
||||||
@ -186,7 +187,7 @@ pub fn env_module(params: EnvParams) -> Result<EnvModuleInstance, Error> {
|
|||||||
.with_export(ExportEntry::new("DYNAMIC_BASE".into(), Internal::Global(INDEX_GLOBAL_DYNAMIC_BASE)))
|
.with_export(ExportEntry::new("DYNAMIC_BASE".into(), Internal::Global(INDEX_GLOBAL_DYNAMIC_BASE)))
|
||||||
.with_global(GlobalEntry::new(GlobalType::new(ValueType::I32, true), InitExpr::new(vec![Opcode::I32Const((DEFAULT_STACK_BASE + params.total_stack) as i32)])))
|
.with_global(GlobalEntry::new(GlobalType::new(ValueType::I32, true), InitExpr::new(vec![Opcode::I32Const((DEFAULT_STACK_BASE + params.total_stack) as i32)])))
|
||||||
.with_export(ExportEntry::new("DYNAMICTOP_PTR".into(), Internal::Global(INDEX_GLOBAL_DYNAMICTOP_PTR)))
|
.with_export(ExportEntry::new("DYNAMICTOP_PTR".into(), Internal::Global(INDEX_GLOBAL_DYNAMICTOP_PTR)))
|
||||||
.with_global(GlobalEntry::new(GlobalType::new(ValueType::I32, params.allow_memory_growth), InitExpr::new(vec![Opcode::I32Const(params.total_memory as i32)])))
|
.with_global(GlobalEntry::new(GlobalType::new(ValueType::I32, params.allow_memory_growth), InitExpr::new(vec![Opcode::I32Const(params.total_memory as i32)])))
|
||||||
.with_export(ExportEntry::new("TOTAL_MEMORY".into(), Internal::Global(INDEX_GLOBAL_TOTAL_MEMORY)))
|
.with_export(ExportEntry::new("TOTAL_MEMORY".into(), Internal::Global(INDEX_GLOBAL_TOTAL_MEMORY)))
|
||||||
.with_global(GlobalEntry::new(GlobalType::new(ValueType::I32, true), InitExpr::new(vec![Opcode::I32Const(0)])))
|
.with_global(GlobalEntry::new(GlobalType::new(ValueType::I32, true), InitExpr::new(vec![Opcode::I32Const(0)])))
|
||||||
.with_export(ExportEntry::new("ABORT".into(), Internal::Global(INDEX_GLOBAL_ABORT)))
|
.with_export(ExportEntry::new("ABORT".into(), Internal::Global(INDEX_GLOBAL_ABORT)))
|
||||||
|
@ -235,32 +235,30 @@ impl ModuleInstance {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// validate export section
|
// validate export section
|
||||||
if is_user_module { // TODO: env module exports STACKTOP global, which is mutable => check is failed
|
if let Some(export_section) = self.module.export_section() {
|
||||||
if let Some(export_section) = self.module.export_section() {
|
for export in export_section.entries() {
|
||||||
for export in export_section.entries() {
|
match export.internal() {
|
||||||
match export.internal() {
|
&Internal::Function(function_index) => {
|
||||||
&Internal::Function(function_index) => {
|
self.require_function(ItemIndex::IndexSpace(function_index)).map(|_| ())?;
|
||||||
self.require_function(ItemIndex::IndexSpace(function_index)).map(|_| ())?;
|
self.exports.entry(export.field().into()).or_insert_with(Default::default).push(Internal::Function(function_index));
|
||||||
self.exports.entry(export.field().into()).or_insert_with(Default::default).push(Internal::Function(function_index));
|
},
|
||||||
},
|
&Internal::Global(global_index) => {
|
||||||
&Internal::Global(global_index) => {
|
self.global(ItemIndex::IndexSpace(global_index), None)
|
||||||
self.global(ItemIndex::IndexSpace(global_index), None)
|
.and_then(|g| if g.is_mutable() && is_user_module {
|
||||||
.and_then(|g| if g.is_mutable() {
|
Err(Error::Validation(format!("trying to export mutable global {}", export.field())))
|
||||||
Err(Error::Validation(format!("trying to export mutable global {}", export.field())))
|
} else {
|
||||||
} else {
|
Ok(())
|
||||||
Ok(())
|
})?;
|
||||||
})?;
|
self.exports.entry(export.field().into()).or_insert_with(Default::default).push(Internal::Global(global_index));
|
||||||
self.exports.entry(export.field().into()).or_insert_with(Default::default).push(Internal::Global(global_index));
|
},
|
||||||
},
|
&Internal::Memory(memory_index) => {
|
||||||
&Internal::Memory(memory_index) => {
|
self.memory(ItemIndex::IndexSpace(memory_index)).map(|_| ())?;
|
||||||
self.memory(ItemIndex::IndexSpace(memory_index)).map(|_| ())?;
|
self.exports.entry(export.field().into()).or_insert_with(Default::default).push(Internal::Memory(memory_index));
|
||||||
self.exports.entry(export.field().into()).or_insert_with(Default::default).push(Internal::Memory(memory_index));
|
},
|
||||||
},
|
&Internal::Table(table_index) => {
|
||||||
&Internal::Table(table_index) => {
|
self.table(ItemIndex::IndexSpace(table_index)).map(|_| ())?;
|
||||||
self.table(ItemIndex::IndexSpace(table_index)).map(|_| ())?;
|
self.exports.entry(export.field().into()).or_insert_with(Default::default).push(Internal::Table(table_index));
|
||||||
self.exports.entry(export.field().into()).or_insert_with(Default::default).push(Internal::Table(table_index));
|
},
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -211,38 +211,16 @@ fn single_program_different_modules() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn import_global() {
|
fn import_env_mutable_global() {
|
||||||
// create new program
|
|
||||||
let program = ProgramInstance::new().unwrap();
|
let program = ProgramInstance::new().unwrap();
|
||||||
// => env module is created
|
|
||||||
let env_instance = program.module("env").unwrap();
|
|
||||||
// => linear memory is created
|
|
||||||
let env_memory = env_instance.memory(ItemIndex::Internal(0)).unwrap();
|
|
||||||
|
|
||||||
// create native env module executor
|
let module = module()
|
||||||
let mut executor = FunctionExecutor {
|
.with_import(ImportEntry::new("env".into(), "STACKTOP".into(), External::Global(GlobalType::new(ValueType::I32, false))))
|
||||||
memory: env_memory.clone(),
|
.build();
|
||||||
values: Vec::new(),
|
|
||||||
};
|
|
||||||
{
|
|
||||||
let functions: UserFunctions = UserFunctions {
|
|
||||||
executor: &mut executor,
|
|
||||||
functions: ::std::borrow::Cow::from(SIGNATURES),
|
|
||||||
};
|
|
||||||
let native_env_instance = Arc::new(env_native_module(env_instance, functions).unwrap());
|
|
||||||
let params = ExecutionParams::with_external("env".into(), native_env_instance);
|
|
||||||
|
|
||||||
let module = module()
|
|
||||||
.with_import(ImportEntry::new("env".into(), "STACKTOP".into(), External::Global(GlobalType::new(ValueType::I32, false))))
|
|
||||||
.build();
|
|
||||||
|
|
||||||
// load module
|
|
||||||
program.add_module("main", module, Some(¶ms.externals)).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
program.add_module("main", module, None).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn env_native_export_entry_type_check() {
|
fn env_native_export_entry_type_check() {
|
||||||
let program = ProgramInstance::new().unwrap();
|
let program = ProgramInstance::new().unwrap();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user