summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-validator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/wasm-validator.cpp')
-rw-r--r--src/wasm/wasm-validator.cpp14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp
index 696c50d8b..8cf456409 100644
--- a/src/wasm/wasm-validator.cpp
+++ b/src/wasm/wasm-validator.cpp
@@ -445,7 +445,12 @@ private:
}
template<typename T>
- void validateCallParamsAndResult(T* curr, Signature sig) {
+ void validateCallParamsAndResult(T* curr, HeapType sigType) {
+ if (!shouldBeTrue(
+ sigType.isSignature(), curr, "Heap type must be a signature type")) {
+ return;
+ }
+ auto sig = sigType.getSignature();
if (!shouldBeTrue(curr->operands.size() == sig.params.size(),
curr,
"call* param number must match")) {
@@ -792,7 +797,7 @@ void FunctionValidator::visitCall(Call* curr) {
if (!shouldBeTrue(!!target, curr, "call target must exist")) {
return;
}
- validateCallParamsAndResult(curr, target->getSig());
+ validateCallParamsAndResult(curr, target->type);
}
void FunctionValidator::visitCallIndirect(CallIndirect* curr) {
@@ -812,7 +817,7 @@ void FunctionValidator::visitCallIndirect(CallIndirect* curr) {
}
}
- validateCallParamsAndResult(curr, curr->sig);
+ validateCallParamsAndResult(curr, curr->heapType);
}
void FunctionValidator::visitConst(Const* curr) {
@@ -2322,8 +2327,7 @@ void FunctionValidator::visitCallRef(CallRef* curr) {
shouldBeTrue(curr->target->type.isFunction(),
curr,
"call_ref target must be a function reference");
- validateCallParamsAndResult(
- curr, curr->target->type.getHeapType().getSignature());
+ validateCallParamsAndResult(curr, curr->target->type.getHeapType());
}
}