Bug 851459 - Don't use ScriptFrameIter in EnsureCanEnterIon. r=djvj
--- a/js/src/ion/BaselineIC.cpp
+++ b/js/src/ion/BaselineIC.cpp
@@ -574,27 +574,41 @@ ICStackCheck_Fallback::Compiler::generat
masm.push(BaselineStubReg);
return tailCallVM(DoStackCheckFallbackInfo, masm);
}
//
// UseCount_Fallback
//
+static bool
+IsTopFrameConstructing(JSContext *cx)
+{
+ IonFrameIterator iter(cx);
+ JS_ASSERT(iter.type() == IonFrame_Exit);
+
+ ++iter;
+ JS_ASSERT(iter.type() == IonFrame_BaselineStub);
+
+ ++iter;
+ JS_ASSERT(iter.isBaselineJS());
+
+ return iter.isConstructing();
+}
static bool
EnsureCanEnterIon(JSContext *cx, ICUseCount_Fallback *stub, BaselineFrame *frame,
HandleScript script, jsbytecode *pc, void **jitcodePtr)
{
JS_ASSERT(jitcodePtr);
JS_ASSERT(!*jitcodePtr);
bool isLoopEntry = (JSOp(*pc) == JSOP_LOOPENTRY);
- bool isConstructing = ScriptFrameIter(cx).isConstructing();
+ bool isConstructing = IsTopFrameConstructing(cx);
MethodStatus stat;
if (isLoopEntry) {
IonSpew(IonSpew_BaselineOSR, " Compile at loop entry!");
stat = CanEnterAtBranch(cx, script, frame, pc, isConstructing);
} else if (frame->isFunctionFrame()) {
IonSpew(IonSpew_BaselineOSR, " Compile function from top for later entry!");
stat = CompileFunctionForBaseline(cx, script, frame, isConstructing);
} else {