Bug 1331064 - Ignore wasm onExceptionUnwind events in JSTRAP_ERROR state. r=luke
MozReview-Commit-ID: BU8YzfFLqc1
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/bug1331064.js
@@ -0,0 +1,22 @@
+// |jit-test| test-also-wasm-baseline; exitstatus: 3
+
+load(libdir + "asserts.js");
+
+if (!wasmIsSupported())
+ quit(3);
+
+var g = newGlobal();
+g.parent = this;
+g.eval("new Debugger(parent).onExceptionUnwind = function () { some_error; };");
+
+var module = new WebAssembly.Module(wasmTextToBinary(`
+(module
+ (import $imp "a" "b" (result i32))
+ (func $call (result i32) (call 0))
+ (export "call" $call)
+)`));
+
+var instance = new WebAssembly.Instance(module, { a: { b: () => {
+ some_other_error;
+}}});
+instance.exports.call();
--- a/js/src/wasm/WasmTypes.cpp
+++ b/js/src/wasm/WasmTypes.cpp
@@ -146,22 +146,26 @@ WasmHandleThrow()
JSContext* cx = activation->cx();
for (FrameIterator iter(activation, FrameIterator::Unwind::True); !iter.done(); ++iter) {
if (!iter.debugEnabled())
continue;
DebugFrame* frame = iter.debugFrame();
- JSTrapStatus status = Debugger::onExceptionUnwind(cx, frame);
- if (status == JSTRAP_RETURN) {
- // Unexpected trap return -- raising error since throw recovery
- // is not yet implemented in the wasm baseline.
- // TODO properly handle JSTRAP_RETURN and resume wasm execution.
- JS_ReportErrorASCII(cx, "Unexpected resumption value from onExceptionUnwind");
+ // Assume JSTRAP_ERROR status if no exception is pending --
+ // no onExceptionUnwind handlers must be fired.
+ if (cx->isExceptionPending()) {
+ JSTrapStatus status = Debugger::onExceptionUnwind(cx, frame);
+ if (status == JSTRAP_RETURN) {
+ // Unexpected trap return -- raising error since throw recovery
+ // is not yet implemented in the wasm baseline.
+ // TODO properly handle JSTRAP_RETURN and resume wasm execution.
+ JS_ReportErrorASCII(cx, "Unexpected resumption value from onExceptionUnwind");
+ }
}
bool ok = Debugger::onLeaveFrame(cx, frame, nullptr, false);
if (ok) {
// Unexpected success from the handler onLeaveFrame -- raising error
// since throw recovery is not yet implemented in the wasm baseline.
// TODO properly handle success and resume wasm execution.
JS_ReportErrorASCII(cx, "Unexpected success from onLeaveFrame");