1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
use crate::{PrimaryMap, SignatureIndex, WasmFuncType};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::ops::Index;
#[derive(Default, Serialize, Deserialize)]
#[allow(missing_docs)]
pub struct ModuleTypes {
wasm_signatures: PrimaryMap<SignatureIndex, WasmFuncType>,
}
impl ModuleTypes {
pub fn wasm_signatures(&self) -> impl Iterator<Item = (SignatureIndex, &WasmFuncType)> {
self.wasm_signatures.iter()
}
}
impl Index<SignatureIndex> for ModuleTypes {
type Output = WasmFuncType;
fn index(&self, sig: SignatureIndex) -> &WasmFuncType {
&self.wasm_signatures[sig]
}
}
#[derive(Default)]
#[allow(missing_docs)]
pub struct ModuleTypesBuilder {
types: ModuleTypes,
interned_func_types: HashMap<WasmFuncType, SignatureIndex>,
}
impl ModuleTypesBuilder {
pub fn reserve_wasm_signatures(&mut self, amt: usize) {
self.types.wasm_signatures.reserve(amt);
}
pub fn wasm_func_type(&mut self, sig: WasmFuncType) -> SignatureIndex {
if let Some(idx) = self.interned_func_types.get(&sig) {
return *idx;
}
let idx = self.types.wasm_signatures.push(sig.clone());
self.interned_func_types.insert(sig, idx);
return idx;
}
pub fn finish(self) -> ModuleTypes {
self.types
}
}
impl<T> Index<T> for ModuleTypesBuilder
where
ModuleTypes: Index<T>,
{
type Output = <ModuleTypes as Index<T>>::Output;
fn index(&self, sig: T) -> &Self::Output {
&self.types[sig]
}
}