Bug 1428742 - use Value::toGCCellPtr and delegating ctr of GCCellPtr. r=jonco

Differential Revision: https://phabricator.services.mozilla.com/D103589
This commit is contained in:
Oleg Skoromnik 2021-02-03 20:13:10 +00:00
parent 37fcc6f78b
commit cd2514ec74
6 changed files with 11 additions and 37 deletions

View File

@ -20,6 +20,7 @@
#include "js-config.h"
#include "jstypes.h"
#include "js/HeapAPI.h"
#include "js/RootingAPI.h"
#include "js/TypeDecls.h"
@ -930,7 +931,7 @@ static MOZ_ALWAYS_INLINE void ExposeValueToActiveJS(const Value& v) {
MOZ_ASSERT(!js::gc::EdgeNeedsSweepUnbarrieredSlow(&tmp));
#endif
if (v.isGCThing()) {
js::gc::ExposeGCThingToActiveJS(GCCellPtr(v));
js::gc::ExposeGCThingToActiveJS(v.toGCCellPtr());
}
}
@ -1162,6 +1163,7 @@ class WrappedPtrOperations<JS::Value, Wrapper> {
JS::BigInt* toBigInt() const { return value().toBigInt(); }
JSObject& toObject() const { return value().toObject(); }
JSObject* toObjectOrNull() const { return value().toObjectOrNull(); }
JS::GCCellPtr toGCCellPtr() const { return value().toGCCellPtr(); }
gc::Cell* toGCThing() const { return value().toGCThing(); }
JS::TraceKind traceKind() const { return value().traceKind(); }
void* toPrivate() const { return value().toPrivate(); }

View File

@ -235,6 +235,7 @@
#include "jit/JitRuntime.h"
#include "jit/JitZone.h"
#include "jit/MacroAssembler.h" // js::jit::CodeAlignment
#include "js/HeapAPI.h" // JS::GCCellPtr
#include "js/Object.h" // JS::GetClass
#include "js/SliceBudget.h"
#include "proxy/DeadObjectProxy.h"
@ -8307,37 +8308,8 @@ JS_FRIEND_API size_t JS::GCTraceKindSize(JS::TraceKind kind) {
}
}
JS::GCCellPtr::GCCellPtr(const Value& v) : ptr(0) {
switch (v.type()) {
case ValueType::String:
ptr = checkedCast(v.toString(), JS::TraceKind::String);
return;
case ValueType::Object:
ptr = checkedCast(&v.toObject(), JS::TraceKind::Object);
return;
case ValueType::Symbol:
ptr = checkedCast(v.toSymbol(), JS::TraceKind::Symbol);
return;
case ValueType::BigInt:
ptr = checkedCast(v.toBigInt(), JS::TraceKind::BigInt);
return;
case ValueType::PrivateGCThing:
ptr = checkedCast(v.toGCThing(), v.toGCThing()->getTraceKind());
return;
case ValueType::Double:
case ValueType::Int32:
case ValueType::Boolean:
case ValueType::Undefined:
case ValueType::Null:
case ValueType::Magic: {
MOZ_ASSERT(!v.isGCThing());
ptr = checkedCast(nullptr, JS::TraceKind::Null);
return;
}
}
ReportBadValueTypeAndCrash(v);
}
JS::GCCellPtr::GCCellPtr(const Value& v)
: GCCellPtr(v.toGCThing(), v.traceKind()) {}
JS::TraceKind JS::GCCellPtr::outOfLineKind() const {
MOZ_ASSERT((ptr & OutOfLineTraceKindMask) == OutOfLineTraceKindMask);

View File

@ -35,11 +35,11 @@ BEGIN_TEST(testGCCellPtr) {
CHECK(JS::GCCellPtr(obj.get()));
CHECK(JS::GCCellPtr(obj.get()).kind() == JS::TraceKind::Object);
CHECK(JS::GCCellPtr(JS::ObjectValue(*obj)).kind() == JS::TraceKind::Object);
CHECK(JS::ObjectValue(*obj).toGCCellPtr().kind() == JS::TraceKind::Object);
CHECK(JS::GCCellPtr(str.get()));
CHECK(JS::GCCellPtr(str.get()).kind() == JS::TraceKind::String);
CHECK(JS::GCCellPtr(JS::StringValue(str)).kind() == JS::TraceKind::String);
CHECK(JS::StringValue(str).toGCCellPtr().kind() == JS::TraceKind::String);
CHECK(JS::GCCellPtr(script.get()));
CHECK(!JS::GCCellPtr(nullptr));

View File

@ -162,7 +162,7 @@ void ProxyObject::setSameCompartmentPrivate(const Value& priv) {
inline void ProxyObject::setPrivate(const Value& priv) {
MOZ_ASSERT_IF(IsMarkedBlack(this) && priv.isGCThing(),
!JS::GCThingIsMarkedGray(JS::GCCellPtr(priv)));
!JS::GCThingIsMarkedGray(priv.toGCCellPtr()));
*slotOfPrivate() = priv;
}

View File

@ -77,7 +77,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(XPCVariant)
JS::Value val = tmp->GetJSValPreserveColor();
if (val.isObject()) {
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mJSVal");
cb.NoteJSChild(JS::GCCellPtr(val));
cb.NoteJSChild(val.toGCCellPtr());
}
tmp->mData.Traverse(cb);

View File

@ -34,7 +34,7 @@ void nsCycleCollectionParticipant::NoteJSChild(JS::GCCellPtr aGCThing,
void TraceCallbackFunc::Trace(JS::Heap<JS::Value>* aPtr, const char* aName,
void* aClosure) const {
if (aPtr->unbarrieredGet().isGCThing()) {
mCallback(JS::GCCellPtr(aPtr->unbarrieredGet()), aName, aClosure);
mCallback(aPtr->unbarrieredGet().toGCCellPtr(), aName, aClosure);
}
}