fixed shr && shl in dev configuration

This commit is contained in:
Svyatoslav Nikolsky
2017-06-19 13:55:53 +03:00
parent 6befd68098
commit 9949706e7c
4 changed files with 18 additions and 21 deletions

View File

@ -344,7 +344,7 @@ impl ModuleInstanceInterface for ModuleInstance {
&function_type);
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| {
if let Error::Validation(msg) = e {
Error::Validation(format!("Function #{} validation error: {}", index, msg))

View File

@ -333,9 +333,9 @@ impl Interpreter {
&Opcode::I32And => Interpreter::run_and::<i32>(context),
&Opcode::I32Or => Interpreter::run_or::<i32>(context),
&Opcode::I32Xor => Interpreter::run_xor::<i32>(context),
&Opcode::I32Shl => Interpreter::run_shl::<i32>(context),
&Opcode::I32ShrS => Interpreter::run_shr::<i32, i32>(context),
&Opcode::I32ShrU => Interpreter::run_shr::<i32, u32>(context),
&Opcode::I32Shl => Interpreter::run_shl::<i32>(context, 0x1F),
&Opcode::I32ShrS => Interpreter::run_shr::<i32, i32>(context, 0x1F),
&Opcode::I32ShrU => Interpreter::run_shr::<i32, u32>(context, 0x1F),
&Opcode::I32Rotl => Interpreter::run_rotl::<i32>(context),
&Opcode::I32Rotr => Interpreter::run_rotr::<i32>(context),
@ -352,9 +352,9 @@ impl Interpreter {
&Opcode::I64And => Interpreter::run_and::<i64>(context),
&Opcode::I64Or => Interpreter::run_or::<i64>(context),
&Opcode::I64Xor => Interpreter::run_xor::<i64>(context),
&Opcode::I64Shl => Interpreter::run_shl::<i64>(context),
&Opcode::I64ShrS => Interpreter::run_shr::<i64, i64>(context),
&Opcode::I64ShrU => Interpreter::run_shr::<i64, u64>(context),
&Opcode::I64Shl => Interpreter::run_shl::<i64>(context, 0x3F),
&Opcode::I64ShrS => Interpreter::run_shr::<i64, i64>(context, 0x3F),
&Opcode::I64ShrU => Interpreter::run_shr::<i64, u64>(context, 0x3F),
&Opcode::I64Rotl => Interpreter::run_rotl::<i64>(context),
&Opcode::I64Rotr => Interpreter::run_rotr::<i64>(context),
@ -829,23 +829,23 @@ impl Interpreter {
.map(|_| InstructionOutcome::RunNextInstruction)
}
fn run_shl<'a, T>(context: &mut FunctionContext) -> Result<InstructionOutcome<'a>, Error>
where RuntimeValue: From<<T as ops::Shl<T>>::Output> + TryInto<T, Error>, T: ops::Shl<T> {
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> + ops::BitAnd<T, Output=T> {
context
.value_stack_mut()
.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(|_| InstructionOutcome::RunNextInstruction)
}
fn run_shr<'a, T, U>(context: &mut FunctionContext) -> 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> {
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> + ops::BitAnd<U, Output=U>, <U as ops::Shr<U>>::Output: TransmuteInto<T> {
context
.value_stack_mut()
.pop_pair_as::<T>()
.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| context.value_stack_mut().push(v.into()))
.map(|_| InstructionOutcome::RunNextInstruction)

View File

@ -235,7 +235,7 @@ fn if_else_with_return_type_validation() {
let imports = ModuleImports::new(Weak::default(), None);
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::If(BlockType::NoResult, Opcodes::new(vec![
Opcode::I32Const(1),
@ -249,5 +249,5 @@ fn if_else_with_return_type_validation() {
Opcode::End,
])),
Opcode::End,
], Opcode::End).unwrap();
]).unwrap();
}

View File

@ -1,15 +1,12 @@
///! Tests from https://github.com/WebAssembly/wabt/tree/8e1f6031e9889ba770c7be4a9b084da5f14456a0/test/interp
use std::sync::{Arc, Weak};
use std::collections::HashMap;
use std::sync::Arc;
use builder::module;
use elements::{Module, ValueType, Opcodes, Opcode, BlockType, FunctionType, Local};
use elements::{ValueType, Opcodes, Opcode, BlockType, Local};
use interpreter::Error;
use interpreter::module::{ModuleInstance, ModuleInstanceInterface, ItemIndex};
use interpreter::module::{ModuleInstanceInterface, ItemIndex};
use interpreter::program::ProgramInstance;
use interpreter::runner::{Interpreter, FunctionContext};
use interpreter::value::{RuntimeValue, TryInto};
use interpreter::variable::{VariableInstance, VariableType};
fn make_function_i32(body: Opcodes) -> (ProgramInstance, Arc<ModuleInstanceInterface>) {
let module = module()