1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/base/nsWrapperCache.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,737 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#ifndef nsWrapperCache_h___ 1.10 +#define nsWrapperCache_h___ 1.11 + 1.12 +#include "nsCycleCollectionParticipant.h" 1.13 +#include "mozilla/Assertions.h" 1.14 +#include "js/Id.h" // must come before js/RootingAPI.h 1.15 +#include "js/Value.h" // must come before js/RootingAPI.h 1.16 +#include "js/RootingAPI.h" 1.17 +#include "js/TracingAPI.h" 1.18 + 1.19 +class XPCWrappedNativeScope; 1.20 + 1.21 +#define NS_WRAPPERCACHE_IID \ 1.22 +{ 0x6f3179a1, 0x36f7, 0x4a5c, \ 1.23 + { 0x8c, 0xf1, 0xad, 0xc8, 0x7c, 0xde, 0x3e, 0x87 } } 1.24 + 1.25 +/** 1.26 + * Class to store the wrapper for an object. This can only be used with objects 1.27 + * that only have one non-security wrapper at a time (for an XPCWrappedNative 1.28 + * this is usually ensured by setting an explicit parent in the PreCreate hook 1.29 + * for the class). 1.30 + * 1.31 + * An instance of nsWrapperCache can be gotten from an object that implements 1.32 + * a wrapper cache by calling QueryInterface on it. Note that this breaks XPCOM 1.33 + * rules a bit (this object doesn't derive from nsISupports). 1.34 + * 1.35 + * The cache can store objects other than wrappers. We allow wrappers to use a 1.36 + * separate JSObject to store their state (mostly expandos). If the wrapper is 1.37 + * collected and we want to preserve this state we actually store the state 1.38 + * object in the cache. 1.39 + * 1.40 + * The cache can store 2 types of objects: 1.41 + * 1.42 + * If WRAPPER_IS_DOM_BINDING is not set (IsDOMBinding() returns false): 1.43 + * - a slim wrapper or the JSObject of an XPCWrappedNative wrapper 1.44 + * 1.45 + * If WRAPPER_IS_DOM_BINDING is set (IsDOMBinding() returns true): 1.46 + * - a DOM binding object (regular JS object or proxy) 1.47 + * 1.48 + * The finalizer for the wrapper clears the cache. 1.49 + * 1.50 + * A number of the methods are implemented in nsWrapperCacheInlines.h because we 1.51 + * have to include some JS headers that don't play nicely with the rest of the 1.52 + * codebase. Include nsWrapperCacheInlines.h if you need to call those methods. 1.53 + */ 1.54 +class nsWrapperCache 1.55 +{ 1.56 +public: 1.57 + NS_DECLARE_STATIC_IID_ACCESSOR(NS_WRAPPERCACHE_IID) 1.58 + 1.59 + nsWrapperCache() : mWrapper(nullptr), mFlags(0) 1.60 + { 1.61 + } 1.62 + ~nsWrapperCache() 1.63 + { 1.64 + MOZ_ASSERT(!PreservingWrapper(), 1.65 + "Destroying cache with a preserved wrapper!"); 1.66 + } 1.67 + 1.68 + /** 1.69 + * Get the cached wrapper. 1.70 + * 1.71 + * This getter clears the gray bit before handing out the JSObject which means 1.72 + * that the object is guaranteed to be kept alive past the next CC. 1.73 + */ 1.74 + JSObject* GetWrapper() const; 1.75 + 1.76 + /** 1.77 + * Get the cached wrapper. 1.78 + * 1.79 + * This getter does not change the color of the JSObject meaning that the 1.80 + * object returned is not guaranteed to be kept alive past the next CC. 1.81 + * 1.82 + * This should only be called if you are certain that the return value won't 1.83 + * be passed into a JS API function and that it won't be stored without being 1.84 + * rooted (or otherwise signaling the stored value to the CC). 1.85 + */ 1.86 + JSObject* GetWrapperPreserveColor() const 1.87 + { 1.88 + return GetWrapperJSObject(); 1.89 + } 1.90 + 1.91 + void SetWrapper(JSObject* aWrapper) 1.92 + { 1.93 + MOZ_ASSERT(!PreservingWrapper(), "Clearing a preserved wrapper!"); 1.94 + MOZ_ASSERT(aWrapper, "Use ClearWrapper!"); 1.95 + 1.96 + SetWrapperJSObject(aWrapper); 1.97 + } 1.98 + 1.99 + /** 1.100 + * Clear the wrapper. This should be called from the finalizer for the 1.101 + * wrapper. 1.102 + */ 1.103 + void ClearWrapper() 1.104 + { 1.105 + MOZ_ASSERT(!PreservingWrapper(), "Clearing a preserved wrapper!"); 1.106 + 1.107 + SetWrapperJSObject(nullptr); 1.108 + } 1.109 + 1.110 + bool PreservingWrapper() 1.111 + { 1.112 + return HasWrapperFlag(WRAPPER_BIT_PRESERVED); 1.113 + } 1.114 + 1.115 + void SetIsDOMBinding() 1.116 + { 1.117 + MOZ_ASSERT(!mWrapper && !(GetWrapperFlags() & ~WRAPPER_IS_DOM_BINDING), 1.118 + "This flag should be set before creating any wrappers."); 1.119 + SetWrapperFlags(WRAPPER_IS_DOM_BINDING); 1.120 + } 1.121 + 1.122 + bool IsDOMBinding() const 1.123 + { 1.124 + return HasWrapperFlag(WRAPPER_IS_DOM_BINDING); 1.125 + } 1.126 + 1.127 + /** 1.128 + * Wrap the object corresponding to this wrapper cache. If non-null is 1.129 + * returned, the object has already been stored in the wrapper cache. 1.130 + */ 1.131 + virtual JSObject* WrapObject(JSContext* cx) 1.132 + { 1.133 + MOZ_ASSERT(!IsDOMBinding(), "Someone forgot to override WrapObject"); 1.134 + return nullptr; 1.135 + } 1.136 + 1.137 + /** 1.138 + * Returns true if the object has a non-gray wrapper. 1.139 + */ 1.140 + bool IsBlack(); 1.141 + 1.142 + /** 1.143 + * Returns true if the object has a black wrapper, 1.144 + * and all the GC things it is keeping alive are black too. 1.145 + */ 1.146 + bool IsBlackAndDoesNotNeedTracing(nsISupports* aThis); 1.147 + 1.148 + bool HasNothingToTrace(nsISupports* aThis); 1.149 + 1.150 + // Only meant to be called by code that preserves a wrapper. 1.151 + void SetPreservingWrapper(bool aPreserve) 1.152 + { 1.153 + if(aPreserve) { 1.154 + SetWrapperFlags(WRAPPER_BIT_PRESERVED); 1.155 + } 1.156 + else { 1.157 + UnsetWrapperFlags(WRAPPER_BIT_PRESERVED); 1.158 + } 1.159 + } 1.160 + 1.161 + void TraceWrapper(const TraceCallbacks& aCallbacks, void* aClosure) 1.162 + { 1.163 + if (PreservingWrapper() && mWrapper) { 1.164 + aCallbacks.Trace(&mWrapper, "Preserved wrapper", aClosure); 1.165 + } 1.166 + } 1.167 + 1.168 + /* 1.169 + * The following methods for getting and manipulating flags allow the unused 1.170 + * bits of mFlags to be used by derived classes. 1.171 + */ 1.172 + 1.173 + uint32_t GetFlags() const 1.174 + { 1.175 + return mFlags & ~kWrapperFlagsMask; 1.176 + } 1.177 + 1.178 + bool HasFlag(uint32_t aFlag) const 1.179 + { 1.180 + MOZ_ASSERT((aFlag & kWrapperFlagsMask) == 0, "Bad flag mask"); 1.181 + return !!(mFlags & aFlag); 1.182 + } 1.183 + 1.184 + void SetFlags(uint32_t aFlagsToSet) 1.185 + { 1.186 + MOZ_ASSERT((aFlagsToSet & kWrapperFlagsMask) == 0, "Bad flag mask"); 1.187 + mFlags |= aFlagsToSet; 1.188 + } 1.189 + 1.190 + void UnsetFlags(uint32_t aFlagsToUnset) 1.191 + { 1.192 + MOZ_ASSERT((aFlagsToUnset & kWrapperFlagsMask) == 0, "Bad flag mask"); 1.193 + mFlags &= ~aFlagsToUnset; 1.194 + } 1.195 + 1.196 + void PreserveWrapper(nsISupports* aScriptObjectHolder) 1.197 + { 1.198 + if (PreservingWrapper()) { 1.199 + return; 1.200 + } 1.201 + 1.202 + nsISupports* ccISupports; 1.203 + aScriptObjectHolder->QueryInterface(NS_GET_IID(nsCycleCollectionISupports), 1.204 + reinterpret_cast<void**>(&ccISupports)); 1.205 + MOZ_ASSERT(ccISupports); 1.206 + 1.207 + nsXPCOMCycleCollectionParticipant* participant; 1.208 + CallQueryInterface(ccISupports, &participant); 1.209 + PreserveWrapper(ccISupports, participant); 1.210 + } 1.211 + 1.212 + void PreserveWrapper(void* aScriptObjectHolder, nsScriptObjectTracer* aTracer) 1.213 + { 1.214 + if (PreservingWrapper()) { 1.215 + return; 1.216 + } 1.217 + 1.218 + HoldJSObjects(aScriptObjectHolder, aTracer); 1.219 + SetPreservingWrapper(true); 1.220 +#ifdef DEBUG 1.221 + // Make sure the cycle collector will be able to traverse to the wrapper. 1.222 + CheckCCWrapperTraversal(aScriptObjectHolder, aTracer); 1.223 +#endif 1.224 + } 1.225 + 1.226 + void ReleaseWrapper(void* aScriptObjectHolder); 1.227 + 1.228 +protected: 1.229 + void TraceWrapper(JSTracer* aTrc, const char* name) 1.230 + { 1.231 + if (mWrapper) { 1.232 + JS_CallHeapObjectTracer(aTrc, &mWrapper, name); 1.233 + } 1.234 + } 1.235 + 1.236 + void PoisonWrapper() 1.237 + { 1.238 + if (mWrapper) { 1.239 + mWrapper.setToCrashOnTouch(); 1.240 + } 1.241 + } 1.242 + 1.243 +private: 1.244 + JSObject *GetWrapperJSObject() const 1.245 + { 1.246 + return mWrapper; 1.247 + } 1.248 + 1.249 + void SetWrapperJSObject(JSObject* aWrapper) 1.250 + { 1.251 + mWrapper = aWrapper; 1.252 + UnsetWrapperFlags(kWrapperFlagsMask & ~WRAPPER_IS_DOM_BINDING); 1.253 + } 1.254 + 1.255 + void TraceWrapperJSObject(JSTracer* aTrc, const char* aName); 1.256 + 1.257 + uint32_t GetWrapperFlags() const 1.258 + { 1.259 + return mFlags & kWrapperFlagsMask; 1.260 + } 1.261 + 1.262 + bool HasWrapperFlag(uint32_t aFlag) const 1.263 + { 1.264 + MOZ_ASSERT((aFlag & ~kWrapperFlagsMask) == 0, "Bad wrapper flag bits"); 1.265 + return !!(mFlags & aFlag); 1.266 + } 1.267 + 1.268 + void SetWrapperFlags(uint32_t aFlagsToSet) 1.269 + { 1.270 + MOZ_ASSERT((aFlagsToSet & ~kWrapperFlagsMask) == 0, "Bad wrapper flag bits"); 1.271 + mFlags |= aFlagsToSet; 1.272 + } 1.273 + 1.274 + void UnsetWrapperFlags(uint32_t aFlagsToUnset) 1.275 + { 1.276 + MOZ_ASSERT((aFlagsToUnset & ~kWrapperFlagsMask) == 0, "Bad wrapper flag bits"); 1.277 + mFlags &= ~aFlagsToUnset; 1.278 + } 1.279 + 1.280 + static void HoldJSObjects(void* aScriptObjectHolder, 1.281 + nsScriptObjectTracer* aTracer); 1.282 + 1.283 +#ifdef DEBUG 1.284 + void CheckCCWrapperTraversal(void* aScriptObjectHolder, 1.285 + nsScriptObjectTracer* aTracer); 1.286 +#endif // DEBUG 1.287 + 1.288 + /** 1.289 + * If this bit is set then we're preserving the wrapper, which in effect ties 1.290 + * the lifetime of the JS object stored in the cache to the lifetime of the 1.291 + * native object. We rely on the cycle collector to break the cycle that this 1.292 + * causes between the native object and the JS object, so it is important that 1.293 + * any native object that supports preserving of its wrapper 1.294 + * traces/traverses/unlinks the cached JS object (see 1.295 + * NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER, 1.296 + * NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS and 1.297 + * NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER). 1.298 + */ 1.299 + enum { WRAPPER_BIT_PRESERVED = 1 << 0 }; 1.300 + 1.301 + /** 1.302 + * If this bit is set then the wrapper for the native object is a DOM binding 1.303 + * (regular JS object or proxy). 1.304 + */ 1.305 + enum { WRAPPER_IS_DOM_BINDING = 1 << 1 }; 1.306 + 1.307 + enum { kWrapperFlagsMask = (WRAPPER_BIT_PRESERVED | WRAPPER_IS_DOM_BINDING) }; 1.308 + 1.309 + JS::Heap<JSObject*> mWrapper; 1.310 + uint32_t mFlags; 1.311 +}; 1.312 + 1.313 +enum { WRAPPER_CACHE_FLAGS_BITS_USED = 2 }; 1.314 + 1.315 +NS_DEFINE_STATIC_IID_ACCESSOR(nsWrapperCache, NS_WRAPPERCACHE_IID) 1.316 + 1.317 +#define NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY \ 1.318 + if ( aIID.Equals(NS_GET_IID(nsWrapperCache)) ) { \ 1.319 + *aInstancePtr = static_cast<nsWrapperCache*>(this); \ 1.320 + return NS_OK; \ 1.321 + } 1.322 + 1.323 + 1.324 +// Cycle collector macros for wrapper caches. 1.325 + 1.326 +#define NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER \ 1.327 + tmp->TraceWrapper(aCallbacks, aClosure); 1.328 + 1.329 +#define NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.330 + tmp->ReleaseWrapper(p); 1.331 + 1.332 +#define NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) \ 1.333 + NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(_class) \ 1.334 + NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER \ 1.335 + NS_IMPL_CYCLE_COLLECTION_TRACE_END 1.336 + 1.337 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(_class) \ 1.338 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.339 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.340 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.341 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.342 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.343 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.344 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.345 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.346 + 1.347 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(_class, _field) \ 1.348 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.349 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.350 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field) \ 1.351 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.352 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.353 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.354 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field) \ 1.355 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.356 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.357 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.358 + 1.359 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_2(_class, _field1,\ 1.360 + _field2) \ 1.361 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.362 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.363 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field1) \ 1.364 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field2) \ 1.365 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.366 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.367 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.368 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field1) \ 1.369 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field2) \ 1.370 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.371 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.372 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.373 + 1.374 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_3(_class, _field1,\ 1.375 + _field2, \ 1.376 + _field3) \ 1.377 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.378 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.379 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field1) \ 1.380 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field2) \ 1.381 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field3) \ 1.382 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.383 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.384 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.385 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field1) \ 1.386 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field2) \ 1.387 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field3) \ 1.388 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.389 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.390 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.391 + 1.392 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_4(_class, _field1,\ 1.393 + _field2, \ 1.394 + _field3, \ 1.395 + _field4) \ 1.396 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.397 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.398 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field1) \ 1.399 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field2) \ 1.400 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field3) \ 1.401 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field4) \ 1.402 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.403 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.404 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.405 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field1) \ 1.406 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field2) \ 1.407 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field3) \ 1.408 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field4) \ 1.409 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.410 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.411 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.412 + 1.413 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_5(_class, _field1,\ 1.414 + _field2, \ 1.415 + _field3, \ 1.416 + _field4, \ 1.417 + _field5) \ 1.418 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.419 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.420 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field1) \ 1.421 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field2) \ 1.422 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field3) \ 1.423 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field4) \ 1.424 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field5) \ 1.425 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.426 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.427 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.428 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field1) \ 1.429 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field2) \ 1.430 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field3) \ 1.431 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field4) \ 1.432 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field5) \ 1.433 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.434 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.435 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.436 + 1.437 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_6(_class, _field1,\ 1.438 + _field2, \ 1.439 + _field3, \ 1.440 + _field4, \ 1.441 + _field5, \ 1.442 + _field6) \ 1.443 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.444 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.445 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field1) \ 1.446 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field2) \ 1.447 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field3) \ 1.448 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field4) \ 1.449 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field5) \ 1.450 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field6) \ 1.451 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.452 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.453 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.454 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field1) \ 1.455 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field2) \ 1.456 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field3) \ 1.457 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field4) \ 1.458 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field5) \ 1.459 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field6) \ 1.460 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.461 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.462 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.463 + 1.464 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_7(_class, _field1,\ 1.465 + _field2, \ 1.466 + _field3, \ 1.467 + _field4, \ 1.468 + _field5, \ 1.469 + _field6, \ 1.470 + _field7) \ 1.471 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.472 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.473 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field1) \ 1.474 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field2) \ 1.475 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field3) \ 1.476 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field4) \ 1.477 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field5) \ 1.478 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field6) \ 1.479 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field7) \ 1.480 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.481 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.482 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.483 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field1) \ 1.484 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field2) \ 1.485 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field3) \ 1.486 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field4) \ 1.487 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field5) \ 1.488 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field6) \ 1.489 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field7) \ 1.490 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.491 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.492 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.493 + 1.494 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_8(_class, _field1,\ 1.495 + _field2, \ 1.496 + _field3, \ 1.497 + _field4, \ 1.498 + _field5, \ 1.499 + _field6, \ 1.500 + _field7, \ 1.501 + _field8) \ 1.502 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.503 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.504 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field1) \ 1.505 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field2) \ 1.506 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field3) \ 1.507 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field4) \ 1.508 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field5) \ 1.509 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field6) \ 1.510 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field7) \ 1.511 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field8) \ 1.512 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.513 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.514 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.515 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field1) \ 1.516 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field2) \ 1.517 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field3) \ 1.518 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field4) \ 1.519 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field5) \ 1.520 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field6) \ 1.521 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field7) \ 1.522 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field8) \ 1.523 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.524 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.525 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.526 + 1.527 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_9(_class, _field1,\ 1.528 + _field2, \ 1.529 + _field3, \ 1.530 + _field4, \ 1.531 + _field5, \ 1.532 + _field6, \ 1.533 + _field7, \ 1.534 + _field8, \ 1.535 + _field9) \ 1.536 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.537 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.538 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field1) \ 1.539 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field2) \ 1.540 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field3) \ 1.541 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field4) \ 1.542 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field5) \ 1.543 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field6) \ 1.544 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field7) \ 1.545 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field8) \ 1.546 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field9) \ 1.547 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.548 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.549 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.550 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field1) \ 1.551 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field2) \ 1.552 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field3) \ 1.553 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field4) \ 1.554 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field5) \ 1.555 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field6) \ 1.556 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field7) \ 1.557 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field8) \ 1.558 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field9) \ 1.559 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.560 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.561 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.562 + 1.563 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_10(_class, _field1,\ 1.564 + _field2, \ 1.565 + _field3, \ 1.566 + _field4, \ 1.567 + _field5, \ 1.568 + _field6, \ 1.569 + _field7, \ 1.570 + _field8, \ 1.571 + _field9, \ 1.572 + _field10) \ 1.573 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.574 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.575 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field1) \ 1.576 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field2) \ 1.577 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field3) \ 1.578 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field4) \ 1.579 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field5) \ 1.580 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field6) \ 1.581 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field7) \ 1.582 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field8) \ 1.583 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field9) \ 1.584 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field10) \ 1.585 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.586 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.587 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.588 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field1) \ 1.589 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field2) \ 1.590 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field3) \ 1.591 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field4) \ 1.592 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field5) \ 1.593 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field6) \ 1.594 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field7) \ 1.595 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field8) \ 1.596 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field9) \ 1.597 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field10) \ 1.598 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.599 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.600 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.601 + 1.602 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_11(_class, \ 1.603 + _field1, \ 1.604 + _field2, \ 1.605 + _field3, \ 1.606 + _field4, \ 1.607 + _field5, \ 1.608 + _field6, \ 1.609 + _field7, \ 1.610 + _field8, \ 1.611 + _field9, \ 1.612 + _field10, \ 1.613 + _field11) \ 1.614 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.615 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.616 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field1) \ 1.617 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field2) \ 1.618 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field3) \ 1.619 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field4) \ 1.620 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field5) \ 1.621 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field6) \ 1.622 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field7) \ 1.623 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field8) \ 1.624 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field9) \ 1.625 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field10) \ 1.626 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field11) \ 1.627 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.628 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.629 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.630 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field1) \ 1.631 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field2) \ 1.632 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field3) \ 1.633 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field4) \ 1.634 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field5) \ 1.635 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field6) \ 1.636 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field7) \ 1.637 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field8) \ 1.638 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field9) \ 1.639 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field10) \ 1.640 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field11) \ 1.641 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.642 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.643 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.644 + 1.645 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_12(_class, \ 1.646 + _field1, \ 1.647 + _field2, \ 1.648 + _field3, \ 1.649 + _field4, \ 1.650 + _field5, \ 1.651 + _field6, \ 1.652 + _field7, \ 1.653 + _field8, \ 1.654 + _field9, \ 1.655 + _field10, \ 1.656 + _field11, \ 1.657 + _field12) \ 1.658 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.659 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.660 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field1) \ 1.661 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field2) \ 1.662 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field3) \ 1.663 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field4) \ 1.664 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field5) \ 1.665 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field6) \ 1.666 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field7) \ 1.667 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field8) \ 1.668 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field9) \ 1.669 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field10) \ 1.670 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field11) \ 1.671 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field12) \ 1.672 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.673 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.674 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.675 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field1) \ 1.676 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field2) \ 1.677 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field3) \ 1.678 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field4) \ 1.679 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field5) \ 1.680 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field6) \ 1.681 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field7) \ 1.682 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field8) \ 1.683 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field9) \ 1.684 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field10) \ 1.685 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field11) \ 1.686 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field12) \ 1.687 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.688 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.689 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.690 + 1.691 +#define NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_13(_class, \ 1.692 + _field1, \ 1.693 + _field2, \ 1.694 + _field3, \ 1.695 + _field4, \ 1.696 + _field5, \ 1.697 + _field6, \ 1.698 + _field7, \ 1.699 + _field8, \ 1.700 + _field9, \ 1.701 + _field10, \ 1.702 + _field11, \ 1.703 + _field12, \ 1.704 + _field13) \ 1.705 + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ 1.706 + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ 1.707 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field1) \ 1.708 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field2) \ 1.709 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field3) \ 1.710 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field4) \ 1.711 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field5) \ 1.712 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field6) \ 1.713 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field7) \ 1.714 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field8) \ 1.715 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field9) \ 1.716 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field10) \ 1.717 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field11) \ 1.718 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field12) \ 1.719 + NS_IMPL_CYCLE_COLLECTION_UNLINK(_field13) \ 1.720 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \ 1.721 + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ 1.722 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \ 1.723 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field1) \ 1.724 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field2) \ 1.725 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field3) \ 1.726 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field4) \ 1.727 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field5) \ 1.728 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field6) \ 1.729 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field7) \ 1.730 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field8) \ 1.731 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field9) \ 1.732 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field10) \ 1.733 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field11) \ 1.734 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field12) \ 1.735 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_field13) \ 1.736 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \ 1.737 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \ 1.738 + NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class) 1.739 + 1.740 +#endif /* nsWrapperCache_h___ */