Fix Luau output emitting dead control branches

This commit is contained in:
Rerumu 2023-06-20 14:59:37 -04:00
parent 7a49d61e0a
commit dfb86b30f9
2 changed files with 13 additions and 7 deletions

View File

@ -34,6 +34,7 @@ macro_rules! line {
#[derive(Default)] #[derive(Default)]
pub struct Manager { pub struct Manager {
table_map: HashMap<usize, usize>, table_map: HashMap<usize, usize>,
has_branch: bool,
label_list: Vec<Option<LabelType>>, label_list: Vec<Option<LabelType>>,
indentation: usize, indentation: usize,
} }
@ -45,8 +46,13 @@ impl Manager {
self.table_map[&id] self.table_map[&id]
} }
pub fn set_table_map(&mut self, map: HashMap<usize, usize>) { pub fn set_branch_information(&mut self, table_map: HashMap<usize, usize>, has_branch: bool) {
self.table_map = map; 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<LabelType>] { pub fn label_list(&self) -> &[Option<LabelType>] {

View File

@ -140,7 +140,7 @@ impl Driver for Terminator {
} }
fn write_br_parent(mng: &mut Manager, w: &mut dyn Write) -> Result<()> { 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(()); return Ok(());
} }
@ -389,22 +389,22 @@ fn write_variable_list(ast: &FuncData, mng: &mut Manager, w: &mut dyn Write) ->
impl Driver for FuncData { impl Driver for FuncData {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { 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(); mng.indent();
write_parameter_list(self, w)?; write_parameter_list(self, w)?;
write_variable_list(self, mng, w)?; write_variable_list(self, mng, w)?;
if br_data.1 { if has_branch {
line!(mng, w, "local desired")?; line!(mng, w, "local desired")?;
} }
if !br_data.0.is_empty() { if !table_map.is_empty() {
line!(mng, w, "local br_map = {{}}")?; 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)?; self.code().write(mng, w)?;
if self.num_result() != 0 { if self.num_result() != 0 {