diff --git a/codegen-luajit/src/backend/expression.rs b/codegen-luajit/src/backend/expression.rs index d8c13bc..7b83c23 100644 --- a/codegen-luajit/src/backend/expression.rs +++ b/codegen-luajit/src/backend/expression.rs @@ -1,8 +1,8 @@ use std::io::{Result, Write}; use wasm_ast::node::{ - BinOp, CmpOp, Expression, GetGlobal, GetLocal, LoadAt, MemoryGrow, MemorySize, Recall, Select, - UnOp, Value, + BinOp, CmpOp, Expression, GetGlobal, GetLocal, GetTemporary, LoadAt, MemoryGrow, MemorySize, + Select, UnOp, Value, }; use crate::analyzer::operator::bin_symbol_of; @@ -11,12 +11,6 @@ use super::manager::{ write_cmp_op, write_condition, write_separated, write_variable, Driver, Manager, }; -impl Driver for Recall { - fn write(&self, _: &mut Manager, w: &mut dyn Write) -> Result<()> { - write!(w, "reg_{} ", self.var) - } -} - impl Driver for Select { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { write!(w, "(")?; @@ -29,6 +23,12 @@ impl Driver for Select { } } +impl Driver for GetTemporary { + fn write(&self, _: &mut Manager, w: &mut dyn Write) -> Result<()> { + write!(w, "reg_{} ", self.var) + } +} + impl Driver for GetLocal { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { write_variable(self.var, mng, w) @@ -144,8 +144,8 @@ impl Driver for CmpOp { impl Driver for Expression { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { match self { - Self::Recall(e) => e.write(mng, w), Self::Select(e) => e.write(mng, w), + Self::GetTemporary(e) => e.write(mng, w), Self::GetLocal(e) => e.write(mng, w), Self::GetGlobal(e) => e.write(mng, w), Self::LoadAt(e) => e.write(mng, w), diff --git a/codegen-luajit/src/backend/statement.rs b/codegen-luajit/src/backend/statement.rs index 3ac631a..ffa1b00 100644 --- a/codegen-luajit/src/backend/statement.rs +++ b/codegen-luajit/src/backend/statement.rs @@ -5,21 +5,14 @@ use std::{ use parity_wasm::elements::ValueType; use wasm_ast::node::{ - Backward, Br, BrIf, BrTable, Call, CallIndirect, Else, Forward, If, Intermediate, Memorize, - Return, SetGlobal, SetLocal, Statement, StoreAt, + Backward, Br, BrIf, BrTable, Call, CallIndirect, Else, Forward, If, Intermediate, Return, + SetGlobal, SetLocal, SetTemporary, Statement, StoreAt, }; use super::manager::{ write_ascending, write_condition, write_separated, write_variable, Driver, Manager, }; -impl Driver for Memorize { - fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { - write!(w, "reg_{} = ", self.var)?; - self.value.write(mng, w) - } -} - impl Driver for Forward { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { let label = mng.push_label(); @@ -196,6 +189,13 @@ impl Driver for CallIndirect { } } +impl Driver for SetTemporary { + fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { + write!(w, "reg_{} = ", self.var)?; + self.value.write(mng, w) + } +} + impl Driver for SetLocal { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { write_variable(self.var, mng, w)?; @@ -230,7 +230,6 @@ impl Driver for Statement { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { match self { Self::Unreachable => write!(w, "error(\"out of code bounds\")"), - Self::Memorize(s) => s.write(mng, w), Self::Forward(s) => s.write(mng, w), Self::Backward(s) => s.write(mng, w), Self::If(s) => s.write(mng, w), @@ -240,6 +239,7 @@ impl Driver for Statement { Self::Return(s) => s.write(mng, w), Self::Call(s) => s.write(mng, w), Self::CallIndirect(s) => s.write(mng, w), + Self::SetTemporary(s) => s.write(mng, w), Self::SetLocal(s) => s.write(mng, w), Self::SetGlobal(s) => s.write(mng, w), Self::StoreAt(s) => s.write(mng, w), diff --git a/codegen-luau/src/backend/expression.rs b/codegen-luau/src/backend/expression.rs index 2ec1e06..ef59bdc 100644 --- a/codegen-luau/src/backend/expression.rs +++ b/codegen-luau/src/backend/expression.rs @@ -1,8 +1,8 @@ use std::io::{Result, Write}; use wasm_ast::node::{ - BinOp, CmpOp, Expression, GetGlobal, GetLocal, LoadAt, MemoryGrow, MemorySize, Recall, Select, - UnOp, Value, + BinOp, CmpOp, Expression, GetGlobal, GetLocal, GetTemporary, LoadAt, MemoryGrow, MemorySize, + Select, UnOp, Value, }; use crate::analyzer::operator::bin_symbol_of; @@ -11,12 +11,6 @@ use super::manager::{ write_cmp_op, write_condition, write_separated, write_variable, Driver, Manager, }; -impl Driver for Recall { - fn write(&self, _: &mut Manager, w: &mut dyn Write) -> Result<()> { - write!(w, "reg_{} ", self.var) - } -} - impl Driver for Select { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { write!(w, "(")?; @@ -29,6 +23,12 @@ impl Driver for Select { } } +impl Driver for GetTemporary { + fn write(&self, _: &mut Manager, w: &mut dyn Write) -> Result<()> { + write!(w, "reg_{} ", self.var) + } +} + impl Driver for GetLocal { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { write_variable(self.var, mng, w) @@ -164,8 +164,8 @@ impl Driver for CmpOp { impl Driver for Expression { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { match self { - Self::Recall(e) => e.write(mng, w), Self::Select(e) => e.write(mng, w), + Self::GetTemporary(e) => e.write(mng, w), Self::GetLocal(e) => e.write(mng, w), Self::GetGlobal(e) => e.write(mng, w), Self::LoadAt(e) => e.write(mng, w), diff --git a/codegen-luau/src/backend/statement.rs b/codegen-luau/src/backend/statement.rs index 3c83be0..4457348 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, Memorize, - Return, SetGlobal, SetLocal, Statement, StoreAt, + Backward, Br, BrIf, BrTable, Call, CallIndirect, Else, Forward, If, Intermediate, Return, + SetGlobal, SetLocal, SetTemporary, Statement, StoreAt, }; use super::manager::{ @@ -35,13 +35,6 @@ fn write_br_gadget(label_list: &[Label], rem: usize, w: &mut dyn Write) -> Resul } } -impl Driver for Memorize { - fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { - write!(w, "reg_{} = ", self.var)?; - self.value.write(mng, w) - } -} - impl Driver for Forward { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { let rem = mng.push_label(Label::Forward); @@ -203,6 +196,13 @@ impl Driver for CallIndirect { } } +impl Driver for SetTemporary { + fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { + write!(w, "reg_{} = ", self.var)?; + self.value.write(mng, w) + } +} + impl Driver for SetLocal { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { write_variable(self.var, mng, w)?; @@ -237,7 +237,6 @@ impl Driver for Statement { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { match self { Self::Unreachable => write!(w, "error(\"out of code bounds\")"), - Self::Memorize(s) => s.write(mng, w), Self::Forward(s) => s.write(mng, w), Self::Backward(s) => s.write(mng, w), Self::If(s) => s.write(mng, w), @@ -247,6 +246,7 @@ impl Driver for Statement { Self::Return(s) => s.write(mng, w), Self::Call(s) => s.write(mng, w), Self::CallIndirect(s) => s.write(mng, w), + Self::SetTemporary(s) => s.write(mng, w), Self::SetLocal(s) => s.write(mng, w), Self::SetGlobal(s) => s.write(mng, w), Self::StoreAt(s) => s.write(mng, w), diff --git a/wasm-ast/src/builder.rs b/wasm-ast/src/builder.rs index 8bb531b..184027b 100644 --- a/wasm-ast/src/builder.rs +++ b/wasm-ast/src/builder.rs @@ -5,8 +5,8 @@ use parity_wasm::elements::{ use crate::node::{ Backward, BinOp, BinOpType, Br, BrIf, BrTable, Call, CallIndirect, CmpOp, CmpOpType, Else, - Expression, Forward, GetGlobal, GetLocal, If, Intermediate, LoadAt, LoadType, Memorize, - MemoryGrow, MemorySize, Recall, Return, Select, SetGlobal, SetLocal, Statement, StoreAt, + Expression, Forward, GetGlobal, GetLocal, GetTemporary, If, Intermediate, LoadAt, LoadType, + MemoryGrow, MemorySize, Return, Select, SetGlobal, SetLocal, SetTemporary, Statement, StoreAt, StoreType, UnOp, UnOpType, Value, }; @@ -125,22 +125,22 @@ impl Stacked { .stack .iter_mut() .enumerate() - .filter(|v| !v.1.is_recalling(v.0)) + .filter(|v| !v.1.is_temporary(v.0)) { - let new = Expression::Recall(Recall { var: i }); - let mem = Memorize { + let get = Expression::GetTemporary(GetTemporary { var: i }); + let set = Statement::SetTemporary(SetTemporary { var: i, - value: std::mem::replace(v, new), - }; + value: std::mem::replace(v, get), + }); - stat.push(Statement::Memorize(mem)); + stat.push(set); } } // Pending expressions are put to sleep before entering // a control structure so that they are not lost. fn save_pending(&mut self) { - let cloned = self.stack.iter().map(Expression::clone_recall).collect(); + let cloned = self.stack.iter().map(Expression::clone_temporary).collect(); self.pending_list.push(cloned); } @@ -167,11 +167,12 @@ impl Stacked { self.stack.push(value); } - fn push_recall(&mut self, num: usize) { + fn push_temporary(&mut self, num: usize) { let len = self.stack.len(); for var in len..len + num { - self.stack.push(Expression::Recall(Recall { var })); + self.stack + .push(Expression::GetTemporary(GetTemporary { var })); } } @@ -333,7 +334,7 @@ impl<'a> Builder<'a> { } }; - self.data.push_recall(num); + self.data.push_temporary(num); } fn gen_return(&mut self, stat: &mut Vec) { @@ -351,7 +352,7 @@ impl<'a> Builder<'a> { let first = self.data.stack.len(); let result = first..first + arity.num_result; - self.data.push_recall(arity.num_result); + self.data.push_temporary(arity.num_result); self.data.gen_leak_pending(stat); stat.push(Statement::Call(Call { @@ -369,7 +370,7 @@ impl<'a> Builder<'a> { let first = self.data.stack.len(); let result = first..first + arity.num_result; - self.data.push_recall(arity.num_result); + self.data.push_temporary(arity.num_result); self.data.gen_leak_pending(stat); stat.push(Statement::CallIndirect(CallIndirect { @@ -532,7 +533,7 @@ impl<'a> Builder<'a> { let var = var.try_into().unwrap(); let value = self.data.pop(); - self.data.push(value.clone_recall()); + self.data.push(value.clone_temporary()); stat.push(Statement::SetLocal(SetLocal { var, value })); } Inst::GetGlobal(var) => { diff --git a/wasm-ast/src/node.rs b/wasm-ast/src/node.rs index 4ea2390..29de202 100644 --- a/wasm-ast/src/node.rs +++ b/wasm-ast/src/node.rs @@ -531,7 +531,7 @@ impl TryFrom<&Instruction> for CmpOpType { } #[derive(Clone)] -pub struct Recall { +pub struct GetTemporary { pub var: usize, } @@ -614,8 +614,8 @@ pub struct CmpOp { } pub enum Expression { - Recall(Recall), Select(Select), + GetTemporary(GetTemporary), GetLocal(GetLocal), GetGlobal(GetGlobal), LoadAt(LoadAt), @@ -629,27 +629,22 @@ pub enum Expression { impl Expression { #[must_use] - pub fn is_recalling(&self, wanted: usize) -> bool { + pub fn is_temporary(&self, wanted: usize) -> bool { match self { - Expression::Recall(v) => v.var == wanted, + Expression::GetTemporary(v) => v.var == wanted, _ => false, } } #[must_use] - pub fn clone_recall(&self) -> Self { + pub fn clone_temporary(&self) -> Self { match self { - Expression::Recall(v) => Expression::Recall(v.clone()), - _ => unreachable!("clone_recall called on non-recall"), + Expression::GetTemporary(v) => Expression::GetTemporary(v.clone()), + _ => unreachable!("not a temporary"), } } } -pub struct Memorize { - pub var: usize, - pub value: Expression, -} - pub struct Forward { pub body: Vec, } @@ -699,6 +694,11 @@ pub struct CallIndirect { pub param_list: Vec, } +pub struct SetTemporary { + pub var: usize, + pub value: Expression, +} + pub struct SetLocal { pub var: usize, pub value: Expression, @@ -718,7 +718,6 @@ pub struct StoreAt { pub enum Statement { Unreachable, - Memorize(Memorize), Forward(Forward), Backward(Backward), If(If), @@ -728,6 +727,7 @@ pub enum Statement { Return(Return), Call(Call), CallIndirect(CallIndirect), + SetTemporary(SetTemporary), SetLocal(SetLocal), SetGlobal(SetGlobal), StoreAt(StoreAt), diff --git a/wasm-ast/src/visit.rs b/wasm-ast/src/visit.rs index 31a8cbd..88c0272 100644 --- a/wasm-ast/src/visit.rs +++ b/wasm-ast/src/visit.rs @@ -1,14 +1,14 @@ use crate::node::{ Backward, BinOp, Br, BrIf, BrTable, Call, CallIndirect, CmpOp, Else, Expression, Forward, - GetGlobal, GetLocal, If, Intermediate, LoadAt, Memorize, MemoryGrow, MemorySize, Recall, - Return, Select, SetGlobal, SetLocal, Statement, StoreAt, UnOp, Value, + GetGlobal, GetLocal, GetTemporary, If, Intermediate, LoadAt, MemoryGrow, MemorySize, Return, + Select, SetGlobal, SetLocal, SetTemporary, Statement, StoreAt, UnOp, Value, }; pub trait Visitor { - fn visit_recall(&mut self, _: &Recall) {} - fn visit_select(&mut self, _: &Select) {} + fn visit_get_temporary(&mut self, _: &GetTemporary) {} + fn visit_get_local(&mut self, _: &GetLocal) {} fn visit_get_global(&mut self, _: &GetGlobal) {} @@ -31,8 +31,6 @@ pub trait Visitor { fn visit_unreachable(&mut self) {} - fn visit_memorize(&mut self, _: &Memorize) {} - fn visit_forward(&mut self, _: &Forward) {} fn visit_backward(&mut self, _: &Backward) {} @@ -53,6 +51,8 @@ pub trait Visitor { fn visit_call_indirect(&mut self, _: &CallIndirect) {} + fn visit_set_temporary(&mut self, _: &SetTemporary) {} + fn visit_set_local(&mut self, _: &SetLocal) {} fn visit_set_global(&mut self, _: &SetGlobal) {} @@ -66,12 +66,6 @@ pub trait Driver { fn accept(&self, visitor: &mut T); } -impl Driver for Recall { - fn accept(&self, visitor: &mut T) { - visitor.visit_recall(self); - } -} - impl Driver for Select { fn accept(&self, visitor: &mut T) { self.cond.accept(visitor); @@ -82,6 +76,12 @@ impl Driver for Select { } } +impl Driver for GetTemporary { + fn accept(&self, visitor: &mut T) { + visitor.visit_get_temporary(self); + } +} + impl Driver for GetLocal { fn accept(&self, visitor: &mut T) { visitor.visit_get_local(self); @@ -151,8 +151,8 @@ impl Driver for CmpOp { impl Driver for Expression { fn accept(&self, visitor: &mut T) { match self { - Self::Recall(v) => v.accept(visitor), Self::Select(v) => v.accept(visitor), + Self::GetTemporary(v) => v.accept(visitor), Self::GetLocal(v) => v.accept(visitor), Self::GetGlobal(v) => v.accept(visitor), Self::LoadAt(v) => v.accept(visitor), @@ -168,14 +168,6 @@ impl Driver for Expression { } } -impl Driver for Memorize { - fn accept(&self, visitor: &mut T) { - self.value.accept(visitor); - - visitor.visit_memorize(self); - } -} - impl Driver for Forward { fn accept(&self, visitor: &mut T) { for v in &self.body { @@ -276,6 +268,14 @@ impl Driver for CallIndirect { } } +impl Driver for SetTemporary { + fn accept(&self, visitor: &mut T) { + self.value.accept(visitor); + + visitor.visit_set_temporary(self); + } +} + impl Driver for SetLocal { fn accept(&self, visitor: &mut T) { self.value.accept(visitor); @@ -305,7 +305,6 @@ impl Driver for Statement { fn accept(&self, visitor: &mut T) { match self { Self::Unreachable => visitor.visit_unreachable(), - Self::Memorize(v) => v.accept(visitor), Self::Forward(v) => v.accept(visitor), Self::Backward(v) => v.accept(visitor), Self::If(v) => v.accept(visitor), @@ -315,6 +314,7 @@ impl Driver for Statement { Self::Return(v) => v.accept(visitor), Self::Call(v) => v.accept(visitor), Self::CallIndirect(v) => v.accept(visitor), + Self::SetTemporary(v) => v.accept(visitor), Self::SetLocal(v) => v.accept(visitor), Self::SetGlobal(v) => v.accept(visitor), Self::StoreAt(v) => v.accept(visitor),