зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
e0b4ed4d95
Коммит
ca427d70af
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче