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