// 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(); } %PrepareFunctionForOptimization(foo); assertFulfilledWith(undefined, foo()); assertFulfilledWith(undefined, foo()); %OptimizeFunctionOnNextCall(foo); assertFulfilledWith(undefined, foo()); })(); (function() { function foo(x) { return Promise.resolve(x); } %PrepareFunctionForOptimization(foo); assertFulfilledWith(3, foo(3)); assertFulfilledWith(3, foo(3)); %OptimizeFunctionOnNextCall(foo); assertFulfilledWith(3, foo(3)); })(); (function() { function foo(x, y) { return Promise.resolve(x, y); } %PrepareFunctionForOptimization(foo); 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}); } %PrepareFunctionForOptimization(foo); 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)); } %PrepareFunctionForOptimization(foo); 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); } %PrepareFunctionForOptimization(foo); assertFulfilledWith(1, foo()); assertFulfilledWith(1, foo()); %OptimizeFunctionOnNextCall(foo); assertFulfilledWith(1, foo()); })(); (function() { const MyPromise = class MyPromise extends Promise {}; (function() { function foo() { return MyPromise.resolve(); } %PrepareFunctionForOptimization(foo); assertFulfilledWith(undefined, foo()); assertFulfilledWith(undefined, foo()); %OptimizeFunctionOnNextCall(foo); assertFulfilledWith(undefined, foo()); })(); (function() { function foo(x) { return MyPromise.resolve(x); } %PrepareFunctionForOptimization(foo); assertFulfilledWith(3, foo(3)); assertFulfilledWith(3, foo(3)); %OptimizeFunctionOnNextCall(foo); assertFulfilledWith(3, foo(3)); })(); (function() { function foo(x, y) { return MyPromise.resolve(x, y); } %PrepareFunctionForOptimization(foo); 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}); } %PrepareFunctionForOptimization(foo); 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)); } %PrepareFunctionForOptimization(foo); 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); } %PrepareFunctionForOptimization(foo); assertFulfilledWith(1, foo()); assertFulfilledWith(1, foo()); %OptimizeFunctionOnNextCall(foo); assertFulfilledWith(1, foo()); })(); })();