1425bb815Sopenharmony_ci/* Copyright JS Foundation and other contributors, http://js.foundation
2425bb815Sopenharmony_ci *
3425bb815Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4425bb815Sopenharmony_ci * you may not use this file except in compliance with the License.
5425bb815Sopenharmony_ci * You may obtain a copy of the License at
6425bb815Sopenharmony_ci *
7425bb815Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8425bb815Sopenharmony_ci *
9425bb815Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10425bb815Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS
11425bb815Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12425bb815Sopenharmony_ci * See the License for the specific language governing permissions and
13425bb815Sopenharmony_ci * limitations under the License.
14425bb815Sopenharmony_ci */
15425bb815Sopenharmony_ci
16425bb815Sopenharmony_ci var A = Array;
17425bb815Sopenharmony_ci var order = 0;
18425bb815Sopenharmony_ci
19425bb815Sopenharmony_ci function f () {
20425bb815Sopenharmony_ci   order++;
21425bb815Sopenharmony_ci
22425bb815Sopenharmony_ci   return function () {
23425bb815Sopenharmony_ci     return A;
24425bb815Sopenharmony_ci   }
25425bb815Sopenharmony_ci }
26425bb815Sopenharmony_ci
27425bb815Sopenharmony_ci var B = class extends f ()() {
28425bb815Sopenharmony_ci   constructor () {
29425bb815Sopenharmony_ci     assert (++order === 2);
30425bb815Sopenharmony_ci     eval ("eval ('super (1, 2, 3, 4)')");
31425bb815Sopenharmony_ci     try {
32425bb815Sopenharmony_ci       super (1, 2, 3, 4, 5)
33425bb815Sopenharmony_ci       assert (false);
34425bb815Sopenharmony_ci     } catch (e) {
35425bb815Sopenharmony_ci       assert (e instanceof ReferenceError)
36425bb815Sopenharmony_ci     }
37425bb815Sopenharmony_ci
38425bb815Sopenharmony_ci     assert (this.g ()()()() === 10);
39425bb815Sopenharmony_ci     assert (eval ("eval ('this.g ()')()")()() === 10);
40425bb815Sopenharmony_ci     assert (eval ("eval ('this.g ()')")()()() === 10);
41425bb815Sopenharmony_ci     assert (eval ("eval ('this.g ()()()')")() === 10);
42425bb815Sopenharmony_ci     assert (eval ("eval ('this.g')")()()()() === 10);
43425bb815Sopenharmony_ci     this.push (5);
44425bb815Sopenharmony_ci     assert (this.length === 5)
45425bb815Sopenharmony_ci     eval ('this.push (6)');
46425bb815Sopenharmony_ci     assert (this.length === 6);
47425bb815Sopenharmony_ci     eval ("eval ('this.push (7)')");
48425bb815Sopenharmony_ci     this.j = 6;
49425bb815Sopenharmony_ci     return;
50425bb815Sopenharmony_ci   }
51425bb815Sopenharmony_ci }
52425bb815Sopenharmony_ci
53425bb815Sopenharmony_ci var C = class extends B {
54425bb815Sopenharmony_ci   g () {
55425bb815Sopenharmony_ci     return function () {
56425bb815Sopenharmony_ci       return () => {
57425bb815Sopenharmony_ci         return 10;
58425bb815Sopenharmony_ci       }
59425bb815Sopenharmony_ci     }
60425bb815Sopenharmony_ci   }
61425bb815Sopenharmony_ci }
62425bb815Sopenharmony_ci
63425bb815Sopenharmony_ci var D = class D extends C {
64425bb815Sopenharmony_ci    constructor () {
65425bb815Sopenharmony_ci      super ();
66425bb815Sopenharmony_ci      this.k = 5;
67425bb815Sopenharmony_ci      return
68425bb815Sopenharmony_ci    }
69425bb815Sopenharmony_ci
70425bb815Sopenharmony_ci    g () {
71425bb815Sopenharmony_ci      return eval ('super["g"]');
72425bb815Sopenharmony_ci    }
73425bb815Sopenharmony_ci }
74425bb815Sopenharmony_ci
75425bb815Sopenharmony_ci assert (order === 1);
76425bb815Sopenharmony_ci
77425bb815Sopenharmony_ci var d = new D;
78425bb815Sopenharmony_ci assert (d.length === 7);
79425bb815Sopenharmony_ci assert (d.k === 5);
80425bb815Sopenharmony_ci assert (d.j === 6);
81425bb815Sopenharmony_ci assert (d instanceof D);
82425bb815Sopenharmony_ci assert (d instanceof C);
83425bb815Sopenharmony_ci assert (d instanceof B);
84425bb815Sopenharmony_ci assert (d instanceof f ()());
85425bb815Sopenharmony_ci assert (JSON.stringify (d) === "[1,2,3,4,5,6,7]");
86