mirror of
https://github.com/fluencelabs/parity-wasm
synced 2025-04-25 15:22:17 +00:00
tests and bug fixed for i64store interpretation
This commit is contained in:
parent
fa86543fbb
commit
3fb35f29b2
BIN
res/cases/v1/offset.wasm
Normal file
BIN
res/cases/v1/offset.wasm
Normal file
Binary file not shown.
11
res/cases/v1/offset.wast
Normal file
11
res/cases/v1/offset.wast
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
(module
|
||||||
|
(import "env" "memory" (memory (;0;) 256 256))
|
||||||
|
(type (;0;) (func (result i32)))
|
||||||
|
(func (;0;) (type 0) (result i32)
|
||||||
|
(local i32)
|
||||||
|
get_local 0
|
||||||
|
i64.const 72340172838076673
|
||||||
|
i64.store offset=32 align=1
|
||||||
|
i32.const 1
|
||||||
|
)
|
||||||
|
)
|
@ -276,4 +276,15 @@ mod integration_tests {
|
|||||||
assert_eq!(I32Const(-16384), func.code().elements()[10]);
|
assert_eq!(I32Const(-16384), func.code().elements()[10]);
|
||||||
assert_eq!(I32Const(-32768), func.code().elements()[11]);
|
assert_eq!(I32Const(-32768), func.code().elements()[11]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn store() {
|
||||||
|
use super::super::Opcode::*;
|
||||||
|
|
||||||
|
let module = deserialize_file("./res/cases/v1/offset.wasm").expect("Should be deserialized");
|
||||||
|
let func = &module.code_section().expect("Code section to exist").bodies()[0];
|
||||||
|
|
||||||
|
assert_eq!(func.code().elements().len(), 5);
|
||||||
|
assert_eq!(I64Store(0, 32), func.code().elements()[2]);
|
||||||
|
}
|
||||||
}
|
}
|
@ -67,6 +67,7 @@ impl MemoryInstance {
|
|||||||
|
|
||||||
let mut mut_buffer = buffer.as_mut_slice();
|
let mut mut_buffer = buffer.as_mut_slice();
|
||||||
mut_buffer[begin..end].copy_from_slice(value);
|
mut_buffer[begin..end].copy_from_slice(value);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -395,7 +395,7 @@ impl Interpreter {
|
|||||||
.map(|_| InstructionOutcome::RunNextInstruction)
|
.map(|_| InstructionOutcome::RunNextInstruction)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_load<T>(context: &mut FunctionContext, offset: u32, _align: u32) -> Result<InstructionOutcome, Error>
|
fn run_load<T>(context: &mut FunctionContext, _align: u32, offset: u32) -> Result<InstructionOutcome, Error>
|
||||||
where RuntimeValue: From<T>, T: LittleEndianConvert {
|
where RuntimeValue: From<T>, T: LittleEndianConvert {
|
||||||
let address = effective_address(offset, context.value_stack_mut().pop_as()?)?;
|
let address = effective_address(offset, context.value_stack_mut().pop_as()?)?;
|
||||||
context.module()
|
context.module()
|
||||||
@ -406,7 +406,7 @@ impl Interpreter {
|
|||||||
.map(|_| InstructionOutcome::RunNextInstruction)
|
.map(|_| InstructionOutcome::RunNextInstruction)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_load_extend<T, U>(context: &mut FunctionContext, offset: u32, _align: u32) -> Result<InstructionOutcome, Error>
|
fn run_load_extend<T, U>(context: &mut FunctionContext, _align: u32, offset: u32) -> Result<InstructionOutcome, Error>
|
||||||
where T: ExtendInto<U>, RuntimeValue: From<U>, T: LittleEndianConvert {
|
where T: ExtendInto<U>, RuntimeValue: From<U>, T: LittleEndianConvert {
|
||||||
let address = effective_address(offset, context.value_stack_mut().pop_as()?)?;
|
let address = effective_address(offset, context.value_stack_mut().pop_as()?)?;
|
||||||
let stack_value: U = context.module()
|
let stack_value: U = context.module()
|
||||||
@ -420,7 +420,7 @@ impl Interpreter {
|
|||||||
.map(|_| InstructionOutcome::RunNextInstruction)
|
.map(|_| InstructionOutcome::RunNextInstruction)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_store<T>(context: &mut FunctionContext, offset: u32, _align: u32) -> Result<InstructionOutcome, Error>
|
fn run_store<T>(context: &mut FunctionContext, _align: u32, offset: u32, ) -> Result<InstructionOutcome, Error>
|
||||||
where RuntimeValue: TryInto<T, Error>, T: LittleEndianConvert {
|
where RuntimeValue: TryInto<T, Error>, T: LittleEndianConvert {
|
||||||
let stack_value = context
|
let stack_value = context
|
||||||
.value_stack_mut()
|
.value_stack_mut()
|
||||||
@ -433,7 +433,7 @@ impl Interpreter {
|
|||||||
.map(|_| InstructionOutcome::RunNextInstruction)
|
.map(|_| InstructionOutcome::RunNextInstruction)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_store_wrap<T, U>(context: &mut FunctionContext, offset: u32, _align: u32) -> Result<InstructionOutcome, Error>
|
fn run_store_wrap<T, U>(context: &mut FunctionContext, _align: u32, offset: u32) -> Result<InstructionOutcome, Error>
|
||||||
where RuntimeValue: TryInto<T, Error>, T: WrapInto<U>, U: LittleEndianConvert {
|
where RuntimeValue: TryInto<T, Error>, T: WrapInto<U>, U: LittleEndianConvert {
|
||||||
let stack_value: T = context.value_stack_mut().pop().and_then(|v| v.try_into())?;
|
let stack_value: T = context.value_stack_mut().pop().and_then(|v| v.try_into())?;
|
||||||
let stack_value = stack_value.wrap_into().into_little_endian();
|
let stack_value = stack_value.wrap_into().into_little_endian();
|
||||||
|
@ -508,7 +508,7 @@ fn return_void() {
|
|||||||
])),
|
])),
|
||||||
Opcode::I32Const(0),
|
Opcode::I32Const(0),
|
||||||
Opcode::I32Const(1),
|
Opcode::I32Const(1),
|
||||||
Opcode::I32Store(0, 2),
|
Opcode::I32Store(2, 0),
|
||||||
Opcode::End,
|
Opcode::End,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user