optimize
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index ba3be7b..bf35944 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -1405,11 +1405,11 @@
Signature getSignatureByFunctionIndex(Index index);
Signature getSignatureByTypeIndex(Index index);
- // The heap types of functions. This is cached for performance reasons, as
- // computing the heap type from the signature (stored in functionSignatures)
- // is not cheap.
+ // Cache a mapping of signatures to heap types. This lets us get the heap
+ // type of a function very efficiently, as computing the heap type from the
+ // signature (stored in functionSignatures) is not cheap.
// TODO: optimize that conversion and remove this
- std::vector<HeapType> functionTypes;
+ std::unordered_map<Signature, HeapType> signatureTypes;
HeapType getTypeByFunctionIndex(Index index);
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index c842fbf..5dad261 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -2113,15 +2113,12 @@
}
HeapType WasmBinaryBuilder::getTypeByFunctionIndex(Index index) {
- // functionTypes is grown on demand, and contains HeapType::any for
- // uninitialized elements, which we lazily fill.
- if (functionTypes.size() <= index) {
- functionTypes.resize(index + 1, HeapType::any);
+ auto sig = getSignatureByFunctionIndex(index);
+ auto iter = signatureTypes.find(sig);
+ if (iter != signatureTypes.end()) {
+ return iter->second;
}
- if (functionTypes[index] != HeapType::any) {
- return functionTypes[index];
- }
- return functionTypes[index] = HeapType(getSignatureByFunctionIndex(index));
+ return signatureTypes[sig] = HeapType(sig);
}
void WasmBinaryBuilder::readFunctions() {