[JSC] Do not use asArrayModes() with Structures because it discards TypedArray inform...
[WebKit-https.git] / JSTests / stress / class-syntax-double-constructor.js
1 const oneCallOfParentConstructor = 1;
2 const twoCallOfParentConstructor = 2;
3
4 function tryCatch(klass) {
5   let result = false;
6   try {
7     new klass();
8   } catch(e) {
9     result = e instanceof ReferenceError;
10   }
11   return result;
12 }
13
14 var testCase = function (actual, expected, message) {
15   if (actual !== expected) {
16     throw message + ". Expected '" + expected + "', but was '" + actual + "'";
17   }
18 };
19
20 let count = 0;
21 class A {
22   constructor() {
23     this.id = 0;
24     count++;
25   }
26 }
27
28 class B extends A {
29   constructor() {
30     super();
31     super();
32     super();
33   }
34 }
35
36 testCase(tryCatch(B), true, 'Error: ReferenceError was not raised in case of two or more call super() #1');
37 testCase(count, twoCallOfParentConstructor, 'Excpected two call of parent constructor #1');
38
39 count = 0;
40 class C extends A {
41   constructor() {
42     (()=>super())();
43     (()=>super())();
44     (()=>super())();
45   }
46 }
47
48 testCase(tryCatch(C), true, 'Error: ReferenceError was not raised in case of two or more call super() in arrrow function #2');
49 testCase(count, twoCallOfParentConstructor, 'Excpected two call of parent constructor in arrow function #2');
50
51 count = 0;
52 class D extends A {
53   constructor() {
54     eval('super()');
55     eval('super()');
56     eval('super()');
57   }
58 }
59
60 testCase(tryCatch(D), true, 'Error: ReferenceError was not raised in case of two or more call super() in eval #3');
61 testCase(count, twoCallOfParentConstructor, 'Excpected two call of parent constructor in eval #3');
62
63 count = 0;
64 class E extends A {
65   constructor() {
66     (()=>eval('super()'))();
67     (()=>eval('super()'))();
68     (()=>eval('super()'))();
69   }
70 }
71
72 testCase(tryCatch(E), true, 'Error: ReferenceError was not raised in case of two or more call super() in eval within arrow function #4');
73 testCase(count, twoCallOfParentConstructor, 'Excpected two call of parent constructor in eval within arrow function #4');
74
75 count = 0;
76 class F extends A {
77     constructor() {
78         super();
79         var arrow = () => 'testValue';
80         arrow();
81     }
82 }
83
84 testCase(tryCatch(F), false, 'Error: ReferenceError was raised but should not be #5');
85 testCase(count, oneCallOfParentConstructor, 'Excpected two call of parent constructor #5');
86
87 count = 0;
88 class G extends A {
89     constructor() {
90         super();
91         eval('(()=>"abc")()');
92     }
93 }
94
95 testCase(tryCatch(G), false, 'Error: ReferenceError was raised but should not be #6');
96 testCase(count, oneCallOfParentConstructor, 'Excpected two call of parent constructor #6');
97
98 count = 0;
99 class H extends A {
100     constructor() {
101         eval('(()=>eval("super()"))()');
102         try {
103             eval('(()=>eval("super()"))()');
104         } catch(e) {
105           let result = e instanceof ReferenceError;
106           if (!result) throw new Error('Wrong type error');
107         }
108         try {
109             eval('(()=>eval("super()"))()');
110           } catch(e) {
111             let result = e instanceof ReferenceError;
112             if (!result) throw new Error('Wrong type error');
113           }
114         try {
115             eval('(()=>eval("super()"))()');
116         } catch(e) {
117             let result = e instanceof ReferenceError;
118             if (!result) throw new Error('Wrong type error');
119         }
120     }
121 }
122
123 testCase(tryCatch(H), false, 'Error: ReferenceError was raised but should not be #7');
124 testCase(count, 4, 'Excpected two call of parent constructor #7');
125
126 noInline(B);
127 for (var i = 0; i < 10000; i++) {
128     count = 0;
129     let result = false;
130     try {
131         new B();
132     } catch(e) {
133         result = e instanceof ReferenceError;
134     }
135
136     testCase(result, true, '');
137     testCase(count, 2, '');
138 }
139
140 count = 0;
141 class I extends A {
142   constructor() {
143     super();
144     (()=>super())();
145   }
146 }
147
148 testCase(tryCatch(I), true, 'Error: ReferenceError was not raised in case of two or more call super() #8');
149 testCase(count, 2, 'Excpected two call of parent constructor #8');
150
151 count = 0;
152 class J extends A {
153   constructor() {
154     super();
155     eval('super()');
156   }
157 }
158
159 testCase(tryCatch(J), true, 'Error: ReferenceError was not raised in case of two or more call super() #9');
160 testCase(count, 2, 'Excpected two call of parent constructor #9');
161
162 let maxCount = 150000;
163 class K extends A {
164   constructor(i) {
165     if (i % 2 === 0 )
166       super();
167     if (i % 2 !== 0 || maxCount === i)
168       super();
169   }
170 }
171
172 noInline(K);
173 let result = false;
174 try {
175     count = 0;
176     for (var i = 1; i <= maxCount; i++) {
177         new K(i);
178     }
179 } catch (e) {
180     result = e instanceof ReferenceError;
181 }
182 testCase(result, true, 'Error: ReferenceError was not raised in case of two or more call super() #10');
183 testCase(count, maxCount + 1, 'Excpected a lot of calls of parent constructor #10');