use crate::runtime::vm::component::{ComponentInstance, OwnedComponentInstance};
use crate::store::{StoreData, StoreId, StoreOpaque};
use core::pin::Pin;
use wasmtime_environ::PrimaryMap;
#[derive(Default)]
pub struct ComponentStoreData {
instances: PrimaryMap<ComponentInstanceId, Option<OwnedComponentInstance>>,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct ComponentInstanceId(u32);
wasmtime_environ::entity_impl!(ComponentInstanceId);
impl StoreData {
pub(crate) fn push_component_instance(
&mut self,
data: OwnedComponentInstance,
) -> ComponentInstanceId {
let expected = data.get().id();
let ret = self.components.instances.push(Some(data));
assert_eq!(expected, ret);
ret
}
}
impl ComponentStoreData {
pub fn next_component_instance_id(&self) -> ComponentInstanceId {
self.instances.next_key()
}
#[cfg(feature = "component-model-async")]
pub(crate) fn drop_fibers(store: &mut StoreOpaque) {
_ = store;
}
}
impl StoreData {
pub(crate) fn component_instance(&self, id: ComponentInstanceId) -> &ComponentInstance {
self.components.instances[id].as_ref().unwrap().get()
}
pub(crate) fn component_instance_mut(
&mut self,
id: ComponentInstanceId,
) -> Pin<&mut ComponentInstance> {
self.components.instances[id].as_mut().unwrap().get_mut()
}
}
impl StoreOpaque {
pub(crate) fn component_instance(&self, id: ComponentInstanceId) -> &ComponentInstance {
self.store_data().component_instance(id)
}
}
#[repr(C)] #[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct StoreComponentInstanceId {
store_id: StoreId,
instance: ComponentInstanceId,
}
impl StoreComponentInstanceId {
pub(crate) fn new(
store_id: StoreId,
instance: ComponentInstanceId,
) -> StoreComponentInstanceId {
StoreComponentInstanceId { store_id, instance }
}
#[inline]
pub fn assert_belongs_to(&self, store: StoreId) {
self.store_id.assert_belongs_to(store)
}
#[inline]
pub(crate) fn instance(&self) -> ComponentInstanceId {
self.instance
}
pub(crate) fn get<'a>(&self, store: &'a StoreOpaque) -> &'a ComponentInstance {
self.assert_belongs_to(store.id());
store.component_instance(self.instance)
}
pub(crate) fn get_mut<'a>(&self, store: &'a mut StoreOpaque) -> Pin<&'a mut ComponentInstance> {
self.from_data_get_mut(store.store_data_mut())
}
pub(crate) fn from_data_get_mut<'a>(
&self,
store: &'a mut StoreData,
) -> Pin<&'a mut ComponentInstance> {
self.assert_belongs_to(store.id());
store.component_instance_mut(self.instance)
}
}