Bug 1350143: Don't allow debug mode when there's no more frames in wasm non-profiling iteration; r?yury draft
authorBenjamin Bouvier <benj@benj.me>
Fri, 24 Mar 2017 12:28:45 +0100
changeset 504734 309aadae8cb1065f3a6b37d1ce4c36a922e23b8c
parent 504732 ecc2d2326a0ee0e09c291752bee608bd345b3291
child 550709 a2484dd810df5b8160b849fc9d7a9631dc7356cb
push id50856
push userbbouvier@mozilla.com
push dateFri, 24 Mar 2017 16:07:50 +0000
reviewersyury
bugs1350143
milestone55.0a1
Bug 1350143: Don't allow debug mode when there's no more frames in wasm non-profiling iteration; r?yury MozReview-Commit-ID: 67FECD9GRho
js/src/jit-test/tests/wasm/timeout/debug-noprofiling.js
js/src/wasm/WasmFrameIterator.cpp
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/timeout/debug-noprofiling.js
@@ -0,0 +1,32 @@
+// |jit-test| exitstatus: 6;
+
+// Don't include wasm.js in timeout tests: when wasm isn't supported, it will
+// quit(0) which will cause the test to fail.
+if (!wasmIsSupported())
+    quit(6);
+
+newGlobal().Debugger().addDebuggee(this);
+
+var t = new WebAssembly.Table({
+    initial: 1,
+    element: "anyfunc"
+});
+
+new WebAssembly.Instance(new WebAssembly.Module(wasmTextToBinary(`
+(module
+    (func $iloop loop $top br $top end)
+    (import "imports" "t" (table1 anyfunc))
+    (elem (i32.const0) $iloop))
+`)), { imports: { t } });
+
+outer = new WebAssembly.Instance(new WebAssembly.Module(wasmTextToBinary(`
+(module
+    (import "imports" "t" (table1 anyfunc))
+    (type $v2v (func))
+    (func (export "run")
+        i32.const0
+        call_indirect $v2v)
+    )`)), { imports: { t } });
+
+timeout(1);
+outer.exports.run();
--- a/js/src/wasm/WasmFrameIterator.cpp
+++ b/js/src/wasm/WasmFrameIterator.cpp
@@ -221,25 +221,29 @@ FrameIterator::instance() const
     return FrameToDebugFrame(fp_)->instance();
 }
 
 bool
 FrameIterator::debugEnabled() const
 {
     MOZ_ASSERT(!done() && code_);
     MOZ_ASSERT_IF(!missingFrameMessage_, codeRange_->kind() == CodeRange::Function);
+    MOZ_ASSERT_IF(missingFrameMessage_, !codeRange_ && !fp_);
     // Only non-imported functions can have debug frames.
     return code_->metadata().debugEnabled &&
+           fp_ &&
+           !missingFrameMessage_ &&
            codeRange_->funcIndex() >= code_->metadata().funcImports.length();
 }
 
 DebugFrame*
 FrameIterator::debugFrame() const
 {
     MOZ_ASSERT(!done() && debugEnabled());
+    MOZ_ASSERT(fp_);
     return FrameToDebugFrame(fp_);
 }
 
 const CallSite*
 FrameIterator::debugTrapCallsite() const
 {
     MOZ_ASSERT(!done() && debugEnabled());
     MOZ_ASSERT(callsite_->kind() == CallSite::EnterFrame || callsite_->kind() == CallSite::LeaveFrame ||