DeclarativeEnvironmentRecord.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/FlyString.h>
  8. #include <AK/HashMap.h>
  9. #include <LibJS/Runtime/EnvironmentRecord.h>
  10. #include <LibJS/Runtime/Value.h>
  11. namespace JS {
  12. struct Binding {
  13. Value value;
  14. bool strict;
  15. bool mutable_ { false };
  16. bool can_be_deleted { false };
  17. bool initialized { false };
  18. };
  19. class DeclarativeEnvironmentRecord : public EnvironmentRecord {
  20. JS_ENVIRONMENT_RECORD(DeclarativeEnvironmentRecord, EnvironmentRecord);
  21. public:
  22. DeclarativeEnvironmentRecord();
  23. explicit DeclarativeEnvironmentRecord(EnvironmentRecord* parent_scope);
  24. DeclarativeEnvironmentRecord(HashMap<FlyString, Variable> variables, EnvironmentRecord* parent_scope);
  25. virtual ~DeclarativeEnvironmentRecord() override;
  26. // ^EnvironmentRecord
  27. virtual Optional<Variable> get_from_environment_record(FlyString const&) const override;
  28. virtual void put_into_environment_record(FlyString const&, Variable) override;
  29. virtual bool delete_from_environment_record(FlyString const&) override;
  30. HashMap<FlyString, Variable> const& variables() const { return m_variables; }
  31. virtual bool has_binding(FlyString const& name) const override;
  32. virtual void create_mutable_binding(GlobalObject&, FlyString const& name, bool can_be_deleted) override;
  33. virtual void create_immutable_binding(GlobalObject&, FlyString const& name, bool strict) override;
  34. virtual void initialize_binding(GlobalObject&, FlyString const& name, Value) override;
  35. virtual void set_mutable_binding(GlobalObject&, FlyString const& name, Value, bool strict) override;
  36. virtual Value get_binding_value(GlobalObject&, FlyString const& name, bool strict) override;
  37. virtual bool delete_binding(GlobalObject&, FlyString const& name) override;
  38. protected:
  39. virtual void visit_edges(Visitor&) override;
  40. private:
  41. virtual bool is_declarative_environment_record() const override { return true; }
  42. HashMap<FlyString, Variable> m_variables;
  43. HashMap<FlyString, Binding> m_bindings;
  44. };
  45. template<>
  46. inline bool EnvironmentRecord::fast_is<DeclarativeEnvironmentRecord>() const { return is_declarative_environment_record(); }
  47. }