// |reftest| async // Copyright (C) 2015 André Bargull. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- es6id: 25.4.5.3 description: > Promise reaction jobs do not check for cyclic resolutions. info: | Promise.prototype.then ( onFulfilled , onRejected ) ... 5. Let resultCapability be NewPromiseCapability(C). 6. ReturnIfAbrupt(resultCapability). 7. Return PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability). 25.4.5.3.1 PerformPromiseThen ( promise, onFulfilled, onRejected, resultCapability ) ... 3. If IsCallable(onFulfilled) is false, then a. Let onFulfilled be "Identity". 4. If IsCallable(onRejected) is false, then a. Let onRejected be "Thrower". 5. Let fulfillReaction be the PromiseReaction { [[Capabilities]]: resultCapability, [[Handler]]: onFulfilled }. 6. Let rejectReaction be the PromiseReaction { [[Capabilities]]: resultCapability, [[Handler]]: onRejected}. ... 8. Else if the value of promise's [[PromiseState]] internal slot is "fulfilled", a. Let value be the value of promise's [[PromiseResult]] internal slot. b. Perform EnqueueJob("PromiseJobs", PromiseReactionJob, «fulfillReaction, value»). ... 25.4.2.1 PromiseReactionJob ( reaction, argument ) ... 4. If handler is "Identity", let handlerResult be NormalCompletion(argument). ... 8. Let status be Call(promiseCapability.[[Resolve]], undefined, «handlerResult.[[value]]»). 9. NextJob Completion(status). features: [class] flags: [async] ---*/ var createBadPromise = false; var object = {}; class P extends Promise { constructor(executor) { if (createBadPromise) { executor( function(v) { assert.sameValue(v, object); $DONE(); }, function(e) { $DONE(e); } ); return object; } return super(executor); } } var p = P.resolve(object); createBadPromise = true; var q = p.then(); createBadPromise = false; assert.sameValue(q, object, "then() returns object");