Refactor BrIf
behavior
This commit is contained in:
parent
183db977f3
commit
32031c8c2c
@ -5,7 +5,7 @@ use std::{
|
|||||||
|
|
||||||
use parity_wasm::elements::ValueType;
|
use parity_wasm::elements::ValueType;
|
||||||
use wasm_ast::node::{
|
use wasm_ast::node::{
|
||||||
Backward, Br, BrIf, BrTable, Call, CallIndirect, Forward, FuncData, If, SetGlobal, SetLocal,
|
Backward, Br, BrTable, Call, CallIndirect, Forward, FuncData, If, SetGlobal, SetLocal,
|
||||||
SetTemporary, Statement, StoreAt, Terminator,
|
SetTemporary, Statement, StoreAt, Terminator,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -152,16 +152,6 @@ impl Driver for If {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Driver for BrIf {
|
|
||||||
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
|
|
||||||
write!(w, "if ")?;
|
|
||||||
write_condition(&self.cond, mng, w)?;
|
|
||||||
write!(w, "then ")?;
|
|
||||||
write_br_at(self.target, mng, w)?;
|
|
||||||
write!(w, "end ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write_call_store(result: Range<usize>, w: &mut dyn Write) -> Result<()> {
|
fn write_call_store(result: Range<usize>, w: &mut dyn Write) -> Result<()> {
|
||||||
if result.is_empty() {
|
if result.is_empty() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@ -236,7 +226,6 @@ impl Driver for Statement {
|
|||||||
Self::Forward(s) => s.write(mng, w),
|
Self::Forward(s) => s.write(mng, w),
|
||||||
Self::Backward(s) => s.write(mng, w),
|
Self::Backward(s) => s.write(mng, w),
|
||||||
Self::If(s) => s.write(mng, w),
|
Self::If(s) => s.write(mng, w),
|
||||||
Self::BrIf(s) => s.write(mng, w),
|
|
||||||
Self::Call(s) => s.write(mng, w),
|
Self::Call(s) => s.write(mng, w),
|
||||||
Self::CallIndirect(s) => s.write(mng, w),
|
Self::CallIndirect(s) => s.write(mng, w),
|
||||||
Self::SetTemporary(s) => s.write(mng, w),
|
Self::SetTemporary(s) => s.write(mng, w),
|
||||||
|
@ -5,7 +5,7 @@ use std::{
|
|||||||
|
|
||||||
use parity_wasm::elements::ValueType;
|
use parity_wasm::elements::ValueType;
|
||||||
use wasm_ast::node::{
|
use wasm_ast::node::{
|
||||||
Backward, Br, BrIf, BrTable, Call, CallIndirect, Forward, FuncData, If, SetGlobal, SetLocal,
|
Backward, Br, BrTable, Call, CallIndirect, Forward, FuncData, If, SetGlobal, SetLocal,
|
||||||
SetTemporary, Statement, StoreAt, Terminator,
|
SetTemporary, Statement, StoreAt, Terminator,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -159,16 +159,6 @@ impl Driver for If {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Driver for BrIf {
|
|
||||||
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
|
|
||||||
write!(w, "if ")?;
|
|
||||||
write_condition(&self.cond, mng, w)?;
|
|
||||||
write!(w, "then ")?;
|
|
||||||
write_br_at(self.target, mng, w)?;
|
|
||||||
write!(w, "end ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write_call_store(result: Range<usize>, w: &mut dyn Write) -> Result<()> {
|
fn write_call_store(result: Range<usize>, w: &mut dyn Write) -> Result<()> {
|
||||||
if result.is_empty() {
|
if result.is_empty() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@ -243,7 +233,6 @@ impl Driver for Statement {
|
|||||||
Self::Forward(s) => s.write(mng, w),
|
Self::Forward(s) => s.write(mng, w),
|
||||||
Self::Backward(s) => s.write(mng, w),
|
Self::Backward(s) => s.write(mng, w),
|
||||||
Self::If(s) => s.write(mng, w),
|
Self::If(s) => s.write(mng, w),
|
||||||
Self::BrIf(s) => s.write(mng, w),
|
|
||||||
Self::Call(s) => s.write(mng, w),
|
Self::Call(s) => s.write(mng, w),
|
||||||
Self::CallIndirect(s) => s.write(mng, w),
|
Self::CallIndirect(s) => s.write(mng, w),
|
||||||
Self::SetTemporary(s) => s.write(mng, w),
|
Self::SetTemporary(s) => s.write(mng, w),
|
||||||
|
@ -4,10 +4,10 @@ use parity_wasm::elements::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use crate::node::{
|
use crate::node::{
|
||||||
Backward, BinOp, BinOpType, Br, BrIf, BrTable, Call, CallIndirect, CmpOp, CmpOpType,
|
Backward, BinOp, BinOpType, Br, BrTable, Call, CallIndirect, CmpOp, CmpOpType, Expression,
|
||||||
Expression, Forward, FuncData, GetGlobal, GetLocal, GetTemporary, If, LoadAt, LoadType,
|
Forward, FuncData, GetGlobal, GetLocal, GetTemporary, If, LoadAt, LoadType, MemoryGrow,
|
||||||
MemoryGrow, MemorySize, Select, SetGlobal, SetLocal, SetTemporary, Statement, StoreAt,
|
MemorySize, Select, SetGlobal, SetLocal, SetTemporary, Statement, StoreAt, StoreType,
|
||||||
StoreType, Terminator, UnOp, UnOpType, Value,
|
Terminator, UnOp, UnOpType, Value,
|
||||||
};
|
};
|
||||||
|
|
||||||
macro_rules! leak_with_predicate {
|
macro_rules! leak_with_predicate {
|
||||||
@ -574,13 +574,17 @@ impl<'a> Builder<'a> {
|
|||||||
self.set_br_to_block(target);
|
self.set_br_to_block(target);
|
||||||
}
|
}
|
||||||
Inst::BrIf(v) => {
|
Inst::BrIf(v) => {
|
||||||
let data = Statement::BrIf(BrIf {
|
let target: usize = v.try_into().unwrap();
|
||||||
|
let data = Statement::If(If {
|
||||||
cond: self.target.pop_required(),
|
cond: self.target.pop_required(),
|
||||||
target: v.try_into().unwrap(),
|
truthy: Forward::default(),
|
||||||
|
falsey: None,
|
||||||
});
|
});
|
||||||
|
|
||||||
// FIXME: Does not push results unless true
|
self.start_block(BlockType::NoResult);
|
||||||
self.target.code.push(data);
|
self.pending.last_mut().unwrap().code.push(data);
|
||||||
|
self.set_br_to_block(target + 1);
|
||||||
|
self.end_block();
|
||||||
}
|
}
|
||||||
Inst::BrTable(ref v) => {
|
Inst::BrTable(ref v) => {
|
||||||
self.nested_unreachable += 1;
|
self.nested_unreachable += 1;
|
||||||
|
@ -693,11 +693,6 @@ pub struct If {
|
|||||||
pub falsey: Option<Forward>,
|
pub falsey: Option<Forward>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct BrIf {
|
|
||||||
pub cond: Expression,
|
|
||||||
pub target: usize,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Call {
|
pub struct Call {
|
||||||
pub func: usize,
|
pub func: usize,
|
||||||
pub result: Range<usize>,
|
pub result: Range<usize>,
|
||||||
@ -737,7 +732,6 @@ pub enum Statement {
|
|||||||
Forward(Forward),
|
Forward(Forward),
|
||||||
Backward(Backward),
|
Backward(Backward),
|
||||||
If(If),
|
If(If),
|
||||||
BrIf(BrIf),
|
|
||||||
Call(Call),
|
Call(Call),
|
||||||
CallIndirect(CallIndirect),
|
CallIndirect(CallIndirect),
|
||||||
SetTemporary(SetTemporary),
|
SetTemporary(SetTemporary),
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use crate::node::{
|
use crate::node::{
|
||||||
Backward, BinOp, Br, BrIf, BrTable, Call, CallIndirect, CmpOp, Expression, Forward, FuncData,
|
Backward, BinOp, Br, BrTable, Call, CallIndirect, CmpOp, Expression, Forward, FuncData,
|
||||||
GetGlobal, GetLocal, GetTemporary, If, LoadAt, MemoryGrow, MemorySize, Select, SetGlobal,
|
GetGlobal, GetLocal, GetTemporary, If, LoadAt, MemoryGrow, MemorySize, Select, SetGlobal,
|
||||||
SetLocal, SetTemporary, Statement, StoreAt, Terminator, UnOp, Value,
|
SetLocal, SetTemporary, Statement, StoreAt, Terminator, UnOp, Value,
|
||||||
};
|
};
|
||||||
@ -43,8 +43,6 @@ pub trait Visitor {
|
|||||||
|
|
||||||
fn visit_if(&mut self, _: &If) {}
|
fn visit_if(&mut self, _: &If) {}
|
||||||
|
|
||||||
fn visit_br_if(&mut self, _: &BrIf) {}
|
|
||||||
|
|
||||||
fn visit_call(&mut self, _: &Call) {}
|
fn visit_call(&mut self, _: &Call) {}
|
||||||
|
|
||||||
fn visit_call_indirect(&mut self, _: &CallIndirect) {}
|
fn visit_call_indirect(&mut self, _: &CallIndirect) {}
|
||||||
@ -233,14 +231,6 @@ impl<T: Visitor> Driver<T> for If {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Visitor> Driver<T> for BrIf {
|
|
||||||
fn accept(&self, visitor: &mut T) {
|
|
||||||
self.cond.accept(visitor);
|
|
||||||
|
|
||||||
visitor.visit_br_if(self);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: Visitor> Driver<T> for Call {
|
impl<T: Visitor> Driver<T> for Call {
|
||||||
fn accept(&self, visitor: &mut T) {
|
fn accept(&self, visitor: &mut T) {
|
||||||
for v in &self.param_list {
|
for v in &self.param_list {
|
||||||
@ -302,7 +292,6 @@ impl<T: Visitor> Driver<T> for Statement {
|
|||||||
Self::Forward(v) => v.accept(visitor),
|
Self::Forward(v) => v.accept(visitor),
|
||||||
Self::Backward(v) => v.accept(visitor),
|
Self::Backward(v) => v.accept(visitor),
|
||||||
Self::If(v) => v.accept(visitor),
|
Self::If(v) => v.accept(visitor),
|
||||||
Self::BrIf(v) => v.accept(visitor),
|
|
||||||
Self::Call(v) => v.accept(visitor),
|
Self::Call(v) => v.accept(visitor),
|
||||||
Self::CallIndirect(v) => v.accept(visitor),
|
Self::CallIndirect(v) => v.accept(visitor),
|
||||||
Self::SetTemporary(v) => v.accept(visitor),
|
Self::SetTemporary(v) => v.accept(visitor),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user