Cache memory index.
This commit is contained in:
parent
ea1e15bc3f
commit
03f378a000
|
@ -56,14 +56,6 @@ impl<T> StackWithLimit<T> where T: Clone {
|
||||||
.ok_or_else(|| Error("non-empty stack expected".into()))
|
.ok_or_else(|| Error("non-empty stack expected".into()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn pick_mut(&mut self, depth: usize) -> Result<&mut T, Error> {
|
|
||||||
let len = self.values.len();
|
|
||||||
// TODO:
|
|
||||||
self.values
|
|
||||||
.get_mut(len - 1 - depth)
|
|
||||||
.ok_or_else(|| Error("non-empty stack expected".into()))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get(&self, index: usize) -> Result<&T, Error> {
|
pub fn get(&self, index: usize) -> Result<&T, Error> {
|
||||||
if index >= self.values.len() {
|
if index >= self.values.len() {
|
||||||
return Err(Error(format!("trying to get value at position {} on stack of size {}", index, self.values.len())));
|
return Err(Error(format!("trying to get value at position {} on stack of size {}", index, self.values.len())));
|
||||||
|
|
|
@ -6,6 +6,7 @@ use std::iter::repeat;
|
||||||
use parity_wasm::elements::Local;
|
use parity_wasm::elements::Local;
|
||||||
use {Error, Trap, TrapKind, Signature};
|
use {Error, Trap, TrapKind, Signature};
|
||||||
use module::ModuleRef;
|
use module::ModuleRef;
|
||||||
|
use memory::MemoryRef;
|
||||||
use func::{FuncRef, FuncInstance, FuncInstanceInternal};
|
use func::{FuncRef, FuncInstance, FuncInstanceInternal};
|
||||||
use value::{
|
use value::{
|
||||||
RuntimeValue, FromRuntimeValue, WrapInto, TryTruncateInto, ExtendInto,
|
RuntimeValue, FromRuntimeValue, WrapInto, TryTruncateInto, ExtendInto,
|
||||||
|
@ -13,7 +14,6 @@ use value::{
|
||||||
};
|
};
|
||||||
use host::Externals;
|
use host::Externals;
|
||||||
use common::{DEFAULT_MEMORY_INDEX, DEFAULT_TABLE_INDEX};
|
use common::{DEFAULT_MEMORY_INDEX, DEFAULT_TABLE_INDEX};
|
||||||
use common::stack::StackWithLimit;
|
|
||||||
use memory_units::Pages;
|
use memory_units::Pages;
|
||||||
use nan_preserving_float::{F32, F64};
|
use nan_preserving_float::{F32, F64};
|
||||||
use isa;
|
use isa;
|
||||||
|
@ -123,7 +123,7 @@ impl<'a, E: Externals> Interpreter<'a, E> {
|
||||||
|
|
||||||
match *nested_func.as_internal() {
|
match *nested_func.as_internal() {
|
||||||
FuncInstanceInternal::Internal { .. } => {
|
FuncInstanceInternal::Internal { .. } => {
|
||||||
let nested_context = function_context.nested(nested_func.clone()).map_err(Trap::new)?;
|
let nested_context = FunctionContext::new(nested_func.clone());
|
||||||
call_stack.push(function_context);
|
call_stack.push(function_context);
|
||||||
call_stack.push(nested_context);
|
call_stack.push(nested_context);
|
||||||
},
|
},
|
||||||
|
@ -534,8 +534,8 @@ impl<'a, E: Externals> Interpreter<'a, E> {
|
||||||
offset,
|
offset,
|
||||||
raw_address,
|
raw_address,
|
||||||
)?;
|
)?;
|
||||||
let m = context.module()
|
let m = context
|
||||||
.memory_by_index(DEFAULT_MEMORY_INDEX)
|
.memory()
|
||||||
.expect("Due to validation memory should exists");
|
.expect("Due to validation memory should exists");
|
||||||
let b = m.get(address, mem::size_of::<T>())
|
let b = m.get(address, mem::size_of::<T>())
|
||||||
.map_err(|_| TrapKind::MemoryAccessOutOfBounds)?;
|
.map_err(|_| TrapKind::MemoryAccessOutOfBounds)?;
|
||||||
|
@ -555,8 +555,8 @@ impl<'a, E: Externals> Interpreter<'a, E> {
|
||||||
offset,
|
offset,
|
||||||
raw_address,
|
raw_address,
|
||||||
)?;
|
)?;
|
||||||
let m = context.module()
|
let m = context
|
||||||
.memory_by_index(DEFAULT_MEMORY_INDEX)
|
.memory()
|
||||||
.expect("Due to validation memory should exists");
|
.expect("Due to validation memory should exists");
|
||||||
let b = m.get(address, mem::size_of::<T>())
|
let b = m.get(address, mem::size_of::<T>())
|
||||||
.map_err(|_| TrapKind::MemoryAccessOutOfBounds)?;
|
.map_err(|_| TrapKind::MemoryAccessOutOfBounds)?;
|
||||||
|
@ -585,8 +585,8 @@ impl<'a, E: Externals> Interpreter<'a, E> {
|
||||||
raw_address,
|
raw_address,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let m = context.module()
|
let m = context
|
||||||
.memory_by_index(DEFAULT_MEMORY_INDEX)
|
.memory()
|
||||||
.expect("Due to validation memory should exists");
|
.expect("Due to validation memory should exists");
|
||||||
m.set(address, &stack_value)
|
m.set(address, &stack_value)
|
||||||
.map_err(|_| TrapKind::MemoryAccessOutOfBounds)?;
|
.map_err(|_| TrapKind::MemoryAccessOutOfBounds)?;
|
||||||
|
@ -617,8 +617,8 @@ impl<'a, E: Externals> Interpreter<'a, E> {
|
||||||
offset,
|
offset,
|
||||||
raw_address,
|
raw_address,
|
||||||
)?;
|
)?;
|
||||||
let m = context.module()
|
let m = context
|
||||||
.memory_by_index(DEFAULT_MEMORY_INDEX)
|
.memory()
|
||||||
.expect("Due to validation memory should exists");
|
.expect("Due to validation memory should exists");
|
||||||
m.set(address, &stack_value)
|
m.set(address, &stack_value)
|
||||||
.map_err(|_| TrapKind::MemoryAccessOutOfBounds)?;
|
.map_err(|_| TrapKind::MemoryAccessOutOfBounds)?;
|
||||||
|
@ -626,8 +626,8 @@ impl<'a, E: Externals> Interpreter<'a, E> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_current_memory(&mut self, context: &mut FunctionContext) -> Result<InstructionOutcome, TrapKind> {
|
fn run_current_memory(&mut self, context: &mut FunctionContext) -> Result<InstructionOutcome, TrapKind> {
|
||||||
let m = context.module()
|
let m = context
|
||||||
.memory_by_index(DEFAULT_MEMORY_INDEX)
|
.memory()
|
||||||
.expect("Due to validation memory should exists");
|
.expect("Due to validation memory should exists");
|
||||||
let s = m.current_size().0;
|
let s = m.current_size().0;
|
||||||
self
|
self
|
||||||
|
@ -640,8 +640,8 @@ impl<'a, E: Externals> Interpreter<'a, E> {
|
||||||
let pages: u32 = self
|
let pages: u32 = self
|
||||||
.value_stack
|
.value_stack
|
||||||
.pop_as();
|
.pop_as();
|
||||||
let m = context.module()
|
let m = context
|
||||||
.memory_by_index(DEFAULT_MEMORY_INDEX)
|
.memory()
|
||||||
.expect("Due to validation memory should exists");
|
.expect("Due to validation memory should exists");
|
||||||
let m = match m.grow(Pages(pages as usize)) {
|
let m = match m.grow(Pages(pages as usize)) {
|
||||||
Ok(Pages(new_size)) => new_size as u32,
|
Ok(Pages(new_size)) => new_size as u32,
|
||||||
|
@ -1003,6 +1003,7 @@ struct FunctionContext {
|
||||||
/// Internal function reference.
|
/// Internal function reference.
|
||||||
pub function: FuncRef,
|
pub function: FuncRef,
|
||||||
pub module: ModuleRef,
|
pub module: ModuleRef,
|
||||||
|
pub memory: Option<MemoryRef>,
|
||||||
/// Current instruction position.
|
/// Current instruction position.
|
||||||
pub position: usize,
|
pub position: usize,
|
||||||
}
|
}
|
||||||
|
@ -1013,28 +1014,16 @@ impl FunctionContext {
|
||||||
FuncInstanceInternal::Internal { ref module, .. } => module.upgrade().expect("module deallocated"),
|
FuncInstanceInternal::Internal { ref module, .. } => module.upgrade().expect("module deallocated"),
|
||||||
FuncInstanceInternal::Host { .. } => panic!("Host functions can't be called as internally defined functions; Thus FunctionContext can be created only with internally defined functions; qed"),
|
FuncInstanceInternal::Host { .. } => panic!("Host functions can't be called as internally defined functions; Thus FunctionContext can be created only with internally defined functions; qed"),
|
||||||
};
|
};
|
||||||
|
let memory = module.memory_by_index(DEFAULT_MEMORY_INDEX);
|
||||||
FunctionContext {
|
FunctionContext {
|
||||||
is_initialized: false,
|
is_initialized: false,
|
||||||
function: function,
|
function: function,
|
||||||
module: ModuleRef(module),
|
module: ModuleRef(module),
|
||||||
|
memory: memory,
|
||||||
position: 0,
|
position: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn nested(&mut self, function: FuncRef) -> Result<Self, TrapKind> {
|
|
||||||
let module = match *function.as_internal() {
|
|
||||||
FuncInstanceInternal::Internal { ref module, .. } => module.upgrade().expect("module deallocated"),
|
|
||||||
FuncInstanceInternal::Host { .. } => panic!("Host functions can't be called as internally defined functions; Thus FunctionContext can be created only with internally defined functions; qed"),
|
|
||||||
};
|
|
||||||
|
|
||||||
Ok(FunctionContext {
|
|
||||||
is_initialized: false,
|
|
||||||
function: function,
|
|
||||||
module: ModuleRef(module),
|
|
||||||
position: 0,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn is_initialized(&self) -> bool {
|
pub fn is_initialized(&self) -> bool {
|
||||||
self.is_initialized
|
self.is_initialized
|
||||||
}
|
}
|
||||||
|
@ -1061,6 +1050,10 @@ impl FunctionContext {
|
||||||
pub fn module(&self) -> ModuleRef {
|
pub fn module(&self) -> ModuleRef {
|
||||||
self.module.clone()
|
self.module.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn memory(&self) -> Option<&MemoryRef> {
|
||||||
|
self.memory.as_ref()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Debug for FunctionContext {
|
impl fmt::Debug for FunctionContext {
|
||||||
|
|
Loading…
Reference in New Issue