From 435f49d98e22c6546b3fc0a917ff865772abc208 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 8 Mar 2022 12:02:55 -0500 Subject: [PATCH] LibJS: Allow direct index-based initialization of a declarative binding Similar to the direct getter and setter in DeclarativeEnvironment, there are cases where we already know the index of a binding and can avoid a O(n) lookup to re-find that index. --- .../Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp | 10 ++++++++-- .../Libraries/LibJS/Runtime/DeclarativeEnvironment.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp b/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp index 758983ce7d..ec61b3ca13 100644 --- a/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp +++ b/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp @@ -86,11 +86,17 @@ ThrowCompletionOr DeclarativeEnvironment::create_immutable_binding(GlobalO } // 9.1.1.1.4 InitializeBinding ( N, V ), https://tc39.es/ecma262/#sec-declarative-environment-records-initializebinding-n-v -ThrowCompletionOr DeclarativeEnvironment::initialize_binding(GlobalObject&, FlyString const& name, Value value) +ThrowCompletionOr DeclarativeEnvironment::initialize_binding(GlobalObject& global_object, FlyString const& name, Value value) { auto index = find_binding_index(name); VERIFY(index.has_value()); - auto& binding = m_bindings[*index]; + + return initialize_binding_direct(global_object, *index, value); +} + +ThrowCompletionOr DeclarativeEnvironment::initialize_binding_direct(GlobalObject&, size_t index, Value value) +{ + auto& binding = m_bindings[index]; // 1. Assert: envRec must have an uninitialized binding for N. VERIFY(binding.initialized == false); diff --git a/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h b/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h index 67d36b9533..f118024146 100644 --- a/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h +++ b/Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h @@ -45,6 +45,7 @@ public: return names; } + ThrowCompletionOr initialize_binding_direct(GlobalObject&, size_t index, Value); ThrowCompletionOr get_binding_value_direct(GlobalObject&, size_t index, bool strict); ThrowCompletionOr set_mutable_binding_direct(GlobalObject&, size_t index, Value, bool strict);