// static XPCWrappedNativeScope* XPCWrappedNativeScope::FindInJSObjectScope(JSContext* cx, JSObject* obj, JSBool OKIfNotInitialized, XPCJSRuntime* runtime) { XPCWrappedNativeScope* scope; if(!obj) return nsnull; // If this object is itself a wrapped native then we can get the // scope directly. scope = GetScopeOfObject(obj); if(scope) return scope; // Else we'll have to look up the parent chain to get the scope obj = JS_GetGlobalForObject(cx, obj); if(!runtime) { runtime = nsXPConnect::GetRuntime(); if(!runtime) return nsnull; } // XXX We are assuming that the scope count is low enough that traversing // the linked list is more reasonable then doing a hashtable lookup. { // scoped lock XPCAutoLock lock(runtime->GetMapLock()); DEBUG_TrackScopeTraversal(); for(XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext) { if(obj == cur->GetGlobalJSObject()) { DEBUG_CheckForComponentsInScope(cx, obj, OKIfNotInitialized, runtime); return cur; } } } // Failure to find the scope is only OK if the caller told us it might fail. // This flag would only be set in the call from // XPCWrappedNativeScope::GetNewOrUsed NS_ASSERTION(OKIfNotInitialized, "No scope has this global object!"); return nsnull; }
// static XPCWrappedNativeScope* XPCWrappedNativeScope::FindInJSObjectScope(JSContext* cx, JSObject* obj, JSBool OKIfNotInitialized, XPCJSRuntime* runtime) { XPCWrappedNativeScope* scope; if (!obj) return nsnull; // If this object is itself a wrapped native then we can get the // scope directly. scope = GetScopeOfObject(obj); if (scope) return scope; // Else we'll have to look up the parent chain to get the scope JSAutoEnterCompartment ac; ac.enterAndIgnoreErrors(cx, obj); #ifdef DEBUG JSObject *startingObj = obj; #endif obj = JS_GetGlobalForObject(cx, obj); if (js::GetObjectClass(obj)->flags & JSCLASS_XPCONNECT_GLOBAL) { scope = XPCWrappedNativeScope::GetNativeScope(cx, obj); if (scope) return scope; } if (!runtime) { runtime = nsXPConnect::GetRuntimeInstance(); NS_ASSERTION(runtime, "This should never be null!"); } // XXX We are assuming that the scope count is low enough that traversing // the linked list is more reasonable then doing a hashtable lookup. XPCWrappedNativeScope* found = nsnull; { // scoped lock XPCAutoLock lock(runtime->GetMapLock()); DEBUG_TrackScopeTraversal(); for (XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext) { if (obj == cur->GetGlobalJSObject()) { found = cur; break; } } } if (found) { // This cannot be called within the map lock! DEBUG_CheckForComponentsInScope(cx, obj, startingObj, OKIfNotInitialized, runtime); return found; } // Failure to find the scope is only OK if the caller told us it might fail. // This flag would only be set in the call from // XPCWrappedNativeScope::GetNewOrUsed NS_ASSERTION(OKIfNotInitialized, "No scope has this global object!"); return nsnull; }