From 35b152a5a6c6e8c9aa6aa2df09dbe0e1a89107ae Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Wed, 3 May 2017 00:20:58 +0200 Subject: [PATCH] Backed out changeset 8cbc5f3bf065 (bug 935809) --- js/src/vm/Debugger.cpp | 39 ++++++++++++++++++--------- js/src/vm/Debugger.h | 60 ++++++------------------------------------ 2 files changed, 35 insertions(+), 64 deletions(-) diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index f279c883fc49..1c73ac07d1d5 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -524,6 +524,7 @@ RequireGlobalObject(JSContext* cx, HandleValue dbgobj, HandleObject referent) BreakpointSite::BreakpointSite(Type type) : type_(type), enabledCount(0) { + JS_INIT_CLIST(&breakpoints); } void @@ -546,22 +547,21 @@ BreakpointSite::dec(FreeOp* fop) bool BreakpointSite::isEmpty() const { - return breakpoints.isEmpty(); + return JS_CLIST_IS_EMPTY(&breakpoints); } Breakpoint* BreakpointSite::firstBreakpoint() const { - if (isEmpty()) + if (JS_CLIST_IS_EMPTY(&breakpoints)) return nullptr; - return &(*breakpoints.begin()); + return Breakpoint::fromSiteLinks(JS_NEXT_LINK(&breakpoints)); } bool -BreakpointSite::hasBreakpoint(Breakpoint* toFind) +BreakpointSite::hasBreakpoint(Breakpoint* bp) { - const BreakpointList::Iterator bp(toFind); - for (auto p = breakpoints.begin(); p; p++) + for (Breakpoint* p = firstBreakpoint(); p; p = p->nextInSite()) if (p == bp) return true; return false; @@ -571,8 +571,20 @@ Breakpoint::Breakpoint(Debugger* debugger, BreakpointSite* site, JSObject* handl : debugger(debugger), site(site), handler(handler) { MOZ_ASSERT(handler->compartment() == debugger->object->compartment()); - debugger->breakpoints.pushBack(this); - site->breakpoints.pushBack(this); + JS_APPEND_LINK(&debuggerLinks, &debugger->breakpoints); + JS_APPEND_LINK(&siteLinks, &site->breakpoints); +} + +Breakpoint* +Breakpoint::fromDebuggerLinks(JSCList* links) +{ + return (Breakpoint*) ((unsigned char*) links - offsetof(Breakpoint, debuggerLinks)); +} + +Breakpoint* +Breakpoint::fromSiteLinks(JSCList* links) +{ + return (Breakpoint*) ((unsigned char*) links - offsetof(Breakpoint, siteLinks)); } void @@ -580,8 +592,8 @@ Breakpoint::destroy(FreeOp* fop) { if (debugger->enabled) site->dec(fop); - debugger->breakpoints.remove(this); - site->breakpoints.remove(this); + JS_REMOVE_LINK(&debuggerLinks); + JS_REMOVE_LINK(&siteLinks); site->destroyIfEmpty(fop); fop->delete_(this); } @@ -589,13 +601,15 @@ Breakpoint::destroy(FreeOp* fop) Breakpoint* Breakpoint::nextInDebugger() { - return debuggerLink.mNext; + JSCList* link = JS_NEXT_LINK(&debuggerLinks); + return (link == &debugger->breakpoints) ? nullptr : fromDebuggerLinks(link); } Breakpoint* Breakpoint::nextInSite() { - return siteLink.mNext; + JSCList* link = JS_NEXT_LINK(&siteLinks); + return (link == &site->breakpoints) ? nullptr : fromSiteLinks(link); } JSBreakpointSite::JSBreakpointSite(JSScript* script, jsbytecode* pc) @@ -670,6 +684,7 @@ Debugger::Debugger(JSContext* cx, NativeObject* dbg) { assertSameCompartment(cx, dbg); + JS_INIT_CLIST(&breakpoints); JS_INIT_CLIST(&onNewGlobalObjectWatchersLink); #ifdef JS_TRACE_LOGGING diff --git a/js/src/vm/Debugger.h b/js/src/vm/Debugger.h index 52f8369effc0..c52dbd912081 100644 --- a/js/src/vm/Debugger.h +++ b/js/src/vm/Debugger.h @@ -7,7 +7,6 @@ #ifndef vm_Debugger_h #define vm_Debugger_h -#include "mozilla/DoublyLinkedList.h" #include "mozilla/GuardObjects.h" #include "mozilla/LinkedList.h" #include "mozilla/Range.h" @@ -386,27 +385,7 @@ class Debugger : private mozilla::LinkedListElement // Whether to enable code coverage on the Debuggee. bool collectCoverageInfo; - template - struct DebuggerSiblingAccess { - static T* GetNext(T* elm) { - return elm->debuggerLink.mNext; - } - static void SetNext(T* elm, T* next) { - elm->debuggerLink.mNext = next; - } - static T* GetPrev(T* elm) { - return elm->debuggerLink.mPrev; - } - static void SetPrev(T* elm, T* prev) { - elm->debuggerLink.mPrev = prev; - } - }; - - // List of all js::Breakpoints in this debugger. - using BreakpointList = - mozilla::DoublyLinkedList>; - BreakpointList breakpoints; + JSCList breakpoints; /* Circular list of all js::Breakpoints in this debugger */ // The set of GC numbers for which one or more of this Debugger's observed // debuggees participated in. @@ -1583,27 +1562,7 @@ class BreakpointSite { private: Type type_; - template - struct SiteSiblingAccess { - static T* GetNext(T* elm) { - return elm->siteLink.mNext; - } - static void SetNext(T* elm, T* next) { - elm->siteLink.mNext = next; - } - static T* GetPrev(T* elm) { - return elm->siteLink.mPrev; - } - static void SetPrev(T* elm, T* prev) { - elm->siteLink.mPrev = prev; - } - }; - - // List of all js::Breakpoints at this instruction. - using BreakpointList = - mozilla::DoublyLinkedList>; - BreakpointList breakpoints; + JSCList breakpoints; /* cyclic list of all js::Breakpoints at this instruction */ size_t enabledCount; /* number of breakpoints in the list that are enabled */ protected: @@ -1647,7 +1606,6 @@ class BreakpointSite { class Breakpoint { friend struct ::JSCompartment; friend class Debugger; - friend class BreakpointSite; public: Debugger * const debugger; @@ -1655,14 +1613,12 @@ class Breakpoint { private: /* |handler| is marked unconditionally during minor GC. */ js::PreBarrieredObject handler; - - /** - * Link elements for each list this breakpoint can be in. - */ - mozilla::DoublyLinkedListElement debuggerLink; - mozilla::DoublyLinkedListElement siteLink; + JSCList debuggerLinks; + JSCList siteLinks; public: + static Breakpoint* fromDebuggerLinks(JSCList* links); + static Breakpoint* fromSiteLinks(JSCList* links); Breakpoint(Debugger* debugger, BreakpointSite* site, JSObject* handler); void destroy(FreeOp* fop); Breakpoint* nextInDebugger(); @@ -1740,9 +1696,9 @@ Breakpoint::asWasm() Breakpoint* Debugger::firstBreakpoint() const { - if (breakpoints.isEmpty()) + if (JS_CLIST_IS_EMPTY(&breakpoints)) return nullptr; - return &(*breakpoints.begin()); + return Breakpoint::fromDebuggerLinks(JS_NEXT_LINK(&breakpoints)); } /* static */ Debugger*