|
@@ -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));
|