summaryrefslogtreecommitdiff
path: root/src/wasm/wasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/wasm.cpp')
-rw-r--r--src/wasm/wasm.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp
index 26e6b369b..4975f4597 100644
--- a/src/wasm/wasm.cpp
+++ b/src/wasm/wasm.cpp
@@ -300,6 +300,30 @@ void CallIndirect::finalize() {
}
}
+HeapType CallIndirect::getHeapType(Module* module) {
+ auto heapType = HeapType(sig);
+ // See comment in wasm.h
+ if (module) {
+ // The table may not yet exist if the wasm module is still being
+ // constructed. This should perhaps be an error, but as this is a hack for
+ // the time being, handle this the same as the case where module is null.
+ // Note: table_ (with underscore) is needed as |table| is a field on |this|.
+ if (auto* table_ = module->getTableOrNull(table)) {
+ // The wasm spec may allow more things eventually, and if so we'd need to
+ // add more checking here.
+ assert(table_->type.isRef());
+ auto tableHeapType = table_->type.getHeapType();
+ if (tableHeapType.isSignature()) {
+ auto tableSig = tableHeapType.getSignature();
+ if (sig == tableSig) {
+ heapType = tableHeapType;
+ }
+ }
+ }
+ }
+ return heapType;
+}
+
bool LocalSet::isTee() const { return type != Type::none; }
// Changes to local.tee. The type of the local should be given.