Bug 1425450 - Pass zone information through when preserving wrappers r=mccr8

This is bascially the same as your original patch.

Differential Revision: https://phabricator.services.mozilla.com/D68520
This commit is contained in:
Andrew McCreight 2020-04-20 17:07:58 +00:00
Родитель e0b4ed4d95
Коммит ca427d70af
8 изменённых файлов: 21 добавлений и 12 удалений

Просмотреть файл

@ -24,8 +24,9 @@ bool nsWrapperCache::HasJSObjectMovedOp(JSObject* aWrapper) {
#endif
void nsWrapperCache::HoldJSObjects(void* aScriptObjectHolder,
nsScriptObjectTracer* aTracer) {
cyclecollector::HoldJSObjectsImpl(aScriptObjectHolder, aTracer);
nsScriptObjectTracer* aTracer,
JS::Zone* aWrapperZone) {
cyclecollector::HoldJSObjectsImpl(aScriptObjectHolder, aTracer, aWrapperZone);
if (mWrapper && !JS::ObjectIsTenured(mWrapper)) {
CycleCollectedJSRuntime::Get()->NurseryWrapperPreserved(mWrapper);
}

Просмотреть файл

@ -13,6 +13,7 @@
#include "js/Value.h" // must come before js/RootingAPI.h
#include "js/RootingAPI.h"
#include "js/TracingAPI.h"
#include "jsfriendapi.h"
namespace mozilla {
namespace dom {
@ -184,6 +185,8 @@ class nsWrapperCache {
* any wrapper cached object.
*/
void UpdateWrapper(JSObject* aNewObject, const JSObject* aOldObject) {
MOZ_ASSERT(js::GetObjectZoneFromAnyThread(aNewObject) ==
js::GetObjectZoneFromAnyThread(aOldObject));
if (mWrapper) {
MOZ_ASSERT(mWrapper == aOldObject);
mWrapper = aNewObject;
@ -293,8 +296,8 @@ class nsWrapperCache {
return;
}
GetWrapper(); // Read barrier for incremental GC.
HoldJSObjects(aScriptObjectHolder, aTracer);
JSObject* wrapper = GetWrapper(); // Read barrier for incremental GC.
HoldJSObjects(aScriptObjectHolder, aTracer, JS::GetObjectZone(wrapper));
SetPreservingWrapper(true);
#ifdef DEBUG
// Make sure the cycle collector will be able to traverse to the wrapper.
@ -341,7 +344,8 @@ class nsWrapperCache {
mFlags &= ~aFlagsToUnset;
}
void HoldJSObjects(void* aScriptObjectHolder, nsScriptObjectTracer* aTracer);
void HoldJSObjects(void* aScriptObjectHolder, nsScriptObjectTracer* aTracer,
JS::Zone* aZone);
#ifdef DEBUG
public:

Просмотреть файл

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

Просмотреть файл

@ -2692,7 +2692,7 @@ extern JS_FRIEND_API void SetPerformanceHint(JSContext* cx,
} /* namespace gc */
extern JS_FRIEND_API JS::Zone* GetObjectZoneFromAnyThread(JSObject* obj);
extern JS_FRIEND_API JS::Zone* GetObjectZoneFromAnyThread(const JSObject* obj);
} /* namespace js */

Просмотреть файл

@ -1244,7 +1244,8 @@ void CycleCollectedJSRuntime::TraceNativeGrayRoots(JSTracer* aTracer) {
}
void CycleCollectedJSRuntime::AddJSHolder(void* aHolder,
nsScriptObjectTracer* aTracer) {
nsScriptObjectTracer* aTracer,
JS::Zone* aZone) {
mJSHolders.Put(aHolder, aTracer);
}

Просмотреть файл

@ -273,7 +273,8 @@ class CycleCollectedJSRuntime {
}
public:
void AddJSHolder(void* aHolder, nsScriptObjectTracer* aTracer);
void AddJSHolder(void* aHolder, nsScriptObjectTracer* aTracer,
JS::Zone* aZone);
void RemoveJSHolder(void* aHolder);
#ifdef DEBUG
void AssertNoObjectsToTrace(void* aPossibleJSHolder);

Просмотреть файл

@ -12,10 +12,11 @@
namespace mozilla {
namespace cyclecollector {
void HoldJSObjectsImpl(void* aHolder, nsScriptObjectTracer* aTracer) {
void HoldJSObjectsImpl(void* aHolder, nsScriptObjectTracer* aTracer,
JS::Zone* aZone) {
CycleCollectedJSRuntime* rt = CycleCollectedJSRuntime::Get();
MOZ_ASSERT(rt, "Should have a CycleCollectedJSRuntime by now");
rt->AddJSHolder(aHolder, aTracer);
rt->AddJSHolder(aHolder, aTracer, aZone);
}
void HoldJSObjectsImpl(nsISupports* aHolder) {

Просмотреть файл

@ -17,7 +17,8 @@ class nsScriptObjectTracer;
namespace mozilla {
namespace cyclecollector {
void HoldJSObjectsImpl(void* aHolder, nsScriptObjectTracer* aTracer);
void HoldJSObjectsImpl(void* aHolder, nsScriptObjectTracer* aTracer,
JS::Zone* aZone = nullptr);
void HoldJSObjectsImpl(nsISupports* aHolder);
void DropJSObjectsImpl(void* aHolder);
void DropJSObjectsImpl(nsISupports* aHolder);