use crate::prelude::*;
use crate::store::{StoreData, StoreOpaque, StoredData};
use crate::{AsContext, AsContextMut, Store, StoreContextMut};
const DEFAULT_HOSTCALL_FUEL: usize = 2 << 30;
macro_rules! component_store_data {
($($field:ident => $t:ty,)*) => (
pub struct ComponentStoreData {
$($field: Vec<$t>,)*
hostcall_fuel: usize,
}
$(
impl StoredData for $t {
#[inline]
fn list(data: &StoreData) -> &Vec<Self> {
&data.components.$field
}
#[inline]
fn list_mut(data: &mut StoreData) -> &mut Vec<Self> {
&mut data.components.$field
}
}
)*
impl Default for ComponentStoreData {
fn default() -> Self {
Self {
$($field: Default::default(),)*
hostcall_fuel: DEFAULT_HOSTCALL_FUEL,
}
}
}
)
}
component_store_data! {
funcs => crate::component::func::FuncData,
instances => Option<Box<crate::component::instance::InstanceData>>,
}
impl StoreOpaque {
pub(crate) fn hostcall_fuel(&self) -> usize {
self.store_data().components.hostcall_fuel
}
pub(crate) fn set_hostcall_fuel(&mut self, fuel: usize) {
self.store_data_mut().components.hostcall_fuel = fuel;
}
}
impl<T> Store<T> {
pub fn hostcall_fuel(&self) -> usize {
self.as_context().0.hostcall_fuel()
}
pub fn set_hostcall_fuel(&mut self, fuel: usize) {
self.as_context_mut().set_hostcall_fuel(fuel)
}
}
impl<T> StoreContextMut<'_, T> {
pub fn hostcall_fuel(&self) -> usize {
self.0.hostcall_fuel()
}
pub fn set_hostcall_fuel(&mut self, fuel: usize) {
self.0.set_hostcall_fuel(fuel)
}
}