wasmtime/runtime/externals/
tag.rs1use crate::Result;
2use crate::runtime::types::TagType;
3use crate::trampoline::generate_tag_export;
4use crate::{
5 AsContext, AsContextMut,
6 store::{StoreInstanceId, StoreOpaque},
7};
8use wasmtime_environ::DefinedTagIndex;
9
10#[cfg(feature = "gc")]
11use crate::store::InstanceId;
12
13#[derive(Copy, Clone, Debug)]
15#[repr(C)] pub struct Tag {
17 instance: StoreInstanceId,
18 index: DefinedTagIndex,
19}
20
21impl Tag {
22 pub(crate) fn from_raw(instance: StoreInstanceId, index: DefinedTagIndex) -> Tag {
23 Tag { instance, index }
24 }
25
26 pub fn new(mut store: impl AsContextMut, ty: &TagType) -> Result<Tag> {
36 generate_tag_export(store.as_context_mut().0, ty)
37 }
38
39 pub fn ty(&self, store: impl AsContext) -> TagType {
45 self._ty(store.as_context().0)
46 }
47
48 pub(crate) fn _ty(&self, store: &StoreOpaque) -> TagType {
49 TagType::from_wasmtime_tag(store.engine(), self.wasmtime_ty(store))
50 }
51
52 pub(crate) fn wasmtime_ty<'a>(&self, store: &'a StoreOpaque) -> &'a wasmtime_environ::Tag {
53 let module = store[self.instance].env_module();
54 let index = module.tag_index(self.index);
55 &module.tags[index]
56 }
57
58 pub(crate) fn vmimport(&self, store: &StoreOpaque) -> crate::runtime::vm::VMTagImport {
59 let instance = &store[self.instance];
60 crate::runtime::vm::VMTagImport {
61 from: instance.tag_ptr(self.index).into(),
62 vmctx: instance.vmctx().into(),
63 index: self.index,
64 }
65 }
66
67 pub(crate) fn comes_from_same_store(&self, store: &StoreOpaque) -> bool {
68 store.id() == self.instance.store_id()
69 }
70
71 pub fn eq(a: &Tag, b: &Tag, store: impl AsContext) -> bool {
78 let store = store.as_context();
80 let _ = &store[a.instance];
81 let _ = &store[b.instance];
82
83 a.instance == b.instance && a.index == b.index
85 }
86
87 #[cfg(feature = "gc")]
93 pub(crate) fn to_raw_indices(&self) -> (InstanceId, DefinedTagIndex) {
94 (self.instance.instance(), self.index)
95 }
96
97 #[cfg(feature = "gc")]
104 pub(crate) fn from_raw_indices(
105 store: &StoreOpaque,
106 instance: InstanceId,
107 index: DefinedTagIndex,
108 ) -> Tag {
109 let instance = StoreInstanceId::new(store.id(), instance);
110 Tag { instance, index }
111 }
112}