Bug 1231964 - Move CC participant code that touches JS out of mozglue. r=smaug
authorAndrew McCreight <continuation@gmail.com>
Fri, 18 Dec 2015 14:22:01 -0800
changeset 277084 93179299ab59cd47bd025e50eba38430154f0a06
parent 277083 9c29c0efe6914da335b79b239a0d1cd363cee988
child 277085 b09b2b6f9f3744f6e7692a665a72184005398ca4
push id16724
push usercbook@mozilla.com
push dateMon, 21 Dec 2015 11:00:52 +0000
treeherderfx-team@3f3f0361567c [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerssmaug
bugs1231964, 1120016
milestone46.0a1
Bug 1231964 - Move CC participant code that touches JS out of mozglue. r=smaug The JS engine does not export symbols outside of XUL, so having these defined inside mozglue apparently causes linking errors on some platforms with the patches in bug 1120016. This patch moves enough methods outside of mozglue that the patch in that other bug will still link on all platforms, without moving so much out that there are other linking errors.
xpcom/base/moz.build
xpcom/base/nsCycleCollectorTraceJSHelpers.cpp
xpcom/glue/nsCycleCollectionParticipant.cpp
xpcom/glue/nsCycleCollectionParticipant.h
--- a/xpcom/base/moz.build
+++ b/xpcom/base/moz.build
@@ -107,16 +107,17 @@ UNIFIED_SOURCES += [
     'DeferredFinalize.cpp',
     'ErrorNames.cpp',
     'HoldDropJSObjects.cpp',
     'JSObjectHolder.cpp',
     'Logging.cpp',
     'nsConsoleMessage.cpp',
     'nsConsoleService.cpp',
     'nsCycleCollector.cpp',
+    'nsCycleCollectorTraceJSHelpers.cpp',
     'nsDumpUtils.cpp',
     'nsErrorService.cpp',
     'nsGZFileWriter.cpp',
     'nsInterfaceRequestorAgg.cpp',
     'nsMemoryImpl.cpp',
     'nsMemoryInfoDumper.cpp',
     'nsMemoryReporterManager.cpp',
     'nsMessageLoop.cpp',
copy from xpcom/glue/nsCycleCollectionParticipant.cpp
copy to xpcom/base/nsCycleCollectorTraceJSHelpers.cpp
--- a/xpcom/glue/nsCycleCollectionParticipant.cpp
+++ b/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp
@@ -1,25 +1,29 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsCycleCollectionParticipant.h"
-#include "mozilla/CycleCollectedJSRuntime.h"
-#include "nsCOMPtr.h"
 #include "jsapi.h"
 #include "jsfriendapi.h"
 
-#ifdef MOZILLA_INTERNAL_API
-#include "nsString.h"
-#else
-#include "nsStringAPI.h"
-#endif
+void
+CycleCollectionNoteEdgeNameImpl(nsCycleCollectionTraversalCallback& aCallback,
+                                const char* aName,
+                                uint32_t aFlags)
+{
+  nsAutoCString arrayEdgeName(aName);
+  if (aFlags & CycleCollectionEdgeNameArrayFlag) {
+    arrayEdgeName.AppendLiteral("[i]");
+  }
+  aCallback.NoteNextEdgeName(arrayEdgeName.get());
+}
 
 void
 nsScriptObjectTracer::NoteJSChild(JS::GCCellPtr aGCThing, const char* aName,
                                   void* aClosure)
 {
   nsCycleCollectionTraversalCallback* cb =
     static_cast<nsCycleCollectionTraversalCallback*>(aClosure);
   NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(*cb, aName);
@@ -27,59 +31,16 @@ nsScriptObjectTracer::NoteJSChild(JS::GC
     cb->NoteJSObject(&aGCThing.as<JSObject>());
   } else if (aGCThing.is<JSScript>()) {
     cb->NoteJSScript(&aGCThing.as<JSScript>());
   } else {
     MOZ_ASSERT(!mozilla::AddToCCKind(aGCThing.kind()));
   }
 }
 
-NS_IMETHODIMP_(void)
-nsXPCOMCycleCollectionParticipant::Root(void* aPtr)
-{
-  nsISupports* s = static_cast<nsISupports*>(aPtr);
-  NS_ADDREF(s);
-}
-
-NS_IMETHODIMP_(void)
-nsXPCOMCycleCollectionParticipant::Unroot(void* aPtr)
-{
-  nsISupports* s = static_cast<nsISupports*>(aPtr);
-  NS_RELEASE(s);
-}
-
-// We define a default trace function because some participants don't need
-// to trace anything, so it is okay for them not to define one.
-NS_IMETHODIMP_(void)
-nsXPCOMCycleCollectionParticipant::Trace(void* aPtr, const TraceCallbacks& aCb,
-                                         void* aClosure)
-{
-}
-
-bool
-nsXPCOMCycleCollectionParticipant::CheckForRightISupports(nsISupports* aSupports)
-{
-  nsISupports* foo;
-  aSupports->QueryInterface(NS_GET_IID(nsCycleCollectionISupports),
-                            reinterpret_cast<void**>(&foo));
-  return aSupports == foo;
-}
-
-void
-CycleCollectionNoteEdgeNameImpl(nsCycleCollectionTraversalCallback& aCallback,
-                                const char* aName,
-                                uint32_t aFlags)
-{
-  nsAutoCString arrayEdgeName(aName);
-  if (aFlags & CycleCollectionEdgeNameArrayFlag) {
-    arrayEdgeName.AppendLiteral("[i]");
-  }
-  aCallback.NoteNextEdgeName(arrayEdgeName.get());
-}
-
 void
 TraceCallbackFunc::Trace(JS::Heap<JS::Value>* aPtr, const char* aName,
                          void* aClosure) const
 {
   if (aPtr->isMarkable()) {
     mCallback(JS::GCCellPtr(*aPtr), aName, aClosure);
   }
 }
--- a/xpcom/glue/nsCycleCollectionParticipant.cpp
+++ b/xpcom/glue/nsCycleCollectionParticipant.cpp
@@ -1,41 +1,16 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsCycleCollectionParticipant.h"
-#include "mozilla/CycleCollectedJSRuntime.h"
 #include "nsCOMPtr.h"
-#include "jsapi.h"
-#include "jsfriendapi.h"
-
-#ifdef MOZILLA_INTERNAL_API
-#include "nsString.h"
-#else
-#include "nsStringAPI.h"
-#endif
-
-void
-nsScriptObjectTracer::NoteJSChild(JS::GCCellPtr aGCThing, const char* aName,
-                                  void* aClosure)
-{
-  nsCycleCollectionTraversalCallback* cb =
-    static_cast<nsCycleCollectionTraversalCallback*>(aClosure);
-  NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(*cb, aName);
-  if (aGCThing.is<JSObject>()) {
-    cb->NoteJSObject(&aGCThing.as<JSObject>());
-  } else if (aGCThing.is<JSScript>()) {
-    cb->NoteJSScript(&aGCThing.as<JSScript>());
-  } else {
-    MOZ_ASSERT(!mozilla::AddToCCKind(aGCThing.kind()));
-  }
-}
 
 NS_IMETHODIMP_(void)
 nsXPCOMCycleCollectionParticipant::Root(void* aPtr)
 {
   nsISupports* s = static_cast<nsISupports*>(aPtr);
   NS_ADDREF(s);
 }
 
@@ -57,73 +32,8 @@ nsXPCOMCycleCollectionParticipant::Trace
 bool
 nsXPCOMCycleCollectionParticipant::CheckForRightISupports(nsISupports* aSupports)
 {
   nsISupports* foo;
   aSupports->QueryInterface(NS_GET_IID(nsCycleCollectionISupports),
                             reinterpret_cast<void**>(&foo));
   return aSupports == foo;
 }
-
-void
-CycleCollectionNoteEdgeNameImpl(nsCycleCollectionTraversalCallback& aCallback,
-                                const char* aName,
-                                uint32_t aFlags)
-{
-  nsAutoCString arrayEdgeName(aName);
-  if (aFlags & CycleCollectionEdgeNameArrayFlag) {
-    arrayEdgeName.AppendLiteral("[i]");
-  }
-  aCallback.NoteNextEdgeName(arrayEdgeName.get());
-}
-
-void
-TraceCallbackFunc::Trace(JS::Heap<JS::Value>* aPtr, const char* aName,
-                         void* aClosure) const
-{
-  if (aPtr->isMarkable()) {
-    mCallback(JS::GCCellPtr(*aPtr), aName, aClosure);
-  }
-}
-
-void
-TraceCallbackFunc::Trace(JS::Heap<jsid>* aPtr, const char* aName,
-                         void* aClosure) const
-{
-  if (JSID_IS_GCTHING(*aPtr)) {
-    mCallback(JSID_TO_GCTHING(*aPtr), aName, aClosure);
-  }
-}
-
-void
-TraceCallbackFunc::Trace(JS::Heap<JSObject*>* aPtr, const char* aName,
-                         void* aClosure) const
-{
-  mCallback(JS::GCCellPtr(aPtr->get()), aName, aClosure);
-}
-
-void
-TraceCallbackFunc::Trace(JS::TenuredHeap<JSObject*>* aPtr, const char* aName,
-                         void* aClosure) const
-{
-  mCallback(JS::GCCellPtr(aPtr->getPtr()), aName, aClosure);
-}
-
-void
-TraceCallbackFunc::Trace(JS::Heap<JSFunction*>* aPtr, const char* aName,
-                         void* aClosure) const
-{
-  mCallback(JS::GCCellPtr(aPtr->get()), aName, aClosure);
-}
-
-void
-TraceCallbackFunc::Trace(JS::Heap<JSString*>* aPtr, const char* aName,
-                         void* aClosure) const
-{
-  mCallback(JS::GCCellPtr(aPtr->get()), aName, aClosure);
-}
-
-void
-TraceCallbackFunc::Trace(JS::Heap<JSScript*>* aPtr, const char* aName,
-                         void* aClosure) const
-{
-  mCallback(JS::GCCellPtr(aPtr->get()), aName, aClosure);
-}
--- a/xpcom/glue/nsCycleCollectionParticipant.h
+++ b/xpcom/glue/nsCycleCollectionParticipant.h
@@ -71,17 +71,17 @@ struct TraceCallbacks
   virtual void Trace(JS::Heap<JSScript*>* aPtr, const char* aName,
                      void* aClosure) const = 0;
   virtual void Trace(JS::Heap<JSFunction*>* aPtr, const char* aName,
                      void* aClosure) const = 0;
 };
 
 /*
  * An implementation of TraceCallbacks that calls a single function for all JS
- * GC thing types encountered.
+ * GC thing types encountered. Implemented in nsCycleCollectorTraceJSHelpers.cpp.
  */
 struct TraceCallbackFunc : public TraceCallbacks
 {
   typedef void (*Func)(JS::GCCellPtr aPtr, const char* aName, void* aClosure);
 
   explicit TraceCallbackFunc(Func aCb) : mCallback(aCb) {}
 
   virtual void Trace(JS::Heap<JS::Value>* aPtr, const char* aName,
@@ -179,16 +179,17 @@ public:
   MOZ_CONSTEXPR explicit nsScriptObjectTracer(bool aSkip)
     : nsCycleCollectionParticipant(aSkip)
   {
   }
 
   NS_IMETHOD_(void) Trace(void* aPtr, const TraceCallbacks& aCb,
                           void* aClosure) override = 0;
 
+  // Implemented in nsCycleCollectorTraceJSHelpers.cpp.
   static void NoteJSChild(JS::GCCellPtr aGCThing, const char* aName,
                           void* aClosure);
 };
 
 class NS_NO_VTABLE nsXPCOMCycleCollectionParticipant : public nsScriptObjectTracer
 {
 public:
   MOZ_CONSTEXPR nsXPCOMCycleCollectionParticipant()