continue env

This commit is contained in:
Svyatoslav Nikolsky
2017-05-04 19:50:48 +03:00
parent 7511e3095a
commit fb14751864
3 changed files with 25 additions and 3 deletions

View File

@ -18,6 +18,7 @@ impl Func {
} }
/// Local definition inside the function body. /// Local definition inside the function body.
#[derive(Debug)]
pub struct Local { pub struct Local {
count: u32, count: u32,
value_type: ValueType, value_type: ValueType,
@ -57,6 +58,7 @@ impl Serialize for Local {
} }
/// Function body definition. /// Function body definition.
#[derive(Debug)]
pub struct FuncBody { pub struct FuncBody {
locals: Vec<Local>, locals: Vec<Local>,
opcodes: Opcodes, opcodes: Opcodes,

View File

@ -20,6 +20,8 @@ const TABLE_BASE_DEFAULT: i32 = 0;
const INVOKE_VI_INDEX: u32 = 0; // (i32, i32) -> () const INVOKE_VI_INDEX: u32 = 0; // (i32, i32) -> ()
const INVOKE_INDEX: u32 = 1; // (i32) -> () const INVOKE_INDEX: u32 = 1; // (i32) -> ()
const GAS_INDEX: u32 = 2; const GAS_INDEX: u32 = 2;
const STORAGE_SIZE_INDEX: u32 = 3;
const STORAGE_WRITE_INDEX: u32 = 4;
const TABLE_SIZE: u32 = 1024; const TABLE_SIZE: u32 = 1024;
const TABLE_INDEX: u32 = 0; const TABLE_INDEX: u32 = 0;
@ -88,9 +90,21 @@ impl ModuleInstanceInterface for EnvModuleInstance {
unimplemented!() unimplemented!()
} }
fn call_internal_function(&self, _outer: CallerContext, index: u32, _function_type: Option<&FunctionType>) -> Result<Option<RuntimeValue>, Error> { fn call_internal_function(&self, outer: CallerContext, index: u32, _function_type: Option<&FunctionType>) -> Result<Option<RuntimeValue>, Error> {
match index { match index {
GAS_INDEX => Ok(None), GAS_INDEX => {
outer.value_stack.pop()?;
Ok(None)
},
STORAGE_SIZE_INDEX => {
Ok(Some(RuntimeValue::I32(0)))
},
STORAGE_WRITE_INDEX => {
outer.value_stack.pop()?;
outer.value_stack.pop()?;
outer.value_stack.pop()?;
Ok(Some(RuntimeValue::I32(0)))
},
_ => unimplemented!(), _ => unimplemented!(),
} }
} }
@ -113,6 +127,8 @@ pub fn env_module() -> Result<EnvModuleInstance, Error> {
.with_export(ExportEntry::new("invoke_vi".into(), Internal::Function(INVOKE_VI_INDEX))) .with_export(ExportEntry::new("invoke_vi".into(), Internal::Function(INVOKE_VI_INDEX)))
.with_export(ExportEntry::new("invoke".into(), Internal::Function(INVOKE_INDEX))) .with_export(ExportEntry::new("invoke".into(), Internal::Function(INVOKE_INDEX)))
.with_export(ExportEntry::new("gas".into(), Internal::Function(GAS_INDEX))) .with_export(ExportEntry::new("gas".into(), Internal::Function(GAS_INDEX)))
.with_export(ExportEntry::new("_storage_size".into(), Internal::Function(STORAGE_SIZE_INDEX)))
.with_export(ExportEntry::new("_storage_write".into(), Internal::Function(STORAGE_WRITE_INDEX)))
.build(); .build();
EnvModuleInstance::new(module) EnvModuleInstance::new(module)

View File

@ -1,3 +1,4 @@
use std::iter::repeat;
use std::sync::{Arc, Weak}; use std::sync::{Arc, Weak};
use elements::{Module, InitExpr, Opcode, Type, FunctionType, FuncBody, Internal}; use elements::{Module, InitExpr, Opcode, Type, FunctionType, FuncBody, Internal};
use interpreter::Error; use interpreter::Error;
@ -345,7 +346,10 @@ fn prepare_function_locals(function_type: &FunctionType, function_body: &FuncBod
VariableInstance::new(true, expected_type, param_value) VariableInstance::new(true, expected_type, param_value)
}) })
.collect::<Vec<_>>().into_iter().rev() .collect::<Vec<_>>().into_iter().rev()
.chain(function_body.locals().iter().map(|l| VariableInstance::new(true, l.value_type().into(), RuntimeValue::default(l.value_type().into())))) .chain(function_body.locals()
.iter()
.flat_map(|l| repeat(l.value_type().into()).take(l.count() as usize))
.map(|vt| VariableInstance::new(true, vt, RuntimeValue::default(vt))))
.collect::<Result<Vec<_>, _>>() .collect::<Result<Vec<_>, _>>()
} }