Optimize `resolve` method lookup in Promise static methods
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Jun 2019 00:38:20 +0000 (00:38 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Jun 2019 00:38:20 +0000 (00:38 +0000)
https://bugs.webkit.org/show_bug.cgi?id=198864

Patch by Alexey Shvayka <shvaikalesh@gmail.com> on 2019-06-19
Reviewed by Yusuke Suzuki.

JSTests:

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

Source/JavaScriptCore:

Lookup `resolve` method only once in Promise.{all,allSettled,race}.
(https://github.com/tc39/ecma262/pull/1506)

Already implemented in V8.

* builtins/PromiseConstructor.js:

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

JSTests/ChangeLog
JSTests/test262/expectations.yaml
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/builtins/PromiseConstructor.js

index 05d0123..02d736f 100644 (file)
@@ -1,3 +1,12 @@
+2019-06-19  Alexey Shvayka  <shvaikalesh@gmail.com>
+
+        Optimize `resolve` method lookup in Promise static methods
+        https://bugs.webkit.org/show_bug.cgi?id=198864
+
+        Reviewed by Yusuke Suzuki.
+
+        * test262/expectations.yaml: Mark 18 test cases as passing.
+
 2019-06-19  Justin Michaud  <justin_michaud@apple.com>
 
         [WASM-References] Rename anyfunc to funcref
index 94f97f2..006d01c 100644 (file)
@@ -1095,27 +1095,9 @@ test/built-ins/Object/prototype/toString/proxy-function.js:
 test/built-ins/Object/subclass-object-arg.js:
   default: 'Test262Error: Expected SameValue(«undefined», Â«1») to be true'
   strict mode: 'Test262Error: Expected SameValue(«undefined», Â«1») to be true'
-test/built-ins/Promise/all/invoke-resolve-get-error-close.js:
-  default: 'Test262Error: Expected SameValue(«1», Â«0») to be true'
-  strict mode: 'Test262Error: Expected SameValue(«1», Â«0») to be true'
-test/built-ins/Promise/all/invoke-resolve-get-once-multiple-calls.js:
-  default: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«4», Â«1») to be true'
-  strict mode: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«4», Â«1») to be true'
-test/built-ins/Promise/all/invoke-resolve-get-once-no-calls.js:
-  default: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«0», Â«1») to be true'
-  strict mode: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«0», Â«1») to be true'
 test/built-ins/Promise/all/resolve-element-function-nonconstructor.js:
   default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all'
   strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all'
-test/built-ins/Promise/allSettled/invoke-resolve-get-error-close.js:
-  default: 'Test262Error: Expected SameValue(«1», Â«0») to be true'
-  strict mode: 'Test262Error: Expected SameValue(«1», Â«0») to be true'
-test/built-ins/Promise/allSettled/invoke-resolve-get-once-multiple-calls.js:
-  default: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«4», Â«1») to be true'
-  strict mode: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«4», Â«1») to be true'
-test/built-ins/Promise/allSettled/invoke-resolve-get-once-no-calls.js:
-  default: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«0», Â«1») to be true'
-  strict mode: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«0», Â«1») to be true'
 test/built-ins/Promise/allSettled/reject-element-function-nonconstructor.js:
   default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all'
   strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all'
@@ -1128,15 +1110,6 @@ test/built-ins/Promise/get-prototype-abrupt-executor-not-callable.js:
 test/built-ins/Promise/proto-from-ctor-realm.js:
   default: 'Test262Error: Expected SameValue(«[object Promise]», Â«[object Promise]») to be true'
   strict mode: 'Test262Error: Expected SameValue(«[object Promise]», Â«[object Promise]») to be true'
-test/built-ins/Promise/race/invoke-resolve-get-error-close.js:
-  default: 'Test262Error: Expected SameValue(«1», Â«0») to be true'
-  strict mode: 'Test262Error: Expected SameValue(«1», Â«0») to be true'
-test/built-ins/Promise/race/invoke-resolve-get-once-multiple-calls.js:
-  default: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«4», Â«1») to be true'
-  strict mode: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«4», Â«1») to be true'
-test/built-ins/Promise/race/invoke-resolve-get-once-no-calls.js:
-  default: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«0», Â«1») to be true'
-  strict mode: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«0», Â«1») to be true'
 test/built-ins/Promise/reject-function-nonconstructor.js:
   default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all'
   strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all'
index 2ff7f56..974f901 100644 (file)
@@ -1,3 +1,17 @@
+2019-06-19  Alexey Shvayka  <shvaikalesh@gmail.com>
+
+        Optimize `resolve` method lookup in Promise static methods
+        https://bugs.webkit.org/show_bug.cgi?id=198864
+
+        Reviewed by Yusuke Suzuki.
+
+        Lookup `resolve` method only once in Promise.{all,allSettled,race}.
+        (https://github.com/tc39/ecma262/pull/1506)
+
+        Already implemented in V8.
+
+        * builtins/PromiseConstructor.js:
+
 2019-06-19  Tadeu Zagallo  <tzagallo@apple.com>
 
         Some of the ASSERTs in CachedTypes.cpp should be RELEASE_ASSERTs
index c667afd..dc596ed 100644 (file)
@@ -56,9 +56,13 @@ function all(iterable)
     }
 
     try {
+        var promiseResolve = this.resolve;
+        if (typeof promiseResolve !== "function")
+            @throwTypeError("Promise resolve is not a function");
+
         for (var value of iterable) {
             @putByValDirect(values, index, @undefined);
-            var nextPromise = this.resolve(value);
+            var nextPromise = promiseResolve.@call(this, value);
             var resolveElement = newResolveElement(index);
             ++remainingElementsCount;
             nextPromise.then(resolveElement, promiseCapability.@reject);
@@ -136,9 +140,13 @@ function allSettled(iterable)
     }
 
     try {
+        var promiseResolve = this.resolve;
+        if (typeof promiseResolve !== "function")
+            @throwTypeError("Promise resolve is not a function");
+
         for (var value of iterable) {
             @putByValDirect(values, index, @undefined);
-            var nextPromise = this.resolve(value);
+            var nextPromise = promiseResolve.@call(this, value);
             var [resolveElement, rejectElement] = newResolveRejectElements(index);
             ++remainingElementsCount;
             nextPromise.then(resolveElement, rejectElement);
@@ -165,8 +173,12 @@ function race(iterable)
     var promiseCapability = @newPromiseCapability(this);
 
     try {
+        var promiseResolve = this.resolve;
+        if (typeof promiseResolve !== "function")
+            @throwTypeError("Promise resolve is not a function");
+
         for (var value of iterable) {
-            var nextPromise = this.resolve(value);
+            var nextPromise = promiseResolve.@call(this, value);
             nextPromise.then(promiseCapability.@resolve, promiseCapability.@reject);
         }
     } catch (error) {