ladybird/Libraries/LibJS/Runtime/PrivateEnvironment.h
Andreas Kling 68fa684f76 LibJS: Account runtime storage as external memory
Report outline storage retained by scripts, environments, module
namespace objects, iterator helpers, property name iterators, argument
objects, and error tracebacks. These objects keep vectors and maps that
can grow independently from their GC cell sizes.
2026-05-07 10:03:09 +02:00

63 lines
1.6 KiB
C++

/*
* Copyright (c) 2021, David Tuin <davidot@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/StringView.h>
#include <AK/Utf16FlyString.h>
#include <AK/Vector.h>
#include <LibGC/CellAllocator.h>
#include <LibJS/Heap/Cell.h>
namespace JS {
struct PrivateName {
PrivateName() = default;
PrivateName(u64 unique_id, Utf16FlyString description)
: unique_id(unique_id)
, description(move(description))
{
}
u64 unique_id { 0 };
Utf16FlyString description;
bool operator==(PrivateName const& rhs) const;
};
class PrivateEnvironment : public Cell {
GC_CELL(PrivateEnvironment, Cell);
GC_DECLARE_ALLOCATOR(PrivateEnvironment);
public:
PrivateName resolve_private_identifier(Utf16FlyString const& identifier) const;
void add_private_name(Utf16FlyString description);
PrivateEnvironment* outer_environment() { return m_outer_environment; }
PrivateEnvironment const* outer_environment() const { return m_outer_environment; }
private:
explicit PrivateEnvironment(PrivateEnvironment* parent);
virtual void visit_edges(Visitor&) override;
virtual size_t external_memory_size() const override;
auto find_private_name(Utf16FlyString const& description) const
{
return m_private_names.find_if([&](PrivateName const& private_name) {
return private_name.description == description;
});
}
static u64 s_next_id;
GC::Ptr<PrivateEnvironment> m_outer_environment; // [[OuterEnv]]
Vector<PrivateName> m_private_names; // [[Names]]
u64 m_unique_id;
};
}