use wasmer_types::StoreId;
use crate::{BackendStore, macros::backend::match_rt};
#[derive(Debug)]
pub enum StoreObjects {
#[cfg(feature = "sys")]
Sys(crate::backend::sys::store::StoreObjects),
#[cfg(feature = "v8")]
V8(crate::backend::v8::store::StoreObjects),
#[cfg(feature = "js")]
Js(crate::backend::js::store::StoreObjects),
}
impl StoreObjects {
#[inline]
pub fn same(a: &Self, b: &Self) -> bool {
match (a, b) {
#[cfg(feature = "sys")]
(Self::Sys(a), Self::Sys(b)) => a.id() == b.id(),
#[cfg(feature = "v8")]
(Self::V8(a), Self::V8(b)) => a.id() == b.id(),
#[cfg(feature = "js")]
(Self::Js(a), Self::Js(b)) => a.id() == b.id(),
_ => panic!(
"Incompatible `StoreObjects` instance: {}, {}!",
a.id(),
b.id()
),
}
}
#[inline]
pub fn id(&self) -> StoreId {
match_rt!(on self => s {
s.id()
})
}
#[inline]
pub(crate) fn from_store_ref(store: &BackendStore) -> Self {
match store {
#[cfg(feature = "sys")]
BackendStore::Sys(_) => Self::Sys(Default::default()),
#[cfg(feature = "v8")]
BackendStore::V8(_) => Self::V8(Default::default()),
#[cfg(feature = "js")]
BackendStore::Js(_) => Self::Js(Default::default()),
}
}
#[inline]
pub fn as_u128_globals(&self) -> Vec<u128> {
match_rt!(on self => s {
s.as_u128_globals()
})
}
#[inline]
pub fn set_global_unchecked(&self, idx: usize, val: u128) {
match_rt!(on self => s {
s.set_global_unchecked(idx, val)
})
}
#[cfg(all(unix, feature = "experimental-host-interrupt"))]
pub fn interrupter(&self) -> Interrupter {
match self {
#[cfg(feature = "sys")]
Self::Sys(s) => Interrupter(InterrupterInner::Sys(
crate::backend::sys::store::Interrupter::new(s.id()),
)),
_ => panic!("Interrupters can only be built for stores from the sys backend"),
}
}
}
#[cfg(all(unix, feature = "experimental-host-interrupt"))]
#[derive(Clone)]
pub struct Interrupter(InterrupterInner);
#[cfg(all(unix, feature = "experimental-host-interrupt"))]
impl Interrupter {
pub fn interrupt(&self) {
self.0.interrupt()
}
}
#[cfg(all(unix, feature = "experimental-host-interrupt"))]
#[derive(Clone)]
pub enum InterrupterInner {
#[cfg(feature = "sys")]
Sys(crate::backend::sys::store::Interrupter),
}
#[cfg(all(unix, feature = "experimental-host-interrupt"))]
impl InterrupterInner {
pub fn interrupt(&self) {
match self {
#[cfg(feature = "sys")]
Self::Sys(i) => i.interrupt(),
}
}
}