Bumping manifests a=b2g-bump
[gecko.git] / dom / base / nsWrapperCache.cpp
blob6dc3f9603036d2c6ff3a7a4e56e2d5f845e75958
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "nsWrapperCacheInlines.h"
9 #include "jsproxy.h"
10 #include "mozilla/dom/DOMJSProxyHandler.h"
11 #include "mozilla/HoldDropJSObjects.h"
12 #include "nsCycleCollectionTraversalCallback.h"
13 #include "nsCycleCollector.h"
15 using namespace mozilla;
16 using namespace mozilla::dom;
18 /* static */ void
19 nsWrapperCache::HoldJSObjects(void* aScriptObjectHolder,
20 nsScriptObjectTracer* aTracer)
22 cyclecollector::HoldJSObjectsImpl(aScriptObjectHolder, aTracer);
25 void
26 nsWrapperCache::ReleaseWrapper(void* aScriptObjectHolder)
28 if (PreservingWrapper()) {
29 // PreserveWrapper puts new DOM bindings in the JS holders hash, but they
30 // can also be in the DOM expando hash, so we need to try to remove them
31 // from both here.
32 JSObject* obj = GetWrapperPreserveColor();
33 if (IsDOMBinding() && obj && js::IsProxy(obj)) {
34 DOMProxyHandler::GetAndClearExpandoObject(obj);
36 SetPreservingWrapper(false);
37 cyclecollector::DropJSObjectsImpl(aScriptObjectHolder);
41 #ifdef DEBUG
43 class DebugWrapperTraversalCallback : public nsCycleCollectionTraversalCallback
45 public:
46 explicit DebugWrapperTraversalCallback(void* aWrapper)
47 : mFound(false)
48 , mWrapper(aWrapper)
50 mFlags = WANT_ALL_TRACES;
53 NS_IMETHOD_(void) DescribeRefCountedNode(nsrefcnt aRefCount,
54 const char* aObjName)
57 NS_IMETHOD_(void) DescribeGCedNode(bool aIsMarked,
58 const char* aObjName,
59 uint64_t aCompartmentAddress)
63 NS_IMETHOD_(void) NoteJSChild(void* aChild)
65 if (aChild == mWrapper) {
66 mFound = true;
69 NS_IMETHOD_(void) NoteXPCOMChild(nsISupports* aChild)
72 NS_IMETHOD_(void) NoteNativeChild(void* aChild,
73 nsCycleCollectionParticipant* aHelper)
77 NS_IMETHOD_(void) NoteNextEdgeName(const char* aName)
81 bool mFound;
83 private:
84 void* mWrapper;
87 static void
88 DebugWrapperTraceCallback(void* aP, const char* aName, void* aClosure)
90 DebugWrapperTraversalCallback* callback =
91 static_cast<DebugWrapperTraversalCallback*>(aClosure);
92 callback->NoteJSChild(aP);
95 void
96 nsWrapperCache::CheckCCWrapperTraversal(void* aScriptObjectHolder,
97 nsScriptObjectTracer* aTracer)
99 JSObject* wrapper = GetWrapper();
100 if (!wrapper) {
101 return;
104 DebugWrapperTraversalCallback callback(wrapper);
106 aTracer->Traverse(aScriptObjectHolder, callback);
107 MOZ_ASSERT(callback.mFound,
108 "Cycle collection participant didn't traverse to preserved "
109 "wrapper! This will probably crash.");
111 callback.mFound = false;
112 aTracer->Trace(aScriptObjectHolder,
113 TraceCallbackFunc(DebugWrapperTraceCallback), &callback);
114 MOZ_ASSERT(callback.mFound,
115 "Cycle collection participant didn't trace preserved wrapper! "
116 "This will probably crash.");
119 #endif // DEBUG