diff --git a/wasm-ast/src/builder.rs b/wasm-ast/src/builder.rs index 267ad44..92082d3 100644 --- a/wasm-ast/src/builder.rs +++ b/wasm-ast/src/builder.rs @@ -464,11 +464,9 @@ impl<'a> Builder<'a> { let arity = self.type_info.rel_arity_of(func); let param_list = self.target.stack.pop_len(arity.num_param).collect(); - let first = self.target.stack.len(); - let result = first..first + arity.num_result; - self.target.leak_all(); - self.target.stack.push_temporary(arity.num_result); + + let result = self.target.stack.push_temporary(arity.num_result); let data = Statement::Call(Call { func, @@ -484,11 +482,9 @@ impl<'a> Builder<'a> { let index = self.target.stack.pop(); let param_list = self.target.stack.pop_len(arity.num_param).collect(); - let first = self.target.stack.len(); - let result = first..first + arity.num_result; - self.target.leak_all(); - self.target.stack.push_temporary(arity.num_result); + + let result = self.target.stack.push_temporary(arity.num_result); let data = Statement::CallIndirect(CallIndirect { table, @@ -700,7 +696,7 @@ impl<'a> Builder<'a> { } Inst::GrowMemory(i) => { let value = self.target.stack.pop().into(); - let result = self.target.stack.len(); + let result = self.target.stack.push_temporary(1).start; let memory = i.try_into().unwrap(); let data = Statement::MemoryGrow(MemoryGrow { @@ -710,7 +706,6 @@ impl<'a> Builder<'a> { }); self.target.leak_memory_write(memory); - self.target.stack.push_temporary(1); self.target.code.push(data); } Inst::I32Const(v) => self.target.push_constant(v), diff --git a/wasm-ast/src/stack.rs b/wasm-ast/src/stack.rs index b32ea91..606a8b3 100644 --- a/wasm-ast/src/stack.rs +++ b/wasm-ast/src/stack.rs @@ -1,4 +1,4 @@ -use std::collections::HashSet; +use std::{collections::HashSet, ops::Range}; use crate::node::{ Align, Expression, GetGlobal, GetLocal, GetTemporary, LoadAt, SetTemporary, Statement, @@ -82,16 +82,19 @@ impl Stack { self.var_list.drain(desired..).map(|v| v.data) } - pub fn push_temporary(&mut self, num: usize) { - let len = self.len() + self.previous; + pub fn push_temporary(&mut self, num: usize) -> Range { + let start = self.previous + self.len(); + let range = start..start + num; - for var in len..len + num { + self.capacity = self.capacity.max(range.end); + + for var in range.clone() { let data = Expression::GetTemporary(GetTemporary { var }); self.push(data); } - self.capacity = self.capacity.max(len + num); + range } pub fn has_read_at(&self, index: usize, read: ReadType) -> bool { @@ -101,7 +104,7 @@ impl Stack { // Return the alignment necessary for this block to branch out to a // another given stack frame pub fn get_br_alignment(&self, par_start: usize, par_result: usize) -> Align { - let start = self.len() + self.previous - par_result; + let start = self.previous + self.len() - par_result; Align { new: par_start,