Fix Luau output emitting dead control branches
This commit is contained in:
parent
7a49d61e0a
commit
dfb86b30f9
@ -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>] {
|
||||||
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user