use crate::{Result, bail_bug, hash_map::HashMap, vm::VMContObj};
use wasmtime_core::{
alloc::PanicOnOom,
slab::{Id, Slab},
};
#[derive(Default)]
pub struct ContRefTable {
interned: HashMap<VMContObj, u32>,
slab: Slab<VMContObj>,
}
impl ContRefTable {
pub unsafe fn intern(&mut self, contobj: Option<VMContObj>) -> u32 {
let Some(contobj) = contobj else {
return 0;
};
*self.interned.entry(contobj).or_insert_with(|| {
let id = self.slab.alloc(contobj).panic_on_oom().into_raw();
id.checked_add(1).unwrap()
})
}
pub fn get(&self, raw: u32) -> Result<Option<VMContObj>> {
if raw == 0 {
return Ok(None);
}
let contobj = Id::try_from_raw(raw - 1).and_then(|id| self.slab.get(id).copied());
match contobj {
Some(contobj) => Ok(Some(contobj)),
None => bail_bug!("bad continuation-reference table ID"),
}
}
}