use crate::Result;
use crate::runtime::types::TagType;
use crate::trampoline::generate_tag_export;
use crate::{
AsContext, AsContextMut,
store::{StoreInstanceId, StoreOpaque},
};
use wasmtime_environ::DefinedTagIndex;
#[cfg(feature = "gc")]
use crate::store::InstanceId;
#[derive(Copy, Clone, Debug)]
#[repr(C)] pub struct Tag {
instance: StoreInstanceId,
index: DefinedTagIndex,
}
impl Tag {
pub(crate) fn from_raw(instance: StoreInstanceId, index: DefinedTagIndex) -> Tag {
Tag { instance, index }
}
pub fn new(mut store: impl AsContextMut, ty: &TagType) -> Result<Tag> {
generate_tag_export(store.as_context_mut().0, ty)
}
pub fn ty(&self, store: impl AsContext) -> TagType {
self._ty(store.as_context().0)
}
pub(crate) fn _ty(&self, store: &StoreOpaque) -> TagType {
TagType::from_wasmtime_tag(store.engine(), self.wasmtime_ty(store))
}
pub(crate) fn wasmtime_ty<'a>(&self, store: &'a StoreOpaque) -> &'a wasmtime_environ::Tag {
let module = store[self.instance].env_module();
let index = module.tag_index(self.index);
&module.tags[index]
}
pub(crate) fn vmimport(&self, store: &StoreOpaque) -> crate::runtime::vm::VMTagImport {
let instance = &store[self.instance];
crate::runtime::vm::VMTagImport {
from: instance.tag_ptr(self.index).into(),
vmctx: instance.vmctx().into(),
index: self.index,
}
}
pub(crate) fn comes_from_same_store(&self, store: &StoreOpaque) -> bool {
store.id() == self.instance.store_id()
}
pub fn eq(a: &Tag, b: &Tag, store: impl AsContext) -> bool {
let store = store.as_context();
let _ = &store[a.instance];
let _ = &store[b.instance];
a.instance == b.instance && a.index == b.index
}
#[cfg(feature = "gc")]
pub(crate) fn to_raw_indices(&self) -> (InstanceId, DefinedTagIndex) {
(self.instance.instance(), self.index)
}
#[cfg(feature = "gc")]
pub(crate) fn from_raw_indices(
store: &StoreOpaque,
instance: InstanceId,
index: DefinedTagIndex,
) -> Tag {
let instance = StoreInstanceId::new(store.id(), instance);
Tag { instance, index }
}
}