Refactor and fix post call stack
This commit is contained in:
parent
34311bd0fb
commit
cc0920b573
@ -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),
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user