ladybird/Libraries/LibJS/Runtime/PrivateEnvironment.h
Andreas Kling a6e642790f LibJS: Validate eval private names at instantiation
Track private identifiers that eval code references outside a local
class body and pass them through EvalDeclarationInstantiation data.
This lets direct eval validate those names against the caller private
environment before execution, while indirect eval and missing names
still throw SyntaxError.

Add coverage for direct eval access from methods, field initializers,
static methods, and the missing-private-name SyntaxError path.
2026-05-22 01:56:57 +02:00

64 lines
1.7 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;
bool contains_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;
};
}