diff --git a/js/src/gc/AtomMarking.cpp b/js/src/gc/AtomMarking.cpp index 64348293f0ea..5bd1f34ef7e9 100644 --- a/js/src/gc/AtomMarking.cpp +++ b/js/src/gc/AtomMarking.cpp @@ -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(thing); - if (str->isAtom()) - return atomIsMarked(zone, &str->asAtom()); - return true; + if (thing->is()) { + JSString* str = thing->as(); + return str->isAtom() ? atomIsMarked(zone, &str->asAtom()) : true; } - if (kind == JS::TraceKind::Symbol) - return atomIsMarked(zone, static_cast(thing)); + + if (thing->is()) + return atomIsMarked(zone, thing->as()); + return true; } diff --git a/js/src/gc/Cell.h b/js/src/gc/Cell.h index 65784d51c754..36c6cbfc0063 100644 --- a/js/src/gc/Cell.h +++ b/js/src/gc/Cell.h @@ -138,6 +138,23 @@ class TenuredCell : public Cell return JS::shadow::Zone::asShadowZone(zoneFromAnyThread()); } + template + inline bool is() const { + return getTraceKind() == JS::MapTypeToTraceKind::kind; + } + + template + inline T* as() { + MOZ_ASSERT(is()); + return static_cast(this); + } + + template + inline const T* as() const { + MOZ_ASSERT(is()); + return static_cast(this); + } + static MOZ_ALWAYS_INLINE void readBarrier(TenuredCell* thing); static MOZ_ALWAYS_INLINE void writeBarrierPre(TenuredCell* thing); diff --git a/js/src/gc/Marking.cpp b/js/src/gc/Marking.cpp index af9b58c3925a..7f75423599f8 100644 --- a/js/src/gc/Marking.cpp +++ b/js/src/gc/Marking.cpp @@ -2016,7 +2016,8 @@ inline T* MarkStack::TaggedPtr::as() const { MOZ_ASSERT(tag() == MapTypeToMarkStackTag::value); - MOZ_ASSERT(ptr()->asTenured().getTraceKind() == MapTypeToTraceKind::kind); + MOZ_ASSERT(ptr()->isTenured()); + MOZ_ASSERT(ptr()->is()); return static_cast(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()); return static_cast(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()); return static_cast(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()); return static_cast(ptr()); }