diff --git a/codegen/luau/src/backend/manager.rs b/codegen/luau/src/backend/manager.rs index de0f6a7..ed57b5c 100644 --- a/codegen/luau/src/backend/manager.rs +++ b/codegen/luau/src/backend/manager.rs @@ -34,6 +34,7 @@ macro_rules! line { #[derive(Default)] pub struct Manager { table_map: HashMap, + has_branch: bool, label_list: Vec>, indentation: usize, } @@ -45,8 +46,13 @@ impl Manager { self.table_map[&id] } - pub fn set_table_map(&mut self, map: HashMap) { - self.table_map = map; + pub fn set_branch_information(&mut self, table_map: HashMap, has_branch: bool) { + self.table_map = table_map; + self.has_branch = has_branch; + } + + pub const fn has_branch(&self) -> bool { + self.has_branch } pub fn label_list(&self) -> &[Option] { diff --git a/codegen/luau/src/backend/statement.rs b/codegen/luau/src/backend/statement.rs index d29e58a..3627c44 100644 --- a/codegen/luau/src/backend/statement.rs +++ b/codegen/luau/src/backend/statement.rs @@ -140,7 +140,7 @@ impl Driver for Terminator { } fn write_br_parent(mng: &mut Manager, w: &mut dyn Write) -> Result<()> { - if mng.label_list().iter().all(Option::is_none) { + if !mng.has_branch() || mng.label_list().iter().all(Option::is_none) { return Ok(()); } @@ -389,22 +389,22 @@ fn write_variable_list(ast: &FuncData, mng: &mut Manager, w: &mut dyn Write) -> impl Driver for FuncData { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { - let br_data = br_target::visit(self); + let (table_map, has_branch) = br_target::visit(self); mng.indent(); write_parameter_list(self, w)?; write_variable_list(self, mng, w)?; - if br_data.1 { + if has_branch { line!(mng, w, "local desired")?; } - if !br_data.0.is_empty() { + if !table_map.is_empty() { line!(mng, w, "local br_map = {{}}")?; } - mng.set_table_map(br_data.0); + mng.set_branch_information(table_map, has_branch); self.code().write(mng, w)?; if self.num_result() != 0 {