/* * Copyright (c) 2026-present, the Ladybird developers. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include namespace JS { struct PropertyMetadata { u32 offset { 0 }; PropertyAttributes attributes { 0 }; }; class JS_API DescriptorArray final : public Cell { GC_CELL(DescriptorArray, Cell); GC_DECLARE_ALLOCATOR(DescriptorArray); public: struct Entry { PropertyKey property_key; u32 offset { 0 }; u16 attributes { 0 }; u16 enum_index { 0 }; PropertyMetadata metadata() const { return { offset, static_cast(attributes) }; } }; static constexpr u32 max_descriptor_count = NumericLimits::max() + 1; DescriptorArray() = default; explicit DescriptorArray(DescriptorArray const&, u32 descriptor_count); virtual ~DescriptorArray() override = default; [[nodiscard]] u32 size() const { return m_entries.size(); } [[nodiscard]] Optional lookup(PropertyKey const&, u32 descriptor_count) const; void set(PropertyKey const&, PropertyMetadata, u32 enum_index); void set_attributes(PropertyKey const&, PropertyAttributes, u32 descriptor_count); void remove(PropertyKey const&, u32 descriptor_count); void for_each_in_insertion_order(Function const&, u32 descriptor_count) const; private: virtual void visit_edges(Visitor&) override; virtual size_t external_memory_size() const override; [[nodiscard]] Optional find(PropertyKey const&, u32 descriptor_count) const; [[nodiscard]] size_t find_insertion_index(PropertyKey const&) const; Vector m_entries; Vector m_entry_indices_by_enum_index; }; static_assert(sizeof(DescriptorArray::Entry) == 16); }