Procházet zdrojové kódy

LibJS: Make ObjectEnvironment::get_binding_value() faster in sloppy mode

We can combine HasProperty and Get into just Get in non-strict mode for
non-with object environments.
Andreas Kling před 2 roky
rodič
revize
12ceaf3790

+ 8 - 0
Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp

@@ -127,6 +127,14 @@ ThrowCompletionOr<Value> ObjectEnvironment::get_binding_value(VM&, FlyString con
 {
 {
     auto& vm = this->vm();
     auto& vm = this->vm();
 
 
+    // OPTIMIZATION: For non-with environments in non-strict mode, we don't need the separate HasProperty check
+    //               since Get will return undefined for missing properties anyway. So we take advantage of this
+    //               to avoid doing both HasProperty and Get.
+    //               We can't do this for with environments, since it would be observable (e.g via a Proxy)
+    // FIXME: We could combine HasProperty and Get in non-strict mode if Get would return a bit more failure information.
+    if (!m_with_environment && !strict)
+        return m_binding_object.get(name);
+
     // 1. Let bindingObject be envRec.[[BindingObject]].
     // 1. Let bindingObject be envRec.[[BindingObject]].
     // 2. Let value be ? HasProperty(bindingObject, N).
     // 2. Let value be ? HasProperty(bindingObject, N).
     auto value = TRY(m_binding_object.has_property(name));
     auto value = TRY(m_binding_object.has_property(name));