static void CloseLiveIterators(JSContext *cx, const InlineFrameIterator &frame) { AssertCanGC(); RootedScript script(cx, frame.script()); jsbytecode *pc = frame.pc(); if (!script->hasTrynotes()) return; JSTryNote *tn = script->trynotes()->vector; JSTryNote *tnEnd = tn + script->trynotes()->length; uint32 pcOffset = uint32(pc - script->main()); for (; tn != tnEnd; ++tn) { if (pcOffset < tn->start) continue; if (pcOffset >= tn->start + tn->length) continue; if (tn->kind != JSTRY_ITER) continue; JS_ASSERT(JSOp(*(script->main() + tn->start + tn->length)) == JSOP_ENDITER); JS_ASSERT(tn->stackDepth > 0); uint32 localSlot = tn->stackDepth; CloseLiveIterator(cx, frame, localSlot); } }
RematerializedFrame::RematerializedFrame(JSContext *cx, uint8_t *top, unsigned numActualArgs, InlineFrameIterator &iter, MaybeReadFallback &fallback) : prevUpToDate_(false), isDebuggee_(iter.script()->isDebuggee()), top_(top), pc_(iter.pc()), frameNo_(iter.frameNo()), numActualArgs_(numActualArgs), script_(iter.script()) { CopyValueToRematerializedFrame op(slots_); iter.readFrameArgsAndLocals(cx, op, op, &scopeChain_, &hasCallObj_, &returnValue_, &argsObj_, &thisValue_, ReadFrame_Actuals, fallback); }
RematerializedFrame::RematerializedFrame(JSContext* cx, uint8_t* top, unsigned numActualArgs, InlineFrameIterator& iter, MaybeReadFallback& fallback) : prevUpToDate_(false), isDebuggee_(iter.script()->isDebuggee()), isConstructing_(iter.isConstructing()), hasCachedSavedFrame_(false), top_(top), pc_(iter.pc()), frameNo_(iter.frameNo()), numActualArgs_(numActualArgs), script_(iter.script()) { if (iter.isFunctionFrame()) callee_ = iter.callee(fallback); else callee_ = nullptr; CopyValueToRematerializedFrame op(slots_); iter.readFrameArgsAndLocals(cx, op, op, &scopeChain_, &hasCallObj_, &returnValue_, &argsObj_, &thisArgument_, ReadFrame_Actuals, fallback); }