diff --git a/codegen/luau/src/analyzer/br_table.rs b/codegen/luau/src/analyzer/br_table.rs deleted file mode 100644 index 67bcb45..0000000 --- a/codegen/luau/src/analyzer/br_table.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::collections::HashMap; - -use wasm_ast::{ - node::{BrTable, FuncData}, - visit::{Driver, Visitor}, -}; - -struct Visit { - id_map: HashMap, -} - -impl Visitor for Visit { - fn visit_br_table(&mut self, table: &BrTable) { - let id = table as *const _ as usize; - let len = self.id_map.len() + 1; - - self.id_map.insert(id, len); - } -} - -pub fn visit(ast: &FuncData) -> HashMap { - let mut visit = Visit { - id_map: HashMap::new(), - }; - - ast.accept(&mut visit); - - visit.id_map -} diff --git a/codegen/luau/src/analyzer/br_target.rs b/codegen/luau/src/analyzer/br_target.rs new file mode 100644 index 0000000..28d9a99 --- /dev/null +++ b/codegen/luau/src/analyzer/br_target.rs @@ -0,0 +1,40 @@ +use std::collections::HashMap; + +use wasm_ast::{ + node::{Br, BrIf, BrTable, FuncData}, + visit::{Driver, Visitor}, +}; + +struct Visit { + br_map: HashMap, + has_branch: bool, +} + +impl Visitor for Visit { + fn visit_br(&mut self, _: &Br) { + self.has_branch = true; + } + + fn visit_br_if(&mut self, _: &BrIf) { + self.has_branch = true; + } + + fn visit_br_table(&mut self, table: &BrTable) { + let id = table as *const _ as usize; + let len = self.br_map.len() + 1; + + self.has_branch = true; + self.br_map.insert(id, len); + } +} + +pub fn visit(ast: &FuncData) -> (HashMap, bool) { + let mut visit = Visit { + br_map: HashMap::new(), + has_branch: false, + }; + + ast.accept(&mut visit); + + (visit.br_map, visit.has_branch) +} diff --git a/codegen/luau/src/analyzer/mod.rs b/codegen/luau/src/analyzer/mod.rs index 4f71fce..9a402b9 100644 --- a/codegen/luau/src/analyzer/mod.rs +++ b/codegen/luau/src/analyzer/mod.rs @@ -1,3 +1,3 @@ pub mod as_symbol; -pub mod br_table; +pub mod br_target; pub mod localize; diff --git a/codegen/luau/src/backend/statement.rs b/codegen/luau/src/backend/statement.rs index b3ea3a2..86e58a2 100644 --- a/codegen/luau/src/backend/statement.rs +++ b/codegen/luau/src/backend/statement.rs @@ -9,7 +9,7 @@ use wasm_ast::node::{ }; use wasmparser::ValType; -use crate::analyzer::br_table; +use crate::analyzer::br_target; use super::manager::{ write_ascending, write_condition, write_separated, write_variable, Driver, Manager, @@ -130,7 +130,7 @@ fn write_br_gadget( label: usize, w: &mut dyn Write, ) -> Result<()> { - if label_list.len() == 1 { + if label_list.len() == 1 || label_list.iter().all(Option::is_none) { return Ok(()); } @@ -340,17 +340,20 @@ fn write_variable_list(ast: &FuncData, w: &mut dyn Write) -> Result<()> { impl Driver for FuncData { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { - let br_map = br_table::visit(self); + let br_data = br_target::visit(self); write_parameter_list(self, w)?; write_variable_list(self, w)?; - write!(w, "local desired ")?; - if !br_map.is_empty() { + if br_data.1 { + write!(w, "local desired ")?; + } + + if !br_data.0.is_empty() { write!(w, "local br_map = {{}} ")?; } - mng.set_table_map(br_map); + mng.set_table_map(br_data.0); mng.set_num_param(self.num_param()); self.code().write(mng, w)?;