[JSC] Handle new_async_func / new_async_func_exp in DFG / FTL
[WebKit-https.git] / JSTests / stress / async-function-expression-sinking-osrexit.js
1 // This test requires ENABLE_ES2017_ASYNCFUNCTION_SYNTAX to be enabled at build time.
2 //@ skip
3
4 function shouldBe(expected, actual, msg = "") {
5     if (msg)
6         msg = " for " + msg;
7     if (actual !== expected)
8         throw new Error("bad value" + msg + ": " + actual + ". Expected " + expected);
9 }
10 function shouldBeAsync(expected, promise, msg) {
11     let actual;
12     var hadError = false;
13     promise.then(function(value) { actual = value; },
14                  function(error) { hadError = true; actual = error; });
15     drainMicrotasks();
16
17     if (hadError)
18         throw actual;
19
20     shouldBe(expected, actual, msg);
21 }
22
23 var AsyncFunctionPrototype = async function(){}.__proto__;
24
25 function sink (p, q) {
26     var g = async function (x) { return x; };
27     if (p) { if (q) OSRExit(); return g; }
28     return async function (x) { return x; };
29 }
30 noInline(sink);
31
32 for (var i = 0; i < 10000; ++i) {
33     var f = sink(true, false);
34     shouldBe(f.__proto__, AsyncFunctionPrototype);
35     shouldBeAsync(42, f(42));
36 }
37
38 // At this point, the function should be compiled down to the FTL
39
40 // Check that the function is properly allocated on OSR exit
41 var f = sink(true, true);
42 shouldBe(f.__proto__, AsyncFunctionPrototype);
43 shouldBeAsync(42, f(42));