diff --git a/crates/interpreter/src/side_table.rs b/crates/interpreter/src/side_table.rs index c491f5d3..49cc82c8 100644 --- a/crates/interpreter/src/side_table.rs +++ b/crates/interpreter/src/side_table.rs @@ -15,7 +15,7 @@ use crate::bit_field::*; use crate::error::*; -#[derive(Default, Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug)] #[repr(transparent)] pub struct SideTableEntry(u64); @@ -52,4 +52,12 @@ impl SideTableEntry { let pop_cnt = from_field(Self::POP_CNT_MASK, self.0); SideTableEntryView { delta_ip, delta_stp, val_cnt, pop_cnt } } + + pub fn is_invalid(self) -> bool { + self.0 == 0 + } + + pub fn invalid() -> Self { + SideTableEntry(0) + } } diff --git a/crates/interpreter/src/valid.rs b/crates/interpreter/src/valid.rs index 4b7897f3..9e783a6b 100644 --- a/crates/interpreter/src/valid.rs +++ b/crates/interpreter/src/valid.rs @@ -414,8 +414,7 @@ struct Expr<'a, 'm> { #[derive(Default)] struct SideTable { - // TODO(dev/fast-interp): Consider removing `Option` if confident. - entries: Vec>, + entries: Vec, } impl SideTable { @@ -424,7 +423,7 @@ impl SideTable { } fn branch(&mut self) { - self.entries.push(None); + self.entries.push(SideTableEntry::invalid()); } fn stitch(&mut self, source: SideTableBranch, target: SideTableBranch) -> CheckResult { @@ -436,9 +435,9 @@ impl SideTable { unsupported(if_debug!(Unsupported::SideTable)) })?; let pop_cnt = Self::pop_cnt(source, target)?; - let entry = &mut self.entries[source.side_table]; - assert!(entry.is_none()); - *entry = Some(SideTableEntryView { delta_ip, delta_stp, val_cnt, pop_cnt }); + debug_assert!(self.entries[source.side_table].is_invalid()); + self.entries[source.side_table] = + SideTableEntry::new(SideTableEntryView { delta_ip, delta_stp, val_cnt, pop_cnt })?; Ok(()) } @@ -478,7 +477,8 @@ impl SideTable { } fn persist(self) -> MResult, Check> { - self.entries.into_iter().map(|entry| SideTableEntry::new(entry.unwrap())).collect() + debug_assert!(self.entries.iter().all(|x| !x.is_invalid())); + Ok(self.entries) } }