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 |