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 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),

View File

@ -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),

View File

@ -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),

View File

@ -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),

View File

@ -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<Statement>) {
@ -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) => {

View File

@ -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<Statement>,
}
@ -699,6 +694,11 @@ pub struct CallIndirect {
pub param_list: Vec<Expression>,
}
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),

View File

@ -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<T: Visitor> {
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 {
fn accept(&self, visitor: &mut T) {
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 {
fn accept(&self, visitor: &mut T) {
visitor.visit_get_local(self);
@ -151,8 +151,8 @@ impl<T: Visitor> Driver<T> for CmpOp {
impl<T: Visitor> Driver<T> 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<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 {
fn accept(&self, visitor: &mut T) {
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 {
fn accept(&self, visitor: &mut T) {
self.value.accept(visitor);
@ -305,7 +305,6 @@ impl<T: Visitor> Driver<T> 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<T: Visitor> Driver<T> 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),