From 2aa4a82499d4becd2284cdb482213d541b8804dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 28 Apr 2024 16:29:10 +0200 Subject: Adding upstream version 86.0.1. Signed-off-by: Daniel Baumann --- js/src/gc/Allocator.h | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 js/src/gc/Allocator.h (limited to 'js/src/gc/Allocator.h') diff --git a/js/src/gc/Allocator.h b/js/src/gc/Allocator.h new file mode 100644 index 0000000000..6becd816b9 --- /dev/null +++ b/js/src/gc/Allocator.h @@ -0,0 +1,89 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: set ts=8 sts=2 et sw=2 tw=80: + * 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_Allocator_h +#define gc_Allocator_h + +#include + +#include "gc/AllocKind.h" +#include "js/RootingAPI.h" + +class JSFatInlineString; + +namespace js { + +enum AllowGC { NoGC = 0, CanGC = 1 }; + +namespace gc { + +/* + * This flag allows an allocation site to request a specific heap based upon the + * estimated lifetime or lifetime requirements of objects allocated from that + * site. + */ +enum InitialHeap : uint8_t { DefaultHeap, TenuredHeap }; + +} // namespace gc + +// Allocate a new GC thing that's not a JSObject or a string. +// +// After a successful allocation the caller must fully initialize the thing +// before calling any function that can potentially trigger GC. This will ensure +// that GC tracing never sees junk values stored in the partially initialized +// thing. +template +T* Allocate(JSContext* cx); + +// Allocate a JSObject. +// +// A longer signature that includes additional information in support of various +// optimizations. If dynamic slots are requested they will be allocated and the +// pointer stored directly in |NativeObject::slots_|. +template +JSObject* AllocateObject(JSContext* cx, gc::AllocKind kind, + size_t nDynamicSlots, gc::InitialHeap heap, + const JSClass* clasp); + +// Internal function used for nursery-allocatable strings. +template +StringAllocT* AllocateStringImpl(JSContext* cx, gc::InitialHeap heap); + +// Allocate a string. +// +// Use for nursery-allocatable strings. Returns a value cast to the correct +// type. +template +StringT* AllocateString(JSContext* cx, gc::InitialHeap heap) { + return static_cast(AllocateStringImpl(cx, heap)); +} + +// Specialization for JSFatInlineString that must use a different allocation +// type. Note that we have to explicitly specialize for both values of AllowGC +// because partial function specialization is not allowed. +template <> +inline JSFatInlineString* AllocateString( + JSContext* cx, gc::InitialHeap heap) { + return static_cast( + js::AllocateStringImpl(cx, heap)); +} + +template <> +inline JSFatInlineString* AllocateString( + JSContext* cx, gc::InitialHeap heap) { + return static_cast( + js::AllocateStringImpl(cx, heap)); +} + +// Allocate a BigInt. +// +// Use for nursery-allocatable BigInt. +template +JS::BigInt* AllocateBigInt(JSContext* cx, gc::InitialHeap heap); + +} // namespace js + +#endif // gc_Allocator_h -- cgit v1.2.3