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 #ifndef js_GlobalObject_h
8 #define js_GlobalObject_h
10 #include "mozilla/Attributes.h"
14 #include "js/TypeDecls.h"
16 class JS_PUBLIC_API JSTracer
;
20 extern JS_PUBLIC_API
bool JS_IsGlobalObject(JSObject
* obj
);
24 class JS_PUBLIC_API RealmOptions
;
27 * Get the current realm's global. Returns nullptr if no realm has been
30 extern JS_PUBLIC_API JSObject
* CurrentGlobalOrNull(JSContext
* cx
);
33 * Get the global object associated with an object's realm. The object must not
34 * be a cross-compartment wrapper (because CCWs are shared by all realms in the
37 extern JS_PUBLIC_API JSObject
* GetNonCCWObjectGlobal(JSObject
* obj
);
40 * During global creation, we fire notifications to callbacks registered
41 * via the Debugger API. These callbacks are arbitrary script, and can touch
42 * the global in arbitrary ways. When that happens, the global should not be
43 * in a half-baked state. But this creates a problem for consumers that need
44 * to set slots on the global to put it in a consistent state.
46 * This API provides a way for consumers to set slots atomically (immediately
47 * after the global is created), before any debugger hooks are fired. It's
48 * unfortunately on the clunky side, but that's the way the cookie crumbles.
50 * If callers have no additional state on the global to set up, they may pass
51 * |FireOnNewGlobalHook| to JS_NewGlobalObject, which causes that function to
52 * fire the hook as its final act before returning. Otherwise, callers should
53 * pass |DontFireOnNewGlobalHook|, which means that they are responsible for
54 * invoking JS_FireOnNewGlobalObject upon successfully creating the global. If
55 * an error occurs and the operation aborts, callers should skip firing the
56 * hook. But otherwise, callers must take care to fire the hook exactly once
57 * before compiling any script in the global's scope (we have assertions in
58 * place to enforce this). This lets us be sure that debugger clients never miss
61 enum OnNewGlobalHookOption
{ FireOnNewGlobalHook
, DontFireOnNewGlobalHook
};
65 extern JS_PUBLIC_API JSObject
* JS_NewGlobalObject(
66 JSContext
* cx
, const JSClass
* clasp
, JSPrincipals
* principals
,
67 JS::OnNewGlobalHookOption hookOption
, const JS::RealmOptions
& options
);
69 * Spidermonkey does not have a good way of keeping track of what compartments
70 * should be marked on their own. We can mark the roots unconditionally, but
71 * marking GC things only relevant in live compartments is hard. To mitigate
72 * this, we create a static trace hook, installed on each global object, from
73 * which we can be sure the compartment is relevant, and mark it.
75 * It is still possible to specify custom trace hooks for global object classes.
76 * They can be provided via the RealmOptions passed to JS_NewGlobalObject.
78 extern JS_PUBLIC_API
void JS_GlobalObjectTraceHook(JSTracer
* trc
,
84 * This allows easily constructing a global object without having to deal with
85 * JSClassOps, forgetting to add JS_GlobalObjectTraceHook, or forgetting to call
86 * JS::InitRealmStandardClasses(). Example:
88 * const JSClass globalClass = { "MyGlobal", JSCLASS_GLOBAL_FLAGS,
89 * &JS::DefaultGlobalClassOps };
90 * JS_NewGlobalObject(cx, &globalClass, ...);
92 extern JS_PUBLIC_DATA
const JSClassOps DefaultGlobalClassOps
;
96 extern JS_PUBLIC_API
void JS_FireOnNewGlobalObject(JSContext
* cx
,
97 JS::HandleObject global
);
99 #endif // js_GlobalObject_h