use crate::vmcontext::VMSignatureHash;
use std::collections::HashMap;
use std::sync::RwLock;
use wasmer_types::{FunctionType, SignatureHash};
#[derive(Debug, Default)]
pub struct SignatureRegistry {
inner: RwLock<Inner>,
}
#[derive(Debug, Default)]
struct Inner {
signature_to_hash: HashMap<FunctionType, VMSignatureHash>,
hash_to_signature: HashMap<VMSignatureHash, FunctionType>,
}
impl SignatureRegistry {
pub fn new() -> Self {
Default::default()
}
pub fn register(&self, sig: &FunctionType, hash: SignatureHash) -> VMSignatureHash {
let mut inner = self.inner.write().unwrap();
if let Some(sig_hash) = inner.signature_to_hash.get(sig) {
return *sig_hash;
}
let sig_hash = VMSignatureHash::new(hash.0);
if inner.hash_to_signature.contains_key(&sig_hash) {
unreachable!("type signature collision");
}
inner.hash_to_signature.insert(sig_hash, sig.clone());
inner.signature_to_hash.insert(sig.clone(), sig_hash);
sig_hash
}
pub fn lookup_signature(&self, sig_hash: VMSignatureHash) -> Option<FunctionType> {
self.inner
.read()
.unwrap()
.hash_to_signature
.get(&sig_hash)
.cloned()
}
}