Simplify LuaJIT label generation

This commit is contained in:
Rerumu 2021-11-30 15:28:51 -05:00
parent 03a73395be
commit e80f1ffedd

View File

@ -65,19 +65,32 @@ fn condense_jump_table(list: &[u32]) -> Vec<(usize, usize, u32)> {
result result
} }
#[derive(PartialEq, Eq)]
enum Label {
Forward,
Backward,
If,
}
#[derive(Default)] #[derive(Default)]
struct Visitor { struct Visitor {
label_list: Vec<Label>, label_list: Vec<usize>,
num_label: usize,
num_param: u32, num_param: u32,
} }
impl Visitor {
fn push_label(&mut self) -> usize {
self.label_list.push(self.num_label);
self.num_label += 1;
self.num_label - 1
}
fn pop_label(&mut self) {
self.label_list.pop().unwrap();
}
fn get_label(&self, up: u32) -> usize {
let last = self.label_list.len() - 1;
self.label_list[last - up as usize]
}
}
trait Driver { trait Driver {
fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()>; fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()>;
} }
@ -238,18 +251,16 @@ impl Driver for Memorize {
impl Driver for Forward { impl Driver for Forward {
fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> { fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> {
let rem = v.label_list.len(); let label = v.push_label();
v.label_list.push(Label::Forward);
write!(w, "do ")?; write!(w, "do ")?;
self.body.iter().try_for_each(|s| s.visit(v, w))?; self.body.iter().try_for_each(|s| s.visit(v, w))?;
write!(w, "::continue_at_{}::", rem)?; write!(w, "::continue_at_{}::", label)?;
write!(w, "end ")?; write!(w, "end ")?;
v.label_list.pop().unwrap(); v.pop_label();
Ok(()) Ok(())
} }
@ -257,18 +268,16 @@ impl Driver for Forward {
impl Driver for Backward { impl Driver for Backward {
fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> { fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> {
let rem = v.label_list.len(); let label = v.push_label();
v.label_list.push(Label::Backward);
write!(w, "do ")?; write!(w, "do ")?;
write!(w, "::continue_at_{}::", rem)?; write!(w, "::continue_at_{}::", label)?;
self.body.iter().try_for_each(|s| s.visit(v, w))?; self.body.iter().try_for_each(|s| s.visit(v, w))?;
write!(w, "end ")?; write!(w, "end ")?;
v.label_list.pop().unwrap(); v.pop_label();
Ok(()) Ok(())
} }
@ -284,9 +293,7 @@ impl Driver for Else {
impl Driver for If { impl Driver for If {
fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> { fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> {
let rem = v.label_list.len(); let label = v.push_label();
v.label_list.push(Label::If);
write!(w, "if ")?; write!(w, "if ")?;
self.cond.visit(v, w)?; self.cond.visit(v, w)?;
@ -298,20 +305,19 @@ impl Driver for If {
s.visit(v, w)?; s.visit(v, w)?;
} }
write!(w, "::continue_at_{}::", rem)?; write!(w, "::continue_at_{}::", label)?;
write!(w, "end ")?; write!(w, "end ")?;
v.label_list.pop().unwrap(); v.pop_label();
Ok(()) Ok(())
} }
} }
fn write_br_at(up: u32, v: &Visitor, w: Writer) -> Result<()> { fn write_br_at(up: u32, v: &Visitor, w: Writer) -> Result<()> {
let up = up as usize; let level = v.get_label(up);
let level = v.label_list.len() - 1;
write!(w, "goto continue_at_{} ", level - up) write!(w, "goto continue_at_{} ", level)
} }
impl Driver for Br { impl Driver for Br {