Hide ValueType.
This commit is contained in:
parent
1bf3702440
commit
ca6299ba53
|
@ -2,7 +2,7 @@ use std::rc::Rc;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use parity_wasm::elements::{FunctionType, Local, Opcodes};
|
use parity_wasm::elements::{Local, Opcodes};
|
||||||
use {Error, Signature};
|
use {Error, Signature};
|
||||||
use host::Externals;
|
use host::Externals;
|
||||||
use runner::{prepare_function_args, FunctionContext, Interpreter};
|
use runner::{prepare_function_args, FunctionContext, Interpreter};
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use parity_wasm::elements::ValueType;
|
|
||||||
use value::RuntimeValue;
|
use value::RuntimeValue;
|
||||||
use Error;
|
use Error;
|
||||||
|
use types::ValueType;
|
||||||
|
use parity_wasm::elements::{ValueType as EValueType};
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct GlobalRef(Rc<GlobalInstance>);
|
pub struct GlobalRef(Rc<GlobalInstance>);
|
||||||
|
@ -56,4 +57,8 @@ impl GlobalInstance {
|
||||||
pub fn value_type(&self) -> ValueType {
|
pub fn value_type(&self) -> ValueType {
|
||||||
self.val.get().value_type()
|
self.val.get().value_type()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn elements_value_type(&self) -> EValueType {
|
||||||
|
self.value_type().into_elements()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use parity_wasm::elements::{FunctionType, GlobalType, MemoryType, TableType};
|
use parity_wasm::elements::{GlobalType, MemoryType, TableType};
|
||||||
use global::GlobalRef;
|
use global::GlobalRef;
|
||||||
use memory::MemoryRef;
|
use memory::MemoryRef;
|
||||||
use func::FuncRef;
|
use func::FuncRef;
|
||||||
|
|
|
@ -97,8 +97,6 @@ impl From<::common::stack::Error> for Error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
use types::Signature;
|
|
||||||
|
|
||||||
mod validation;
|
mod validation;
|
||||||
mod common;
|
mod common;
|
||||||
mod memory;
|
mod memory;
|
||||||
|
@ -123,3 +121,4 @@ pub use self::imports::{ModuleImportResolver, ImportResolver, ImportsBuilder};
|
||||||
pub use self::module::{ModuleInstance, ModuleRef, ExternVal, NotStartedModuleRef};
|
pub use self::module::{ModuleInstance, ModuleRef, ExternVal, NotStartedModuleRef};
|
||||||
pub use self::global::{GlobalInstance, GlobalRef};
|
pub use self::global::{GlobalInstance, GlobalRef};
|
||||||
pub use self::func::{FuncInstance, FuncRef};
|
pub use self::func::{FuncInstance, FuncRef};
|
||||||
|
pub use self::types::{Signature, ValueType};
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::cell::RefCell;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use parity_wasm::elements::{External, FunctionType, InitExpr, Internal, Opcode, ResizableLimits, Type};
|
use parity_wasm::elements::{External, InitExpr, Internal, Opcode, ResizableLimits, Type};
|
||||||
use {Error, Signature, MemoryInstance, RuntimeValue, TableInstance};
|
use {Error, Signature, MemoryInstance, RuntimeValue, TableInstance};
|
||||||
use imports::ImportResolver;
|
use imports::ImportResolver;
|
||||||
use global::{GlobalInstance, GlobalRef};
|
use global::{GlobalInstance, GlobalRef};
|
||||||
|
@ -165,7 +165,7 @@ impl ModuleInstance {
|
||||||
let instance = ModuleRef(Rc::new(ModuleInstance::default()));
|
let instance = ModuleRef(Rc::new(ModuleInstance::default()));
|
||||||
|
|
||||||
for &Type::Function(ref ty) in module.type_section().map(|ts| ts.types()).unwrap_or(&[]) {
|
for &Type::Function(ref ty) in module.type_section().map(|ts| ts.types()).unwrap_or(&[]) {
|
||||||
let signature = Rc::new(ty.clone().into());
|
let signature = Rc::new(Signature::from_elements(ty.clone()));
|
||||||
instance.push_signature(signature);
|
instance.push_signature(signature);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ impl ModuleInstance {
|
||||||
instance.push_memory(memory.clone());
|
instance.push_memory(memory.clone());
|
||||||
}
|
}
|
||||||
(&External::Global(ref gl), &ExternVal::Global(ref global)) => {
|
(&External::Global(ref gl), &ExternVal::Global(ref global)) => {
|
||||||
if gl.content_type() != global.value_type() {
|
if gl.content_type() != global.elements_value_type() {
|
||||||
return Err(Error::Instantiation(format!(
|
return Err(Error::Instantiation(format!(
|
||||||
"Expect global with {:?} type, but provided global with {:?} type",
|
"Expect global with {:?} type, but provided global with {:?} type",
|
||||||
gl.content_type(),
|
gl.content_type(),
|
||||||
|
@ -386,7 +386,7 @@ impl ModuleInstance {
|
||||||
let &Type::Function(ref func_type) = types
|
let &Type::Function(ref func_type) = types
|
||||||
.get(fn_ty_idx as usize)
|
.get(fn_ty_idx as usize)
|
||||||
.expect("Due to validation functions should have valid types");
|
.expect("Due to validation functions should have valid types");
|
||||||
let signature = func_type.clone().into();
|
let signature = Signature::from_elements(func_type.clone());
|
||||||
let func = imports.resolve_func(module_name, field_name, &signature)?;
|
let func = imports.resolve_func(module_name, field_name, &signature)?;
|
||||||
ExternVal::Func(func)
|
ExternVal::Func(func)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ use std::{u32, usize};
|
||||||
use std::fmt::{self, Display};
|
use std::fmt::{self, Display};
|
||||||
use std::iter::repeat;
|
use std::iter::repeat;
|
||||||
use std::collections::{HashMap, VecDeque};
|
use std::collections::{HashMap, VecDeque};
|
||||||
use parity_wasm::elements::{Opcode, BlockType, Local, FunctionType};
|
use parity_wasm::elements::{Opcode, BlockType, Local};
|
||||||
use {Error, Signature};
|
use {Error, Signature};
|
||||||
use module::ModuleRef;
|
use module::ModuleRef;
|
||||||
use func::FuncRef;
|
use func::FuncRef;
|
||||||
|
@ -1010,7 +1010,7 @@ impl FunctionContext {
|
||||||
is_initialized: false,
|
is_initialized: false,
|
||||||
function: function,
|
function: function,
|
||||||
module: module,
|
module: module,
|
||||||
return_type: signature.return_type().map(|vt| BlockType::Value(vt)).unwrap_or(BlockType::NoResult),
|
return_type: signature.return_type().map(|vt| BlockType::Value(vt.into_elements())).unwrap_or(BlockType::NoResult),
|
||||||
value_stack: StackWithLimit::with_limit(value_stack_limit),
|
value_stack: StackWithLimit::with_limit(value_stack_limit),
|
||||||
frame_stack: StackWithLimit::with_limit(frame_stack_limit),
|
frame_stack: StackWithLimit::with_limit(frame_stack_limit),
|
||||||
locals: args,
|
locals: args,
|
||||||
|
@ -1025,7 +1025,7 @@ impl FunctionContext {
|
||||||
FuncInstance::Host { .. } => panic!("Host functions can't be called as internally defined functions; Thus FunctionContext can be created only with internally defined functions; qed"),
|
FuncInstance::Host { .. } => panic!("Host functions can't be called as internally defined functions; Thus FunctionContext can be created only with internally defined functions; qed"),
|
||||||
};
|
};
|
||||||
let function_type = function.signature();
|
let function_type = function.signature();
|
||||||
let function_return_type = function_type.return_type().map(|vt| BlockType::Value(vt)).unwrap_or(BlockType::NoResult);
|
let function_return_type = function_type.return_type().map(|vt| BlockType::Value(vt.into_elements())).unwrap_or(BlockType::NoResult);
|
||||||
let function_locals = prepare_function_args(&function_type, &mut self.value_stack)?;
|
let function_locals = prepare_function_args(&function_type, &mut self.value_stack)?;
|
||||||
(function_locals, module, function_return_type)
|
(function_locals, module, function_return_type)
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
|
|
||||||
use parity_wasm::elements::{deserialize_buffer, FunctionType, MemoryType, TableType, ValueType};
|
use parity_wasm::elements::{deserialize_buffer, MemoryType, TableType};
|
||||||
use validation::{validate_module, ValidatedModule};
|
use validation::{validate_module, ValidatedModule};
|
||||||
use {
|
use {
|
||||||
Error, Signature, Externals, FuncInstance, FuncRef, HostError, ImportsBuilder,
|
Error, Signature, Externals, FuncInstance, FuncRef, HostError, ImportsBuilder,
|
||||||
MemoryInstance, MemoryRef, TableInstance, TableRef, ModuleImportResolver, ModuleInstance, ModuleRef,
|
MemoryInstance, MemoryRef, TableInstance, TableRef, ModuleImportResolver, ModuleInstance, ModuleRef,
|
||||||
RuntimeValue, TryInto,
|
RuntimeValue, TryInto,
|
||||||
};
|
};
|
||||||
|
use types::ValueType;
|
||||||
use wabt::wat2wasm;
|
use wabt::wat2wasm;
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use parity_wasm::elements::deserialize_file;
|
use parity_wasm::elements::deserialize_file;
|
||||||
use parity_wasm::elements::{FunctionType, GlobalType, MemoryType, Module, TableType};
|
use parity_wasm::elements::{GlobalType, MemoryType, Module, TableType};
|
||||||
use {Error, Signature, FuncRef, GlobalInstance, GlobalRef, ImportsBuilder, MemoryInstance,
|
use {Error, Signature, FuncRef, GlobalInstance, GlobalRef, ImportsBuilder, MemoryInstance,
|
||||||
MemoryRef, ModuleImportResolver, ModuleInstance, NopExternals, RuntimeValue,
|
MemoryRef, ModuleImportResolver, ModuleInstance, NopExternals, RuntimeValue,
|
||||||
TableInstance, TableRef};
|
TableInstance, TableRef};
|
||||||
|
|
47
src/types.rs
47
src/types.rs
|
@ -1,28 +1,59 @@
|
||||||
use parity_wasm::elements::{FunctionType, ValueType};
|
use parity_wasm::elements::{FunctionType, ValueType as EValueType};
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub struct Signature {
|
pub struct Signature {
|
||||||
func_type: FunctionType,
|
params: Vec<ValueType>,
|
||||||
|
return_type: Option<ValueType>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Signature {
|
impl Signature {
|
||||||
pub fn new(params: &[ValueType], return_type: Option<ValueType>) -> Signature {
|
pub fn new(params: &[ValueType], return_type: Option<ValueType>) -> Signature {
|
||||||
Signature {
|
Signature {
|
||||||
func_type: FunctionType::new(params.to_vec(), return_type),
|
params: params.to_vec(),
|
||||||
|
return_type: return_type,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn params(&self) -> &[ValueType] {
|
pub fn params(&self) -> &[ValueType] {
|
||||||
self.func_type.params()
|
&self.params
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn return_type(&self) -> Option<ValueType> {
|
pub fn return_type(&self) -> Option<ValueType> {
|
||||||
self.func_type.return_type()
|
self.return_type
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn from_elements(func_type: FunctionType) -> Signature {
|
||||||
|
Signature {
|
||||||
|
params: func_type.params().iter().cloned().map(ValueType::from_elements).collect(),
|
||||||
|
return_type: func_type.return_type().map(ValueType::from_elements),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<FunctionType> for Signature {
|
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||||
fn from(func_type: FunctionType) -> Signature {
|
pub enum ValueType {
|
||||||
Signature { func_type }
|
I32,
|
||||||
|
I64,
|
||||||
|
F32,
|
||||||
|
F64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ValueType {
|
||||||
|
pub(crate) fn from_elements(value_type: EValueType) -> ValueType {
|
||||||
|
match value_type {
|
||||||
|
EValueType::I32 => ValueType::I32,
|
||||||
|
EValueType::I64 => ValueType::I64,
|
||||||
|
EValueType::F32 => ValueType::F32,
|
||||||
|
EValueType::F64 => ValueType::F64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn into_elements(self) -> EValueType {
|
||||||
|
match self {
|
||||||
|
ValueType::I32 => EValueType::I32,
|
||||||
|
ValueType::I64 => EValueType::I64,
|
||||||
|
ValueType::F32 => EValueType::F32,
|
||||||
|
ValueType::F64 => EValueType::F64,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
10
src/value.rs
10
src/value.rs
|
@ -130,12 +130,12 @@ impl RuntimeValue {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get variable type for this value.
|
/// Get variable type for this value.
|
||||||
pub fn value_type(&self) -> ValueType {
|
pub fn value_type(&self) -> ::types::ValueType {
|
||||||
match *self {
|
match *self {
|
||||||
RuntimeValue::I32(_) => ValueType::I32,
|
RuntimeValue::I32(_) => ::types::ValueType::I32,
|
||||||
RuntimeValue::I64(_) => ValueType::I64,
|
RuntimeValue::I64(_) => ::types::ValueType::I64,
|
||||||
RuntimeValue::F32(_) => ValueType::F32,
|
RuntimeValue::F32(_) => ::types::ValueType::F32,
|
||||||
RuntimeValue::F64(_) => ValueType::F64,
|
RuntimeValue::F64(_) => ::types::ValueType::F64,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue