Fix severe lapse in naming scheme judgement

This commit is contained in:
Rerumu 2022-06-09 01:05:53 -04:00
parent dee02d24ad
commit f85235738e
7 changed files with 89 additions and 88 deletions

View File

@ -1,8 +1,8 @@
use std::io::{Result, Write}; use std::io::{Result, Write};
use wasm_ast::node::{ use wasm_ast::node::{
BinOp, CmpOp, Expression, GetGlobal, GetLocal, LoadAt, MemoryGrow, MemorySize, Recall, Select, BinOp, CmpOp, Expression, GetGlobal, GetLocal, GetTemporary, LoadAt, MemoryGrow, MemorySize,
UnOp, Value, Select, UnOp, Value,
}; };
use crate::analyzer::operator::bin_symbol_of; 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, 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 { impl Driver for Select {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
write!(w, "(")?; 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 { impl Driver for GetLocal {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
write_variable(self.var, mng, w) write_variable(self.var, mng, w)
@ -144,8 +144,8 @@ impl Driver for CmpOp {
impl Driver for Expression { impl Driver for Expression {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
match self { match self {
Self::Recall(e) => e.write(mng, w),
Self::Select(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::GetLocal(e) => e.write(mng, w),
Self::GetGlobal(e) => e.write(mng, w), Self::GetGlobal(e) => e.write(mng, w),
Self::LoadAt(e) => e.write(mng, w), Self::LoadAt(e) => e.write(mng, w),

View File

@ -5,21 +5,14 @@ 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, Else, Forward, If, Intermediate, Memorize, Backward, Br, BrIf, BrTable, Call, CallIndirect, Else, Forward, If, Intermediate, Return,
Return, SetGlobal, SetLocal, Statement, StoreAt, SetGlobal, SetLocal, SetTemporary, Statement, StoreAt,
}; };
use super::manager::{ use super::manager::{
write_ascending, write_condition, write_separated, write_variable, Driver, 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 { impl Driver for Forward {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
let label = mng.push_label(); 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 { impl Driver for SetLocal {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
write_variable(self.var, mng, w)?; 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<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
match self { match self {
Self::Unreachable => write!(w, "error(\"out of code bounds\")"), Self::Unreachable => write!(w, "error(\"out of code bounds\")"),
Self::Memorize(s) => s.write(mng, w),
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),
@ -240,6 +239,7 @@ impl Driver for Statement {
Self::Return(s) => s.write(mng, w), Self::Return(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::SetLocal(s) => s.write(mng, w), Self::SetLocal(s) => s.write(mng, w),
Self::SetGlobal(s) => s.write(mng, w), Self::SetGlobal(s) => s.write(mng, w),
Self::StoreAt(s) => s.write(mng, w), Self::StoreAt(s) => s.write(mng, w),

View File

@ -1,8 +1,8 @@
use std::io::{Result, Write}; use std::io::{Result, Write};
use wasm_ast::node::{ use wasm_ast::node::{
BinOp, CmpOp, Expression, GetGlobal, GetLocal, LoadAt, MemoryGrow, MemorySize, Recall, Select, BinOp, CmpOp, Expression, GetGlobal, GetLocal, GetTemporary, LoadAt, MemoryGrow, MemorySize,
UnOp, Value, Select, UnOp, Value,
}; };
use crate::analyzer::operator::bin_symbol_of; 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, 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 { impl Driver for Select {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
write!(w, "(")?; 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 { impl Driver for GetLocal {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
write_variable(self.var, mng, w) write_variable(self.var, mng, w)
@ -164,8 +164,8 @@ impl Driver for CmpOp {
impl Driver for Expression { impl Driver for Expression {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
match self { match self {
Self::Recall(e) => e.write(mng, w),
Self::Select(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::GetLocal(e) => e.write(mng, w),
Self::GetGlobal(e) => e.write(mng, w), Self::GetGlobal(e) => e.write(mng, w),
Self::LoadAt(e) => e.write(mng, w), Self::LoadAt(e) => e.write(mng, w),

View File

@ -5,8 +5,8 @@ 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, Else, Forward, If, Intermediate, Memorize, Backward, Br, BrIf, BrTable, Call, CallIndirect, Else, Forward, If, Intermediate, Return,
Return, SetGlobal, SetLocal, Statement, StoreAt, SetGlobal, SetLocal, SetTemporary, Statement, StoreAt,
}; };
use super::manager::{ 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 { impl Driver for Forward {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
let rem = mng.push_label(Label::Forward); 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 { impl Driver for SetLocal {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
write_variable(self.var, mng, w)?; 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<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
match self { match self {
Self::Unreachable => write!(w, "error(\"out of code bounds\")"), Self::Unreachable => write!(w, "error(\"out of code bounds\")"),
Self::Memorize(s) => s.write(mng, w),
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),
@ -247,6 +246,7 @@ impl Driver for Statement {
Self::Return(s) => s.write(mng, w), Self::Return(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::SetLocal(s) => s.write(mng, w), Self::SetLocal(s) => s.write(mng, w),
Self::SetGlobal(s) => s.write(mng, w), Self::SetGlobal(s) => s.write(mng, w),
Self::StoreAt(s) => s.write(mng, w), Self::StoreAt(s) => s.write(mng, w),

View File

@ -5,8 +5,8 @@ use parity_wasm::elements::{
use crate::node::{ use crate::node::{
Backward, BinOp, BinOpType, Br, BrIf, BrTable, Call, CallIndirect, CmpOp, CmpOpType, Else, Backward, BinOp, BinOpType, Br, BrIf, BrTable, Call, CallIndirect, CmpOp, CmpOpType, Else,
Expression, Forward, GetGlobal, GetLocal, If, Intermediate, LoadAt, LoadType, Memorize, Expression, Forward, GetGlobal, GetLocal, GetTemporary, If, Intermediate, LoadAt, LoadType,
MemoryGrow, MemorySize, Recall, Return, Select, SetGlobal, SetLocal, Statement, StoreAt, MemoryGrow, MemorySize, Return, Select, SetGlobal, SetLocal, SetTemporary, Statement, StoreAt,
StoreType, UnOp, UnOpType, Value, StoreType, UnOp, UnOpType, Value,
}; };
@ -125,22 +125,22 @@ impl Stacked {
.stack .stack
.iter_mut() .iter_mut()
.enumerate() .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 get = Expression::GetTemporary(GetTemporary { var: i });
let mem = Memorize { let set = Statement::SetTemporary(SetTemporary {
var: i, 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 // Pending expressions are put to sleep before entering
// a control structure so that they are not lost. // a control structure so that they are not lost.
fn save_pending(&mut self) { 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); self.pending_list.push(cloned);
} }
@ -167,11 +167,12 @@ impl Stacked {
self.stack.push(value); self.stack.push(value);
} }
fn push_recall(&mut self, num: usize) { fn push_temporary(&mut self, num: usize) {
let len = self.stack.len(); let len = self.stack.len();
for var in len..len + num { 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<Statement>) { fn gen_return(&mut self, stat: &mut Vec<Statement>) {
@ -351,7 +352,7 @@ impl<'a> Builder<'a> {
let first = self.data.stack.len(); let first = self.data.stack.len();
let result = first..first + arity.num_result; 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); self.data.gen_leak_pending(stat);
stat.push(Statement::Call(Call { stat.push(Statement::Call(Call {
@ -369,7 +370,7 @@ impl<'a> Builder<'a> {
let first = self.data.stack.len(); let first = self.data.stack.len();
let result = first..first + arity.num_result; 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); self.data.gen_leak_pending(stat);
stat.push(Statement::CallIndirect(CallIndirect { stat.push(Statement::CallIndirect(CallIndirect {
@ -532,7 +533,7 @@ impl<'a> Builder<'a> {
let var = var.try_into().unwrap(); let var = var.try_into().unwrap();
let value = self.data.pop(); let value = self.data.pop();
self.data.push(value.clone_recall()); self.data.push(value.clone_temporary());
stat.push(Statement::SetLocal(SetLocal { var, value })); stat.push(Statement::SetLocal(SetLocal { var, value }));
} }
Inst::GetGlobal(var) => { Inst::GetGlobal(var) => {

View File

@ -531,7 +531,7 @@ impl TryFrom<&Instruction> for CmpOpType {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct Recall { pub struct GetTemporary {
pub var: usize, pub var: usize,
} }
@ -614,8 +614,8 @@ pub struct CmpOp {
} }
pub enum Expression { pub enum Expression {
Recall(Recall),
Select(Select), Select(Select),
GetTemporary(GetTemporary),
GetLocal(GetLocal), GetLocal(GetLocal),
GetGlobal(GetGlobal), GetGlobal(GetGlobal),
LoadAt(LoadAt), LoadAt(LoadAt),
@ -629,27 +629,22 @@ pub enum Expression {
impl Expression { impl Expression {
#[must_use] #[must_use]
pub fn is_recalling(&self, wanted: usize) -> bool { pub fn is_temporary(&self, wanted: usize) -> bool {
match self { match self {
Expression::Recall(v) => v.var == wanted, Expression::GetTemporary(v) => v.var == wanted,
_ => false, _ => false,
} }
} }
#[must_use] #[must_use]
pub fn clone_recall(&self) -> Self { pub fn clone_temporary(&self) -> Self {
match self { match self {
Expression::Recall(v) => Expression::Recall(v.clone()), Expression::GetTemporary(v) => Expression::GetTemporary(v.clone()),
_ => unreachable!("clone_recall called on non-recall"), _ => unreachable!("not a temporary"),
} }
} }
} }
pub struct Memorize {
pub var: usize,
pub value: Expression,
}
pub struct Forward { pub struct Forward {
pub body: Vec<Statement>, pub body: Vec<Statement>,
} }
@ -699,6 +694,11 @@ pub struct CallIndirect {
pub param_list: Vec<Expression>, pub param_list: Vec<Expression>,
} }
pub struct SetTemporary {
pub var: usize,
pub value: Expression,
}
pub struct SetLocal { pub struct SetLocal {
pub var: usize, pub var: usize,
pub value: Expression, pub value: Expression,
@ -718,7 +718,6 @@ pub struct StoreAt {
pub enum Statement { pub enum Statement {
Unreachable, Unreachable,
Memorize(Memorize),
Forward(Forward), Forward(Forward),
Backward(Backward), Backward(Backward),
If(If), If(If),
@ -728,6 +727,7 @@ pub enum Statement {
Return(Return), Return(Return),
Call(Call), Call(Call),
CallIndirect(CallIndirect), CallIndirect(CallIndirect),
SetTemporary(SetTemporary),
SetLocal(SetLocal), SetLocal(SetLocal),
SetGlobal(SetGlobal), SetGlobal(SetGlobal),
StoreAt(StoreAt), StoreAt(StoreAt),

View File

@ -1,14 +1,14 @@
use crate::node::{ use crate::node::{
Backward, BinOp, Br, BrIf, BrTable, Call, CallIndirect, CmpOp, Else, Expression, Forward, Backward, BinOp, Br, BrIf, BrTable, Call, CallIndirect, CmpOp, Else, Expression, Forward,
GetGlobal, GetLocal, If, Intermediate, LoadAt, Memorize, MemoryGrow, MemorySize, Recall, GetGlobal, GetLocal, GetTemporary, If, Intermediate, LoadAt, MemoryGrow, MemorySize, Return,
Return, Select, SetGlobal, SetLocal, Statement, StoreAt, UnOp, Value, Select, SetGlobal, SetLocal, SetTemporary, Statement, StoreAt, UnOp, Value,
}; };
pub trait Visitor { pub trait Visitor {
fn visit_recall(&mut self, _: &Recall) {}
fn visit_select(&mut self, _: &Select) {} fn visit_select(&mut self, _: &Select) {}
fn visit_get_temporary(&mut self, _: &GetTemporary) {}
fn visit_get_local(&mut self, _: &GetLocal) {} fn visit_get_local(&mut self, _: &GetLocal) {}
fn visit_get_global(&mut self, _: &GetGlobal) {} fn visit_get_global(&mut self, _: &GetGlobal) {}
@ -31,8 +31,6 @@ pub trait Visitor {
fn visit_unreachable(&mut self) {} fn visit_unreachable(&mut self) {}
fn visit_memorize(&mut self, _: &Memorize) {}
fn visit_forward(&mut self, _: &Forward) {} fn visit_forward(&mut self, _: &Forward) {}
fn visit_backward(&mut self, _: &Backward) {} fn visit_backward(&mut self, _: &Backward) {}
@ -53,6 +51,8 @@ pub trait Visitor {
fn visit_call_indirect(&mut self, _: &CallIndirect) {} fn visit_call_indirect(&mut self, _: &CallIndirect) {}
fn visit_set_temporary(&mut self, _: &SetTemporary) {}
fn visit_set_local(&mut self, _: &SetLocal) {} fn visit_set_local(&mut self, _: &SetLocal) {}
fn visit_set_global(&mut self, _: &SetGlobal) {} fn visit_set_global(&mut self, _: &SetGlobal) {}
@ -66,12 +66,6 @@ pub trait Driver<T: Visitor> {
fn accept(&self, visitor: &mut T); fn accept(&self, visitor: &mut T);
} }
impl<T: Visitor> Driver<T> for Recall {
fn accept(&self, visitor: &mut T) {
visitor.visit_recall(self);
}
}
impl<T: Visitor> Driver<T> for Select { impl<T: Visitor> Driver<T> for Select {
fn accept(&self, visitor: &mut T) { fn accept(&self, visitor: &mut T) {
self.cond.accept(visitor); self.cond.accept(visitor);
@ -82,6 +76,12 @@ impl<T: Visitor> Driver<T> for Select {
} }
} }
impl<T: Visitor> Driver<T> for GetTemporary {
fn accept(&self, visitor: &mut T) {
visitor.visit_get_temporary(self);
}
}
impl<T: Visitor> Driver<T> for GetLocal { impl<T: Visitor> Driver<T> for GetLocal {
fn accept(&self, visitor: &mut T) { fn accept(&self, visitor: &mut T) {
visitor.visit_get_local(self); visitor.visit_get_local(self);
@ -151,8 +151,8 @@ impl<T: Visitor> Driver<T> for CmpOp {
impl<T: Visitor> Driver<T> for Expression { impl<T: Visitor> Driver<T> for Expression {
fn accept(&self, visitor: &mut T) { fn accept(&self, visitor: &mut T) {
match self { match self {
Self::Recall(v) => v.accept(visitor),
Self::Select(v) => v.accept(visitor), Self::Select(v) => v.accept(visitor),
Self::GetTemporary(v) => v.accept(visitor),
Self::GetLocal(v) => v.accept(visitor), Self::GetLocal(v) => v.accept(visitor),
Self::GetGlobal(v) => v.accept(visitor), Self::GetGlobal(v) => v.accept(visitor),
Self::LoadAt(v) => v.accept(visitor), Self::LoadAt(v) => v.accept(visitor),
@ -168,14 +168,6 @@ impl<T: Visitor> Driver<T> for Expression {
} }
} }
impl<T: Visitor> Driver<T> for Memorize {
fn accept(&self, visitor: &mut T) {
self.value.accept(visitor);
visitor.visit_memorize(self);
}
}
impl<T: Visitor> Driver<T> for Forward { impl<T: Visitor> Driver<T> for Forward {
fn accept(&self, visitor: &mut T) { fn accept(&self, visitor: &mut T) {
for v in &self.body { for v in &self.body {
@ -276,6 +268,14 @@ impl<T: Visitor> Driver<T> for CallIndirect {
} }
} }
impl<T: Visitor> Driver<T> for SetTemporary {
fn accept(&self, visitor: &mut T) {
self.value.accept(visitor);
visitor.visit_set_temporary(self);
}
}
impl<T: Visitor> Driver<T> for SetLocal { impl<T: Visitor> Driver<T> for SetLocal {
fn accept(&self, visitor: &mut T) { fn accept(&self, visitor: &mut T) {
self.value.accept(visitor); self.value.accept(visitor);
@ -305,7 +305,6 @@ impl<T: Visitor> Driver<T> for Statement {
fn accept(&self, visitor: &mut T) { fn accept(&self, visitor: &mut T) {
match self { match self {
Self::Unreachable => visitor.visit_unreachable(), Self::Unreachable => visitor.visit_unreachable(),
Self::Memorize(v) => v.accept(visitor),
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),
@ -315,6 +314,7 @@ impl<T: Visitor> Driver<T> for Statement {
Self::Return(v) => v.accept(visitor), Self::Return(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::SetLocal(v) => v.accept(visitor), Self::SetLocal(v) => v.accept(visitor),
Self::SetGlobal(v) => v.accept(visitor), Self::SetGlobal(v) => v.accept(visitor),
Self::StoreAt(v) => v.accept(visitor), Self::StoreAt(v) => v.accept(visitor),