OLD | NEW |
| (Empty) |
1 // Copyright 2015 the V8 project authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 // Flags: --strong-mode --allow-natives-syntax | |
6 | |
7 'use strict'; | |
8 | |
9 function assertWeakClassWeakInstances(x) { | |
10 assertFalse(%IsStrong(x)); | |
11 assertFalse(%IsStrong(x.prototype)); | |
12 assertFalse(%IsStrong(new x)); | |
13 } | |
14 | |
15 function assertWeakClassStrongInstances(x) { | |
16 assertFalse(%IsStrong(x)); | |
17 assertFalse(%IsStrong(x.prototype)); | |
18 assertTrue(%IsStrong(new x)); | |
19 } | |
20 | |
21 function assertStrongClassWeakInstances(x) { | |
22 assertTrue(%IsStrong(x)); | |
23 assertTrue(%IsStrong(x.prototype)); | |
24 assertFalse(%IsStrong(new x)); | |
25 } | |
26 | |
27 function assertStrongClassStrongInstances(x) { | |
28 assertTrue(%IsStrong(x)); | |
29 assertTrue(%IsStrong(x.prototype)); | |
30 assertTrue(%IsStrong(new x)); | |
31 } | |
32 | |
33 function getWeakClass() { | |
34 return (class {}); | |
35 } | |
36 | |
37 function getWeakClassExtends(x) { | |
38 return (class extends x {}); | |
39 } | |
40 | |
41 function getStrongClass() { | |
42 "use strong"; | |
43 return (class {}); | |
44 } | |
45 | |
46 function getStrongClassExtends(x) { | |
47 "use strong"; | |
48 return (class extends x {}); | |
49 } | |
50 | |
51 (function SimpleWeakClassLiterals() { | |
52 class C {}; | |
53 class D extends C {}; | |
54 class E extends Object {}; | |
55 | |
56 assertWeakClassWeakInstances(C); | |
57 assertWeakClassWeakInstances(D); | |
58 assertWeakClassWeakInstances(E); | |
59 | |
60 assertWeakClassWeakInstances(class {}); | |
61 assertWeakClassWeakInstances(class extends Object {}); | |
62 assertWeakClassWeakInstances(class extends C {}); | |
63 assertWeakClassWeakInstances(class extends class {} {}); | |
64 })(); | |
65 | |
66 (function SimpleStrongClassLiterals() { | |
67 'use strong'; | |
68 class C {}; | |
69 class D extends C {}; | |
70 | |
71 assertStrongClassStrongInstances(C); | |
72 assertStrongClassStrongInstances(D); | |
73 | |
74 assertStrongClassStrongInstances(class {}); | |
75 assertStrongClassStrongInstances(class extends C {}); | |
76 assertStrongClassStrongInstances(class extends class {} {}); | |
77 })(); | |
78 | |
79 (function MixedWeakClassLiterals() { | |
80 class C extends getStrongClass() {}; | |
81 class D extends getStrongClassExtends((class {})) {}; | |
82 class E extends getStrongClassExtends(C) {}; | |
83 | |
84 assertWeakClassStrongInstances(C); | |
85 assertWeakClassStrongInstances(class extends getStrongClass() {}); | |
86 | |
87 assertWeakClassWeakInstances(D); | |
88 assertWeakClassWeakInstances( | |
89 class extends getStrongClassExtends((class {})) {}); | |
90 | |
91 assertWeakClassStrongInstances(E); | |
92 assertWeakClassStrongInstances( | |
93 class extends getStrongClassExtends(class extends getStrongClass() {}) {}); | |
94 })(); | |
95 | |
96 (function MixedStrongClassLiterals() { | |
97 'use strong'; | |
98 class C extends getWeakClass() {}; | |
99 class D extends getWeakClassExtends((class {})) {}; | |
100 class E extends getWeakClassExtends(C) {}; | |
101 class F extends Object {}; | |
102 | |
103 assertStrongClassWeakInstances(C); | |
104 assertStrongClassWeakInstances(class extends getWeakClass() {}); | |
105 | |
106 assertStrongClassStrongInstances(D); | |
107 assertStrongClassStrongInstances( | |
108 class extends getWeakClassExtends((class {})) {}); | |
109 | |
110 assertStrongClassWeakInstances(E); | |
111 assertStrongClassWeakInstances( | |
112 class extends getWeakClassExtends(class extends getWeakClass() {}) {}); | |
113 | |
114 assertStrongClassWeakInstances(F); | |
115 assertStrongClassWeakInstances(class extends Object {}); | |
116 })(); | |
117 | |
118 (function WeakMonkeyPatchedClassLiterals() { | |
119 class C {}; | |
120 assertWeakClassWeakInstances(C); | |
121 C.__proto__ = getStrongClass(); | |
122 // C's default constructor doesn't call super. | |
123 assertWeakClassWeakInstances(C); | |
124 | |
125 class D extends Object {}; | |
126 assertWeakClassWeakInstances(D); | |
127 D.__proto__ = getStrongClass(); | |
128 // D is a derived class, so its default constructor calls super. | |
129 assertWeakClassStrongInstances(D); | |
130 | |
131 class E extends (class {}) {}; | |
132 E.__proto__ = C; | |
133 assertWeakClassWeakInstances(E); | |
134 | |
135 class F extends (class {}) {}; | |
136 F.__proto__ = D; | |
137 assertWeakClassStrongInstances(F); | |
138 | |
139 class G extends getStrongClass() {}; | |
140 G.__proto__ = getWeakClass(); | |
141 assertWeakClassWeakInstances(G); | |
142 })(); | |
143 | |
144 (function StrongMonkeyPatchedClassLiterals() { | |
145 let C = getStrongClassExtends(getWeakClassExtends(getStrongClass())); | |
146 let D = getStrongClassExtends(getWeakClassExtends(getWeakClass())); | |
147 | |
148 assertStrongClassStrongInstances(C); | |
149 C.__proto__.__proto__ = getWeakClass(); | |
150 assertStrongClassWeakInstances(C); | |
151 C.__proto__.__proto__ = getStrongClass(); | |
152 assertStrongClassStrongInstances(C); | |
153 | |
154 assertStrongClassWeakInstances(D); | |
155 D.__proto__.__proto__ = getStrongClass(); | |
156 assertStrongClassStrongInstances(D); | |
157 D.__proto__.__proto__ = getWeakClass(); | |
158 assertStrongClassWeakInstances(D); | |
159 })(); | |
OLD | NEW |