[JSC] AI should not propagate AbstractValue relying on constant folding phase
[WebKit-https.git] / JSTests / stress / generator-return.js
1 function shouldBe(actual, expected) {
2     if (actual !== expected)
3         throw new Error(`bad value: ${String(actual)}`);
4 }
5
6 function shouldBeIteratorResult(actual, { value, done })
7 {
8     shouldBe(actual.value, value);
9     shouldBe(actual.done, done);
10 }
11
12 function unreachable()
13 {
14     throw new Error('unreachable');
15 }
16
17 function shouldThrow(func, errorMessage) {
18     var errorThrown = false;
19     var error = null;
20     try {
21         func();
22     } catch (e) {
23         errorThrown = true;
24         error = e;
25     }
26     if (!errorThrown)
27         throw new Error('not thrown');
28     if (String(error) !== errorMessage)
29         throw new Error(`bad error: ${String(error)}`);
30 }
31
32 (function () {
33     function *gen() {
34         yield yield 20;
35         yield 42;
36     }
37
38     {
39         let g = gen();
40         shouldBeIteratorResult(g.next(0), { value: 20, done: false });
41         shouldBeIteratorResult(g.return(20), { value: 20, done: true });
42         shouldBeIteratorResult(g.return(20), { value: 20, done: true });
43         shouldBeIteratorResult(g.next(42), { value: undefined, done: true });
44     }
45     {
46         let g = gen();
47         shouldBeIteratorResult(g.return(42), { value: 42, done: true });
48         shouldBeIteratorResult(g.next(42), { value: undefined, done: true });
49         shouldBeIteratorResult(g.return(42), { value: 42, done: true });
50     }
51 }());
52
53 (function () {
54     function *gen() {
55         return 42;
56     }
57
58     {
59         let g = gen();
60         shouldBeIteratorResult(g.next(), { value: 42, done: true });
61         shouldBeIteratorResult(g.return(0), { value: 0, done: true });
62     }
63     {
64         let g = gen();
65         shouldBeIteratorResult(g.return(0), { value: 0, done: true });
66         shouldBeIteratorResult(g.next(), { value: undefined, done: true });
67         shouldBeIteratorResult(g.return(42), { value: 42, done: true });
68     }
69 }());
70
71 (function () {
72     function *gen() {
73     }
74
75     {
76         let g = gen();
77         shouldBeIteratorResult(g.next(), { value: undefined, done: true });
78         shouldBeIteratorResult(g.return(0), { value: 0, done: true });
79     }
80     {
81         let g = gen();
82         shouldBeIteratorResult(g.return(0), { value: 0, done: true });
83         shouldBeIteratorResult(g.next(), { value: undefined, done: true });
84         shouldBeIteratorResult(g.return(42), { value: 42, done: true });
85     }
86 }());
87
88 (function () {
89     function *gen() {
90         try {
91             yield 42;
92         } finally {
93             return 400;
94         }
95     }
96
97     {
98         let g = gen();
99         shouldBeIteratorResult(g.next(), { value: 42, done: false });
100         shouldBeIteratorResult(g.return(0), { value: 400, done: true });
101         shouldBeIteratorResult(g.return(0), { value: 0, done: true });
102     }
103     {
104         let g = gen();
105         shouldBeIteratorResult(g.return(0), { value: 0, done: true });
106         shouldBeIteratorResult(g.next(), { value: undefined, done: true });
107         shouldBeIteratorResult(g.return(42), { value: 42, done: true });
108     }
109 }());
110
111
112 (function () {
113     function *gen() {
114         try {
115             yield 42;
116         } finally {
117             throw new Error("thrown");
118         }
119     }
120
121     {
122         let g = gen();
123         shouldBeIteratorResult(g.next(), { value: 42, done: false });
124         shouldThrow(() => g.return(0), `Error: thrown`);
125         shouldBeIteratorResult(g.return(0), { value: 0, done: true });
126     }
127     {
128         let g = gen();
129         shouldBeIteratorResult(g.return(0), { value: 0, done: true });
130         shouldBeIteratorResult(g.next(), { value: undefined, done: true });
131         shouldBeIteratorResult(g.return(42), { value: 42, done: true });
132     }
133 }());