Refactor and fix post call stack

This commit is contained in:
Rerumu 2022-06-17 22:43:09 -04:00
parent 34311bd0fb
commit cc0920b573
2 changed files with 14 additions and 16 deletions

View File

@ -464,11 +464,9 @@ impl<'a> Builder<'a> {
let arity = self.type_info.rel_arity_of(func); let arity = self.type_info.rel_arity_of(func);
let param_list = self.target.stack.pop_len(arity.num_param).collect(); 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.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 { let data = Statement::Call(Call {
func, func,
@ -484,11 +482,9 @@ impl<'a> Builder<'a> {
let index = self.target.stack.pop(); let index = self.target.stack.pop();
let param_list = self.target.stack.pop_len(arity.num_param).collect(); 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.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 { let data = Statement::CallIndirect(CallIndirect {
table, table,
@ -700,7 +696,7 @@ impl<'a> Builder<'a> {
} }
Inst::GrowMemory(i) => { Inst::GrowMemory(i) => {
let value = self.target.stack.pop().into(); 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 memory = i.try_into().unwrap();
let data = Statement::MemoryGrow(MemoryGrow { let data = Statement::MemoryGrow(MemoryGrow {
@ -710,7 +706,6 @@ impl<'a> Builder<'a> {
}); });
self.target.leak_memory_write(memory); self.target.leak_memory_write(memory);
self.target.stack.push_temporary(1);
self.target.code.push(data); self.target.code.push(data);
} }
Inst::I32Const(v) => self.target.push_constant(v), Inst::I32Const(v) => self.target.push_constant(v),

View File

@ -1,4 +1,4 @@
use std::collections::HashSet; use std::{collections::HashSet, ops::Range};
use crate::node::{ use crate::node::{
Align, Expression, GetGlobal, GetLocal, GetTemporary, LoadAt, SetTemporary, Statement, Align, Expression, GetGlobal, GetLocal, GetTemporary, LoadAt, SetTemporary, Statement,
@ -82,16 +82,19 @@ impl Stack {
self.var_list.drain(desired..).map(|v| v.data) self.var_list.drain(desired..).map(|v| v.data)
} }
pub fn push_temporary(&mut self, num: usize) { pub fn push_temporary(&mut self, num: usize) -> Range<usize> {
let len = self.len() + self.previous; 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 }); let data = Expression::GetTemporary(GetTemporary { var });
self.push(data); self.push(data);
} }
self.capacity = self.capacity.max(len + num); range
} }
pub fn has_read_at(&self, index: usize, read: ReadType) -> bool { 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 // Return the alignment necessary for this block to branch out to a
// another given stack frame // another given stack frame
pub fn get_br_alignment(&self, par_start: usize, par_result: usize) -> Align { 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 { Align {
new: par_start, new: par_start,