// 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_DESCRIPTOR_ARRAY_H_ #define V8_OBJECTS_DESCRIPTOR_ARRAY_H_ #include "src/common/globals.h" #include "src/objects/fixed-array.h" // TODO(jkummerow): Consider forward-declaring instead. #include "src/base/bit-field.h" #include "src/objects/internal-index.h" #include "src/objects/objects.h" #include "src/objects/struct.h" #include "src/utils/utils.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" namespace v8 { namespace internal { class StructBodyDescriptor; #include "torque-generated/src/objects/descriptor-array-tq.inc" // An EnumCache is a pair used to hold keys and indices caches. class EnumCache : public TorqueGeneratedEnumCache<EnumCache, Struct> { … }; // A DescriptorArray is a custom array that holds instance descriptors. // It has the following layout: // Header: // [16:0 bits]: number_of_all_descriptors (including slack) // [32:16 bits]: number_of_descriptors // [64:32 bits]: raw_gc_state (used by GC) // [kEnumCacheOffset]: enum cache // Elements: // [kHeaderSize + 0]: first key (and internalized String) // [kHeaderSize + 1]: first descriptor details (see PropertyDetails) // [kHeaderSize + 2]: first value for constants / Tagged<Smi>(1) when not // used // Slack: // [kHeaderSize + number of descriptors * 3]: start of slack // The "value" fields store either values or field types. A field type is either // FieldType::None(), FieldType::Any() or a weak reference to a Map. All other // references are strong. class DescriptorArray : public TorqueGeneratedDescriptorArray<DescriptorArray, HeapObject> { … }; // Custom DescriptorArray marking state for visitors that are allowed to write // into the heap. The marking state uses DescriptorArray::raw_gc_state() as // storage. // // The state essentially keeps track of 3 fields: // 1. The collector epoch: The rest of the state is only valid if the epoch // matches. If the epoch doesn't match, the other fields should be considered // invalid. The epoch is necessary, as not all DescriptorArray objects are // eventually trimmed in the atomic pause and thus available for resetting // the state. // 2. Number of already marked descriptors. // 3. Delta of to be marked descriptors in this cycle. This must be 0 after // marking is done. class DescriptorArrayMarkingState final { … }; } // namespace internal } // namespace v8 #include "src/objects/object-macros-undef.h" #endif // V8_OBJECTS_DESCRIPTOR_ARRAY_H_