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_FIXED_ARRAY_BASE_H_
#define V8_OBJECTS_FIXED_ARRAY_BASE_H_

#include "src/common/globals.h"
#include "src/objects/heap-object.h"
#include "src/objects/trusted-object.h"

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

namespace v8::internal {

// Limit all fixed arrays to the same max capacity, so that non-resizing
// transitions between different elements kinds (like Smi to Double) will not
// error.
// This could be larger, but the next power of two up would push the maximum
// byte size of FixedDoubleArray out of int32 range.
static constexpr uint32_t kMaxFixedArrayCapacity =
    V8_LOWER_LIMITS_MODE_BOOL ? (1 * 1024 * 1024) : (128 * 1024 * 1024);

// Common superclass for the FixedArray family of heap classes. Owns the
// length_ field (and optional_padding_ for TAGGED_SIZE_8_BYTES); concrete
// subclasses get them via inheritance and append their own fields after
// kHeaderSize.
V8_OBJECT class FixedArrayBase : public HeapObject {
  V8_IT_ABSTRACT;

 public:
  static constexpr int kLengthOffset = sizeof(HeapObject);
#if TAGGED_SIZE_8_BYTES
  static constexpr uint32_t kPaddingOffset = kLengthOffset + kUInt32Size;
  static constexpr uint32_t kHeaderSize = kPaddingOffset + kUInt32Size;
#else
  static constexpr uint32_t kHeaderSize = kLengthOffset + kUInt32Size;
#endif  // TAGGED_SIZE_8_BYTES
  static constexpr uint32_t kMaxLength = kMaxFixedArrayCapacity;
  static constexpr int kMaxRegularLength =
      (kMaxRegularHeapObjectSize - kHeaderSize) / kTaggedSize;

  inline SafeHeapObjectSize length() const;
  inline SafeHeapObjectSize ulength() const;
  inline SafeHeapObjectSize length(AcquireLoadTag tag) const;
  inline SafeHeapObjectSize length(RelaxedLoadTag tag) const;
  inline void set_length(uint32_t value);
  inline void set_length(uint32_t value, ReleaseStoreTag tag);

  static inline int GetMaxLengthForNewSpaceAllocation(ElementsKind kind);

  V8_EXPORT_PRIVATE inline bool IsCowArray() const;

  DECL_VERIFIER(FixedArrayBase)

 public:
  uint32_t length_;
#if TAGGED_SIZE_8_BYTES
  uint32_t optional_padding_;
#endif
} V8_OBJECT_END;

// Trusted-space mirror of FixedArrayBase. Owns the same length_ /
// optional_padding_ fields but extends TrustedObject so its concrete
// subclasses live in trusted space.
V8_OBJECT class TrustedFixedArrayBase : public TrustedObject {
  V8_IT_ABSTRACT;

 public:
  static constexpr int kLengthOffset = sizeof(TrustedObject);
#if TAGGED_SIZE_8_BYTES
  static constexpr uint32_t kPaddingOffset = kLengthOffset + kUInt32Size;
  static constexpr uint32_t kHeaderSize = kPaddingOffset + kUInt32Size;
#else
  static constexpr uint32_t kHeaderSize = kLengthOffset + kUInt32Size;
#endif  // TAGGED_SIZE_8_BYTES

  inline SafeHeapObjectSize length() const;
  inline SafeHeapObjectSize ulength() const;
  inline SafeHeapObjectSize length(AcquireLoadTag tag) const;
  inline SafeHeapObjectSize length(RelaxedLoadTag tag) const;
  inline void set_length(uint32_t value);
  inline void set_length(uint32_t value, ReleaseStoreTag tag);

 public:
  uint32_t length_;
#if TAGGED_SIZE_8_BYTES
  uint32_t optional_padding_;
#endif
} V8_OBJECT_END;

}  // namespace v8::internal

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

#endif  // V8_OBJECTS_FIXED_ARRAY_BASE_H_