/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * vim: set ts=4 sw=4 et tw=79 ft=cpp: * * 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 gc_Nursery_inl_h #define gc_Nursery_inl_h #include "gc/Nursery.h" #include "jscntxt.h" #include "gc/Heap.h" #include "gc/Zone.h" #include "js/TracingAPI.h" #include "vm/Runtime.h" MOZ_ALWAYS_INLINE bool js::Nursery::getForwardedPointer(JSObject** ref) const { MOZ_ASSERT(ref); MOZ_ASSERT(isInside((void*)*ref)); const gc::RelocationOverlay* overlay = reinterpret_cast(*ref); if (!overlay->isForwarded()) return false; *ref = static_cast(overlay->forwardingAddress()); return true; } namespace js { // The allocation methods below will not run the garbage collector. If the // nursery cannot accomodate the allocation, the malloc heap will be used // instead. template static inline T* AllocateObjectBuffer(ExclusiveContext* cx, uint32_t count) { if (cx->isJSContext()) { Nursery& nursery = cx->asJSContext()->runtime()->gc.nursery; size_t nbytes = JS_ROUNDUP(count * sizeof(T), sizeof(Value)); T* buffer = static_cast(nursery.allocateBuffer(cx->zone(), nbytes)); if (!buffer) ReportOutOfMemory(cx); return buffer; } return cx->zone()->pod_malloc(count); } template static inline T* AllocateObjectBuffer(ExclusiveContext* cx, JSObject* obj, uint32_t count) { if (cx->isJSContext()) { Nursery& nursery = cx->asJSContext()->runtime()->gc.nursery; size_t nbytes = JS_ROUNDUP(count * sizeof(T), sizeof(Value)); T* buffer = static_cast(nursery.allocateBuffer(obj, nbytes)); if (!buffer) ReportOutOfMemory(cx); return buffer; } return obj->zone()->pod_malloc(count); } // If this returns null then the old buffer will be left alone. template static inline T* ReallocateObjectBuffer(ExclusiveContext* cx, JSObject* obj, T* oldBuffer, uint32_t oldCount, uint32_t newCount) { if (cx->isJSContext()) { Nursery& nursery = cx->asJSContext()->runtime()->gc.nursery; T* buffer = static_cast(nursery.reallocateBuffer(obj, oldBuffer, oldCount * sizeof(T), newCount * sizeof(T))); if (!buffer) ReportOutOfMemory(cx); return buffer; } return obj->zone()->pod_realloc(oldBuffer, oldCount, newCount); } } // namespace js #endif /* gc_Nursery_inl_h */