Bug 1421152 - Add a checked cast method to TenuredCell. r=jonco

This commit is contained in:
Yoshi Huang 2017-11-28 12:36:01 +08:00
Родитель 5b80c7cb65
Коммит 5dfaa64c5f
3 изменённых файлов: 32 добавлений и 12 удалений

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

@ -237,15 +237,14 @@ AtomMarkingRuntime::atomIsMarked(Zone* zone, TenuredCell* thing)
if (!thing)
return true;
JS::TraceKind kind = thing->getTraceKind();
if (kind == JS::TraceKind::String) {
JSString* str = static_cast<JSString*>(thing);
if (str->isAtom())
return atomIsMarked(zone, &str->asAtom());
return true;
if (thing->is<JSString>()) {
JSString* str = thing->as<JSString>();
return str->isAtom() ? atomIsMarked(zone, &str->asAtom()) : true;
}
if (kind == JS::TraceKind::Symbol)
return atomIsMarked(zone, static_cast<JS::Symbol*>(thing));
if (thing->is<JS::Symbol>())
return atomIsMarked(zone, thing->as<JS::Symbol>());
return true;
}

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

@ -138,6 +138,23 @@ class TenuredCell : public Cell
return JS::shadow::Zone::asShadowZone(zoneFromAnyThread());
}
template <class T>
inline bool is() const {
return getTraceKind() == JS::MapTypeToTraceKind<T>::kind;
}
template<class T>
inline T* as() {
MOZ_ASSERT(is<T>());
return static_cast<T*>(this);
}
template <class T>
inline const T* as() const {
MOZ_ASSERT(is<T>());
return static_cast<const T*>(this);
}
static MOZ_ALWAYS_INLINE void readBarrier(TenuredCell* thing);
static MOZ_ALWAYS_INLINE void writeBarrierPre(TenuredCell* thing);

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

@ -2016,7 +2016,8 @@ inline T*
MarkStack::TaggedPtr::as() const
{
MOZ_ASSERT(tag() == MapTypeToMarkStackTag<T*>::value);
MOZ_ASSERT(ptr()->asTenured().getTraceKind() == MapTypeToTraceKind<T>::kind);
MOZ_ASSERT(ptr()->isTenured());
MOZ_ASSERT(ptr()->is<T>());
return static_cast<T*>(ptr());
}
@ -2024,7 +2025,8 @@ inline JSObject*
MarkStack::TaggedPtr::asValueArrayObject() const
{
MOZ_ASSERT(tag() == ValueArrayTag);
MOZ_ASSERT(ptr()->asTenured().getTraceKind() == JS::TraceKind::Object);
MOZ_ASSERT(ptr()->isTenured());
MOZ_ASSERT(ptr()->is<JSObject>());
return static_cast<JSObject*>(ptr());
}
@ -2032,7 +2034,8 @@ inline JSObject*
MarkStack::TaggedPtr::asSavedValueArrayObject() const
{
MOZ_ASSERT(tag() == SavedValueArrayTag);
MOZ_ASSERT(ptr()->asTenured().getTraceKind() == JS::TraceKind::Object);
MOZ_ASSERT(ptr()->isTenured());
MOZ_ASSERT(ptr()->is<JSObject>());
return static_cast<JSObject*>(ptr());
}
@ -2040,7 +2043,8 @@ inline JSRope*
MarkStack::TaggedPtr::asTempRope() const
{
MOZ_ASSERT(tag() == TempRopeTag);
MOZ_ASSERT(ptr()->asTenured().getTraceKind() == JS::TraceKind::String);
MOZ_ASSERT(ptr()->isTenured());
MOZ_ASSERT(ptr()->is<JSString>());
return static_cast<JSRope*>(ptr());
}