Fix severe lapse in naming scheme judgement
This commit is contained in:
parent
dee02d24ad
commit
f85235738e
@ -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),
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
@ -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) => {
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
Loading…
x
Reference in New Issue
Block a user