Commit dcbab0f5 authored by stefan.penner's avatar stefan.penner Committed by Commit bot

[es6] Align Promise.resolve with the spec

* Promise.resolve is now works with subclasses
* Spec removed [[PromiseConstructor]] now can simply use constructor
* Promise.resolve ignores species

R=littledan@chromium.org,domenic@chromium.org
BUG=v8:4161,v8:4341
LOG=Y

Review URL: https://codereview.chromium.org/1362773002

Cr-Commit-Position: refs/heads/master@{#31116}
parent 7e113c47
...@@ -285,8 +285,11 @@ function PromiseThen(onResolve, onReject) { ...@@ -285,8 +285,11 @@ function PromiseThen(onResolve, onReject) {
// Combinators. // Combinators.
function PromiseCast(x) { function PromiseCast(x) {
// TODO(rossberg): cannot do better until we support @@create. if (IsPromise(x) && x.constructor === this) {
return IsPromise(x) ? x : new this(function(resolve) { resolve(x) }); return x;
} else {
return new this(function(resolve) { resolve(x) });
}
} }
function PromiseAll(iterable) { function PromiseAll(iterable) {
......
...@@ -1011,9 +1011,9 @@ function assertAsyncDone(iteration) { ...@@ -1011,9 +1011,9 @@ function assertAsyncDone(iteration) {
log = "" log = ""
var p4 = MyPromise.resolve(4) var p4 = MyPromise.resolve(4)
var p5 = MyPromise.reject(5) var p5 = MyPromise.reject(5)
assertTrue(p4 instanceof Promise, "subclass/instance4") assertTrue(p4 instanceof MyPromise, "subclass/instance4")
assertTrue(p4 instanceof MyPromise, "subclass/instance-my4") assertTrue(p4 instanceof MyPromise, "subclass/instance-my4")
assertTrue(p5 instanceof Promise, "subclass/instance5") assertTrue(p5 instanceof MyPromise, "subclass/instance5")
assertTrue(p5 instanceof MyPromise, "subclass/instance-my5") assertTrue(p5 instanceof MyPromise, "subclass/instance-my5")
d3.resolve(3) d3.resolve(3)
assertTrue(log === "nx4nr5x3", "subclass/resolve") assertTrue(log === "nx4nr5x3", "subclass/resolve")
...@@ -1028,12 +1028,35 @@ function assertAsyncDone(iteration) { ...@@ -1028,12 +1028,35 @@ function assertAsyncDone(iteration) {
log = "" log = ""
Promise.all([11, Promise.accept(12), 13, MyPromise.accept(14), 15, 16]) Promise.all([11, Promise.accept(12), 13, MyPromise.accept(14), 15, 16])
assertTrue(log === "nx14n", "subclass/all/arg")
assertTrue(log === "nx14", "subclass/all/arg")
log = "" log = ""
MyPromise.all([21, Promise.accept(22), 23, MyPromise.accept(24), 25, 26]) MyPromise.all([21, Promise.accept(22), 23, MyPromise.accept(24), 25, 26])
assertTrue(log === "nx24nnx21nnx23nnnx25nnx26n", "subclass/all/self") assertTrue(log === "nx24nnx21nnnnx23nnnx25nnx26n", "subclass/all/self")
})(); })();
(function() {
'use strict';
class Pact extends Promise { }
class Vow extends Pact { }
class Oath extends Vow { }
Oath.constructor = Vow;
assertTrue(Pact.resolve(Pact.resolve()).constructor === Pact,
"subclass/resolve/own");
assertTrue(Pact.resolve(Promise.resolve()).constructor === Pact,
"subclass/resolve/ancestor");
assertTrue(Pact.resolve(Vow.resolve()).constructor === Pact,
"subclass/resolve/descendant"); var vow = Vow.resolve();
vow.constructor = Oath;
assertTrue(Oath.resolve(vow) === vow,
"subclass/resolve/descendant with transplanted own constructor");
}());
assertAsyncDone() assertAsyncDone()
...@@ -288,9 +288,6 @@ ...@@ -288,9 +288,6 @@
'built-ins/Promise/race/S25.4.4.3_A3.1_T2': [FAIL], 'built-ins/Promise/race/S25.4.4.3_A3.1_T2': [FAIL],
'built-ins/Promise/reject/S25.4.4.4_A3.1_T1': [FAIL], 'built-ins/Promise/reject/S25.4.4.4_A3.1_T1': [FAIL],
# https://code.google.com/p/v8/issues/detail?id=4341
'built-ins/Promise/resolve/arg-uniq-ctor': [FAIL],
# https://code.google.com/p/v8/issues/detail?id=4119 # https://code.google.com/p/v8/issues/detail?id=4119
'built-ins/RegExp/15.10.4.1-1': [FAIL], 'built-ins/RegExp/15.10.4.1-1': [FAIL],
'built-ins/RegExp/S15.10.3.1_A2_T1': [FAIL], 'built-ins/RegExp/S15.10.3.1_A2_T1': [FAIL],
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment