Parcourir la source

LibJS: Fix that proxy always said that it had a [[Construct]] slot

davidot il y a 3 ans
Parent
commit
021691753d

+ 10 - 0
Userland/Libraries/LibJS/Runtime/ProxyObject.cpp

@@ -799,6 +799,16 @@ ThrowCompletionOr<Value> ProxyObject::internal_call(Value this_argument, MarkedV
     return call(global_object, trap, &m_handler, &m_target, this_argument, arguments_array);
 }
 
+bool ProxyObject::has_constructor() const
+{
+    // Note: A Proxy exotic object only has a [[Construct]] internal method if the initial value of
+    //       its [[ProxyTarget]] internal slot is an object that has a [[Construct]] internal method.
+    if (!is_function())
+        return false;
+
+    return static_cast<FunctionObject&>(m_target).has_constructor();
+}
+
 // 10.5.13 [[Construct]] ( argumentsList, newTarget ), https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
 ThrowCompletionOr<Object*> ProxyObject::internal_construct(MarkedValueList arguments_list, FunctionObject& new_target)
 {

+ 1 - 1
Userland/Libraries/LibJS/Runtime/ProxyObject.h

@@ -22,7 +22,7 @@ public:
     virtual ~ProxyObject() override;
 
     virtual const FlyString& name() const override;
-    virtual bool has_constructor() const override { return true; }
+    virtual bool has_constructor() const override;
 
     const Object& target() const { return m_target; }
     const Object& handler() const { return m_handler; }