[JSC] Handle new_async_func / new_async_func_exp in DFG / FTL
[WebKit-https.git] / JSTests / stress / async-function-declaration-sinking-put.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
11 function shouldBeAsync(expected, promise, msg) {
12     let actual;
13     var hadError = false;
14     promise.then(function(value) { actual = value; },
15                  function(error) { hadError = true; actual = error; });
16     drainMicrotasks();
17
18     if (hadError)
19         throw actual;
20
21     shouldBe(expected, actual, msg);
22 }
23
24 var AsyncFunctionPrototype = async function(){}.__proto__;
25
26 function sink (p, q) {
27     async function g(x) { return x; };
28     if (p) { if (q) g.inner = 42; return g; }
29     async function f(x) { return x; };
30     return f;
31 }
32 noInline(sink);
33
34 for (var i = 0; i < 10000; ++i) {
35     var f = sink(true, true);
36     shouldBe(f.__proto__, AsyncFunctionPrototype);
37     shouldBeAsync(42, f(42));
38 }
39
40 // At this point, the function should be compiled down to the FTL
41
42 // Test the allocation on the implicit inner else branch
43 var f = sink(true, false);
44 shouldBe(f.__proto__, AsyncFunctionPrototype);
45 shouldBeAsync(12, f(12));
46
47 // Check that the allocation did not sink beyond the property assignment
48 var f = sink(true, true);
49 shouldBe(f.__proto__, AsyncFunctionPrototype);
50 var result = f.inner;
51 if (result !== 42)
52     throw "Error: inner should be 42 but is " + result;