Bug 1331064 - Ignore wasm onExceptionUnwind events in JSTRAP_ERROR state. r?shu draft
authorYury Delendik <ydelendik@mozilla.com>
Wed, 18 Jan 2017 14:53:33 -0600
changeset 463322 e06062e1fda9238379905a96338b6aa23bb4f5a2
parent 463197 b3774461acc6bee2216c5f57e167f9e5795fb09d
child 542635 e5da3b6a9f7c42ce9693351b47652b6c0a8ce9fc
push id42019
push userydelendik@mozilla.com
push dateWed, 18 Jan 2017 20:58:22 +0000
reviewersshu
bugs1331064
milestone53.0a1
Bug 1331064 - Ignore wasm onExceptionUnwind events in JSTRAP_ERROR state. r?shu MozReview-Commit-ID: BU8YzfFLqc1
js/src/jit-test/tests/debug/bug1331064.js
js/src/wasm/WasmTypes.cpp
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,17 +146,24 @@ 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);
+        // Assume JSTRAP_ERROR status if no exception is pending --
+        // no onExceptionUnwind handlers must be fired.
+        JSTrapStatus status;
+        if (!cx->isExceptionPending())
+            status = JSTRAP_ERROR;
+        else
+            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);