From e0347c505ec42cd9ff2b6a89c5bde28d819ec78a Mon Sep 17 00:00:00 2001 From: Rerumu Date: Fri, 10 Jun 2022 03:21:16 -0400 Subject: [PATCH] Remove verbose `Else` wrapper --- codegen-luajit/src/backend/statement.rs | 18 ++++++------------ codegen-luau/src/backend/statement.rs | 18 ++++++------------ wasm-ast/src/builder.rs | 12 ++++-------- wasm-ast/src/node.rs | 6 +----- wasm-ast/src/visit.rs | 20 ++++---------------- 5 files changed, 21 insertions(+), 53 deletions(-) diff --git a/codegen-luajit/src/backend/statement.rs b/codegen-luajit/src/backend/statement.rs index ffa1b00..9fe51d5 100644 --- a/codegen-luajit/src/backend/statement.rs +++ b/codegen-luajit/src/backend/statement.rs @@ -5,8 +5,8 @@ use std::{ use parity_wasm::elements::ValueType; use wasm_ast::node::{ - Backward, Br, BrIf, BrTable, Call, CallIndirect, Else, Forward, If, Intermediate, Return, - SetGlobal, SetLocal, SetTemporary, Statement, StoreAt, + Backward, Br, BrIf, BrTable, Call, CallIndirect, Forward, If, Intermediate, Return, SetGlobal, + SetLocal, SetTemporary, Statement, StoreAt, }; use super::manager::{ @@ -45,14 +45,6 @@ impl Driver for Backward { } } -impl Driver for Else { - fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { - write!(w, "else ")?; - - self.body.iter().try_for_each(|s| s.write(mng, w)) - } -} - impl Driver for If { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { let label = mng.push_label(); @@ -63,8 +55,10 @@ impl Driver for If { self.truthy.iter().try_for_each(|s| s.write(mng, w))?; - if let Some(s) = &self.falsey { - s.write(mng, w)?; + if !self.falsey.is_empty() { + write!(w, "else ")?; + + self.falsey.iter().try_for_each(|s| s.write(mng, w))?; } write!(w, "end ")?; diff --git a/codegen-luau/src/backend/statement.rs b/codegen-luau/src/backend/statement.rs index 4457348..4b38995 100644 --- a/codegen-luau/src/backend/statement.rs +++ b/codegen-luau/src/backend/statement.rs @@ -5,8 +5,8 @@ use std::{ use parity_wasm::elements::ValueType; use wasm_ast::node::{ - Backward, Br, BrIf, BrTable, Call, CallIndirect, Else, Forward, If, Intermediate, Return, - SetGlobal, SetLocal, SetTemporary, Statement, StoreAt, + Backward, Br, BrIf, BrTable, Call, CallIndirect, Forward, If, Intermediate, Return, SetGlobal, + SetLocal, SetTemporary, Statement, StoreAt, }; use super::manager::{ @@ -67,14 +67,6 @@ impl Driver for Backward { } } -impl Driver for Else { - fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { - write!(w, "else ")?; - - self.body.iter().try_for_each(|s| s.write(mng, w)) - } -} - impl Driver for If { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { let rem = mng.push_label(Label::If); @@ -86,8 +78,10 @@ impl Driver for If { self.truthy.iter().try_for_each(|s| s.write(mng, w))?; - if let Some(s) = &self.falsey { - s.write(mng, w)?; + if !self.falsey.is_empty() { + write!(w, "else ")?; + + self.falsey.iter().try_for_each(|s| s.write(mng, w))?; } write!(w, "end ")?; diff --git a/wasm-ast/src/builder.rs b/wasm-ast/src/builder.rs index 184027b..bc64d50 100644 --- a/wasm-ast/src/builder.rs +++ b/wasm-ast/src/builder.rs @@ -4,7 +4,7 @@ use parity_wasm::elements::{ }; use crate::node::{ - Backward, BinOp, BinOpType, Br, BrIf, BrTable, Call, CallIndirect, CmpOp, CmpOpType, Else, + Backward, BinOp, BinOpType, Br, BrIf, BrTable, Call, CallIndirect, CmpOp, CmpOpType, Expression, Forward, GetGlobal, GetLocal, GetTemporary, If, Intermediate, LoadAt, LoadType, MemoryGrow, MemorySize, Return, Select, SetGlobal, SetLocal, SetTemporary, Statement, StoreAt, StoreType, UnOp, UnOpType, Value, @@ -605,18 +605,14 @@ impl<'a> Builder<'a> { stat } - fn new_else(&mut self, list: &mut &[Instruction]) -> Else { - Else { - body: self.new_stored_body(list), - } - } - fn new_if(&mut self, cond: Expression, list: &mut &[Instruction]) -> If { let copied = <&[Instruction]>::clone(list); let truthy = self.new_stored_body(list); let end = copied.len() - list.len() - 1; - let falsey = is_else_stat(&copied[end]).then(|| self.new_else(list)); + let falsey = is_else_stat(&copied[end]) + .then(|| self.new_stored_body(list)) + .unwrap_or_default(); If { cond, diff --git a/wasm-ast/src/node.rs b/wasm-ast/src/node.rs index 29de202..b057582 100644 --- a/wasm-ast/src/node.rs +++ b/wasm-ast/src/node.rs @@ -653,14 +653,10 @@ pub struct Backward { pub body: Vec, } -pub struct Else { - pub body: Vec, -} - pub struct If { pub cond: Expression, pub truthy: Vec, - pub falsey: Option, + pub falsey: Vec, } pub struct Br { diff --git a/wasm-ast/src/visit.rs b/wasm-ast/src/visit.rs index 88c0272..50cf00c 100644 --- a/wasm-ast/src/visit.rs +++ b/wasm-ast/src/visit.rs @@ -1,7 +1,7 @@ use crate::node::{ - Backward, BinOp, Br, BrIf, BrTable, Call, CallIndirect, CmpOp, Else, Expression, Forward, - GetGlobal, GetLocal, GetTemporary, If, Intermediate, LoadAt, MemoryGrow, MemorySize, Return, - Select, SetGlobal, SetLocal, SetTemporary, Statement, StoreAt, UnOp, Value, + Backward, BinOp, Br, BrIf, BrTable, Call, CallIndirect, CmpOp, Expression, Forward, GetGlobal, + GetLocal, GetTemporary, If, Intermediate, LoadAt, MemoryGrow, MemorySize, Return, Select, + SetGlobal, SetLocal, SetTemporary, Statement, StoreAt, UnOp, Value, }; pub trait Visitor { @@ -35,8 +35,6 @@ pub trait Visitor { fn visit_backward(&mut self, _: &Backward) {} - fn visit_else(&mut self, _: &Else) {} - fn visit_if(&mut self, _: &If) {} fn visit_br(&mut self, _: &Br) {} @@ -188,16 +186,6 @@ impl Driver for Backward { } } -impl Driver for Else { - fn accept(&self, visitor: &mut T) { - for v in &self.body { - v.accept(visitor); - } - - visitor.visit_else(self); - } -} - impl Driver for If { fn accept(&self, visitor: &mut T) { self.cond.accept(visitor); @@ -206,7 +194,7 @@ impl Driver for If { v.accept(visitor); } - if let Some(v) = &self.falsey { + for v in &self.falsey { v.accept(visitor); }