From cb696eff089b1526dc5f043122c1873c961688e7 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 6 Oct 2021 23:53:22 +0200 Subject: [PATCH] LibJS: Make Environment::has_binding() optionally return binding index If the caller wants to use the binding index for anything, if there is such a thing, it can now be obtained via an optional out-parameter. --- .../Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp | 9 +++++++-- .../Libraries/LibJS/Runtime/DeclarativeEnvironment.h | 2 +- Userland/Libraries/LibJS/Runtime/Environment.h | 2 +- Userland/Libraries/LibJS/Runtime/GlobalEnvironment.cpp | 2 +- Userland/Libraries/LibJS/Runtime/GlobalEnvironment.h | 2 +- Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp | 2 +- Userland/Libraries/LibJS/Runtime/ObjectEnvironment.h | 2 +- 7 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp b/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp index c37d180678..df05c978a3 100644 --- a/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp +++ b/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp @@ -35,9 +35,14 @@ void DeclarativeEnvironment::visit_edges(Visitor& visitor) } // 9.1.1.1.1 HasBinding ( N ), https://tc39.es/ecma262/#sec-declarative-environment-records-hasbinding-n -bool DeclarativeEnvironment::has_binding(FlyString const& name) const +bool DeclarativeEnvironment::has_binding(FlyString const& name, Optional* out_index) const { - return m_names.contains(name); + auto it = m_names.find(name); + if (it == m_names.end()) + return false; + if (out_index) + *out_index = it->value; + return true; } // 9.1.1.1.2 CreateMutableBinding ( N, D ), https://tc39.es/ecma262/#sec-declarative-environment-records-createmutablebinding-n-d diff --git a/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h b/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h index 8861cfd916..283346f50a 100644 --- a/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h +++ b/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h @@ -21,7 +21,7 @@ public: explicit DeclarativeEnvironment(Environment* parent_scope); virtual ~DeclarativeEnvironment() override; - virtual bool has_binding(FlyString const& name) const override; + virtual bool has_binding(FlyString const& name, Optional* = nullptr) const override; virtual void create_mutable_binding(GlobalObject&, FlyString const& name, bool can_be_deleted) override; virtual void create_immutable_binding(GlobalObject&, FlyString const& name, bool strict) override; virtual void initialize_binding(GlobalObject&, FlyString const& name, Value) override; diff --git a/Userland/Libraries/LibJS/Runtime/Environment.h b/Userland/Libraries/LibJS/Runtime/Environment.h index 711aa3409a..69d27bf31e 100644 --- a/Userland/Libraries/LibJS/Runtime/Environment.h +++ b/Userland/Libraries/LibJS/Runtime/Environment.h @@ -32,7 +32,7 @@ public: virtual Object* with_base_object() const { return nullptr; } - virtual bool has_binding([[maybe_unused]] FlyString const& name) const { return false; } + virtual bool has_binding([[maybe_unused]] FlyString const& name, [[maybe_unused]] Optional* out_index = nullptr) const { return false; } virtual void create_mutable_binding(GlobalObject&, [[maybe_unused]] FlyString const& name, [[maybe_unused]] bool can_be_deleted) { } virtual void create_immutable_binding(GlobalObject&, [[maybe_unused]] FlyString const& name, [[maybe_unused]] bool strict) { } virtual void initialize_binding(GlobalObject&, [[maybe_unused]] FlyString const& name, Value) { } diff --git a/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.cpp b/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.cpp index 69ae734d0f..66eeceeca4 100644 --- a/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.cpp +++ b/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.cpp @@ -36,7 +36,7 @@ Value GlobalEnvironment::get_this_binding(GlobalObject&) const } // 9.1.1.4.1 HasBinding ( N ), https://tc39.es/ecma262/#sec-global-environment-records-hasbinding-n -bool GlobalEnvironment::has_binding(FlyString const& name) const +bool GlobalEnvironment::has_binding(FlyString const& name, Optional*) const { if (m_declarative_record->has_binding(name)) return true; diff --git a/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.h b/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.h index a3a313018d..c1e789e7ac 100644 --- a/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.h +++ b/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.h @@ -19,7 +19,7 @@ public: virtual bool has_this_binding() const final { return true; } virtual Value get_this_binding(GlobalObject&) const final; - virtual bool has_binding(FlyString const& name) const override; + virtual bool has_binding(FlyString const& name, Optional* = nullptr) const override; virtual void create_mutable_binding(GlobalObject&, FlyString const& name, bool can_be_deleted) override; virtual void create_immutable_binding(GlobalObject&, FlyString const& name, bool strict) override; virtual void initialize_binding(GlobalObject&, FlyString const& name, Value) override; diff --git a/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp b/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp index ba16a3b5db..3aa0fc2040 100644 --- a/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp +++ b/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp @@ -25,7 +25,7 @@ void ObjectEnvironment::visit_edges(Cell::Visitor& visitor) } // 9.1.1.2.1 HasBinding ( N ), https://tc39.es/ecma262/#sec-object-environment-records-hasbinding-n -bool ObjectEnvironment::has_binding(FlyString const& name) const +bool ObjectEnvironment::has_binding(FlyString const& name, Optional*) const { auto& vm = this->vm(); bool found_binding = TRY_OR_DISCARD(m_binding_object.has_property(name)); diff --git a/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.h b/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.h index d9f16fc7d6..7cfe00fdbc 100644 --- a/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.h +++ b/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.h @@ -20,7 +20,7 @@ public: }; ObjectEnvironment(Object& binding_object, IsWithEnvironment, Environment* outer_environment); - virtual bool has_binding(FlyString const& name) const override; + virtual bool has_binding(FlyString const& name, Optional* = nullptr) const override; virtual void create_mutable_binding(GlobalObject&, FlyString const& name, bool can_be_deleted) override; virtual void create_immutable_binding(GlobalObject&, FlyString const& name, bool strict) override; virtual void initialize_binding(GlobalObject&, FlyString const& name, Value) override;