Improve runtime localizing

This commit is contained in:
Rerumu 2021-11-26 16:05:03 -05:00
parent 55df4c39ca
commit ce59f77f22
2 changed files with 34 additions and 24 deletions

View File

@ -1,10 +1,17 @@
use std::io::{Result, Write}; use std::{
collections::BTreeSet,
io::{Result, Write},
};
use parity_wasm::elements::{ use parity_wasm::elements::{
External, ImportCountType, Instruction, Internal, Module as WasmModule, ResizableLimits, External, ImportCountType, Instruction, Internal, Module as WasmModule, ResizableLimits,
}; };
use crate::backend::{ast::transformer::Transformer, edition::data::Edition}; use crate::backend::{
ast::{data::Function, transformer::Transformer},
edition::data::Edition,
visitor::localize,
};
use super::{arity::List as ArityList, writer::Data}; use super::{arity::List as ArityList, writer::Data};
@ -261,9 +268,27 @@ impl<'a> Module<'a> {
write!(w, "}} end ") write!(w, "}} end ")
} }
fn gen_localize(&self, func_list: &[Function], w: &mut dyn Write) -> Result<()> {
let mut loc_set = BTreeSet::new();
for func in func_list {
loc_set.extend(localize::visit(func));
}
loc_set
.into_iter()
.try_for_each(|(a, b)| write!(w, "local {0}_{1} = rt.{0}.{1} ", a, b))
}
pub fn translate(&self, ed: &dyn Edition, w: &mut dyn Write) -> Result<()> { pub fn translate(&self, ed: &dyn Edition, w: &mut dyn Write) -> Result<()> {
write!(w, "local rt = require({})", ed.runtime())?; 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())
.collect();
self.gen_localize(&func_list, w)?;
gen_nil_array("FUNC_LIST", self.wasm.functions_space(), w)?; gen_nil_array("FUNC_LIST", self.wasm.functions_space(), w)?;
gen_nil_array("TABLE_LIST", self.wasm.table_space(), w)?; gen_nil_array("TABLE_LIST", self.wasm.table_space(), w)?;
gen_nil_array("MEMORY_LIST", self.wasm.memory_space(), w)?; gen_nil_array("MEMORY_LIST", self.wasm.memory_space(), w)?;
@ -271,13 +296,10 @@ impl<'a> Module<'a> {
let offset = self.arity.ex_arity.len(); let offset = self.arity.ex_arity.len();
for i in 0..self.arity.in_arity.len() { for (i, v) in func_list.into_iter().enumerate() {
let func = Transformer::new(self.wasm, &self.arity, i).consume();
let data = &mut Data::new(func.num_param, ed);
write!(w, "FUNC_LIST[{}] =", i + offset)?; write!(w, "FUNC_LIST[{}] =", i + offset)?;
func.output(data, w)?; v.output(&mut Data::new(v.num_param, ed), w)?;
} }
self.gen_start_point(w) self.gen_start_point(w)

View File

@ -10,7 +10,7 @@ use crate::backend::{
Return, Select, SetGlobal, SetLocal, Statement, Value, Return, Select, SetGlobal, SetLocal, Statement, Value,
}, },
edition::data::Edition, edition::data::Edition,
visitor::{localize, memory}, visitor::memory,
}; };
fn write_in_order(prefix: &'static str, len: u32, w: &mut dyn Write) -> Result<()> { fn write_in_order(prefix: &'static str, len: u32, w: &mut dyn Write) -> Result<()> {
@ -483,21 +483,6 @@ impl Function {
Ok(()) Ok(())
} }
fn write_visitor_list(&self, w: &mut dyn Write) -> Result<()> {
let memory = memory::visit(self);
let localize = localize::visit(self);
for v in memory {
write!(w, "local memory_at_{0} = MEMORY_LIST[{0}]", v)?;
}
for (a, b) in localize {
write!(w, "local {0}_{1} = rt.{0}.{1} ", a, b)?;
}
Ok(())
}
pub fn output(&self, d: &mut Data, w: &mut dyn Write) -> Result<()> { pub fn output(&self, d: &mut Data, w: &mut dyn Write) -> Result<()> {
write!(w, "function(")?; write!(w, "function(")?;
@ -505,7 +490,10 @@ impl Function {
write!(w, ")")?; write!(w, ")")?;
self.write_visitor_list(w)?; for v in memory::visit(self) {
write!(w, "local memory_at_{0} = MEMORY_LIST[{0}]", v)?;
}
self.write_variable_list(w)?; self.write_variable_list(w)?;
self.body.output(d, w)?; self.body.output(d, w)?;