diff --git a/wasm/src/backend/ast/transformer.rs b/wasm/src/backend/ast/transformer.rs index 5bcd036..4ff7015 100644 --- a/wasm/src/backend/ast/transformer.rs +++ b/wasm/src/backend/ast/transformer.rs @@ -18,8 +18,8 @@ use super::{ pub struct Transformer<'a> { // target state wasm: &'a Module, - arity: &'a ArityList, - name: usize, + other: &'a ArityList, + num_result: u32, // translation state pending: Vec>, @@ -36,25 +36,27 @@ fn is_else_stat(inst: &Instruction) -> bool { } impl<'a> Transformer<'a> { - pub fn new(wasm: &'a Module, arity: &'a ArityList, name: usize) -> Transformer<'a> { + pub fn new(wasm: &'a Module, other: &'a ArityList) -> Transformer<'a> { Transformer { wasm, - arity, - name, + other, + num_result: 0, pending: Vec::new(), stack: Vec::new(), last_stack: 0, } } - pub fn consume(mut self) -> Function { - debug_assert!(self.name != usize::MAX, "Not an indexed value"); + pub fn consume(mut self, name: usize) -> Function { + let arity = &self.other.in_arity[name]; - let func = &self.wasm.code_section().unwrap().bodies()[self.name]; + self.num_result = arity.num_result; + + let func = &self.wasm.code_section().unwrap().bodies()[name]; let body = self.new_forward(&mut func.code().elements()); Function { - num_param: self.arity.in_arity[self.name].num_param, + num_param: arity.num_param, num_local: local_sum(func.locals()), num_stack: u32::try_from(self.last_stack).unwrap(), body, @@ -121,7 +123,7 @@ impl<'a> Transformer<'a> { } fn gen_return(&mut self, stat: &mut Vec) { - let num = self.arity.in_arity[self.name].num_result as usize; + let num = self.num_result as usize; let list = self.stack.split_off(self.stack.len() - num); self.gen_leak_pending(stat); @@ -129,7 +131,7 @@ impl<'a> Transformer<'a> { } fn gen_call(&mut self, func: u32, stat: &mut Vec) { - let arity = self.arity.arity_of(func as usize); + let arity = self.other.arity_of(func as usize); let param_list = self .stack diff --git a/wasm/src/backend/translator/data.rs b/wasm/src/backend/translator/data.rs index 6b7aae8..7522675 100644 --- a/wasm/src/backend/translator/data.rs +++ b/wasm/src/backend/translator/data.rs @@ -283,7 +283,7 @@ impl<'a> Module<'a> { write!(w, "local rt = require({})", ed.runtime())?; let func_list: Vec<_> = (0..self.arity.in_arity.len()) - .map(|i| Transformer::new(self.wasm, &self.arity, i).consume()) + .map(|i| Transformer::new(self.wasm, &self.arity).consume(i)) .collect(); Self::gen_localize(&func_list, w)?;