Simplify LuaJIT label generation
This commit is contained in:
parent
03a73395be
commit
e80f1ffedd
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user