[INFER] Make sure prevpc() values are intact when returning into the interpreter via js_InternalThrow.
authorBrian Hackett <bhackett1024@gmail.com>
Sat, 23 Jul 2011 08:10:18 -0700
changeset 77373 8c7adf094b8e51e7cdc55322bce7897502b50c24
parent 77372 4fbb36c1c9a3ad2aa3cdc7aec0841faf13886a74
child 77374 3ccf931079419c397420407d4eda196e99123222
push id78
push userclegnitto@mozilla.com
push dateFri, 16 Dec 2011 17:32:24 +0000
treeherdermozilla-release@79d24e644fdd [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone8.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
[INFER] Make sure prevpc() values are intact when returning into the interpreter via js_InternalThrow.
js/src/methodjit/InvokeHelpers.cpp
--- a/js/src/methodjit/InvokeHelpers.cpp
+++ b/js/src/methodjit/InvokeHelpers.cpp
@@ -589,16 +589,24 @@ js_InternalThrow(VMFrame &f)
          * Fall back to EnterMethodJIT and finish the frame in the interpreter.
          * With type inference enabled, we may wipe out all JIT code on the
          * stack without patching ncode values to jump to the interpreter, and
          * thus can only enter JIT code via EnterMethodJIT (which overwrites
          * its entry frame's ncode). See ClearAllFrames.
          */
         cx->compartment->jaegerCompartment()->setLastUnfinished(Jaeger_Unfinished);
 
+        /*
+         * Expanding inline frames will ensure that prevpc values are filled in
+         * for all frames on this VMFrame, without needing to walk the entire
+         * stack: downFramesExpanded() on a StackFrame also means the prevpc()
+         * values are also filled in.
+         */
+        ExpandInlineFrames(cx->compartment, true);
+
         analyze::AutoEnterAnalysis enter(cx);
         analyze::ScriptAnalysis *analysis = script->analysis(cx);
         if (analysis && !analysis->ranBytecode())
             analysis->analyzeBytecode(cx);
         if (!analysis || analysis->OOM()) {
             js_ReportOutOfMemory(cx);
             return NULL;
         }