/* * Copyright (c) 2026-present, the Ladybird developers. * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include namespace JS { GC_DEFINE_ALLOCATOR(EnvironmentShape); EnvironmentShape::EnvironmentShape(Vector bindings, HashMap binding_indices) : m_bindings(move(bindings)) , m_binding_indices(move(binding_indices)) { } GC::Ref EnvironmentShape::create(VM& vm, ReadonlySpan names, ReadonlySpan flags) { VERIFY(names.size() == flags.size()); Vector bindings; bindings.ensure_capacity(names.size()); HashMap binding_indices; binding_indices.ensure_capacity(names.size()); for (size_t i = 0; i < names.size(); ++i) { bindings.unchecked_append({ names[i], flags[i] }); if (!names[i].is_empty()) binding_indices.set(names[i], i); } return vm.heap().allocate(move(bindings), move(binding_indices)); } Optional EnvironmentShape::find_binding(Utf16FlyString const& name) const { auto it = m_binding_indices.find(name); if (it == m_binding_indices.end()) return {}; return it->value; } size_t EnvironmentShape::external_memory_size() const { auto size = vector_external_memory_size(m_bindings); size = saturating_add_external_memory_size(size, hash_map_external_memory_size(m_binding_indices)); return size; } }