call_indirect traps.
This commit is contained in:
parent
19c56c42b6
commit
4765aecf78
|
@ -110,6 +110,9 @@ use std::collections::HashMap;
|
||||||
pub enum Trap {
|
pub enum Trap {
|
||||||
Unreachable,
|
Unreachable,
|
||||||
MemoryAccessOutOfBounds,
|
MemoryAccessOutOfBounds,
|
||||||
|
TableAccessOutOfBounds,
|
||||||
|
ElemUninitialized,
|
||||||
|
ElemSignatureMismatch,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Internal interpreter error.
|
/// Internal interpreter error.
|
||||||
|
|
|
@ -438,7 +438,9 @@ impl<'a, E: Externals> Interpreter<'a, E> {
|
||||||
.module()
|
.module()
|
||||||
.table_by_index(DEFAULT_TABLE_INDEX)
|
.table_by_index(DEFAULT_TABLE_INDEX)
|
||||||
.expect("Due to validation table should exists");
|
.expect("Due to validation table should exists");
|
||||||
let func_ref = table.get(table_func_idx)?;
|
let func_ref = table.get(table_func_idx)
|
||||||
|
.map_err(|_| Error::Trap(Trap::TableAccessOutOfBounds))?
|
||||||
|
.ok_or_else(|| Error::Trap(Trap::ElemUninitialized))?;
|
||||||
|
|
||||||
{
|
{
|
||||||
let actual_function_type = func_ref.signature();
|
let actual_function_type = func_ref.signature();
|
||||||
|
@ -448,13 +450,7 @@ impl<'a, E: Externals> Interpreter<'a, E> {
|
||||||
.expect("Due to validation type should exists");
|
.expect("Due to validation type should exists");
|
||||||
|
|
||||||
if &*required_function_type != actual_function_type {
|
if &*required_function_type != actual_function_type {
|
||||||
return Err(Error::Function(format!(
|
return Err(Error::Trap(Trap::ElemSignatureMismatch));
|
||||||
"expected function with signature ({:?}) -> {:?} when got with ({:?}) -> {:?}",
|
|
||||||
required_function_type.params(),
|
|
||||||
required_function_type.return_type(),
|
|
||||||
actual_function_type.params(),
|
|
||||||
actual_function_type.return_type()
|
|
||||||
)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -107,7 +107,7 @@ impl TableInstance {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the specific value in the table
|
/// Get the specific value in the table
|
||||||
pub fn get(&self, offset: u32) -> Result<FuncRef, Error> {
|
pub fn get(&self, offset: u32) -> Result<Option<FuncRef>, Error> {
|
||||||
let buffer = self.buffer.borrow();
|
let buffer = self.buffer.borrow();
|
||||||
let buffer_len = buffer.len();
|
let buffer_len = buffer.len();
|
||||||
let table_elem = buffer.get(offset as usize).cloned().ok_or_else(||
|
let table_elem = buffer.get(offset as usize).cloned().ok_or_else(||
|
||||||
|
@ -117,10 +117,7 @@ impl TableInstance {
|
||||||
buffer_len
|
buffer_len
|
||||||
)),
|
)),
|
||||||
)?;
|
)?;
|
||||||
Ok(table_elem.ok_or_else(|| Error::Table(format!(
|
Ok(table_elem)
|
||||||
"trying to read uninitialized element on index {}",
|
|
||||||
offset
|
|
||||||
)))?)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the table element to the specified function.
|
/// Set the table element to the specified function.
|
||||||
|
|
Loading…
Reference in New Issue