/* * Copyright (c) 2020-2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace JS { class DeclarativeEnvironmentRecord : public EnvironmentRecord { JS_OBJECT(DeclarativeEnvironmentRecord, EnvironmentRecord); public: enum class EnvironmentRecordType { Declarative, Function, Object, Module, }; DeclarativeEnvironmentRecord(); DeclarativeEnvironmentRecord(EnvironmentRecordType); explicit DeclarativeEnvironmentRecord(EnvironmentRecord* parent_scope); DeclarativeEnvironmentRecord(HashMap variables, EnvironmentRecord* parent_scope); DeclarativeEnvironmentRecord(HashMap variables, EnvironmentRecord* parent_scope, EnvironmentRecordType); virtual ~DeclarativeEnvironmentRecord() override; // ^EnvironmentRecord virtual Optional get_from_environment_record(FlyString const&) const override; virtual void put_into_environment_record(FlyString const&, Variable) override; virtual bool delete_from_environment_record(FlyString const&) override; HashMap const& variables() const { return m_variables; } EnvironmentRecordType type() const { return m_environment_record_type; } protected: virtual void visit_edges(Visitor&) override; private: virtual bool is_declarative_environment_record() const override { return true; } EnvironmentRecordType m_environment_record_type : 8 { EnvironmentRecordType::Declarative }; HashMap m_variables; }; template<> inline bool Object::fast_is() const { return is_declarative_environment_record(); } }