void LiveSavedFrameCache::find(JSContext* cx, FrameIter& frameIter, MutableHandleSavedFrame frame) const { MOZ_ASSERT(initialized()); MOZ_ASSERT(!frameIter.done()); MOZ_ASSERT(frameIter.hasCachedSavedFrame()); Maybe<FramePtr> maybeFramePtr = getFramePtr(frameIter); MOZ_ASSERT(maybeFramePtr.isSome()); FramePtr framePtr(*maybeFramePtr); jsbytecode* pc = frameIter.pc(); size_t numberStillValid = 0; frame.set(nullptr); for (auto* p = frames->begin(); p < frames->end(); p++) { numberStillValid++; if (framePtr == p->framePtr && pc == p->pc) { frame.set(p->savedFrame); break; } } if (!frame) { frames->clear(); return; } MOZ_ASSERT(0 < numberStillValid && numberStillValid <= frames->length()); if (frame->compartment() != cx->compartment()) { frame.set(nullptr); numberStillValid--; } // Everything after the cached SavedFrame are stale younger frames we have // since popped. frames->shrinkBy(frames->length() - numberStillValid); }