2026-05-14 19:17:32 -03:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2026-present, the Ladybird developers.
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <LibJS/Runtime/EnvironmentShape.h>
|
|
|
|
|
#include <LibJS/Runtime/ExternalMemory.h>
|
|
|
|
|
#include <LibJS/Runtime/VM.h>
|
|
|
|
|
|
|
|
|
|
namespace JS {
|
|
|
|
|
|
|
|
|
|
GC_DEFINE_ALLOCATOR(EnvironmentShape);
|
|
|
|
|
|
2026-05-14 19:47:38 -03:00
|
|
|
EnvironmentShape::EnvironmentShape(Vector<Utf16FlyString> binding_names, Vector<u8> binding_flags, HashMap<Utf16FlyString, size_t> binding_indices)
|
|
|
|
|
: m_binding_names(move(binding_names))
|
|
|
|
|
, m_binding_flags(move(binding_flags))
|
2026-05-14 19:17:32 -03:00
|
|
|
, m_binding_indices(move(binding_indices))
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GC::Ref<EnvironmentShape> EnvironmentShape::create(VM& vm, ReadonlySpan<Utf16FlyString> names, ReadonlySpan<u8> flags)
|
|
|
|
|
{
|
|
|
|
|
VERIFY(names.size() == flags.size());
|
|
|
|
|
|
2026-05-14 19:47:38 -03:00
|
|
|
Vector<Utf16FlyString> binding_names;
|
|
|
|
|
binding_names.ensure_capacity(names.size());
|
|
|
|
|
|
|
|
|
|
Vector<u8> binding_flags;
|
|
|
|
|
binding_flags.ensure_capacity(flags.size());
|
2026-05-14 19:17:32 -03:00
|
|
|
|
|
|
|
|
HashMap<Utf16FlyString, size_t> binding_indices;
|
|
|
|
|
binding_indices.ensure_capacity(names.size());
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < names.size(); ++i) {
|
2026-05-14 19:47:38 -03:00
|
|
|
binding_names.unchecked_append(names[i]);
|
|
|
|
|
binding_flags.unchecked_append(flags[i]);
|
2026-05-14 19:17:32 -03:00
|
|
|
|
|
|
|
|
if (!names[i].is_empty())
|
|
|
|
|
binding_indices.set(names[i], i);
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-14 19:47:38 -03:00
|
|
|
return vm.heap().allocate<EnvironmentShape>(move(binding_names), move(binding_flags), move(binding_indices));
|
2026-05-14 19:17:32 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Optional<size_t> 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
|
|
|
|
|
{
|
2026-05-14 19:47:38 -03:00
|
|
|
auto size = vector_external_memory_size(m_binding_names);
|
|
|
|
|
size = saturating_add_external_memory_size(size, vector_external_memory_size(m_binding_flags));
|
2026-05-14 19:17:32 -03:00
|
|
|
size = saturating_add_external_memory_size(size, hash_map_external_memory_size(m_binding_indices));
|
|
|
|
|
return size;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|