فهرست منبع

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.
Timothy Flynn 3 سال پیش
والد
کامیت
435f49d98e

+ 8 - 2
Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.cpp

@@ -86,11 +86,17 @@ ThrowCompletionOr<void> 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<void> DeclarativeEnvironment::initialize_binding(GlobalObject&, FlyString const& name, Value value)
+ThrowCompletionOr<void> 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<void> 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);

+ 1 - 0
Userland/Libraries/LibJS/Runtime/DeclarativeEnvironment.h

@@ -45,6 +45,7 @@ public:
         return names;
     }
 
+    ThrowCompletionOr<void> initialize_binding_direct(GlobalObject&, size_t index, Value);
     ThrowCompletionOr<Value> get_binding_value_direct(GlobalObject&, size_t index, bool strict);
     ThrowCompletionOr<void> set_mutable_binding_direct(GlobalObject&, size_t index, Value, bool strict);