use crate::{
ExportError, Exportable, Extern,
error::RuntimeError,
macros::backend::{gen_rt_ty, match_rt},
store::{AsStoreMut, AsStoreRef, StoreMut, StoreRef},
value::Value,
vm::{VMExtern, VMExternGlobal},
};
use wasmer_types::{GlobalType, Mutability};
gen_rt_ty!(Global
@cfg feature = "artifact-size" => derive(loupe::MemoryUsage)
@derives Debug, Clone, PartialEq, Eq, derive_more::From
);
impl BackendGlobal {
#[inline]
pub fn new(store: &mut impl AsStoreMut, val: Value) -> Self {
Self::from_value(store, val, Mutability::Const).unwrap()
}
#[inline]
pub fn new_mut(store: &mut impl AsStoreMut, val: Value) -> Self {
Self::from_value(store, val, Mutability::Var).unwrap()
}
#[inline]
pub(crate) fn from_value(
store: &mut impl AsStoreMut,
val: Value,
mutability: Mutability,
) -> Result<Self, RuntimeError> {
match &store.as_store_mut().inner.store {
#[cfg(feature = "sys")]
crate::BackendStore::Sys(_) => Ok(Self::Sys(
crate::backend::sys::global::Global::from_value(store, val, mutability)?,
)),
#[cfg(feature = "wamr")]
crate::BackendStore::Wamr(_) => Ok(Self::Wamr(
crate::backend::wamr::global::Global::from_value(store, val, mutability)?,
)),
#[cfg(feature = "wasmi")]
crate::BackendStore::Wasmi(_) => Ok(Self::Wasmi(
crate::backend::wasmi::global::Global::from_value(store, val, mutability)?,
)),
#[cfg(feature = "v8")]
crate::BackendStore::V8(_) => Ok(Self::V8(
crate::backend::v8::global::Global::from_value(store, val, mutability)?,
)),
#[cfg(feature = "js")]
crate::BackendStore::Js(_) => Ok(Self::Js(
crate::backend::js::global::Global::from_value(store, val, mutability)?,
)),
#[cfg(feature = "jsc")]
crate::BackendStore::Jsc(_) => Ok(Self::Jsc(
crate::backend::jsc::global::Global::from_value(store, val, mutability)?,
)),
}
}
#[inline]
pub fn ty(&self, store: &impl AsStoreRef) -> GlobalType {
match_rt!(on self => g {
g.ty(store)
})
}
#[inline]
pub fn get(&self, store: &mut impl AsStoreMut) -> Value {
match_rt!(on self => g {
g.get(store)
})
}
#[inline]
pub fn set(&self, store: &mut impl AsStoreMut, val: Value) -> Result<(), RuntimeError> {
match_rt!(on self => s {
s.set(store, val)
})
}
#[inline]
pub(crate) fn from_vm_extern(store: &mut impl AsStoreMut, vm_extern: VMExternGlobal) -> Self {
match &store.as_store_mut().inner.store {
#[cfg(feature = "sys")]
crate::BackendStore::Sys(_) => Self::Sys(
crate::backend::sys::global::Global::from_vm_extern(store, vm_extern),
),
#[cfg(feature = "wamr")]
crate::BackendStore::Wamr(_) => Self::Wamr(
crate::backend::wamr::global::Global::from_vm_extern(store, vm_extern),
),
#[cfg(feature = "wasmi")]
crate::BackendStore::Wasmi(_) => Self::Wasmi(
crate::backend::wasmi::global::Global::from_vm_extern(store, vm_extern),
),
#[cfg(feature = "v8")]
crate::BackendStore::V8(_) => Self::V8(
crate::backend::v8::global::Global::from_vm_extern(store, vm_extern),
),
#[cfg(feature = "js")]
crate::BackendStore::Js(_) => Self::Js(
crate::backend::js::global::Global::from_vm_extern(store, vm_extern),
),
#[cfg(feature = "jsc")]
crate::BackendStore::Jsc(_) => Self::Jsc(
crate::backend::jsc::global::Global::from_vm_extern(store, vm_extern),
),
}
}
#[inline]
pub fn is_from_store(&self, store: &impl AsStoreRef) -> bool {
match_rt!(on self => s {
s.is_from_store(store)
})
}
#[inline]
pub(crate) fn to_vm_extern(&self) -> VMExtern {
match_rt!(on self => s {
s.to_vm_extern()
})
}
}