Contact emails

gsat...@chromium.org

Explainer

https://github.com/tc39/proposal-promise-allSettled/pull/40

https://github.com/tc39/ecma262/issues/1505

Spec

https://github.com/tc39/ecma262/pull/1506/files

https://github.com/tc39/proposal-promise-allSettled/pull/40/files

Summary

Promise.{all <https://tc39.github.io/ecma262/#sec-performpromiseall>, race
<https://tc39.github.io/ecma262/#sec-performpromiserace>, allSettled
<https://tc39.github.io/proposal-promise-allSettled/>} lookup the
constructor of the receiver on every iteration of the loop. Instead, this
change makes the lookup happen only once outside the loop.

Motivation

To optimize away the Get and Call of the resolve method on the constructor,
I'd have to check the constructor to see if its resolve method has been
modified or not. If it's not been modified, I can directly call (or even
inline) the builtin %PromiseResolve%, saving the lookup and call overhead
for faster performance.

Without this patch, I would have to check against the constructor for every
iteration of the loop before going to the fast path. With this patch, I can
do a check against the constructor just once at the beginning.

The change in behavior with this patch is that if you modify the
constructor's resolve property in the middle of iterating the iterable
argument, then it is not observed.

Risks

Interoperability and Compatibility

There is a very small risk of interop and web compatibility in the case of
Promise.all and Promise.race, as we are modifying the behavior of methods
that have been shipping for a while. There is no risk of interop or web
compat with Promise.allSettled as it is a new proposal.

I expect the risk to be very low considering the surprising side-effecting
nature of changing the resolve method *while* iterating over the argument
or if there is a user installed ‘resolve’ getter that side effects.

Unfortunately it’s not possible to use counters to determine if this will
break or not -- we can’t count the side effects of calling a method. We can
only determine if the resolve method has been patched or not, but that’s
not fully sufficient to determine the risk.

Given the very low risk of this surprising behavior, I’d like to ship this
to determine if there is any breakage.

Ergonomics

N/A

Activation

N/A


Is this feature supported on all six Blink platforms (Windows, Mac, Linux,
Chrome OS, Android, and Android WebView)?

Yes.

Debuggability

This doesn’t change any of the debugging functionality of Promises.

Is this feature fully tested by web-platform-tests
<https://chromium.googlesource.com/chromium/src/+/master/docs/testing/web_platform_tests.md>?
Link to test suite results from wpt.fyi.

V8 passes all the test262 tests: https://github.com/tc39/test262/pull/2131

Entry on the feature dashboard <http://www.chromestatus.com/>

https://www.chromestatus.com/feature/5171235300311040

Requesting approval to ship?

Yes

-- 
-- 
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev
--- 
You received this message because you are subscribed to the Google Groups 
"v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to