current commit
261007.21 · deps: update V8 to 15.5.35.20
// Copyright 2026 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_POD_ARRAY_H_
#define V8_OBJECTS_POD_ARRAY_H_

#include "src/common/globals.h"
#include "src/objects/fixed-primitive-array.h"
#include "src/utils/memcopy.h"

// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"

namespace v8::internal {

V8_OBJECT
template <class T, class Super>
class PodArrayBase : public Super {
 public:
  void copy_out(uint32_t index, T* result, uint32_t length) {
    MemCopy(result, &this->values()[index * sizeof(T)], length * sizeof(T));
  }

  void copy_in(uint32_t index, const T* buffer, uint32_t length) {
    MemCopy(&this->values()[index * sizeof(T)], buffer, length * sizeof(T));
  }

  bool matches(const T* buffer, uint32_t length) {
    DCHECK_LE(length, this->length().value());
    return memcmp(this->begin(), buffer, length * sizeof(T)) == 0;
  }

  bool matches(uint32_t offset, const T* buffer, uint32_t length) {
    DCHECK_LE(offset, this->length().value());
    DCHECK_LE(offset + length, this->length().value());
    return memcmp(this->begin() + sizeof(T) * offset, buffer,
                  length * sizeof(T)) == 0;
  }

  T get(uint32_t index) {
    DCHECK_LT(index, this->length().value());
    T result;
    copy_out(index, &result, 1);
    return result;
  }

  void set(uint32_t index, const T& value) {
    DCHECK_LT(index, this->length().value());
    copy_in(index, &value, 1);
  }

  inline SafeHeapObjectSize length() const;
} V8_OBJECT_END;

// Wrapper class for ByteArray which can store arbitrary C++ classes, as long
// as they can be copied with memcpy.
V8_OBJECT
template <class T>
class PodArray : public PodArrayBase<T, ByteArray> {
  V8_IT_REUSE_PARENT;

 public:
  static Handle<PodArray<T>> New(
      Isolate* isolate, uint32_t length,
      AllocationType allocation = AllocationType::kYoung);
  static Handle<PodArray<T>> New(
      LocalIsolate* isolate, uint32_t length,
      AllocationType allocation = AllocationType::kOld);
} V8_OBJECT_END;

V8_OBJECT
template <class T>
class TrustedPodArray : public PodArrayBase<T, TrustedByteArray> {
  V8_IT_REUSE_PARENT;

 public:
  static DirectHandle<TrustedPodArray<T>> New(Isolate* isolate,
                                              uint32_t length);
  static DirectHandle<TrustedPodArray<T>> New(LocalIsolate* isolate,
                                              uint32_t length);
} V8_OBJECT_END;

}  // namespace v8::internal

#include "src/objects/object-macros-undef.h"

#endif  // V8_OBJECTS_POD_ARRAY_H_