1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 * http://www.mozilla.org/MPL/
10 * Software distributed under the License is distributed on an "AS IS" basis,
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 * for the specific language governing rights and limitations under the
15 * The Original Code is mozilla.org code.
17 * The Initial Developer of the Original Code is
18 * The Mozilla Foundation.
19 * Portions created by the Initial Developer are Copyright (C) 2006
20 * the Initial Developer. All Rights Reserved.
24 * Alternatively, the contents of this file may be used under the terms of
25 * either of the GNU General Public License Version 2 or later (the "GPL"),
26 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
36 * ***** END LICENSE BLOCK ***** */
38 #ifndef nsCycleCollectionParticipant_h__
39 #define nsCycleCollectionParticipant_h__
41 #include "nsISupports.h"
43 // NOTE: If you use header files to define DEBUG_CC, you must do so here
44 // *and* in nsCycleCollector.h
47 #define NS_CYCLECOLLECTIONPARTICIPANT_IID \
52 { 0xa7, 0x30, 0xcc, 0xae, 0xdd, 0x10, 0x4c, 0xf9 } \
56 * Special IID to get at the base nsISupports for a class. Usually this is the
57 * canonical nsISupports pointer, but in the case of tearoffs for example it is
58 * the base nsISupports pointer of the tearoff. This allow the cycle collector
59 * to have separate nsCycleCollectionParticipant's for tearoffs or aggregated
62 #define NS_CYCLECOLLECTIONISUPPORTS_IID \
67 { 0x96, 0x5e, 0x7e, 0xaa, 0x6e, 0xff, 0xa8, 0x5f } \
71 * Just holds the IID so NS_GET_IID works.
73 class nsCycleCollectionISupports
76 NS_DECLARE_STATIC_IID_ACCESSOR(NS_CYCLECOLLECTIONISUPPORTS_IID
)
79 NS_DEFINE_STATIC_IID_ACCESSOR(nsCycleCollectionISupports
,
80 NS_CYCLECOLLECTIONISUPPORTS_IID
)
82 class nsCycleCollectionParticipant
;
84 enum CCNodeType
{ RefCounted
, GCMarked
, GCUnmarked
};
86 class NS_NO_VTABLE nsCycleCollectionTraversalCallback
89 // If type is RefCounted you must call DescribeNode() with an accurate
90 // refcount, otherwise cycle collection will fail, and probably crash.
91 // If type is not refcounted then the refcount will be ignored.
92 // If the callback cares about objsz or objname, it should
93 // put WANT_DEBUG_INFO in mFlags.
94 NS_IMETHOD_(void) DescribeNode(CCNodeType type
,
97 const char *objname
) = 0;
98 NS_IMETHOD_(void) NoteXPCOMRoot(nsISupports
*root
) = 0;
99 NS_IMETHOD_(void) NoteRoot(PRUint32 langID
, void *root
,
100 nsCycleCollectionParticipant
* helper
) = 0;
101 NS_IMETHOD_(void) NoteScriptChild(PRUint32 langID
, void *child
) = 0;
102 NS_IMETHOD_(void) NoteXPCOMChild(nsISupports
*child
) = 0;
103 NS_IMETHOD_(void) NoteNativeChild(void *child
,
104 nsCycleCollectionParticipant
*helper
) = 0;
106 // Give a name to the edge associated with the next call to
107 // NoteScriptChild, NoteXPCOMChild, or NoteNativeChild.
108 // Callbacks who care about this should set WANT_DEBUG_INFO in the
110 NS_IMETHOD_(void) NoteNextEdgeName(const char* name
) = 0;
115 // Caller should pass useful objsz and objname to DescribeNode
116 // and should call NoteNextEdgeName.
117 WANT_DEBUG_INFO
= (1<<0),
119 // Caller should not skip objects that we know will be
121 WANT_ALL_TRACES
= (1<<1)
123 PRUint32
Flags() const { return mFlags
; }
124 PRBool
WantDebugInfo() const { return (mFlags
& WANT_DEBUG_INFO
) != 0; }
125 PRBool
WantAllTraces() const { return (mFlags
& WANT_ALL_TRACES
) != 0; }
127 nsCycleCollectionTraversalCallback() : mFlags(0) {}
132 class NS_NO_VTABLE nsCycleCollectionParticipant
135 NS_DECLARE_STATIC_IID_ACCESSOR(NS_CYCLECOLLECTIONPARTICIPANT_IID
)
137 NS_IMETHOD
Traverse(void *p
, nsCycleCollectionTraversalCallback
&cb
) = 0;
139 NS_IMETHOD
RootAndUnlinkJSObjects(void *p
) = 0;
140 NS_IMETHOD
Unlink(void *p
) = 0;
141 NS_IMETHOD
Unroot(void *p
) = 0;
144 NS_DEFINE_STATIC_IID_ACCESSOR(nsCycleCollectionParticipant
,
145 NS_CYCLECOLLECTIONPARTICIPANT_IID
)
147 #undef IMETHOD_VISIBILITY
148 #define IMETHOD_VISIBILITY NS_COM_GLUE
151 (* TraceCallback
)(PRUint32 langID
, void *p
, void *closure
);
153 class NS_NO_VTABLE nsScriptObjectTracer
: public nsCycleCollectionParticipant
156 NS_IMETHOD_(void) Trace(void *p
, TraceCallback cb
, void *closure
) = 0;
157 void NS_COM_GLUE
TraverseScriptObjects(void *p
,
158 nsCycleCollectionTraversalCallback
&cb
);
161 class NS_COM_GLUE nsXPCOMCycleCollectionParticipant
162 : public nsScriptObjectTracer
165 NS_IMETHOD
Traverse(void *p
, nsCycleCollectionTraversalCallback
&cb
);
167 NS_IMETHOD
RootAndUnlinkJSObjects(void *p
);
168 NS_IMETHOD
Unlink(void *p
);
169 NS_IMETHOD
Unroot(void *p
);
171 NS_IMETHOD_(void) Trace(void *p
, TraceCallback cb
, void *closure
);
173 NS_IMETHOD_(void) UnmarkPurple(nsISupports
*p
);
175 PRBool
CheckForRightISupports(nsISupports
*s
);
178 #undef IMETHOD_VISIBILITY
179 #define IMETHOD_VISIBILITY NS_VISIBILITY_HIDDEN
181 ///////////////////////////////////////////////////////////////////////////////
182 // Helpers for implementing a QI to nsXPCOMCycleCollectionParticipant
183 ///////////////////////////////////////////////////////////////////////////////
185 #define NS_CYCLE_COLLECTION_INNERCLASS \
188 #define NS_CYCLE_COLLECTION_CLASSNAME(_class) \
189 _class::NS_CYCLE_COLLECTION_INNERCLASS
191 #define NS_CYCLE_COLLECTION_INNERNAME \
192 _cycleCollectorGlobal
194 #define NS_CYCLE_COLLECTION_NAME(_class) \
195 _class::NS_CYCLE_COLLECTION_INNERNAME
197 #define NS_IMPL_QUERY_CYCLE_COLLECTION(_class) \
198 if ( aIID.Equals(NS_GET_IID(nsXPCOMCycleCollectionParticipant)) ) { \
199 *aInstancePtr = & NS_CYCLE_COLLECTION_NAME(_class); \
203 #define NS_IMPL_QUERY_CYCLE_COLLECTION_ISUPPORTS(_class) \
204 if ( aIID.Equals(NS_GET_IID(nsCycleCollectionISupports)) ) \
205 foundInterface = NS_CYCLE_COLLECTION_CLASSNAME(_class)::Upcast(this); \
208 #define NS_INTERFACE_MAP_ENTRY_CYCLE_COLLECTION(_class) \
209 NS_IMPL_QUERY_CYCLE_COLLECTION(_class)
211 #define NS_INTERFACE_MAP_ENTRY_CYCLE_COLLECTION_ISUPPORTS(_class) \
212 NS_IMPL_QUERY_CYCLE_COLLECTION_ISUPPORTS(_class)
214 #define NS_INTERFACE_MAP_ENTRIES_CYCLE_COLLECTION(_class) \
215 NS_INTERFACE_MAP_ENTRY_CYCLE_COLLECTION(_class) \
216 NS_INTERFACE_MAP_ENTRY_CYCLE_COLLECTION_ISUPPORTS(_class)
218 #define NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(_class) \
219 NS_INTERFACE_MAP_BEGIN(_class) \
220 NS_INTERFACE_MAP_ENTRIES_CYCLE_COLLECTION(_class)
222 #define NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(_class) \
223 NS_INTERFACE_MAP_BEGIN(_class) \
224 NS_INTERFACE_MAP_ENTRY_CYCLE_COLLECTION(_class)
226 #define NS_INTERFACE_TABLE_TO_MAP_SEGUE_CYCLE_COLLECTION(_class) \
227 if (rv == NS_OK) return rv; \
228 nsISupports* foundInterface; \
229 NS_INTERFACE_MAP_ENTRIES_CYCLE_COLLECTION(_class)
231 #define NS_INTERFACE_TABLE_HEAD_CYCLE_COLLECTION_INHERITED(_class) \
232 NS_IMETHODIMP _class::QueryInterface(REFNSIID aIID, void** aInstancePtr) \
234 NS_PRECONDITION(aInstancePtr, "null out param"); \
236 if ( aIID.Equals(NS_GET_IID(nsXPCOMCycleCollectionParticipant)) ) { \
237 *aInstancePtr = &NS_CYCLE_COLLECTION_NAME(_class); \
242 #define NS_CYCLE_COLLECTION_UPCAST(obj, clazz) \
243 NS_CYCLE_COLLECTION_CLASSNAME(clazz)::Upcast(obj)
245 ///////////////////////////////////////////////////////////////////////////////
246 // Helpers for implementing nsCycleCollectionParticipant::RootAndUnlinkJSObjects
247 ///////////////////////////////////////////////////////////////////////////////
249 #define NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN(_class) \
251 NS_CYCLE_COLLECTION_CLASSNAME(_class)::RootAndUnlinkJSObjects(void *p) \
253 nsISupports *s = static_cast<nsISupports*>(p); \
254 NS_ASSERTION(CheckForRightISupports(s), \
255 "not the nsISupports pointer we expect"); \
256 nsXPCOMCycleCollectionParticipant::RootAndUnlinkJSObjects(s); \
257 _class *tmp = Downcast(s);
259 #define NS_IMPL_CYCLE_COLLECTION_ROOT_BEGIN_NATIVE(_class, _root_function) \
261 NS_CYCLE_COLLECTION_CLASSNAME(_class)::RootAndUnlinkJSObjects(void *p) \
263 _class *tmp = static_cast<_class*>(p); \
264 tmp->_root_function();
266 #define NS_IMPL_CYCLE_COLLECTION_ROOT_END \
270 ///////////////////////////////////////////////////////////////////////////////
271 // Helpers for implementing nsCycleCollectionParticipant::Unlink
272 ///////////////////////////////////////////////////////////////////////////////
274 #define NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \
276 NS_CYCLE_COLLECTION_CLASSNAME(_class)::Unlink(void *p) \
278 nsISupports *s = static_cast<nsISupports*>(p); \
279 NS_ASSERTION(CheckForRightISupports(s), \
280 "not the nsISupports pointer we expect"); \
281 _class *tmp = Downcast(s);
283 #define NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(_class, _base_class) \
285 NS_CYCLE_COLLECTION_CLASSNAME(_class)::Unlink(void *p) \
287 nsISupports *s = static_cast<nsISupports*>(p); \
288 NS_ASSERTION(CheckForRightISupports(s), \
289 "not the nsISupports pointer we expect"); \
290 _class *tmp = static_cast<_class*>(Downcast(s)); \
291 NS_CYCLE_COLLECTION_CLASSNAME(_base_class)::Unlink(s);
293 #define NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_NATIVE(_class) \
295 NS_CYCLE_COLLECTION_CLASSNAME(_class)::Unlink(void *p) \
297 _class *tmp = static_cast<_class*>(p);
299 #define NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_field) \
302 #define NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMARRAY(_field) \
305 #define NS_IMPL_CYCLE_COLLECTION_UNLINK_NSTARRAY(_field) \
308 #define NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
312 #define NS_IMPL_CYCLE_COLLECTION_UNLINK_0(_class) \
314 NS_CYCLE_COLLECTION_CLASSNAME(_class)::Unlink(void *p) \
316 NS_ASSERTION(CheckForRightISupports(static_cast<nsISupports*>(p)), \
317 "not the nsISupports pointer we expect"); \
321 #define NS_IMPL_CYCLE_COLLECTION_UNLINK_NATIVE_0(_class) \
323 NS_CYCLE_COLLECTION_CLASSNAME(_class)::Unlink(void *p) \
329 ///////////////////////////////////////////////////////////////////////////////
330 // Helpers for implementing nsCycleCollectionParticipant::Traverse
331 ///////////////////////////////////////////////////////////////////////////////
333 #define NS_IMPL_CYCLE_COLLECTION_DESCRIBE(_class, _refcnt) \
334 cb.DescribeNode(RefCounted, _refcnt, sizeof(_class), #_class);
336 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(_class) \
338 NS_CYCLE_COLLECTION_CLASSNAME(_class)::Traverse \
340 nsCycleCollectionTraversalCallback &cb) \
342 nsISupports *s = static_cast<nsISupports*>(p); \
343 NS_ASSERTION(CheckForRightISupports(s), \
344 "not the nsISupports pointer we expect"); \
345 _class *tmp = static_cast<_class*>(Downcast(s));
347 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \
348 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(_class) \
349 NS_IMPL_CYCLE_COLLECTION_DESCRIBE(_class, tmp->mRefCnt.get())
351 // Base class' CC participant should return NS_SUCCESS_INTERRUPTED_TRAVERSE
352 // from Traverse if it wants derived classes to not traverse anything from
353 // their CC participant.
354 #define NS_SUCCESS_INTERRUPTED_TRAVERSE \
355 NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_XPCOM, 2)
357 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(_class, _base_class) \
358 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(_class) \
359 if (NS_CYCLE_COLLECTION_CLASSNAME(_base_class)::Traverse(s, cb) == \
360 NS_SUCCESS_INTERRUPTED_TRAVERSE) { \
361 return NS_SUCCESS_INTERRUPTED_TRAVERSE; \
364 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_BEGIN(_class) \
366 NS_CYCLE_COLLECTION_CLASSNAME(_class)::Traverse \
368 nsCycleCollectionTraversalCallback &cb) \
370 _class *tmp = static_cast<_class*>(p); \
371 NS_IMPL_CYCLE_COLLECTION_DESCRIBE(_class, tmp->mRefCnt.get())
373 #define NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(_cb, _name) \
375 if (NS_UNLIKELY((_cb).WantDebugInfo())) { \
376 (_cb).NoteNextEdgeName(_name); \
380 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_RAWPTR(_field) \
382 NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, #_field); \
383 cb.NoteXPCOMChild(tmp->_field); \
386 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_field) \
388 NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, #_field); \
389 cb.NoteXPCOMChild(tmp->_field.get()); \
392 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR_AMBIGUOUS(_field, _base) \
394 NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, #_field); \
395 cb.NoteXPCOMChild(NS_ISUPPORTS_CAST(_base*, tmp->_field)); \
398 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMARRAY(_field) \
401 for (i = 0; i < tmp->_field.Count(); ++i) { \
402 NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, #_field "[i]"); \
403 cb.NoteXPCOMChild(tmp->_field[i]); \
407 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_PTR(_ptr, _ptr_class, _name) \
409 NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, _name); \
410 cb.NoteNativeChild(_ptr, &NS_CYCLE_COLLECTION_NAME(_ptr_class)); \
413 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_MEMBER(_field, _field_class) \
414 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_PTR(tmp->_field, _field_class, \
417 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSTARRAY(_array, _element_class, \
420 PRUint32 i, length = (_array).Length(); \
421 for (i = 0; i < length; ++i) \
422 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_PTR((_array)[i], \
427 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSTARRAY_MEMBER(_field, \
429 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSTARRAY(tmp->_field, _element_class, \
432 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \
433 TraverseScriptObjects(tmp, cb);
435 #define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \
439 ///////////////////////////////////////////////////////////////////////////////
440 // Helpers for implementing nsScriptObjectTracer::Trace
441 ///////////////////////////////////////////////////////////////////////////////
443 #define NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(_class) \
445 NS_CYCLE_COLLECTION_CLASSNAME(_class)::Trace(void *p, \
446 TraceCallback aCallback, \
449 nsISupports *s = static_cast<nsISupports*>(p); \
450 NS_ASSERTION(CheckForRightISupports(s), \
451 "not the nsISupports pointer we expect"); \
452 _class *tmp = Downcast(s);
454 #define NS_IMPL_CYCLE_COLLECTION_TRACE_NATIVE_BEGIN(_class) \
456 NS_CYCLE_COLLECTION_CLASSNAME(_class)::Trace(void *p, \
457 TraceCallback aCallback, \
460 _class *tmp = static_cast<_class*>(p);
462 #define NS_IMPL_CYCLE_COLLECTION_TRACE_CALLBACK(_langID, _object) \
464 aCallback(_langID, _object, aClosure);
466 #define NS_IMPL_CYCLE_COLLECTION_TRACE_MEMBER_CALLBACK(_langID, _field) \
467 NS_IMPL_CYCLE_COLLECTION_TRACE_CALLBACK(_langID, tmp->_field)
469 #define NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(_object) \
470 NS_IMPL_CYCLE_COLLECTION_TRACE_CALLBACK(nsIProgrammingLanguage::JAVASCRIPT, \
473 #define NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(_field) \
474 NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(tmp->_field)
476 // NB: The (void)tmp; hack in the TRACE_END macro exists to support
477 // implementations that don't need to do anything in their Trace method.
478 // Without this hack, some compilers warn about the unused tmp local.
479 #define NS_IMPL_CYCLE_COLLECTION_TRACE_END \
483 ///////////////////////////////////////////////////////////////////////////////
484 // Helpers for implementing a concrete nsCycleCollectionParticipant
485 ///////////////////////////////////////////////////////////////////////////////
487 #define NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE \
488 static NS_CYCLE_COLLECTION_INNERCLASS NS_CYCLE_COLLECTION_INNERNAME;
490 #define NS_DECL_CYCLE_COLLECTION_CLASS_BODY_NO_UNLINK(_class, _base) \
492 NS_IMETHOD Traverse(void *p, \
493 nsCycleCollectionTraversalCallback &cb); \
494 NS_IMETHOD_(void) UnmarkPurple(nsISupports *s) \
496 Downcast(s)->UnmarkPurple(); \
498 static _class* Downcast(nsISupports* s) \
500 return static_cast<_class*>(static_cast<_base*>(s)); \
502 static nsISupports* Upcast(_class *p) \
504 return NS_ISUPPORTS_CAST(_base*, p); \
507 #define NS_DECL_CYCLE_COLLECTION_CLASS_BODY(_class, _base) \
508 NS_DECL_CYCLE_COLLECTION_CLASS_BODY_NO_UNLINK(_class, _base) \
509 NS_IMETHOD Unlink(void *p);
511 #define NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(_class, _base) \
512 class NS_CYCLE_COLLECTION_INNERCLASS \
513 : public nsXPCOMCycleCollectionParticipant \
515 NS_DECL_CYCLE_COLLECTION_CLASS_BODY(_class, _base) \
517 NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE
519 #define NS_DECL_CYCLE_COLLECTION_CLASS(_class) \
520 NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(_class, _class)
522 // Cycle collector helper for classes that don't want to unlink anything.
523 // Note: if this is used a lot it might make sense to have a base class that
524 // doesn't do anything in RootAndUnlinkJSObjects/Unlink/Unroot.
525 #define NS_DECL_CYCLE_COLLECTION_CLASS_NO_UNLINK(_class) \
526 class NS_CYCLE_COLLECTION_INNERCLASS \
527 : public nsXPCOMCycleCollectionParticipant \
529 NS_DECL_CYCLE_COLLECTION_CLASS_BODY_NO_UNLINK(_class, _class) \
530 NS_IMETHOD RootAndUnlinkJSObjects(void *p) \
534 NS_IMETHOD Unlink(void *p) \
538 NS_IMETHOD Unroot(void *p) \
543 NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE
545 #define NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(_class, _base) \
546 class NS_CYCLE_COLLECTION_INNERCLASS \
547 : public nsXPCOMCycleCollectionParticipant \
549 NS_IMETHOD RootAndUnlinkJSObjects(void *p); \
550 NS_DECL_CYCLE_COLLECTION_CLASS_BODY(_class, _base) \
551 NS_IMETHOD_(void) Trace(void *p, TraceCallback cb, void *closure); \
553 NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE
555 #define NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(_class) \
556 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(_class, _class)
558 #define NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED_BODY_NO_UNLINK(_class, \
561 NS_IMETHOD Traverse(void *p, \
562 nsCycleCollectionTraversalCallback &cb); \
563 static _class* Downcast(nsISupports* s) \
565 return static_cast<_class*>(static_cast<_base_class*>( \
566 NS_CYCLE_COLLECTION_CLASSNAME(_base_class)::Downcast(s))); \
569 #define NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED_BODY(_class, _base_class) \
570 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED_BODY_NO_UNLINK(_class, _base_class) \
571 NS_IMETHOD Unlink(void *p);
573 #define NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(_class, _base_class) \
574 class NS_CYCLE_COLLECTION_INNERCLASS \
575 : public NS_CYCLE_COLLECTION_CLASSNAME(_base_class) \
578 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED_BODY(_class, _base_class) \
580 NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE
582 #define NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED_NO_UNLINK(_class, \
584 class NS_CYCLE_COLLECTION_INNERCLASS \
585 : public NS_CYCLE_COLLECTION_CLASSNAME(_base_class) \
588 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED_BODY_NO_UNLINK(_class, _base_class) \
590 NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE
592 #define NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(_class, \
594 class NS_CYCLE_COLLECTION_INNERCLASS \
595 : public NS_CYCLE_COLLECTION_CLASSNAME(_base_class) \
598 NS_IMETHOD RootAndUnlinkJSObjects(void *p); \
599 NS_IMETHOD_(void) Trace(void *p, TraceCallback cb, void *closure); \
600 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED_BODY(_class, _base_class) \
602 NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE
605 * This implements a stub UnmarkPurple function for classes that want to be
606 * traversed but whose AddRef/Release functions don't add/remove them to/from
607 * the purple buffer. If you're just using NS_DECL_CYCLE_COLLECTING_ISUPPORTS
608 * then you don't need this.
610 #define NS_DECL_CYCLE_COLLECTION_UNMARK_PURPLE_STUB(_class) \
611 NS_IMETHODIMP_(void) UnmarkPurple() \
615 #define NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \
616 NS_CYCLE_COLLECTION_CLASSNAME(_class) NS_CYCLE_COLLECTION_NAME(_class);
618 #define NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS_BODY \
620 NS_IMETHOD RootAndUnlinkJSObjects(void *n); \
621 NS_IMETHOD Unlink(void *n); \
622 NS_IMETHOD Unroot(void *n); \
623 NS_IMETHOD Traverse(void *n, \
624 nsCycleCollectionTraversalCallback &cb);
626 #define NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(_class) \
627 class NS_CYCLE_COLLECTION_INNERCLASS \
628 : public nsCycleCollectionParticipant \
630 NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS_BODY \
632 NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE
634 #define NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(_class) \
635 class NS_CYCLE_COLLECTION_INNERCLASS \
636 : public nsScriptObjectTracer \
638 NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS_BODY \
639 NS_IMETHOD_(void) Trace(void *p, TraceCallback cb, void *closure); \
641 NS_CYCLE_COLLECTION_PARTICIPANT_INSTANCE
643 #define NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(_class, _root_function) \
645 NS_CYCLE_COLLECTION_CLASSNAME(_class)::RootAndUnlinkJSObjects(void *p) \
647 _class *tmp = static_cast<_class*>(p); \
648 tmp->_root_function(); \
652 #define NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(_class, _unroot_function) \
654 NS_CYCLE_COLLECTION_CLASSNAME(_class)::Unroot(void *p) \
656 _class *tmp = static_cast<_class*>(p); \
657 tmp->_unroot_function(); \
661 #define NS_IMPL_CYCLE_COLLECTION_0(_class) \
662 NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \
663 NS_IMPL_CYCLE_COLLECTION_UNLINK_0(_class) \
664 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \
665 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
667 #define NS_IMPL_CYCLE_COLLECTION_1(_class, _f) \
668 NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \
669 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \
670 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f) \
671 NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
672 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \
673 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f) \
674 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
676 #define NS_IMPL_CYCLE_COLLECTION_2(_class, _f1, _f2) \
677 NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \
678 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \
679 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f1) \
680 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f2) \
681 NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
682 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \
683 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f1) \
684 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f2) \
685 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
687 #define NS_IMPL_CYCLE_COLLECTION_3(_class, _f1, _f2, _f3) \
688 NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \
689 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \
690 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f1) \
691 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f2) \
692 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f3) \
693 NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
694 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \
695 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f1) \
696 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f2) \
697 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f3) \
698 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
700 #define NS_IMPL_CYCLE_COLLECTION_4(_class, _f1, _f2, _f3, _f4) \
701 NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \
702 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \
703 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f1) \
704 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f2) \
705 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f3) \
706 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f4) \
707 NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
708 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \
709 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f1) \
710 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f2) \
711 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f3) \
712 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f4) \
713 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
715 #define NS_IMPL_CYCLE_COLLECTION_5(_class, _f1, _f2, _f3, _f4, _f5) \
716 NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \
717 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \
718 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f1) \
719 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f2) \
720 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f3) \
721 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f4) \
722 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f5) \
723 NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
724 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \
725 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f1) \
726 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f2) \
727 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f3) \
728 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f4) \
729 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f5) \
730 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
732 #define NS_IMPL_CYCLE_COLLECTION_6(_class, _f1, _f2, _f3, _f4, _f5, _f6) \
733 NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \
734 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \
735 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f1) \
736 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f2) \
737 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f3) \
738 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f4) \
739 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f5) \
740 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f6) \
741 NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
742 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \
743 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f1) \
744 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f2) \
745 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f3) \
746 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f4) \
747 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f5) \
748 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f6) \
749 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
751 #define NS_IMPL_CYCLE_COLLECTION_7(_class, _f1, _f2, _f3, _f4, _f5, _f6, _f7) \
752 NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \
753 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \
754 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f1) \
755 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f2) \
756 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f3) \
757 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f4) \
758 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f5) \
759 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f6) \
760 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f7) \
761 NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
762 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \
763 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f1) \
764 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f2) \
765 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f3) \
766 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f4) \
767 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f5) \
768 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f6) \
769 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f7) \
770 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
772 #define NS_IMPL_CYCLE_COLLECTION_8(_class, _f1, _f2, _f3, _f4, _f5, _f6, _f7, _f8) \
773 NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \
774 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \
775 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f1) \
776 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f2) \
777 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f3) \
778 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f4) \
779 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f5) \
780 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f6) \
781 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f7) \
782 NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(_f8) \
783 NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
784 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \
785 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f1) \
786 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f2) \
787 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f3) \
788 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f4) \
789 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f5) \
790 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f6) \
791 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f7) \
792 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(_f8) \
793 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
795 #endif // nsCycleCollectionParticipant_h__