#ifndef V8_OBJECTS_ELEMENTS_H_
#define V8_OBJECTS_ELEMENTS_H_
#include "src/builtins/builtins-utils.h"
#include "src/objects/elements-kind.h"
#include "src/objects/internal-index.h"
#include "src/objects/keys.h"
#include "src/objects/objects.h"
namespace v8 {
namespace internal {
class JSTypedArray;
class ElementsAccessor {
public:
ElementsAccessor() = default;
virtual ~ElementsAccessor() = default;
ElementsAccessor(const ElementsAccessor&) = delete;
ElementsAccessor& operator=(const ElementsAccessor&) = delete;
static ElementsAccessor* ForKind(ElementsKind elements_kind) {
DCHECK_LT(static_cast<int>(elements_kind), kElementsKindCount);
return elements_accessors_[elements_kind];
}
virtual void Validate(Isolate* isolate, Tagged<JSObject> obj) = 0;
virtual bool HasElement(Isolate* isolate, Tagged<JSObject> holder,
uint32_t index, Tagged<FixedArrayBase> backing_store,
PropertyFilter filter = ALL_PROPERTIES) = 0;
inline bool HasElement(Isolate* isolate, Tagged<JSObject> holder,
uint32_t index,
PropertyFilter filter = ALL_PROPERTIES);
virtual bool HasEntry(Isolate* isolate, Tagged<JSObject> holder,
InternalIndex entry) = 0;
virtual Handle<Object> Get(Isolate* isolate, DirectHandle<JSObject> holder,
InternalIndex entry) = 0;
virtual Handle<Object> GetAtomic(Isolate* isolate,
DirectHandle<JSObject> holder,
InternalIndex entry,
SeqCstAccessTag tag) = 0;
virtual bool HasAccessors(Tagged<JSObject> holder) = 0;
virtual size_t NumberOfElements(Isolate* isolate,
Tagged<JSObject> holder) = 0;
V8_WARN_UNUSED_RESULT virtual Maybe<bool> SetLength(
Isolate* isolate, DirectHandle<JSArray> holder, uint32_t new_length) = 0;
V8_WARN_UNUSED_RESULT virtual ExceptionStatus CollectElementIndices(
DirectHandle<JSObject> object, DirectHandle<FixedArrayBase> backing_store,
KeyAccumulator* keys) = 0;
V8_WARN_UNUSED_RESULT inline ExceptionStatus CollectElementIndices(
DirectHandle<JSObject> object, KeyAccumulator* keys);
virtual Maybe<bool> CollectValuesOrEntries(
Isolate* isolate, DirectHandle<JSObject> object,
DirectHandle<FixedArray> values_or_entries, bool get_entries,
int* nof_items, PropertyFilter filter = ALL_PROPERTIES) = 0;
virtual MaybeHandle<FixedArray> PrependElementIndices(
Isolate* isolate, DirectHandle<JSObject> object,
DirectHandle<FixedArrayBase> backing_store, DirectHandle<FixedArray> keys,
GetKeysConversion convert, PropertyFilter filter = ALL_PROPERTIES) = 0;
inline MaybeHandle<FixedArray> PrependElementIndices(
Isolate* isolate, DirectHandle<JSObject> object,
DirectHandle<FixedArray> keys, GetKeysConversion convert,
PropertyFilter filter = ALL_PROPERTIES);
V8_WARN_UNUSED_RESULT virtual ExceptionStatus AddElementsToKeyAccumulator(
DirectHandle<JSObject> receiver, KeyAccumulator* accumulator,
AddKeyConversion convert) = 0;
virtual void TransitionElementsKind(Isolate* isolate,
DirectHandle<JSObject> object,
DirectHandle<Map> map) = 0;
V8_WARN_UNUSED_RESULT virtual Maybe<bool> GrowCapacityAndConvert(
Isolate* isolate, DirectHandle<JSObject> object, uint32_t capacity) = 0;
V8_WARN_UNUSED_RESULT virtual Maybe<bool> GrowCapacity(
Isolate* isolate, DirectHandle<JSObject> object, uint32_t index) = 0;
static void InitializeOncePerProcess();
static void TearDown();
virtual void Set(DirectHandle<JSObject> holder, InternalIndex entry,
Tagged<Object> value) = 0;
virtual void SetAtomic(DirectHandle<JSObject> holder, InternalIndex entry,
Tagged<Object> value, SeqCstAccessTag tag) = 0;
virtual Handle<Object> SwapAtomic(Isolate* isolate,
DirectHandle<JSObject> holder,
InternalIndex entry, Tagged<Object> value,
SeqCstAccessTag tag) = 0;
virtual Handle<Object> CompareAndSwapAtomic(
Isolate* isolate, DirectHandle<JSObject> holder, InternalIndex entry,
Tagged<Object> expected, Tagged<Object> value, SeqCstAccessTag tag) = 0;
V8_WARN_UNUSED_RESULT virtual Maybe<bool> Add(Isolate* isolate,
DirectHandle<JSObject> object,
uint32_t index,
DirectHandle<Object> value,
PropertyAttributes attributes,
uint32_t new_capacity) = 0;
static DirectHandle<JSArray> Concat(Isolate* isolate, BuiltinArguments* args,
uint32_t concat_size,
uint32_t result_length);
V8_WARN_UNUSED_RESULT virtual Maybe<uint32_t> Push(
Isolate* isolate, DirectHandle<JSArray> receiver, BuiltinArguments* args,
uint32_t push_size) = 0;
V8_WARN_UNUSED_RESULT virtual Maybe<uint32_t> Unshift(
Isolate* isolate, DirectHandle<JSArray> receiver, BuiltinArguments* args,
uint32_t unshift_size) = 0;
virtual Tagged<Object> Pop(Isolate* isolate,
DirectHandle<JSArray> receiver) = 0;
virtual Tagged<Object> Shift(Isolate* isolate,
DirectHandle<JSArray> receiver) = 0;
virtual DirectHandle<NumberDictionary> Normalize(
Isolate* isolate, DirectHandle<JSObject> object) = 0;
virtual size_t GetCapacity(Tagged<JSObject> holder,
Tagged<FixedArrayBase> backing_store) = 0;
V8_WARN_UNUSED_RESULT virtual MaybeDirectHandle<Object> Fill(
Isolate* isolate, DirectHandle<JSObject> receiver,
DirectHandle<Object> obj_value, size_t start, size_t end) = 0;
virtual Maybe<bool> IncludesValue(Isolate* isolate,
DirectHandle<JSObject> receiver,
DirectHandle<Object> value, size_t start,
size_t length) = 0;
virtual Maybe<int64_t> IndexOfValue(Isolate* isolate,
DirectHandle<JSObject> receiver,
DirectHandle<Object> value, size_t start,
size_t length) = 0;
virtual Maybe<int64_t> LastIndexOfValue(DirectHandle<JSObject> receiver,
DirectHandle<Object> value,
size_t start) = 0;
virtual void Reverse(Tagged<JSObject> receiver) = 0;
virtual void CopyElements(Isolate* isolate,
DirectHandle<FixedArrayBase> source,
ElementsKind source_kind,
DirectHandle<FixedArrayBase> destination,
int size) = 0;
virtual Tagged<Object> CopyElements(Isolate* isolate,
DirectHandle<JSAny> source,
DirectHandle<JSObject> destination,
size_t length, size_t offset) = 0;
virtual Handle<FixedArray> CreateListFromArrayLike(
Isolate* isolate, DirectHandle<JSObject> object, uint32_t length) = 0;
virtual void CopyTypedArrayElementsSlice(Tagged<JSTypedArray> source,
Tagged<JSTypedArray> destination,
size_t start, size_t end) = 0;
protected:
friend class LookupIterator;
virtual InternalIndex GetEntryForIndex(Isolate* isolate,
Tagged<JSObject> holder,
Tagged<FixedArrayBase> backing_store,
size_t index) = 0;
virtual PropertyDetails GetDetails(Tagged<JSObject> holder,
InternalIndex entry) = 0;
virtual void Reconfigure(Isolate* isolate, DirectHandle<JSObject> object,
DirectHandle<FixedArrayBase> backing_store,
InternalIndex entry, DirectHandle<Object> value,
PropertyAttributes attributes) = 0;
virtual void Delete(Isolate* isolate, DirectHandle<JSObject> holder,
InternalIndex entry) = 0;
virtual void CopyElements(Isolate* isolate, Tagged<JSObject> source_holder,
uint32_t source_start, ElementsKind source_kind,
DirectHandle<FixedArrayBase> destination,
uint32_t destination_start, int copy_size) = 0;
private:
V8_EXPORT_PRIVATE static ElementsAccessor** elements_accessors_;
};
V8_WARN_UNUSED_RESULT MaybeDirectHandle<Object>
ArrayConstructInitializeElements(Isolate* isolate, DirectHandle<JSArray> array,
JavaScriptArguments* args);
void CopyFastNumberJSArrayElementsToTypedArray(Address raw_context,
Address raw_source,
Address raw_destination,
uintptr_t length,
uintptr_t offset);
void CopyTypedArrayElementsToTypedArray(Address raw_source,
Address raw_destination,
uintptr_t length, uintptr_t offset);
void CopyTypedArrayElementsSlice(Address raw_source, Address raw_destination,
uintptr_t start, uintptr_t end);
}
}
#endif