From 8b52af9651febec9ce07a89bfb11e4b72ddad381 Mon Sep 17 00:00:00 2001 From: Rerumu Date: Wed, 24 Nov 2021 00:22:55 -0500 Subject: [PATCH] Fix jump table emit --- src/backend/translator/writer.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/backend/translator/writer.rs b/src/backend/translator/writer.rs index d7f97ae..3a7c3a3 100644 --- a/src/backend/translator/writer.rs +++ b/src/backend/translator/writer.rs @@ -30,7 +30,7 @@ fn write_br_gadget(rem: usize, d: &mut Data, w: &mut dyn Write) -> Result<()> { } } -pub fn list_to_range(list: &[u32]) -> Vec<(Range, u32)> { +pub fn condense_jump_table(list: &[u32]) -> Vec<(usize, usize, u32)> { let mut result = Vec::new(); let mut index = 0; @@ -46,7 +46,7 @@ pub fn list_to_range(list: &[u32]) -> Vec<(Range, u32)> { } } - result.push((start..index, list[start])); + result.push((start, index - 1, list[start])); } result @@ -338,14 +338,14 @@ impl BrTable { self.cond.output(d, w)?; write!(w, " ")?; - for (r, t) in list_to_range(&self.data.table) { - if r.len() == 1 { - write!(w, "if temp == {} then ", r.start)?; + for (start, end, dest) in condense_jump_table(&self.data.table) { + if start == end { + write!(w, "if temp == {} then ", start)?; } else { - write!(w, "if temp >= {} and temp <= {} then ", r.start, r.end)?; + write!(w, "if temp >= {} and temp <= {} then ", start, end)?; } - Br::write_at(t, d, w)?; + Br::write_at(dest, d, w)?; write!(w, "else")?; }