diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 866075c6d4a..56a9df9d1de 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -4824,7 +4824,11 @@ class ModuleRunnerBase : public ExpressionRunner { return funcFlow; } // Create a new continuation for the target function. - Name funcName = funcFlow.getSingleValue().getFunc(); + auto funcValue = funcFlow.getSingleValue(); + if (funcValue.isNull()) { + trap("null ref"); + } + auto funcName = funcValue.getFunc(); auto* func = self()->getModule()->getFunction(funcName); return Literal(std::make_shared( self()->makeFuncData(func->name, func->type), curr->type.getHeapType())); diff --git a/test/spec/cont.wast b/test/spec/cont.wast index 9e67a2dcd6a..8bfaf83c4d9 100644 --- a/test/spec/cont.wast +++ b/test/spec/cont.wast @@ -117,11 +117,17 @@ (call $nl4 (cont.new $k1 (ref.func $r1))) ) - (func (export "null") + (func (export "null-resume") (resume $k1 (ref.null $k1) ) ) + + (func (export "null-new") (result (ref null $k1)) + (cont.new $k1 + (ref.null $f1) + ) + ) ) (assert_suspension (invoke "unhandled-1") "unhandled") @@ -138,7 +144,8 @@ (assert_trap (invoke "non-linear-3") "continuation already consumed") (assert_trap (invoke "non-linear-4") "continuation already consumed") -(assert_trap (invoke "null") "null continuation reference") +(assert_trap (invoke "null-resume") "null continuation reference") +(assert_trap (invoke "null-new") "null function reference") (assert_invalid (module