| Index: src/js/promise.js | 
| diff --git a/src/js/promise.js b/src/js/promise.js | 
| index f5b39b4048dd5da161a31ccedc7838abdbe65225..930a6143ac6734299d3a385b4e770f200ca9d8ab 100644 | 
| --- a/src/js/promise.js | 
| +++ b/src/js/promise.js | 
| @@ -250,6 +250,33 @@ function ResolvePromise(promise, resolution) { | 
| } catch (e) { | 
| return RejectPromise(promise, e); | 
| } | 
| + | 
| +    // Resolution is a native promise and if it's already resolved or | 
| +    // rejected, shortcircuit the resolution procedure by directly | 
| +    // reusing the value from the promise. | 
| +    if (IsPromise(resolution) && then === PromiseThen) { | 
| +      var thenableState = GET_PRIVATE(resolution, promiseStateSymbol); | 
| +      if (thenableState === kFulfilled) { | 
| +        // This goes inside the if-else to save one symbol lookup in | 
| +        // the slow path. | 
| +        var thenableValue = GET_PRIVATE(resolution, promiseResultSymbol); | 
| +        FulfillPromise(promise, kFulfilled, thenableValue, | 
| +                       promiseFulfillReactionsSymbol); | 
| +        SET_PRIVATE(promise, promiseHasHandlerSymbol, true); | 
| +        return; | 
| +      } else if (thenableState === kRejected) { | 
| +        var thenableValue = GET_PRIVATE(resolution, promiseResultSymbol); | 
| +        if (!HAS_DEFINED_PRIVATE(resolution, promiseHasHandlerSymbol)) { | 
| +          // Promise has already been rejected, but had no handler. | 
| +          // Revoke previously triggered reject event. | 
| +          %PromiseRevokeReject(resolution); | 
| +        } | 
| +        RejectPromise(promise, thenableValue); | 
| +        SET_PRIVATE(resolution, promiseHasHandlerSymbol, true); | 
| +        return; | 
| +      } | 
| +    } | 
| + | 
| if (IS_CALLABLE(then)) { | 
| // PromiseResolveThenableJob | 
| var id, name, instrumenting = DEBUG_IS_ACTIVE; | 
|  |