From 2776d2837b8d45a4fb3cda365af8b1c1b6b87531 Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Thu, 15 Mar 2018 16:26:09 -0700 Subject: [PATCH] Bug 1444604: Part 6: Add LiveSavedFrameCache::findWithoutInvalidation. r=jorendorff --HG-- extra : rebase_source : bbe26f26f0ae8e0f30e6505e1614c3ae4a320300 extra : histedit_source : fa29282837885902c7a5413cce34ef71e8b444d3 --- js/src/vm/SavedStacks.cpp | 18 ++++++++++++++++++ js/src/vm/Stack.h | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/js/src/vm/SavedStacks.cpp b/js/src/vm/SavedStacks.cpp index 68f0d70c0547..bdcc7f92f332 100644 --- a/js/src/vm/SavedStacks.cpp +++ b/js/src/vm/SavedStacks.cpp @@ -156,6 +156,24 @@ LiveSavedFrameCache::find(JSContext* cx, FramePtr& framePtr, const jsbytecode* p frame.set(frames->back().savedFrame); } +void +LiveSavedFrameCache::findWithoutInvalidation(const FramePtr& framePtr, + MutableHandleSavedFrame frame) const +{ + MOZ_ASSERT(initialized()); + MOZ_ASSERT(framePtr.hasCachedSavedFrame()); + + Key key(framePtr); + for (auto& entry : (*frames)) { + if (entry.key == key) { + frame.set(entry.savedFrame); + return; + } + } + + frame.set(nullptr); +} + struct SavedFrame::Lookup { Lookup(JSAtom* source, uint32_t line, uint32_t column, JSAtom* functionDisplayName, JSAtom* asyncCause, SavedFrame* parent, diff --git a/js/src/vm/Stack.h b/js/src/vm/Stack.h index 2663bd640695..8717a7018f22 100644 --- a/js/src/vm/Stack.h +++ b/js/src/vm/Stack.h @@ -1357,6 +1357,11 @@ class LiveSavedFrameCache void find(JSContext* cx, FramePtr& framePtr, const jsbytecode* pc, MutableHandleSavedFrame frame) const; + // Search the cache for a frame matching |framePtr|, without removing any + // entries. Return the matching saved frame, or nullptr if none is found. + // This is used for resolving |evalInFramePrev| links. + void findWithoutInvalidation(const FramePtr& framePtr, MutableHandleSavedFrame frame) const; + // Push a cache entry mapping |framePtr| and |pc| to |savedFrame| on the top // of the cache's stack. You must insert entries for frames from oldest to // youngest. They must all be younger than the frame that the |find| method