/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * vim: set ts=8 sts=4 et sw=4 tw=99: * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef vm_ObjectGroup_inl_h #define vm_ObjectGroup_inl_h #include "vm/ObjectGroup.h" namespace js { inline bool ObjectGroup::needsSweep() { // Note: this can be called off thread during compacting GCs, in which case // nothing will be running on the main thread. return generation() != zoneFromAnyThread()->types.generation; } inline void ObjectGroup::maybeSweep(AutoClearTypeInferenceStateOnOOM* oom) { if (needsSweep()) sweep(oom); } inline ObjectGroupFlags ObjectGroup::flags() { maybeSweep(nullptr); return flagsDontCheckGeneration(); } inline void ObjectGroup::addFlags(ObjectGroupFlags flags) { maybeSweep(nullptr); flags_ |= flags; } inline void ObjectGroup::clearFlags(ObjectGroupFlags flags) { maybeSweep(nullptr); flags_ &= ~flags; } inline bool ObjectGroup::hasAnyFlags(ObjectGroupFlags flags) { MOZ_ASSERT((flags & OBJECT_FLAG_DYNAMIC_MASK) == flags); return !!(this->flags() & flags); } inline bool ObjectGroup::hasAllFlags(ObjectGroupFlags flags) { MOZ_ASSERT((flags & OBJECT_FLAG_DYNAMIC_MASK) == flags); return (this->flags() & flags) == flags; } inline bool ObjectGroup::unknownProperties() { MOZ_ASSERT_IF(flags() & OBJECT_FLAG_UNKNOWN_PROPERTIES, hasAllFlags(OBJECT_FLAG_DYNAMIC_MASK)); return !!(flags() & OBJECT_FLAG_UNKNOWN_PROPERTIES); } inline bool ObjectGroup::shouldPreTenure() { return hasAnyFlags(OBJECT_FLAG_PRE_TENURE) && !unknownProperties(); } inline bool ObjectGroup::canPreTenure() { return !unknownProperties(); } inline bool ObjectGroup::fromAllocationSite() { return flags() & OBJECT_FLAG_FROM_ALLOCATION_SITE; } inline void ObjectGroup::setShouldPreTenure(ExclusiveContext* cx) { MOZ_ASSERT(canPreTenure()); setFlags(cx, OBJECT_FLAG_PRE_TENURE); } inline TypeNewScript* ObjectGroup::newScript() { maybeSweep(nullptr); return newScriptDontCheckGeneration(); } inline PreliminaryObjectArrayWithTemplate* ObjectGroup::maybePreliminaryObjects() { maybeSweep(nullptr); return maybePreliminaryObjectsDontCheckGeneration(); } inline UnboxedLayout* ObjectGroup::maybeUnboxedLayout() { maybeSweep(nullptr); return maybeUnboxedLayoutDontCheckGeneration(); } inline UnboxedLayout& ObjectGroup::unboxedLayout() { maybeSweep(nullptr); return unboxedLayoutDontCheckGeneration(); } } // namespace js #endif /* vm_ObjectGroup_inl_h */