#ifndef gc_GC_h
#define gc_GC_h
#include "jsapi.h"
#include "gc/AllocKind.h"
#include "gc/GCEnum.h"
#include "js/TraceKind.h"
class JSExternalString;
class JSFatInlineString;
class JSTracer;
namespace js {
class AccessorShape;
class FatInlineAtom;
class FreeOp;
class NormalAtom;
class Nursery;
namespace gc {
class Arena;
struct Chunk;
struct Cell;
template <typename T>
struct MapTypeToFinalizeKind {};
#define EXPAND_MAPTYPETOFINALIZEKIND(allocKind, traceKind, type, sizedType, \
bgFinal, nursery, compact) \
template <> \
struct MapTypeToFinalizeKind<type> { \
static const AllocKind kind = AllocKind::allocKind; \
};
FOR_EACH_NONOBJECT_ALLOCKIND(EXPAND_MAPTYPETOFINALIZEKIND)
#undef EXPAND_MAPTYPETOFINALIZEKIND
}
extern void TraceRuntime(JSTracer* trc);
extern void ReleaseAllJITCode(FreeOp* op);
extern void PrepareForDebugGC(JSRuntime* rt);
extern void NotifyGCNukeWrapper(JSObject* o);
extern unsigned NotifyGCPreSwap(JSObject* a, JSObject* b);
extern void NotifyGCPostSwap(JSObject* a, JSObject* b, unsigned preResult);
typedef void (*IterateChunkCallback)(JSRuntime* rt, void* data,
gc::Chunk* chunk);
typedef void (*IterateZoneCallback)(JSRuntime* rt, void* data, JS::Zone* zone);
typedef void (*IterateArenaCallback)(JSRuntime* rt, void* data,
gc::Arena* arena, JS::TraceKind traceKind,
size_t thingSize);
typedef void (*IterateCellCallback)(JSRuntime* rt, void* data, void* thing,
JS::TraceKind traceKind, size_t thingSize);
extern void IterateHeapUnbarriered(JSContext* cx, void* data,
IterateZoneCallback zoneCallback,
JS::IterateRealmCallback realmCallback,
IterateArenaCallback arenaCallback,
IterateCellCallback cellCallback);
extern void IterateHeapUnbarrieredForZone(
JSContext* cx, JS::Zone* zone, void* data, IterateZoneCallback zoneCallback,
JS::IterateRealmCallback realmCallback, IterateArenaCallback arenaCallback,
IterateCellCallback cellCallback);
extern void IterateChunks(JSContext* cx, void* data,
IterateChunkCallback chunkCallback);
typedef void (*IterateScriptCallback)(JSRuntime* rt, void* data,
JSScript* script,
const JS::AutoRequireNoGC& nogc);
typedef void (*IterateLazyScriptCallback)(JSRuntime* rt, void* data,
LazyScript* lazyScript,
const JS::AutoRequireNoGC& nogc);
extern void IterateScripts(JSContext* cx, JS::Realm* realm, void* data,
IterateScriptCallback scriptCallback);
extern void IterateLazyScripts(JSContext* cx, JS::Realm* realm, void* data,
IterateLazyScriptCallback lazyScriptCallback);
JS::Realm* NewRealm(JSContext* cx, JSPrincipals* principals,
const JS::RealmOptions& options);
namespace gc {
void FinishGC(JSContext* cx, JS::GCReason = JS::GCReason::FINISH_GC);
void MergeRealms(JS::Realm* source, JS::Realm* target);
enum VerifierType { PreBarrierVerifier };
#ifdef JS_GC_ZEAL
extern const char ZealModeHelpText[];
void VerifyBarriers(JSRuntime* rt, VerifierType type);
void MaybeVerifyBarriers(JSContext* cx, bool always = false);
void DumpArenaInfo();
#else
static inline void VerifyBarriers(JSRuntime* rt, VerifierType type) {}
static inline void MaybeVerifyBarriers(JSContext* cx, bool always = false) {}
#endif
class MOZ_RAII JS_HAZ_GC_SUPPRESSED AutoSuppressGC {
int32_t& suppressGC_;
public:
explicit AutoSuppressGC(JSContext* cx);
~AutoSuppressGC() { suppressGC_--; }
};
const char* StateName(State state);
}
class MOZ_RAII AutoDisableProxyCheck {
public:
#ifdef DEBUG
AutoDisableProxyCheck();
~AutoDisableProxyCheck();
#else
AutoDisableProxyCheck() {}
#endif
};
struct MOZ_RAII AutoDisableCompactingGC {
explicit AutoDisableCompactingGC(JSContext* cx);
~AutoDisableCompactingGC();
private:
JSContext* cx;
};
bool UninlinedIsInsideNursery(const gc::Cell* cell);
}
#endif