Bound functions should pass correct NewTarget value
authorshvaikalesh@gmail.com <shvaikalesh@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Mar 2020 17:51:50 +0000 (17:51 +0000)
committershvaikalesh@gmail.com <shvaikalesh@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Mar 2020 17:51:50 +0000 (17:51 +0000)
https://bugs.webkit.org/show_bug.cgi?id=209057

Reviewed by Keith Miller.

JSTests:

* test262/expectations.yaml: Mark 4 test cases as passing.

Source/JavaScriptCore:

This change implements steps 5-6 of bound function's [[Construct]] method [1],
fixing bound function subclasses and aligning JSC with V8 and SpiderMonkey.

[1]: https://tc39.es/ecma262/#sec-bound-function-exotic-objects-construct-argumentslist-newtarget

* runtime/JSBoundFunction.cpp:
(JSC::boundThisNoArgsFunctionConstruct):
(JSC::boundFunctionConstruct):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@258410 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChangeLog
JSTests/test262/expectations.yaml
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/JSBoundFunction.cpp

index fb375bf..d0e1731 100644 (file)
@@ -1,3 +1,12 @@
+2020-03-13  Alexey Shvayka  <shvaikalesh@gmail.com>
+
+        Bound functions should pass correct NewTarget value
+        https://bugs.webkit.org/show_bug.cgi?id=209057
+
+        Reviewed by Keith Miller.
+
+        * test262/expectations.yaml: Mark 4 test cases as passing.
+
 2020-03-11  Keith Miller  <keith_miller@apple.com>
 
         Test262-runner should always consider crashes as new failures
index 60981b1..5985804 100644 (file)
@@ -942,9 +942,6 @@ test/built-ins/Function/proto-from-ctor-realm.js:
 test/built-ins/Function/prototype/bind/length-exceeds-int32.js:
   default: 'Test262Error: Expected SameValue(«0», «2147483648») to be true'
   strict mode: 'Test262Error: Expected SameValue(«0», «2147483648») to be true'
-test/built-ins/Function/prototype/bind/proto-from-ctor-realm.js:
-  default: 'Test262Error: Expected SameValue(«[object Object]», «[object Object]») to be true'
-  strict mode: 'Test262Error: Expected SameValue(«[object Object]», «[object Object]») to be true'
 test/built-ins/Function/prototype/toString/AsyncFunction.js:
   default: "SyntaxError: Unexpected token ';'. Expected a ')' or a ',' after a parameter declaration."
   strict mode: "SyntaxError: Unexpected token ';'. Expected a ')' or a ',' after a parameter declaration."
@@ -3306,9 +3303,6 @@ test/language/statements/class/ident-name-method-def-with-escaped.js:
 test/language/statements/class/poisoned-underscore-proto.js:
   default: 'Test262Error: should not be called'
   strict mode: 'Test262Error: should not be called'
-test/language/statements/class/subclass/bound-function.js:
-  default: 'Test262Error: Expected SameValue(«[object Object]», «[object Object]») to be true'
-  strict mode: 'Test262Error: Expected SameValue(«[object Object]», «[object Object]») to be true'
 test/language/statements/class/subclass/builtin-objects/ArrayBuffer/regular-subclassing.js:
   default: 'Test262Error: Expected true but got false'
   strict mode: 'Test262Error: Expected true but got false'
index 9c4df80..9012701 100644 (file)
@@ -1,3 +1,19 @@
+2020-03-13  Alexey Shvayka  <shvaikalesh@gmail.com>
+
+        Bound functions should pass correct NewTarget value
+        https://bugs.webkit.org/show_bug.cgi?id=209057
+
+        Reviewed by Keith Miller.
+
+        This change implements steps 5-6 of bound function's [[Construct]] method [1],
+        fixing bound function subclasses and aligning JSC with V8 and SpiderMonkey.
+
+        [1]: https://tc39.es/ecma262/#sec-bound-function-exotic-objects-construct-argumentslist-newtarget
+
+        * runtime/JSBoundFunction.cpp:
+        (JSC::boundThisNoArgsFunctionConstruct):
+        (JSC::boundFunctionConstruct):
+
 2020-03-13  Yusuke Suzuki  <ysuzuki@apple.com>
 
         Unreviewed, change ASSERT to ASSERT_WITH_SECURITY_IMPLICATION since it is now enabled under ENABLE(SECURITY_ASSERTIONS)
index a066d72..c016bba 100644 (file)
@@ -111,7 +111,11 @@ EncodedJSValue JSC_HOST_CALL boundThisNoArgsFunctionConstruct(JSGlobalObject* gl
     ConstructData constructData;
     ConstructType constructType = getConstructData(globalObject->vm(), targetFunction, constructData);
     ASSERT(constructType != ConstructType::None);
-    return JSValue::encode(construct(globalObject, targetFunction, constructType, constructData, args));
+
+    JSValue newTarget = callFrame->newTarget();
+    if (newTarget == boundFunction)
+        newTarget = targetFunction;
+    return JSValue::encode(construct(globalObject, targetFunction, constructType, constructData, args, newTarget));
 }
 
 EncodedJSValue JSC_HOST_CALL boundFunctionConstruct(JSGlobalObject* globalObject, CallFrame* callFrame)
@@ -139,7 +143,11 @@ EncodedJSValue JSC_HOST_CALL boundFunctionConstruct(JSGlobalObject* globalObject
     ConstructData constructData;
     ConstructType constructType = getConstructData(vm, targetFunction, constructData);
     ASSERT(constructType != ConstructType::None);
-    RELEASE_AND_RETURN(scope, JSValue::encode(construct(globalObject, targetFunction, constructType, constructData, args)));
+
+    JSValue newTarget = callFrame->newTarget();
+    if (newTarget == boundFunction)
+        newTarget = targetFunction;
+    RELEASE_AND_RETURN(scope, JSValue::encode(construct(globalObject, targetFunction, constructType, constructData, args, newTarget)));
 }
 
 EncodedJSValue JSC_HOST_CALL isBoundFunction(JSGlobalObject* globalObject, CallFrame* callFrame)