promise-resolve.js 3.75 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --allow-natives-syntax

function assertFulfilledWith(expected, thenable) {
  assertPromiseResult(thenable, v => assertEquals(expected, v));
}

(function() {
  function foo() { return Promise.resolve(); }
13
  %PrepareFunctionForOptimization(foo);
14 15 16 17 18 19 20 21
  assertFulfilledWith(undefined, foo());
  assertFulfilledWith(undefined, foo());
  %OptimizeFunctionOnNextCall(foo);
  assertFulfilledWith(undefined, foo());
})();

(function() {
  function foo(x) { return Promise.resolve(x); }
22
  %PrepareFunctionForOptimization(foo);
23 24 25 26 27 28 29 30
  assertFulfilledWith(3, foo(3));
  assertFulfilledWith(3, foo(3));
  %OptimizeFunctionOnNextCall(foo);
  assertFulfilledWith(3, foo(3));
})();

(function() {
  function foo(x, y) { return Promise.resolve(x, y); }
31
  %PrepareFunctionForOptimization(foo);
32 33 34 35 36 37 38 39
  assertFulfilledWith(1, foo(1, 0));
  assertFulfilledWith(2, foo(2, 1));
  %OptimizeFunctionOnNextCall(foo);
  assertFulfilledWith(3, foo(3, 2));
})();

(function() {
  function foo(x) { return Promise.resolve({x}); }
40
  %PrepareFunctionForOptimization(foo);
41 42 43 44 45 46 47 48
  assertFulfilledWith({x:1}, foo(1));
  assertFulfilledWith({x:2}, foo(2));
  %OptimizeFunctionOnNextCall(foo);
  assertFulfilledWith({x:3}, foo(3));
})();

(function() {
  function foo(x) { return Promise.resolve(Promise.resolve(x)); }
49
  %PrepareFunctionForOptimization(foo);
50 51 52 53 54 55 56 57 58 59 60 61 62
  assertFulfilledWith(null, foo(null));
  assertFulfilledWith('a', foo('a'));
  %OptimizeFunctionOnNextCall(foo);
  assertFulfilledWith(42, foo(42));
})();

(function() {
  const thenable = new class Thenable {
    then(fulfill, reject) {
      fulfill(1);
    }
  };
  function foo() { return Promise.resolve(thenable); }
63
  %PrepareFunctionForOptimization(foo);
64 65 66 67 68 69 70 71 72 73 74
  assertFulfilledWith(1, foo());
  assertFulfilledWith(1, foo());
  %OptimizeFunctionOnNextCall(foo);
  assertFulfilledWith(1, foo());
})();

(function() {
  const MyPromise = class MyPromise extends Promise {};

  (function() {
    function foo() { return MyPromise.resolve(); }
75
    %PrepareFunctionForOptimization(foo);
76 77 78 79 80 81 82 83
    assertFulfilledWith(undefined, foo());
    assertFulfilledWith(undefined, foo());
    %OptimizeFunctionOnNextCall(foo);
    assertFulfilledWith(undefined, foo());
  })();

  (function() {
    function foo(x) { return MyPromise.resolve(x); }
84
    %PrepareFunctionForOptimization(foo);
85 86 87 88 89 90 91 92
    assertFulfilledWith(3, foo(3));
    assertFulfilledWith(3, foo(3));
    %OptimizeFunctionOnNextCall(foo);
    assertFulfilledWith(3, foo(3));
  })();

  (function() {
    function foo(x, y) { return MyPromise.resolve(x, y); }
93
    %PrepareFunctionForOptimization(foo);
94 95 96 97 98 99 100 101
    assertFulfilledWith(1, foo(1, 0));
    assertFulfilledWith(2, foo(2, 1));
    %OptimizeFunctionOnNextCall(foo);
    assertFulfilledWith(3, foo(3, 2));
  })();

  (function() {
    function foo(x) { return MyPromise.resolve({x}); }
102
    %PrepareFunctionForOptimization(foo);
103 104 105 106 107 108 109 110
    assertFulfilledWith({x:1}, foo(1));
    assertFulfilledWith({x:2}, foo(2));
    %OptimizeFunctionOnNextCall(foo);
    assertFulfilledWith({x:3}, foo(3));
  })();

  (function() {
    function foo(x) { return MyPromise.resolve(Promise.resolve(x)); }
111
    %PrepareFunctionForOptimization(foo);
112 113 114 115 116 117 118 119 120 121 122 123 124
    assertFulfilledWith(null, foo(null));
    assertFulfilledWith('a', foo('a'));
    %OptimizeFunctionOnNextCall(foo);
    assertFulfilledWith(42, foo(42));
  })();

  (function() {
    const thenable = new class Thenable {
      then(fulfill, reject) {
        fulfill(1);
      }
    };
    function foo() { return MyPromise.resolve(thenable); }
125
    %PrepareFunctionForOptimization(foo);
126 127 128 129 130 131
    assertFulfilledWith(1, foo());
    assertFulfilledWith(1, foo());
    %OptimizeFunctionOnNextCall(foo);
    assertFulfilledWith(1, foo());
  })();
})();