Fix loop label targeting for Luau

This commit is contained in:
Rerumu 2022-07-21 21:55:29 -04:00
parent 9b0973e255
commit 5409abe653
2 changed files with 14 additions and 26 deletions

View File

@ -34,10 +34,8 @@ impl Manager {
&self.label_list &self.label_list
} }
pub fn push_label(&mut self, label: Option<LabelType>) -> usize { pub fn push_label(&mut self, label: Option<LabelType>) {
self.label_list.push(label); self.label_list.push(label);
self.label_list.len() - 1
} }
pub fn pop_label(&mut self) { pub fn pop_label(&mut self) {

View File

@ -125,41 +125,33 @@ impl Driver for Terminator {
} }
} }
fn write_br_gadget( fn write_br_parent(label_list: &[Option<LabelType>], w: &mut dyn Write) -> Result<()> {
label_list: &[Option<LabelType>], if label_list.iter().all(Option::is_none) {
label: usize,
w: &mut dyn Write,
) -> Result<()> {
if label_list.len() == 1 || label_list.iter().all(Option::is_none) {
return Ok(()); return Ok(());
} }
write!(w, "if desired then ")?; write!(w, "if desired then ")?;
match label_list.last().unwrap() { if let Some(last) = label_list.last().unwrap() {
Some(t) => { let level = label_list.len() - 1;
write!(w, "if desired == {label} then ")?;
write!(w, "if desired == {level} then ")?;
write!(w, "desired = nil ")?; write!(w, "desired = nil ")?;
if *t == LabelType::Backward { if *last == LabelType::Backward {
write!(w, "continue ")?; write!(w, "continue ")?;
} }
write!(w, "else ")?;
write!(w, "break ")?;
write!(w, "end ")?; write!(w, "end ")?;
} }
None => {
write!(w, "break ")?;
}
}
write!(w, "break ")?;
write!(w, "end ") write!(w, "end ")
} }
impl Driver for Block { impl Driver for Block {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
let label = mng.push_label(self.label_type()); mng.push_label(self.label_type());
write!(w, "while true do ")?; write!(w, "while true do ")?;
@ -172,10 +164,8 @@ impl Driver for Block {
write!(w, "end ")?; write!(w, "end ")?;
write_br_gadget(mng.label_list(), label, w)?;
mng.pop_label(); mng.pop_label();
write_br_parent(mng.label_list(), w)
Ok(())
} }
} }