Added hashing to the StoreHandle and Funciton env in wasmer-js

This commit is contained in:
Syrus Akbary
2022-07-26 09:54:58 -07:00
parent eb9e73d3aa
commit abed65f074
2 changed files with 28 additions and 5 deletions

View File

@@ -10,7 +10,7 @@ use crate::js::{AsStoreMut, AsStoreRef, StoreMut, StoreRef};
/// The function environment data is owned by the `Store`. /// The function environment data is owned by the `Store`.
pub struct FunctionEnv<T> { pub struct FunctionEnv<T> {
pub(crate) handle: StoreHandle<VMFunctionEnvironment>, pub(crate) handle: StoreHandle<VMFunctionEnvironment>,
_phantom: PhantomData<T>, marker: PhantomData<T>,
} }
impl<T> FunctionEnv<T> { impl<T> FunctionEnv<T> {
@@ -24,14 +24,14 @@ impl<T> FunctionEnv<T> {
store.as_store_mut().objects_mut(), store.as_store_mut().objects_mut(),
VMFunctionEnvironment::new(value), VMFunctionEnvironment::new(value),
), ),
_phantom: PhantomData, marker: PhantomData,
} }
} }
pub(crate) fn from_handle(handle: StoreHandle<VMFunctionEnvironment>) -> Self { pub(crate) fn from_handle(handle: StoreHandle<VMFunctionEnvironment>) -> Self {
Self { Self {
handle, handle,
_phantom: PhantomData, marker: PhantomData,
} }
} }
@@ -71,11 +71,26 @@ impl<T> FunctionEnv<T> {
} }
} }
impl<T> PartialEq for FunctionEnv<T> {
fn eq(&self, other: &Self) -> bool {
self.handle == other.handle
}
}
impl<T> Eq for FunctionEnv<T> {}
impl<T> std::hash::Hash for FunctionEnv<T> {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.handle.hash(state);
self.marker.hash(state);
}
}
impl<T> Clone for FunctionEnv<T> { impl<T> Clone for FunctionEnv<T> {
fn clone(&self) -> Self { fn clone(&self) -> Self {
Self { Self {
handle: self.handle.clone(), handle: self.handle.clone(),
_phantom: self._phantom, marker: self.marker,
} }
} }
} }

View File

@@ -202,7 +202,7 @@ mod objects {
/// Every handle to an object managed by a context also contains the ID of the /// Every handle to an object managed by a context also contains the ID of the
/// context. This is used to check that a handle is always used with the /// context. This is used to check that a handle is always used with the
/// correct context. /// correct context.
#[derive(Debug, Copy, Clone, Eq, PartialEq)] #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub struct StoreId(NonZeroU64); pub struct StoreId(NonZeroU64);
impl Default for StoreId { impl Default for StoreId {
@@ -298,6 +298,14 @@ mod objects {
self.id == other.id self.id == other.id
} }
} }
impl<T> std::hash::Hash for StoreHandle<T> {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.id.hash(state);
self.internal.idx.hash(state);
}
}
impl<T> Clone for StoreHandle<T> { impl<T> Clone for StoreHandle<T> {
fn clone(&self) -> Self { fn clone(&self) -> Self {
Self { Self {