| // Copyright 2017 the V8 project authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef V8_OBJECTS_FIXED_ARRAY_H_ | |
| #define V8_OBJECTS_FIXED_ARRAY_H_ | |
| #include "src/maybe-handles.h" | |
| #include "src/objects.h" | |
| // Has to be the last include (doesn't have include guards): | |
| #include "src/objects/object-macros.h" | |
| namespace v8 { | |
| namespace internal { | |
| class WeakArrayBodyDescriptor; | |
| #define FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(V) \ | |
| V(BYTECODE_ARRAY_CONSTANT_POOL_SUB_TYPE) \ | |
| V(BYTECODE_ARRAY_HANDLER_TABLE_SUB_TYPE) \ | |
| V(CODE_STUBS_TABLE_SUB_TYPE) \ | |
| V(COMPILATION_CACHE_TABLE_SUB_TYPE) \ | |
| V(CONTEXT_SUB_TYPE) \ | |
| V(COPY_ON_WRITE_SUB_TYPE) \ | |
| V(DEOPTIMIZATION_DATA_SUB_TYPE) \ | |
| V(DESCRIPTOR_ARRAY_SUB_TYPE) \ | |
| V(EMBEDDED_OBJECT_SUB_TYPE) \ | |
| V(ENUM_CACHE_SUB_TYPE) \ | |
| V(ENUM_INDICES_CACHE_SUB_TYPE) \ | |
| V(DEPENDENT_CODE_SUB_TYPE) \ | |
| V(DICTIONARY_ELEMENTS_SUB_TYPE) \ | |
| V(DICTIONARY_PROPERTIES_SUB_TYPE) \ | |
| V(EMPTY_PROPERTIES_DICTIONARY_SUB_TYPE) \ | |
| V(PACKED_ELEMENTS_SUB_TYPE) \ | |
| V(FAST_PROPERTIES_SUB_TYPE) \ | |
| V(FAST_TEMPLATE_INSTANTIATIONS_CACHE_SUB_TYPE) \ | |
| V(HANDLER_TABLE_SUB_TYPE) \ | |
| V(JS_COLLECTION_SUB_TYPE) \ | |
| V(JS_WEAK_COLLECTION_SUB_TYPE) \ | |
| V(NOSCRIPT_SHARED_FUNCTION_INFOS_SUB_TYPE) \ | |
| V(NUMBER_STRING_CACHE_SUB_TYPE) \ | |
| V(OBJECT_TO_CODE_SUB_TYPE) \ | |
| V(OPTIMIZED_CODE_LITERALS_SUB_TYPE) \ | |
| V(OPTIMIZED_CODE_MAP_SUB_TYPE) \ | |
| V(PROTOTYPE_USERS_SUB_TYPE) \ | |
| V(REGEXP_MULTIPLE_CACHE_SUB_TYPE) \ | |
| V(RETAINED_MAPS_SUB_TYPE) \ | |
| V(SCOPE_INFO_SUB_TYPE) \ | |
| V(SCRIPT_LIST_SUB_TYPE) \ | |
| V(SERIALIZED_OBJECTS_SUB_TYPE) \ | |
| V(SHARED_FUNCTION_INFOS_SUB_TYPE) \ | |
| V(SINGLE_CHARACTER_STRING_CACHE_SUB_TYPE) \ | |
| V(SLOW_TEMPLATE_INSTANTIATIONS_CACHE_SUB_TYPE) \ | |
| V(STRING_SPLIT_CACHE_SUB_TYPE) \ | |
| V(STRING_TABLE_SUB_TYPE) \ | |
| V(TEMPLATE_INFO_SUB_TYPE) \ | |
| V(FEEDBACK_METADATA_SUB_TYPE) \ | |
| V(WEAK_NEW_SPACE_OBJECT_TO_CODE_SUB_TYPE) | |
| enum FixedArraySubInstanceType { | |
| #define DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE(name) name, | |
| FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE) | |
| #undef DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE | |
| LAST_FIXED_ARRAY_SUB_TYPE = WEAK_NEW_SPACE_OBJECT_TO_CODE_SUB_TYPE | |
| }; | |
| // Common superclass for FixedArrays that allow implementations to share | |
| // common accessors and some code paths. | |
| class FixedArrayBase : public HeapObject { | |
| public: | |
| // [length]: length of the array. | |
| inline int length() const; | |
| inline void set_length(int value); | |
| // Get and set the length using acquire loads and release stores. | |
| inline int synchronized_length() const; | |
| inline void synchronized_set_length(int value); | |
| inline Object* unchecked_synchronized_length() const; | |
| DECL_CAST(FixedArrayBase) | |
| static int GetMaxLengthForNewSpaceAllocation(ElementsKind kind); | |
| bool IsCowArray() const; | |
| // Maximal allowed size, in bytes, of a single FixedArrayBase. | |
| // Prevents overflowing size computations, as well as extreme memory | |
| // consumption. | |
| #ifdef V8_HOST_ARCH_32_BIT | |
| static const int kMaxSize = 512 * MB; | |
| #else | |
| static const int kMaxSize = 1024 * MB; | |
| #endif // V8_HOST_ARCH_32_BIT | |
| // Layout description. | |
| // Length is smi tagged when it is stored. | |
| static const int kLengthOffset = HeapObject::kHeaderSize; | |
| static const int kHeaderSize = kLengthOffset + kPointerSize; | |
| }; | |
| // FixedArray describes fixed-sized arrays with element type Object*. | |
| class FixedArray : public FixedArrayBase { | |
| public: | |
| // Setter and getter for elements. | |
| inline Object* get(int index) const; | |
| static inline Handle<Object> get(FixedArray* array, int index, | |
| Isolate* isolate); | |
| template <class T> | |
| MaybeHandle<T> GetValue(Isolate* isolate, int index) const; | |
| template <class T> | |
| Handle<T> GetValueChecked(Isolate* isolate, int index) const; | |
| // Return a grown copy if the index is bigger than the array's length. | |
| static Handle<FixedArray> SetAndGrow(Isolate* isolate, | |
| Handle<FixedArray> array, int index, | |
| Handle<Object> value, | |
| PretenureFlag pretenure = NOT_TENURED); | |
| // Setter that uses write barrier. | |
| inline void set(int index, Object* value); | |
| inline bool is_the_hole(Isolate* isolate, int index); | |
| // Setter that doesn't need write barrier. | |
| inline void set(int index, Smi* value); | |
| // Setter with explicit barrier mode. | |
| inline void set(int index, Object* value, WriteBarrierMode mode); | |
| // Setters for frequently used oddballs located in old space. | |
| inline void set_undefined(int index); | |
| inline void set_undefined(Isolate* isolate, int index); | |
| inline void set_null(int index); | |
| inline void set_null(Isolate* isolate, int index); | |
| inline void set_the_hole(int index); | |
| inline void set_the_hole(Isolate* isolate, int index); | |
| inline Object** GetFirstElementAddress(); | |
| inline bool ContainsOnlySmisOrHoles(); | |
| // Returns true iff the elements are Numbers and sorted ascending. | |
| bool ContainsSortedNumbers(); | |
| // Gives access to raw memory which stores the array's data. | |
| inline Object** data_start(); | |
| inline void FillWithHoles(int from, int to); | |
| // Shrink the array and insert filler objects. {new_length} must be > 0. | |
| void Shrink(Isolate* isolate, int new_length); | |
| // If {new_length} is 0, return the canonical empty FixedArray. Otherwise | |
| // like above. | |
| static Handle<FixedArray> ShrinkOrEmpty(Isolate* isolate, | |
| Handle<FixedArray> array, | |
| int new_length); | |
| // Copy a sub array from the receiver to dest. | |
| void CopyTo(int pos, FixedArray* dest, int dest_pos, int len) const; | |
| // Garbage collection support. | |
| static constexpr int SizeFor(int length) { | |
| return kHeaderSize + length * kPointerSize; | |
| } | |
| // Code Generation support. | |
| static constexpr int OffsetOfElementAt(int index) { return SizeFor(index); } | |
| // Garbage collection support. | |
| inline Object** RawFieldOfElementAt(int index); | |
| DECL_CAST(FixedArray) | |
| // Maximally allowed length of a FixedArray. | |
| static const int kMaxLength = (kMaxSize - kHeaderSize) / kPointerSize; | |
| static_assert(Internals::IsValidSmi(kMaxLength), | |
| "FixedArray maxLength not a Smi"); | |
| // Maximally allowed length for regular (non large object space) object. | |
| STATIC_ASSERT(kMaxRegularHeapObjectSize < kMaxSize); | |
| static const int kMaxRegularLength = | |
| (kMaxRegularHeapObjectSize - kHeaderSize) / kPointerSize; | |
| // Dispatched behavior. | |
| DECL_PRINTER(FixedArray) | |
| DECL_VERIFIER(FixedArray) | |
| #ifdef DEBUG | |
| // Checks if two FixedArrays have identical contents. | |
| bool IsEqualTo(FixedArray* other); | |
| #endif | |
| typedef FlexibleBodyDescriptor<kHeaderSize> BodyDescriptor; | |
| // No weak fields. | |
| typedef BodyDescriptor BodyDescriptorWeak; | |
| protected: | |
| // Set operation on FixedArray without using write barriers. Can | |
| // only be used for storing old space objects or smis. | |
| static inline void NoWriteBarrierSet(FixedArray* array, int index, | |
| Object* value); | |
| private: | |
| STATIC_ASSERT(kHeaderSize == Internals::kFixedArrayHeaderSize); | |
| inline void set_undefined(ReadOnlyRoots ro_roots, int index); | |
| inline void set_null(ReadOnlyRoots ro_roots, int index); | |
| inline void set_the_hole(ReadOnlyRoots ro_roots, int index); | |
| DISALLOW_IMPLICIT_CONSTRUCTORS(FixedArray); | |
| }; | |
| // FixedArray alias added only because of IsFixedArrayExact() predicate, which | |
| // checks for the exact instance type FIXED_ARRAY_TYPE instead of a range | |
| // check: [FIRST_FIXED_ARRAY_TYPE, LAST_FIXED_ARRAY_TYPE]. | |
| class FixedArrayExact final : public FixedArray { | |
| public: | |
| DECL_CAST(FixedArrayExact) | |
| }; | |
| // FixedDoubleArray describes fixed-sized arrays with element type double. | |
| class FixedDoubleArray : public FixedArrayBase { | |
| public: | |
| // Setter and getter for elements. | |
| inline double get_scalar(int index); | |
| inline uint64_t get_representation(int index); | |
| static inline Handle<Object> get(FixedDoubleArray* array, int index, | |
| Isolate* isolate); | |
| inline void set(int index, double value); | |
| inline void set_the_hole(Isolate* isolate, int index); | |
| inline void set_the_hole(int index); | |
| // Checking for the hole. | |
| inline bool is_the_hole(Isolate* isolate, int index); | |
| inline bool is_the_hole(int index); | |
| // Garbage collection support. | |
| inline static int SizeFor(int length) { | |
| return kHeaderSize + length * kDoubleSize; | |
| } | |
| // Gives access to raw memory which stores the array's data. | |
| inline double* data_start(); | |
| inline void FillWithHoles(int from, int to); | |
| // Code Generation support. | |
| static int OffsetOfElementAt(int index) { return SizeFor(index); } | |
| DECL_CAST(FixedDoubleArray) | |
| // Maximally allowed length of a FixedArray. | |
| static const int kMaxLength = (kMaxSize - kHeaderSize) / kDoubleSize; | |
| static_assert(Internals::IsValidSmi(kMaxLength), | |
| "FixedDoubleArray maxLength not a Smi"); | |
| // Dispatched behavior. | |
| DECL_PRINTER(FixedDoubleArray) | |
| DECL_VERIFIER(FixedDoubleArray) | |
| class BodyDescriptor; | |
| // No weak fields. | |
| typedef BodyDescriptor BodyDescriptorWeak; | |
| private: | |
| DISALLOW_IMPLICIT_CONSTRUCTORS(FixedDoubleArray); | |
| }; | |
| // WeakFixedArray describes fixed-sized arrays with element type | |
| // MaybeObject*. | |
| class WeakFixedArray : public HeapObject { | |
| public: | |
| DECL_CAST(WeakFixedArray) | |
| inline MaybeObject* Get(int index) const; | |
| // Setter that uses write barrier. | |
| inline void Set(int index, MaybeObject* value); | |
| // Setter with explicit barrier mode. | |
| inline void Set(int index, MaybeObject* value, WriteBarrierMode mode); | |
| static constexpr int SizeFor(int length) { | |
| return kHeaderSize + length * kPointerSize; | |
| } | |
| DECL_INT_ACCESSORS(length) | |
| // Get and set the length using acquire loads and release stores. | |
| inline int synchronized_length() const; | |
| inline void synchronized_set_length(int value); | |
| // Gives access to raw memory which stores the array's data. | |
| inline MaybeObject** data_start(); | |
| inline MaybeObject** RawFieldOfElementAt(int index); | |
| inline MaybeObject** GetFirstElementAddress(); | |
| DECL_PRINTER(WeakFixedArray) | |
| DECL_VERIFIER(WeakFixedArray) | |
| typedef WeakArrayBodyDescriptor BodyDescriptor; | |
| typedef BodyDescriptor BodyDescriptorWeak; | |
| static const int kLengthOffset = HeapObject::kHeaderSize; | |
| static const int kHeaderSize = kLengthOffset + kPointerSize; | |
| static const int kMaxLength = | |
| (FixedArray::kMaxSize - kHeaderSize) / kPointerSize; | |
| static_assert(Internals::IsValidSmi(kMaxLength), | |
| "WeakFixedArray maxLength not a Smi"); | |
| protected: | |
| static int OffsetOfElementAt(int index) { | |
| return kHeaderSize + index * kPointerSize; | |
| } | |
| private: | |
| friend class Heap; | |
| static const int kFirstIndex = 1; | |
| DISALLOW_IMPLICIT_CONSTRUCTORS(WeakFixedArray); | |
| }; | |
| // WeakArrayList is like a WeakFixedArray with static convenience methods for | |
| // adding more elements. length() returns the number of elements in the list and | |
| // capacity() returns the allocated size. The number of elements is stored at | |
| // kLengthOffset and is updated with every insertion. The array grows | |
| // dynamically with O(1) amortized insertion. | |
| class WeakArrayList : public HeapObject { | |
| public: | |
| DECL_CAST(WeakArrayList) | |
| DECL_VERIFIER(WeakArrayList) | |
| DECL_PRINTER(WeakArrayList) | |
| static Handle<WeakArrayList> AddToEnd(Isolate* isolate, | |
| Handle<WeakArrayList> array, | |
| MaybeObjectHandle value); | |
| inline MaybeObject* Get(int index) const; | |
| // Set the element at index to obj. The underlying array must be large enough. | |
| // If you need to grow the WeakArrayList, use the static AddToEnd() method | |
| // instead. | |
| inline void Set(int index, MaybeObject* value, | |
| WriteBarrierMode mode = UPDATE_WRITE_BARRIER); | |
| static constexpr int SizeForCapacity(int capacity) { | |
| return kHeaderSize + capacity * kPointerSize; | |
| } | |
| // Gives access to raw memory which stores the array's data. | |
| inline MaybeObject** data_start(); | |
| bool IsFull(); | |
| DECL_INT_ACCESSORS(capacity) | |
| DECL_INT_ACCESSORS(length) | |
| // Get and set the capacity using acquire loads and release stores. | |
| inline int synchronized_capacity() const; | |
| inline void synchronized_set_capacity(int value); | |
| typedef WeakArrayBodyDescriptor BodyDescriptor; | |
| typedef BodyDescriptor BodyDescriptorWeak; | |
| static const int kCapacityOffset = HeapObject::kHeaderSize; | |
| static const int kLengthOffset = kCapacityOffset + kPointerSize; | |
| static const int kHeaderSize = kLengthOffset + kPointerSize; | |
| static const int kMaxCapacity = | |
| (FixedArray::kMaxSize - kHeaderSize) / kPointerSize; | |
| static Handle<WeakArrayList> EnsureSpace( | |
| Isolate* isolate, Handle<WeakArrayList> array, int length, | |
| PretenureFlag pretenure = NOT_TENURED); | |
| // Returns the number of non-cleaned weak references in the array. | |
| int CountLiveWeakReferences() const; | |
| // Returns whether an entry was found and removed. Will move the elements | |
| // around in the array - this method can only be used in cases where the user | |
| // doesn't care about the indices! Users should make sure there are no | |
| // duplicates. | |
| bool RemoveOne(MaybeObjectHandle value); | |
| class Iterator { | |
| public: | |
| explicit Iterator(WeakArrayList* array) : index_(0), array_(array) {} | |
| inline HeapObject* Next(); | |
| private: | |
| int index_; | |
| WeakArrayList* array_; | |
| #ifdef DEBUG | |
| DisallowHeapAllocation no_gc_; | |
| #endif // DEBUG | |
| DISALLOW_COPY_AND_ASSIGN(Iterator); | |
| }; | |
| private: | |
| static int OffsetOfElementAt(int index) { | |
| return kHeaderSize + index * kPointerSize; | |
| } | |
| DISALLOW_IMPLICIT_CONSTRUCTORS(WeakArrayList); | |
| }; | |
| // Generic array grows dynamically with O(1) amortized insertion. | |
| // | |
| // ArrayList is a FixedArray with static convenience methods for adding more | |
| // elements. The Length() method returns the number of elements in the list, not | |
| // the allocated size. The number of elements is stored at kLengthIndex and is | |
| // updated with every insertion. The elements of the ArrayList are stored in the | |
| // underlying FixedArray starting at kFirstIndex. | |
| class ArrayList : public FixedArray { | |
| public: | |
| static Handle<ArrayList> Add(Isolate* isolate, Handle<ArrayList> array, | |
| Handle<Object> obj); | |
| static Handle<ArrayList> Add(Isolate* isolate, Handle<ArrayList> array, | |
| Handle<Object> obj1, Handle<Object> obj2); | |
| static Handle<ArrayList> New(Isolate* isolate, int size); | |
| // Returns the number of elements in the list, not the allocated size, which | |
| // is length(). Lower and upper case length() return different results! | |
| inline int Length() const; | |
| // Sets the Length() as used by Elements(). Does not change the underlying | |
| // storage capacity, i.e., length(). | |
| inline void SetLength(int length); | |
| inline Object* Get(int index) const; | |
| inline Object** Slot(int index); | |
| // Set the element at index to obj. The underlying array must be large enough. | |
| // If you need to grow the ArrayList, use the static Add() methods instead. | |
| inline void Set(int index, Object* obj, | |
| WriteBarrierMode mode = UPDATE_WRITE_BARRIER); | |
| // Set the element at index to undefined. This does not change the Length(). | |
| inline void Clear(int index, Object* undefined); | |
| // Return a copy of the list of size Length() without the first entry. The | |
| // number returned by Length() is stored in the first entry. | |
| static Handle<FixedArray> Elements(Isolate* isolate, Handle<ArrayList> array); | |
| bool IsFull(); | |
| DECL_CAST(ArrayList) | |
| private: | |
| static Handle<ArrayList> EnsureSpace(Isolate* isolate, | |
| Handle<ArrayList> array, int length); | |
| static const int kLengthIndex = 0; | |
| static const int kFirstIndex = 1; | |
| DISALLOW_IMPLICIT_CONSTRUCTORS(ArrayList); | |
| }; | |
| enum SearchMode { ALL_ENTRIES, VALID_ENTRIES }; | |
| template <SearchMode search_mode, typename T> | |
| inline int Search(T* array, Name* name, int valid_entries = 0, | |
| int* out_insertion_index = nullptr); | |
| // ByteArray represents fixed sized byte arrays. Used for the relocation info | |
| // that is attached to code objects. | |
| class ByteArray : public FixedArrayBase { | |
| public: | |
| inline int Size(); | |
| // Setter and getter. | |
| inline byte get(int index) const; | |
| inline void set(int index, byte value); | |
| // Copy in / copy out whole byte slices. | |
| inline void copy_out(int index, byte* buffer, int length); | |
| inline void copy_in(int index, const byte* buffer, int length); | |
| // Treat contents as an int array. | |
| inline int get_int(int index) const; | |
| inline void set_int(int index, int value); | |
| inline uint32_t get_uint32(int index) const; | |
| inline void set_uint32(int index, uint32_t value); | |
| // Clear uninitialized padding space. This ensures that the snapshot content | |
| // is deterministic. | |
| inline void clear_padding(); | |
| static int SizeFor(int length) { | |
| return OBJECT_POINTER_ALIGN(kHeaderSize + length); | |
| } | |
| // We use byte arrays for free blocks in the heap. Given a desired size in | |
| // bytes that is a multiple of the word size and big enough to hold a byte | |
| // array, this function returns the number of elements a byte array should | |
| // have. | |
| static int LengthFor(int size_in_bytes) { | |
| DCHECK(IsAligned(size_in_bytes, kPointerSize)); | |
| DCHECK_GE(size_in_bytes, kHeaderSize); | |
| return size_in_bytes - kHeaderSize; | |
| } | |
| // Returns data start address. | |
| inline byte* GetDataStartAddress(); | |
| inline int DataSize() const; | |
| // Returns a pointer to the ByteArray object for a given data start address. | |
| static inline ByteArray* FromDataStartAddress(Address address); | |
| DECL_CAST(ByteArray) | |
| // Dispatched behavior. | |
| inline int ByteArraySize(); | |
| DECL_PRINTER(ByteArray) | |
| DECL_VERIFIER(ByteArray) | |
| // Layout description. | |
| static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize); | |
| // Maximal length of a single ByteArray. | |
| static const int kMaxLength = kMaxSize - kHeaderSize; | |
| static_assert(Internals::IsValidSmi(kMaxLength), | |
| "ByteArray maxLength not a Smi"); | |
| class BodyDescriptor; | |
| // No weak fields. | |
| typedef BodyDescriptor BodyDescriptorWeak; | |
| private: | |
| DISALLOW_IMPLICIT_CONSTRUCTORS(ByteArray); | |
| }; | |
| // Wrapper class for ByteArray which can store arbitrary C++ classes, as long | |
| // as they can be copied with memcpy. | |
| template <class T> | |
| class PodArray : public ByteArray { | |
| public: | |
| static Handle<PodArray<T>> New(Isolate* isolate, int length, | |
| PretenureFlag pretenure = NOT_TENURED); | |
| void copy_out(int index, T* result) { | |
| ByteArray::copy_out(index * sizeof(T), reinterpret_cast<byte*>(result), | |
| sizeof(T)); | |
| } | |
| T get(int index) { | |
| T result; | |
| copy_out(index, &result); | |
| return result; | |
| } | |
| void set(int index, const T& value) { | |
| copy_in(index * sizeof(T), reinterpret_cast<const byte*>(&value), | |
| sizeof(T)); | |
| } | |
| inline int length(); | |
| DECL_CAST(PodArray<T>) | |
| private: | |
| DISALLOW_IMPLICIT_CONSTRUCTORS(PodArray<T>); | |
| }; | |
| class FixedTypedArrayBase : public FixedArrayBase { | |
| public: | |
| // [base_pointer]: Either points to the FixedTypedArrayBase itself or nullptr. | |
| DECL_ACCESSORS(base_pointer, Object) | |
| // [external_pointer]: Contains the offset between base_pointer and the start | |
| // of the data. If the base_pointer is a nullptr, the external_pointer | |
| // therefore points to the actual backing store. | |
| DECL_ACCESSORS(external_pointer, void) | |
| // Dispatched behavior. | |
| DECL_CAST(FixedTypedArrayBase) | |
| static const int kBasePointerOffset = FixedArrayBase::kHeaderSize; | |
| static const int kExternalPointerOffset = kBasePointerOffset + kPointerSize; | |
| static const int kHeaderSize = | |
| DOUBLE_POINTER_ALIGN(kExternalPointerOffset + kPointerSize); | |
| static const int kDataOffset = kHeaderSize; | |
| static const int kMaxElementSize = 8; | |
| #ifdef V8_HOST_ARCH_32_BIT | |
| static const size_t kMaxByteLength = std::numeric_limits<size_t>::max(); | |
| #else | |
| static const size_t kMaxByteLength = | |
| static_cast<size_t>(Smi::kMaxValue) * kMaxElementSize; | |
| #endif // V8_HOST_ARCH_32_BIT | |
| static const size_t kMaxLength = Smi::kMaxValue; | |
| class BodyDescriptor; | |
| // No weak fields. | |
| typedef BodyDescriptor BodyDescriptorWeak; | |
| inline int size() const; | |
| static inline int TypedArraySize(InstanceType type, int length); | |
| inline int TypedArraySize(InstanceType type) const; | |
| // Use with care: returns raw pointer into heap. | |
| inline void* DataPtr(); | |
| inline int DataSize() const; | |
| inline size_t ByteLength() const; | |
| private: | |
| static inline int ElementSize(InstanceType type); | |
| inline int DataSize(InstanceType type) const; | |
| DISALLOW_IMPLICIT_CONSTRUCTORS(FixedTypedArrayBase); | |
| }; | |
| template <class Traits> | |
| class FixedTypedArray : public FixedTypedArrayBase { | |
| public: | |
| typedef typename Traits::ElementType ElementType; | |
| static const InstanceType kInstanceType = Traits::kInstanceType; | |
| DECL_CAST(FixedTypedArray<Traits>) | |
| static inline ElementType get_scalar_from_data_ptr(void* data_ptr, int index); | |
| inline ElementType get_scalar(int index); | |
| static inline Handle<Object> get(Isolate* isolate, FixedTypedArray* array, | |
| int index); | |
| inline void set(int index, ElementType value); | |
| static inline ElementType from(int value); | |
| static inline ElementType from(uint32_t value); | |
| static inline ElementType from(double value); | |
| static inline ElementType from(int64_t value); | |
| static inline ElementType from(uint64_t value); | |
| static inline ElementType FromHandle(Handle<Object> value, | |
| bool* lossless = nullptr); | |
| // This accessor applies the correct conversion from Smi, HeapNumber | |
| // and undefined. | |
| inline void SetValue(uint32_t index, Object* value); | |
| DECL_PRINTER(FixedTypedArray) | |
| DECL_VERIFIER(FixedTypedArray) | |
| private: | |
| DISALLOW_IMPLICIT_CONSTRUCTORS(FixedTypedArray); | |
| }; | |
| #define FIXED_TYPED_ARRAY_TRAITS(Type, type, TYPE, elementType) \ | |
| STATIC_ASSERT(sizeof(elementType) <= FixedTypedArrayBase::kMaxElementSize); \ | |
| class Type##ArrayTraits { \ | |
| public: /* NOLINT */ \ | |
| typedef elementType ElementType; \ | |
| static const InstanceType kInstanceType = FIXED_##TYPE##_ARRAY_TYPE; \ | |
| static const char* Designator() { return #type " array"; } \ | |
| static inline Handle<Object> ToHandle(Isolate* isolate, \ | |
| elementType scalar); \ | |
| static inline elementType defaultValue(); \ | |
| }; \ | |
| \ | |
| typedef FixedTypedArray<Type##ArrayTraits> Fixed##Type##Array; | |
| TYPED_ARRAYS(FIXED_TYPED_ARRAY_TRAITS) | |
| #undef FIXED_TYPED_ARRAY_TRAITS | |
| class TemplateList : public FixedArray { | |
| public: | |
| static Handle<TemplateList> New(Isolate* isolate, int size); | |
| inline int length() const; | |
| inline Object* get(int index) const; | |
| inline void set(int index, Object* value); | |
| static Handle<TemplateList> Add(Isolate* isolate, Handle<TemplateList> list, | |
| Handle<Object> value); | |
| DECL_CAST(TemplateList) | |
| private: | |
| static const int kLengthIndex = 0; | |
| static const int kFirstElementIndex = kLengthIndex + 1; | |
| DISALLOW_IMPLICIT_CONSTRUCTORS(TemplateList); | |
| }; | |
| } // namespace internal | |
| } // namespace v8 | |
| #include "src/objects/object-macros-undef.h" | |
| #endif // V8_OBJECTS_FIXED_ARRAY_H_ |