Bunch of other tests.

This commit is contained in:
Sergey Pepyakin 2018-06-13 17:42:56 +03:00
parent a9bf01a60f
commit bd3d8fc762
2 changed files with 111 additions and 14 deletions

View File

@ -168,16 +168,13 @@ impl Validator {
} }
fn validate_instruction(context: &mut FunctionValidationContext, opcode: &Opcode) -> Result<InstructionOutcome, Error> { fn validate_instruction(context: &mut FunctionValidationContext, opcode: &Opcode) -> Result<InstructionOutcome, Error> {
// TODO: use InstructionOutcome::*;
println!("opcode={:?}", opcode);
use self::Opcode::*; use self::Opcode::*;
match *opcode { match *opcode {
// Nop instruction doesn't do anything. It is safe to just skip it. // Nop instruction doesn't do anything. It is safe to just skip it.
Nop => {}, Nop => {},
Unreachable => { Unreachable => {
context.sink.emit(isa::Instruction::Unreachable);
return Ok(InstructionOutcome::Unreachable); return Ok(InstructionOutcome::Unreachable);
}, },
@ -324,6 +321,8 @@ impl Validator {
Validator::validate_br_if(context, depth)?; Validator::validate_br_if(context, depth)?;
}, },
BrTable(ref table, default) => { BrTable(ref table, default) => {
Validator::validate_br_table(context, table, default)?;
let mut targets = Vec::new(); let mut targets = Vec::new();
for depth in table.iter() { for depth in table.iter() {
let target = context.require_target(*depth)?; let target = context.require_target(*depth)?;
@ -332,8 +331,6 @@ impl Validator {
let default_target = context.require_target(default)?; let default_target = context.require_target(default)?;
context.sink.emit_br_table(&targets, default_target); context.sink.emit_br_table(&targets, default_target);
Validator::validate_br_table(context, table, default)?;
return Ok(InstructionOutcome::Unreachable); return Ok(InstructionOutcome::Unreachable);
}, },
Return => { Return => {
@ -1574,10 +1571,6 @@ impl<'a> FunctionValidationContext<'a> {
let value_stack_height = self.value_stack.len() as u32; let value_stack_height = self.value_stack.len() as u32;
let drop = if frame.polymorphic_stack { 0 } else { let drop = if frame.polymorphic_stack { 0 } else {
// TODO
println!("value_stack_height = {}", value_stack_height);
println!("frame.value_stack_len = {}", frame.value_stack_len);
println!("keep = {}", keep);
(value_stack_height - frame.value_stack_len as u32) - keep as u32 (value_stack_height - frame.value_stack_len as u32) - keep as u32
}; };

View File

@ -701,7 +701,7 @@ fn if_else_branch_from_false_branch() {
} }
#[test] #[test]
fn empty_loop() { fn loop_() {
let code = compile(r#" let code = compile(r#"
(module (module
(func (export "call") (func (export "call")
@ -733,9 +733,113 @@ fn empty_loop() {
) )
} }
// TODO: Loop #[test]
// TODO: Empty loop? fn loop_empty() {
// TODO: brtable let code = compile(r#"
(module
(func (export "call")
loop
end
)
)
"#);
assert_eq!(
code,
vec![
isa::Instruction::Return {
drop: 0,
keep: 0,
},
]
)
}
#[test]
fn brtable() {
let code = compile(r#"
(module
(func (export "call")
block $1
loop $2
i32.const 0
br_table $2 $1
end
end
)
)
"#);
assert_eq!(
code,
vec![
isa::Instruction::I32Const(0),
isa::Instruction::BrTable(
vec![
isa::Target {
dst_pc: 0,
keep: 0,
drop: 0,
},
isa::Target {
dst_pc: 2,
keep: 0,
drop: 0,
},
].into_boxed_slice()
),
isa::Instruction::Return {
drop: 0,
keep: 0,
},
]
)
}
#[test]
fn brtable_returns_result() {
let code = compile(r#"
(module
(func (export "call")
block $1 (result i32)
block $2 (result i32)
i32.const 0
i32.const 1
br_table $2 $1
end
unreachable
end
drop
)
)
"#);
assert_eq!(
code,
vec![
isa::Instruction::I32Const(0),
isa::Instruction::I32Const(1),
isa::Instruction::BrTable(
vec![
isa::Target {
dst_pc: 3,
keep: 1,
drop: 0,
},
isa::Target {
dst_pc: 4,
keep: 1,
drop: 0,
},
].into_boxed_slice()
),
isa::Instruction::Unreachable,
isa::Instruction::Drop,
isa::Instruction::Return {
drop: 0,
keep: 0,
},
]
)
}
#[test] #[test]
fn wabt_example() { fn wabt_example() {