mirror of
https://github.com/fluencelabs/parity-wasm
synced 2025-06-24 12:12:05 +00:00
fixed shr && shl in dev configuration
This commit is contained in:
@ -344,7 +344,7 @@ impl ModuleInstanceInterface for ModuleInstance {
|
|||||||
&function_type);
|
&function_type);
|
||||||
|
|
||||||
let block_type = function_type.return_type().map(BlockType::Value).unwrap_or(BlockType::NoResult);
|
let block_type = function_type.return_type().map(BlockType::Value).unwrap_or(BlockType::NoResult);
|
||||||
Validator::validate_function(&mut context, block_type, function_body.code().elements())?;
|
Validator::validate_function(&mut context, block_type, function_body.code().elements())
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
if let Error::Validation(msg) = e {
|
if let Error::Validation(msg) = e {
|
||||||
Error::Validation(format!("Function #{} validation error: {}", index, msg))
|
Error::Validation(format!("Function #{} validation error: {}", index, msg))
|
||||||
|
@ -333,9 +333,9 @@ impl Interpreter {
|
|||||||
&Opcode::I32And => Interpreter::run_and::<i32>(context),
|
&Opcode::I32And => Interpreter::run_and::<i32>(context),
|
||||||
&Opcode::I32Or => Interpreter::run_or::<i32>(context),
|
&Opcode::I32Or => Interpreter::run_or::<i32>(context),
|
||||||
&Opcode::I32Xor => Interpreter::run_xor::<i32>(context),
|
&Opcode::I32Xor => Interpreter::run_xor::<i32>(context),
|
||||||
&Opcode::I32Shl => Interpreter::run_shl::<i32>(context),
|
&Opcode::I32Shl => Interpreter::run_shl::<i32>(context, 0x1F),
|
||||||
&Opcode::I32ShrS => Interpreter::run_shr::<i32, i32>(context),
|
&Opcode::I32ShrS => Interpreter::run_shr::<i32, i32>(context, 0x1F),
|
||||||
&Opcode::I32ShrU => Interpreter::run_shr::<i32, u32>(context),
|
&Opcode::I32ShrU => Interpreter::run_shr::<i32, u32>(context, 0x1F),
|
||||||
&Opcode::I32Rotl => Interpreter::run_rotl::<i32>(context),
|
&Opcode::I32Rotl => Interpreter::run_rotl::<i32>(context),
|
||||||
&Opcode::I32Rotr => Interpreter::run_rotr::<i32>(context),
|
&Opcode::I32Rotr => Interpreter::run_rotr::<i32>(context),
|
||||||
|
|
||||||
@ -352,9 +352,9 @@ impl Interpreter {
|
|||||||
&Opcode::I64And => Interpreter::run_and::<i64>(context),
|
&Opcode::I64And => Interpreter::run_and::<i64>(context),
|
||||||
&Opcode::I64Or => Interpreter::run_or::<i64>(context),
|
&Opcode::I64Or => Interpreter::run_or::<i64>(context),
|
||||||
&Opcode::I64Xor => Interpreter::run_xor::<i64>(context),
|
&Opcode::I64Xor => Interpreter::run_xor::<i64>(context),
|
||||||
&Opcode::I64Shl => Interpreter::run_shl::<i64>(context),
|
&Opcode::I64Shl => Interpreter::run_shl::<i64>(context, 0x3F),
|
||||||
&Opcode::I64ShrS => Interpreter::run_shr::<i64, i64>(context),
|
&Opcode::I64ShrS => Interpreter::run_shr::<i64, i64>(context, 0x3F),
|
||||||
&Opcode::I64ShrU => Interpreter::run_shr::<i64, u64>(context),
|
&Opcode::I64ShrU => Interpreter::run_shr::<i64, u64>(context, 0x3F),
|
||||||
&Opcode::I64Rotl => Interpreter::run_rotl::<i64>(context),
|
&Opcode::I64Rotl => Interpreter::run_rotl::<i64>(context),
|
||||||
&Opcode::I64Rotr => Interpreter::run_rotr::<i64>(context),
|
&Opcode::I64Rotr => Interpreter::run_rotr::<i64>(context),
|
||||||
|
|
||||||
@ -829,23 +829,23 @@ impl Interpreter {
|
|||||||
.map(|_| InstructionOutcome::RunNextInstruction)
|
.map(|_| InstructionOutcome::RunNextInstruction)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_shl<'a, T>(context: &mut FunctionContext) -> Result<InstructionOutcome<'a>, Error>
|
fn run_shl<'a, T>(context: &mut FunctionContext, mask: T) -> Result<InstructionOutcome<'a>, Error>
|
||||||
where RuntimeValue: From<<T as ops::Shl<T>>::Output> + TryInto<T, Error>, T: ops::Shl<T> {
|
where RuntimeValue: From<<T as ops::Shl<T>>::Output> + TryInto<T, Error>, T: ops::Shl<T> + ops::BitAnd<T, Output=T> {
|
||||||
context
|
context
|
||||||
.value_stack_mut()
|
.value_stack_mut()
|
||||||
.pop_pair_as::<T>()
|
.pop_pair_as::<T>()
|
||||||
.map(|(left, right)| left.shl(right))
|
.map(|(left, right)| left.shl(right & mask))
|
||||||
.map(|v| context.value_stack_mut().push(v.into()))
|
.map(|v| context.value_stack_mut().push(v.into()))
|
||||||
.map(|_| InstructionOutcome::RunNextInstruction)
|
.map(|_| InstructionOutcome::RunNextInstruction)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_shr<'a, T, U>(context: &mut FunctionContext) -> Result<InstructionOutcome<'a>, Error>
|
fn run_shr<'a, T, U>(context: &mut FunctionContext, mask: U) -> Result<InstructionOutcome<'a>, Error>
|
||||||
where RuntimeValue: From<T> + TryInto<T, Error>, T: TransmuteInto<U>, U: ops::Shr<U>, <U as ops::Shr<U>>::Output: TransmuteInto<T> {
|
where RuntimeValue: From<T> + TryInto<T, Error>, T: TransmuteInto<U>, U: ops::Shr<U> + ops::BitAnd<U, Output=U>, <U as ops::Shr<U>>::Output: TransmuteInto<T> {
|
||||||
context
|
context
|
||||||
.value_stack_mut()
|
.value_stack_mut()
|
||||||
.pop_pair_as::<T>()
|
.pop_pair_as::<T>()
|
||||||
.map(|(left, right)| (left.transmute_into(), right.transmute_into()))
|
.map(|(left, right)| (left.transmute_into(), right.transmute_into()))
|
||||||
.map(|(left, right)| left.shr(right))
|
.map(|(left, right)| left.shr(right & mask))
|
||||||
.map(|v| v.transmute_into())
|
.map(|v| v.transmute_into())
|
||||||
.map(|v| context.value_stack_mut().push(v.into()))
|
.map(|v| context.value_stack_mut().push(v.into()))
|
||||||
.map(|_| InstructionOutcome::RunNextInstruction)
|
.map(|_| InstructionOutcome::RunNextInstruction)
|
||||||
|
@ -235,7 +235,7 @@ fn if_else_with_return_type_validation() {
|
|||||||
let imports = ModuleImports::new(Weak::default(), None);
|
let imports = ModuleImports::new(Weak::default(), None);
|
||||||
let mut context = FunctionValidationContext::new(&module, &imports, &[], 1024, 1024, &FunctionType::default());
|
let mut context = FunctionValidationContext::new(&module, &imports, &[], 1024, 1024, &FunctionType::default());
|
||||||
|
|
||||||
Validator::validate_block(&mut context, false, BlockType::NoResult, &[
|
Validator::validate_function(&mut context, BlockType::NoResult, &[
|
||||||
Opcode::I32Const(1),
|
Opcode::I32Const(1),
|
||||||
Opcode::If(BlockType::NoResult, Opcodes::new(vec![
|
Opcode::If(BlockType::NoResult, Opcodes::new(vec![
|
||||||
Opcode::I32Const(1),
|
Opcode::I32Const(1),
|
||||||
@ -249,5 +249,5 @@ fn if_else_with_return_type_validation() {
|
|||||||
Opcode::End,
|
Opcode::End,
|
||||||
])),
|
])),
|
||||||
Opcode::End,
|
Opcode::End,
|
||||||
], Opcode::End).unwrap();
|
]).unwrap();
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,12 @@
|
|||||||
///! Tests from https://github.com/WebAssembly/wabt/tree/8e1f6031e9889ba770c7be4a9b084da5f14456a0/test/interp
|
///! Tests from https://github.com/WebAssembly/wabt/tree/8e1f6031e9889ba770c7be4a9b084da5f14456a0/test/interp
|
||||||
|
|
||||||
use std::sync::{Arc, Weak};
|
use std::sync::Arc;
|
||||||
use std::collections::HashMap;
|
|
||||||
use builder::module;
|
use builder::module;
|
||||||
use elements::{Module, ValueType, Opcodes, Opcode, BlockType, FunctionType, Local};
|
use elements::{ValueType, Opcodes, Opcode, BlockType, Local};
|
||||||
use interpreter::Error;
|
use interpreter::Error;
|
||||||
use interpreter::module::{ModuleInstance, ModuleInstanceInterface, ItemIndex};
|
use interpreter::module::{ModuleInstanceInterface, ItemIndex};
|
||||||
use interpreter::program::ProgramInstance;
|
use interpreter::program::ProgramInstance;
|
||||||
use interpreter::runner::{Interpreter, FunctionContext};
|
|
||||||
use interpreter::value::{RuntimeValue, TryInto};
|
use interpreter::value::{RuntimeValue, TryInto};
|
||||||
use interpreter::variable::{VariableInstance, VariableType};
|
|
||||||
|
|
||||||
fn make_function_i32(body: Opcodes) -> (ProgramInstance, Arc<ModuleInstanceInterface>) {
|
fn make_function_i32(body: Opcodes) -> (ProgramInstance, Arc<ModuleInstanceInterface>) {
|
||||||
let module = module()
|
let module = module()
|
||||||
|
Reference in New Issue
Block a user