Bug 1628371 - Check whether JS holders are single-zone in nightly builds too r=mccr8

Differential Revision: https://phabricator.services.mozilla.com/D70220

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Jon Coppeard 2020-04-09 09:50:26 +00:00
parent 11b739d096
commit 11fc44d6aa
3 changed files with 22 additions and 8 deletions

View File

@ -1465,8 +1465,6 @@ bool js::AddListFormatConstructor(JSContext* cx, JS::HandleObject intl) {
#endif // !JS_HAS_INTL_API
#ifdef DEBUG
JS_FRIEND_API JS::Zone* js::GetObjectZoneFromAnyThread(JSObject* obj) {
return MaybeForwarded(obj)->zoneFromAnyThread();
}
#endif

View File

@ -2693,9 +2693,7 @@ extern JS_FRIEND_API void SetPerformanceHint(JSContext* cx,
} /* namespace gc */
#ifdef DEBUG
extern JS_FRIEND_API JS::Zone* GetObjectZoneFromAnyThread(JSObject* obj);
#endif
} /* namespace js */

View File

@ -1070,7 +1070,11 @@ void mozilla::TraceScriptHolder(nsISupports* aHolder, JSTracer* aTracer) {
participant->Trace(aHolder, JsGcTracer(), aTracer);
}
#ifdef DEBUG
#if defined(NIGHTLY_BUILD) || defined(MOZ_DEV_EDITION) || defined(DEBUG)
# define CHECK_SINGLE_ZONE_JS_HOLDERS
#endif
#ifdef CHECK_SINGLE_ZONE_JS_HOLDERS
// A tracer that checks that a JS holder only holds JS GC things in a single
// JS::Zone.
@ -1177,6 +1181,15 @@ static inline void CheckHolderIsSingleZone(
aParticipant->Trace(aHolder, tracer, nullptr);
}
static inline bool ShouldCheckSingleZoneHolders() {
# ifdef DEBUG
return true;
# else
// Don't check every time to avoid performance impact.
return rand() % 256 == 0;
# endif
}
#endif
void CycleCollectedJSRuntime::TraceNativeGrayRoots(JSTracer* aTracer) {
@ -1184,9 +1197,14 @@ void CycleCollectedJSRuntime::TraceNativeGrayRoots(JSTracer* aTracer) {
// would hurt to do this after the JS holders.
TraceAdditionalNativeGrayRoots(aTracer);
mJSHolders.ForEach([aTracer](void* holder, nsScriptObjectTracer* tracer) {
#ifdef DEBUG
if (!tracer->IsMultiZoneJSHolder()) {
#ifdef CHECK_SINGLE_ZONE_JS_HOLDERS
bool checkSingleZoneHolders = ShouldCheckSingleZoneHolders();
#endif
mJSHolders.ForEach([aTracer, checkSingleZoneHolders](
void* holder, nsScriptObjectTracer* tracer) {
#ifdef CHECK_SINGLE_ZONE_JS_HOLDERS
if (checkSingleZoneHolders && !tracer->IsMultiZoneJSHolder()) {
CheckHolderIsSingleZone(holder, tracer);
}
#endif