Fix loop label targeting for Luau
This commit is contained in:
parent
9b0973e255
commit
5409abe653
@ -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) {
|
||||||
|
@ -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, "desired = nil ")?;
|
|
||||||
|
|
||||||
if *t == LabelType::Backward {
|
write!(w, "if desired == {level} then ")?;
|
||||||
write!(w, "continue ")?;
|
write!(w, "desired = nil ")?;
|
||||||
}
|
|
||||||
|
|
||||||
write!(w, "else ")?;
|
if *last == LabelType::Backward {
|
||||||
write!(w, "break ")?;
|
write!(w, "continue ")?;
|
||||||
write!(w, "end ")?;
|
|
||||||
}
|
|
||||||
None => {
|
|
||||||
write!(w, "break ")?;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
write!(w, "end ")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user