| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Flags: --strong-mode --allow-natives-syntax | 5 // Flags: --strong-mode --allow-natives-syntax |
| 6 // Flags: --harmony-arrow-functions --harmony-rest-parameters | 6 // Flags: --harmony-arrow-functions --harmony-rest-parameters |
| 7 // Flags: --harmony-destructuring | 7 // Flags: --harmony-destructuring --harmony-spread-arrays |
| 8 | 8 |
| 9 'use strict'; | 9 'use strict'; |
| 10 | 10 |
| 11 let GeneratorFunctionPrototype = (function*(){}).__proto__; | |
| 12 | |
| 13 function assertStrongObject(o) { | |
| 14 assertTrue(%IsStrong(o)); | |
| 15 assertSame(Object.prototype, o.__proto__); | |
| 16 } | |
| 17 | |
| 18 function assertStrongArray(a) { | |
| 19 assertTrue(%IsStrong(a)); | |
| 20 assertSame(Array.prototype, a.__proto__); | |
| 21 } | |
| 22 | |
| 23 function assertStrongFunction(f) { | |
| 24 assertTrue(%IsStrong(f)); | |
| 25 assertSame(Function.prototype, f.__proto__); | |
| 26 } | |
| 27 | |
| 28 function assertStrongGenerator(g) { | |
| 29 assertTrue(%IsStrong(g)); | |
| 30 assertSame(GeneratorFunctionPrototype, g.__proto__); | |
| 31 } | |
| 32 | |
| 33 (function WeakObjectLiterals() { | 11 (function WeakObjectLiterals() { |
| 34 assertTrue(!%IsStrong({})); | 12 function assertWeakObject(x) { |
| 35 assertTrue(!%IsStrong({a: 0, b: 0})); | 13 assertFalse(%IsStrong(x)); |
| 36 assertTrue(!%IsStrong({a: [], b: {}})); | 14 assertSame(Object.prototype, Object.getPrototypeOf(x)); |
| 37 assertTrue(!%IsStrong({a: [], b: {}}.a)); | 15 } |
| 38 assertTrue(!%IsStrong({a: [], b: {}}.b)); | 16 assertWeakObject({}); |
| 39 assertTrue(!%IsStrong({a: {b: {c: {}}}}.a)); | 17 assertWeakObject({a: 0, b: 0}); |
| 40 assertTrue(!%IsStrong({a: {b: {c: {}}}}.a.b)); | 18 assertWeakObject({a: [], b: {}}); |
| 41 assertTrue(!%IsStrong({a: {b: {c: {}}}}.a.b.c)); | 19 assertWeakObject({a: [], b: {}}.b); |
| 42 assertTrue(!%IsStrong({f: function(){}})); | 20 assertWeakObject({a: {b: {c: {}}}}.a); |
| 43 assertTrue(!%IsStrong(Realm.eval(Realm.current(), | 21 assertWeakObject({a: {b: {c: {}}}}.a.b); |
| 44 "({f: function(){}})"))); | 22 assertWeakObject({a: {b: {c: {}}}}.a.b.c); |
| 23 assertWeakObject([[1], {}, [[3]]][1]); |
| 24 assertWeakObject({f: function(){}}); |
| 25 assertWeakObject( |
| 26 Realm.eval(Realm.current(), "({f: function(){}})")); |
| 45 })(); | 27 })(); |
| 46 | 28 |
| 47 (function StrongObjectLiterals() { | 29 (function StrongObjectLiterals() { |
| 48 'use strong'; | 30 'use strong'; |
| 31 function assertStrongObject(x) { |
| 32 assertTrue(%IsStrong(x)); |
| 33 assertSame(Object.prototype, Object.getPrototypeOf(x)); |
| 34 } |
| 49 assertStrongObject({}); | 35 assertStrongObject({}); |
| 50 assertStrongObject({a: 0, b: 0}); | 36 assertStrongObject({a: 0, b: 0}); |
| 51 assertStrongObject({a: [], b: {}}); | 37 assertStrongObject({a: [], b: {}}); |
| 52 assertStrongArray({a: [], b: {}}.a); | |
| 53 assertStrongObject({a: [], b: {}}.b); | 38 assertStrongObject({a: [], b: {}}.b); |
| 54 assertStrongObject({a: {b: {c: {}}}}.a); | 39 assertStrongObject({a: {b: {c: {}}}}.a); |
| 55 assertStrongObject({a: {b: {c: {}}}}.a.b); | 40 assertStrongObject({a: {b: {c: {}}}}.a.b); |
| 56 assertStrongObject({a: {b: {c: {}}}}.a.b.c); | 41 assertStrongObject({a: {b: {c: {}}}}.a.b.c); |
| 57 // Maps for literals with too many properties are not cached. | 42 // Maps for literals with too many properties are not cached. |
| 58 assertStrongObject({ | 43 assertStrongObject({ |
| 59 x001: 0, x002: 0, x003: 0, x004: 0, x005: 0, | 44 x001: 0, x002: 0, x003: 0, x004: 0, x005: 0, |
| 60 x006: 0, x007: 0, x008: 0, x009: 0, x010: 0, | 45 x006: 0, x007: 0, x008: 0, x009: 0, x010: 0, |
| 61 x011: 0, x012: 0, x013: 0, x014: 0, x015: 0, | 46 x011: 0, x012: 0, x013: 0, x014: 0, x015: 0, |
| 62 x016: 0, x017: 0, x018: 0, x019: 0, x020: 0, | 47 x016: 0, x017: 0, x018: 0, x019: 0, x020: 0, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 90 x156: 0, x157: 0, x158: 0, x159: 0, x160: 0, | 75 x156: 0, x157: 0, x158: 0, x159: 0, x160: 0, |
| 91 x161: 0, x162: 0, x163: 0, x164: 0, x165: 0, | 76 x161: 0, x162: 0, x163: 0, x164: 0, x165: 0, |
| 92 x166: 0, x167: 0, x168: 0, x169: 0, x170: 0, | 77 x166: 0, x167: 0, x168: 0, x169: 0, x170: 0, |
| 93 x171: 0, x172: 0, x173: 0, x174: 0, x175: 0, | 78 x171: 0, x172: 0, x173: 0, x174: 0, x175: 0, |
| 94 x176: 0, x177: 0, x178: 0, x179: 0, x180: 0, | 79 x176: 0, x177: 0, x178: 0, x179: 0, x180: 0, |
| 95 x181: 0, x182: 0, x183: 0, x184: 0, x185: 0, | 80 x181: 0, x182: 0, x183: 0, x184: 0, x185: 0, |
| 96 x186: 0, x187: 0, x188: 0, x189: 0, x190: 0, | 81 x186: 0, x187: 0, x188: 0, x189: 0, x190: 0, |
| 97 x191: 0, x192: 0, x193: 0, x194: 0, x195: 0, | 82 x191: 0, x192: 0, x193: 0, x194: 0, x195: 0, |
| 98 x196: 0, x197: 0, x198: 0, x199: 0, x200: 0, | 83 x196: 0, x197: 0, x198: 0, x199: 0, x200: 0, |
| 99 }); | 84 }); |
| 85 assertStrongObject([[1], {}, [[3]]][1]); |
| 100 assertStrongObject({[Date() + ""]: 0, [Symbol()]: 0}); | 86 assertStrongObject({[Date() + ""]: 0, [Symbol()]: 0}); |
| 101 assertStrongObject({m() { super.m() }}); | 87 assertStrongObject({m() { super.m() }}); |
| 88 assertTrue(%IsStrong({__proto__: {}, get a() {}, set b(x) {}})); |
| 102 // Object literals with constant functions are treated specially, | 89 // Object literals with constant functions are treated specially, |
| 103 // but currently only on the toplevel (using Realm.eval to emulate that). | 90 // but currently only on the toplevel (using Realm.eval to emulate that). |
| 104 assertStrongObject({f: function(){}}); | 91 assertStrongObject({f: function(){}}); |
| 105 assertStrongObject(Realm.eval(Realm.current(), | 92 assertStrongObject( |
| 106 "'use strong'; ({f: function(){}})")); | 93 Realm.eval(Realm.current(), "'use strong'; ({f: function(){}})")); |
| 107 assertTrue(%IsStrong({__proto__: {}, get a() {}, set b(x) {}})); | |
| 108 })(); | 94 })(); |
| 109 | 95 |
| 110 (function WeakArrayLiterals(...args) { | 96 (function WeakArrayLiterals(...args) { |
| 97 function assertWeakArray(x) { |
| 98 assertFalse(%IsStrong(x)); |
| 99 assertSame(Array.prototype, Object.getPrototypeOf(x)); |
| 100 } |
| 111 let [...r] = []; | 101 let [...r] = []; |
| 112 assertTrue(!%IsStrong(args)); | 102 assertWeakArray(args); |
| 113 assertTrue(!%IsStrong(r)); | 103 assertWeakArray(r); |
| 114 assertTrue(!%IsStrong([])); | 104 assertWeakArray([]); |
| 115 assertTrue(!%IsStrong([1, 2, 3])); | 105 assertWeakArray([1, 2, 3]); |
| 116 assertTrue(!%IsStrong([[[]]])); | 106 assertWeakArray([1, 2, ...[3, 4], 5]); |
| 117 assertTrue(!%IsStrong([[1], {}, [[3]]])); | 107 assertWeakArray([[[]]]); |
| 118 assertTrue(!%IsStrong([[1], {}, [[3]]][0])); | 108 assertWeakArray([[1], {}, [[3]]]); |
| 119 assertTrue(!%IsStrong([[1], {}, [[3]]][1])); | 109 assertWeakArray([[1], {}, [[3]]][0]); |
| 120 assertTrue(!%IsStrong([[1], {}, [[3]]][2])); | 110 assertWeakArray([[1], {}, [[3]]][2]); |
| 121 assertTrue(!%IsStrong([[1], {}, [[3]]][2][0])); | 111 assertWeakArray([[1], {}, [[3]]][2][0]); |
| 112 assertWeakArray({a: [], b: {}}.a); |
| 122 })(); | 113 })(); |
| 123 | 114 |
| 124 (function StrongArrayLiterals(...args) { | 115 (function StrongArrayLiterals(...args) { |
| 125 'use strong'; | 116 'use strong'; |
| 117 function assertStrongArray(x) { |
| 118 assertTrue(%IsStrong(x)); |
| 119 assertSame(Array.prototype, Object.getPrototypeOf(x)); |
| 120 } |
| 126 let [...r] = []; | 121 let [...r] = []; |
| 127 // TODO(rossberg): teach strongness to FastCloneShallowArrayStub | 122 assertStrongArray(args); |
| 128 // assertTrue(%IsStrong(args)); | 123 assertStrongArray(r); |
| 129 // assertTrue(%IsStrong(r)); | 124 assertStrongArray([]); |
| 130 // assertTrue(%IsStrong([])); | 125 assertStrongArray([1, 2, 3]); |
| 131 // assertTrue(%IsStrong([1, 2, 3])); | 126 assertStrongArray([1, 2, ...[3, 4], 5]); |
| 132 // assertTrue(%IsStrong([1, 2, ...[3, 4], 5])); | |
| 133 assertStrongArray([[[]]]); | 127 assertStrongArray([[[]]]); |
| 134 assertStrongArray([[1], {}, [[3]]]); | 128 assertStrongArray([[1], {}, [[3]]]); |
| 135 assertStrongArray([[1], {}, [[3]]][0]); | 129 assertStrongArray([[1], {}, [[3]]][0]); |
| 136 assertStrongObject([[1], {}, [[3]]][1]); | |
| 137 assertStrongArray([[1], {}, [[3]]][2]); | 130 assertStrongArray([[1], {}, [[3]]][2]); |
| 138 assertStrongArray([[1], {}, [[3]]][2][0]); | 131 assertStrongArray([[1], {}, [[3]]][2][0]); |
| 132 assertStrongArray({a: [], b: {}}.a); |
| 139 })(); | 133 })(); |
| 140 | 134 |
| 141 (function WeakFunctionLiterals() { | 135 (function WeakFunctionLiterals() { |
| 136 function assertWeakFunction(x) { |
| 137 assertFalse(%IsStrong(x)); |
| 138 assertFalse(%IsStrong(x.prototype)); |
| 139 assertSame(Function.prototype, Object.getPrototypeOf(x)); |
| 140 } |
| 142 function f() {} | 141 function f() {} |
| 143 assertTrue(!%IsStrong(f)); | 142 assertWeakFunction(f); |
| 144 assertTrue(!%IsStrong(function(){})); | 143 assertWeakFunction(function(){}); |
| 145 assertTrue(!%IsStrong(function f(){})); | 144 assertWeakFunction(function f(){}); |
| 146 assertTrue(!%IsStrong(() => {})); | 145 assertWeakFunction(() => {}); |
| 147 assertTrue(!%IsStrong(x => x)); | 146 assertWeakFunction(x => x); |
| 148 assertTrue(!%IsStrong({m(){}}.m)); | 147 assertWeakFunction({m(){}}.m); |
| 149 assertTrue(!%IsStrong(Object.getOwnPropertyDescriptor( | 148 assertWeakFunction(Object.getOwnPropertyDescriptor( |
| 150 {get a(){}}, 'a').get)); | 149 {get a(){}}, 'a').get); |
| 151 assertTrue(!%IsStrong(Object.getOwnPropertyDescriptor( | 150 assertWeakFunction(Object.getOwnPropertyDescriptor( |
| 152 {set a(x){}}, 'a').set)); | 151 {set a(x){}}, 'a').set); |
| 153 assertTrue(!%IsStrong((class {static m(){}}).m)); | 152 assertWeakFunction((class {static m(){}}).m); |
| 154 assertTrue(!%IsStrong(Object.getOwnPropertyDescriptor( | 153 assertWeakFunction(Object.getOwnPropertyDescriptor( |
| 155 class {static get a(){}}, 'a').get)); | 154 class {static get a(){}}, 'a').get); |
| 156 assertTrue(!%IsStrong(Object.getOwnPropertyDescriptor( | 155 assertWeakFunction(Object.getOwnPropertyDescriptor( |
| 157 class {static set a(x){}}, 'a').set)); | 156 class {static set a(x){}}, 'a').set); |
| 158 assertTrue(!%IsStrong((new class {m(){}}).m)); | 157 assertWeakFunction((new class {m(){}}).m); |
| 159 assertTrue(!%IsStrong(Object.getOwnPropertyDescriptor( | 158 assertWeakFunction(Object.getOwnPropertyDescriptor( |
| 160 (class {get a(){}}).prototype, 'a').get)); | 159 (class {get a(){}}).prototype, 'a').get); |
| 161 assertTrue(!%IsStrong(Object.getOwnPropertyDescriptor( | 160 assertWeakFunction(Object.getOwnPropertyDescriptor( |
| 162 (class {set a(x){}}).prototype, 'a').set)); | 161 (class {set a(x){}}).prototype, 'a').set); |
| 163 })(); | 162 })(); |
| 164 | 163 |
| 165 (function StrongFunctionLiterals() { | 164 (function StrongFunctionLiterals() { |
| 166 'use strong'; | 165 'use strong'; |
| 166 function assertStrongFunction(x) { |
| 167 assertTrue(%IsStrong(x)); |
| 168 assertFalse('prototype' in x); |
| 169 assertSame(Function.prototype, Object.getPrototypeOf(x)); |
| 170 } |
| 167 function f() {} | 171 function f() {} |
| 168 assertStrongFunction(f); | 172 assertStrongFunction(f); |
| 169 assertStrongFunction(function(){}); | 173 assertStrongFunction(function(){}); |
| 170 assertStrongFunction(function f(){}); | 174 assertStrongFunction(function f(){}); |
| 171 assertStrongFunction(() => {}); | 175 assertStrongFunction(() => {}); |
| 172 assertStrongFunction(x => x); | 176 assertStrongFunction(x => x); |
| 173 assertStrongFunction({m(){}}.m); | 177 assertStrongFunction({m(){}}.m); |
| 174 assertStrongFunction(Object.getOwnPropertyDescriptor( | 178 assertStrongFunction(Object.getOwnPropertyDescriptor( |
| 175 {get a(){}}, 'a').get); | 179 {get a(){}}, 'a').get); |
| 176 assertStrongFunction(Object.getOwnPropertyDescriptor( | 180 assertStrongFunction(Object.getOwnPropertyDescriptor( |
| 177 {set a(x){}}, 'a').set); | 181 {set a(x){}}, 'a').set); |
| 178 assertStrongFunction((class {static m(){}}).m); | 182 assertStrongFunction((class {static m(){}}).m); |
| 179 assertStrongFunction(Object.getOwnPropertyDescriptor( | 183 assertStrongFunction(Object.getOwnPropertyDescriptor( |
| 180 class {static get a(){}}, 'a').get); | 184 class {static get a(){}}, 'a').get); |
| 181 assertStrongFunction(Object.getOwnPropertyDescriptor( | 185 assertStrongFunction(Object.getOwnPropertyDescriptor( |
| 182 class {static set a(x){}}, 'a').set); | 186 class {static set a(x){}}, 'a').set); |
| 183 assertStrongFunction((new class {m(){}}).m); | 187 assertStrongFunction((new class {m(){}}).m); |
| 184 assertStrongFunction(Object.getOwnPropertyDescriptor( | 188 assertStrongFunction(Object.getOwnPropertyDescriptor( |
| 185 (class {get a(){}}).prototype, 'a').get); | 189 (class {get a(){}}).prototype, 'a').get); |
| 186 assertStrongFunction(Object.getOwnPropertyDescriptor( | 190 assertStrongFunction(Object.getOwnPropertyDescriptor( |
| 187 (class {set a(x){}}).prototype, 'a').set); | 191 (class {set a(x){}}).prototype, 'a').set); |
| 188 })(); | 192 })(); |
| 189 | 193 |
| 190 (function SelfStrongFunctionLiterals() { | 194 (function SelfStrongFunctionLiterals() { |
| 195 function assertStrongFunction(x) { |
| 196 assertTrue(%IsStrong(x)); |
| 197 assertFalse('prototype' in x); |
| 198 assertSame(Function.prototype, Object.getPrototypeOf(x)); |
| 199 } |
| 191 function f() {'use strong'} | 200 function f() {'use strong'} |
| 192 assertStrongFunction(f); | 201 assertStrongFunction(f); |
| 193 assertStrongFunction(function(){'use strong'}); | 202 assertStrongFunction(function(){'use strong'}); |
| 194 assertStrongFunction(function f(){'use strong'}); | 203 assertStrongFunction(function f(){'use strong'}); |
| 195 assertStrongFunction(() => {'use strong'}); | 204 assertStrongFunction(() => {'use strong'}); |
| 196 assertStrongFunction(x => {'use strong'}); | 205 assertStrongFunction(x => {'use strong'}); |
| 197 assertStrongFunction({m(){'use strong'}}.m); | 206 assertStrongFunction({m(){'use strong'}}.m); |
| 198 assertStrongFunction(Object.getOwnPropertyDescriptor( | 207 assertStrongFunction(Object.getOwnPropertyDescriptor( |
| 199 {get a(){'use strong'}}, 'a').get); | 208 {get a(){'use strong'}}, 'a').get); |
| 200 assertStrongFunction(Object.getOwnPropertyDescriptor( | 209 assertStrongFunction(Object.getOwnPropertyDescriptor( |
| 201 {set a(x){'use strong'}}, 'a').set); | 210 {set a(x){'use strong'}}, 'a').set); |
| 202 assertStrongFunction((class {static m(){'use strong'}}).m); | 211 assertStrongFunction((class {static m(){'use strong'}}).m); |
| 203 assertStrongFunction(Object.getOwnPropertyDescriptor( | 212 assertStrongFunction(Object.getOwnPropertyDescriptor( |
| 204 class {static get a(){'use strong'}}, 'a').get); | 213 class {static get a(){'use strong'}}, 'a').get); |
| 205 assertStrongFunction(Object.getOwnPropertyDescriptor( | 214 assertStrongFunction(Object.getOwnPropertyDescriptor( |
| 206 class {static set a(x){'use strong'}}, 'a').set); | 215 class {static set a(x){'use strong'}}, 'a').set); |
| 207 assertStrongFunction((new class {m(){'use strong'}}).m); | 216 assertStrongFunction((new class {m(){'use strong'}}).m); |
| 208 assertStrongFunction(Object.getOwnPropertyDescriptor( | 217 assertStrongFunction(Object.getOwnPropertyDescriptor( |
| 209 (class {get a(){'use strong'}}).prototype, 'a').get); | 218 (class {get a(){'use strong'}}).prototype, 'a').get); |
| 210 assertStrongFunction(Object.getOwnPropertyDescriptor( | 219 assertStrongFunction(Object.getOwnPropertyDescriptor( |
| 211 (class {set a(x){'use strong'}}).prototype, 'a').set); | 220 (class {set a(x){'use strong'}}).prototype, 'a').set); |
| 212 })(); | 221 })(); |
| 213 | 222 |
| 223 let GeneratorPrototype = (function*(){}).__proto__; |
| 224 |
| 214 (function WeakGeneratorLiterals() { | 225 (function WeakGeneratorLiterals() { |
| 226 function assertWeakGenerator(x) { |
| 227 assertFalse(%IsStrong(x)); |
| 228 assertFalse(%IsStrong(x.prototype)); |
| 229 assertSame(GeneratorPrototype, Object.getPrototypeOf(x)); |
| 230 assertFalse(%IsStrong(x())); |
| 231 } |
| 215 function* g() {} | 232 function* g() {} |
| 216 assertTrue(!%IsStrong(g)); | 233 assertWeakGenerator(g); |
| 217 assertTrue(!%IsStrong(function*(){})); | 234 assertWeakGenerator(function*(){}); |
| 218 assertTrue(!%IsStrong(function* g(){})); | 235 assertWeakGenerator(function* g(){}); |
| 219 assertTrue(!%IsStrong({*m(){}}.m)); | 236 assertWeakGenerator({*m(){}}.m); |
| 220 assertTrue(!%IsStrong((class {static *m(){}}).m)); | 237 assertWeakGenerator((class {static *m(){}}).m); |
| 221 assertTrue(!%IsStrong((new class {*m(){}}).m)); | 238 assertWeakGenerator((new class {*m(){}}).m); |
| 222 })(); | 239 })(); |
| 223 | 240 |
| 224 (function StrongGeneratorLiterals() { | 241 (function StrongGeneratorLiterals() { |
| 225 'use strong'; | 242 'use strong'; |
| 243 function assertStrongGenerator(x) { |
| 244 assertTrue(%IsStrong(x)); |
| 245 // TODO(rossberg): strongify generator prototypes |
| 246 // assertTrue(%IsStrong(x.prototype)); |
| 247 assertSame(GeneratorPrototype, Object.getPrototypeOf(x)); |
| 248 // TODO(rossberg): strongify generator instances |
| 249 // assertTrue(%IsStrong(x())); |
| 250 } |
| 226 function* g() {} | 251 function* g() {} |
| 227 assertStrongGenerator(g); | 252 assertStrongGenerator(g); |
| 228 assertStrongGenerator(function*(){}); | 253 assertStrongGenerator(function*(){}); |
| 229 assertStrongGenerator(function* g(){}); | 254 assertStrongGenerator(function* g(){}); |
| 230 assertStrongGenerator({*m(){}}.m); | 255 assertStrongGenerator({*m(){}}.m); |
| 231 assertStrongGenerator((class {static *m(){}}).m); | 256 assertStrongGenerator((class {static *m(){}}).m); |
| 232 assertStrongGenerator((new class {*m(){}}).m); | 257 assertStrongGenerator((new class {*m(){}}).m); |
| 233 })(); | 258 })(); |
| 234 | 259 |
| 235 (function SelfStrongGeneratorLiterals() { | 260 (function SelfStrongGeneratorLiterals() { |
| 261 function assertStrongGenerator(x) { |
| 262 assertTrue(%IsStrong(x)); |
| 263 // TODO(rossberg): strongify generator prototypes |
| 264 // assertTrue(%IsStrong(x.prototype)); |
| 265 assertSame(GeneratorPrototype, Object.getPrototypeOf(x)); |
| 266 // TODO(rossberg): strongify generator instances |
| 267 // assertTrue(%IsStrong(x())); |
| 268 } |
| 236 function* g() {'use strong'} | 269 function* g() {'use strong'} |
| 237 assertStrongGenerator(g); | 270 assertStrongGenerator(g); |
| 238 assertStrongGenerator(function*(){'use strong'}); | 271 assertStrongGenerator(function*(){'use strong'}); |
| 239 assertStrongGenerator(function* g(){'use strong'}); | 272 assertStrongGenerator(function* g(){'use strong'}); |
| 240 assertStrongGenerator({*m(){'use strong'}}.m); | 273 assertStrongGenerator({*m(){'use strong'}}.m); |
| 241 assertStrongGenerator((class {static *m(){'use strong'}}).m); | 274 assertStrongGenerator((class {static *m(){'use strong'}}).m); |
| 242 assertStrongGenerator((new class {*m(){'use strong'}}).m); | 275 assertStrongGenerator((new class {*m(){'use strong'}}).m); |
| 243 })(); | 276 })(); |
| 244 | 277 |
| 245 (function WeakClassLiterals() { | 278 (function WeakClassLiterals() { |
| 246 function assertWeakClass(C) { | 279 function assertWeakClass(x) { |
| 247 assertTrue(!%IsStrong(C)); | 280 assertFalse(%IsStrong(x)); |
| 248 assertTrue(!%IsStrong(C.prototype)); | 281 assertFalse(%IsStrong(x.prototype)); |
| 282 assertFalse(%IsStrong(new x)); |
| 249 } | 283 } |
| 250 class C {}; | 284 class C {}; |
| 251 class D extends C {}; | 285 class D extends C {}; |
| 252 class E extends Object {}; | 286 class E extends Object {}; |
| 253 class F extends null {}; | 287 // class F extends null {}; |
| 254 const S = (() => {'use strong'; return class {}})(); | 288 const S = (() => {'use strong'; return class {}})(); |
| 255 class G extends S {}; | 289 class G extends S {}; |
| 256 assertWeakClass(C); | 290 assertWeakClass(C); |
| 257 assertWeakClass(D); | 291 assertWeakClass(D); |
| 258 assertWeakClass(E); | 292 assertWeakClass(E); |
| 259 assertWeakClass(F); | 293 // assertWeakClass(F); |
| 260 assertWeakClass(G); | 294 assertWeakClass(G); |
| 261 assertWeakClass(class {}); | 295 assertWeakClass(class {}); |
| 262 assertWeakClass(class extends Object {}); | 296 assertWeakClass(class extends Object {}); |
| 263 assertWeakClass(class extends null {}); | 297 // assertWeakClass(class extends null {}); |
| 264 assertWeakClass(class extends C {}); | 298 assertWeakClass(class extends C {}); |
| 265 assertWeakClass(class extends S {}); | 299 assertWeakClass(class extends S {}); |
| 266 assertWeakClass(class extends class {} {}); | 300 assertWeakClass(class extends class {} {}); |
| 267 assertWeakClass(class C {}); | 301 assertWeakClass(class C {}); |
| 268 assertWeakClass(class D extends Object {}); | 302 assertWeakClass(class D extends Object {}); |
| 269 assertWeakClass(class D extends null {}); | 303 // assertWeakClass(class D extends null {}); |
| 270 assertWeakClass(class D extends C {}); | 304 assertWeakClass(class D extends C {}); |
| 271 assertWeakClass(class D extends S {}); | 305 assertWeakClass(class D extends S {}); |
| 272 assertWeakClass(class D extends class {} {}); | 306 assertWeakClass(class D extends class {} {}); |
| 273 })(); | 307 })(); |
| 274 | 308 |
| 275 (function StrongClassLiterals() { | 309 (function StrongClassLiterals() { |
| 276 'use strong'; | 310 'use strong'; |
| 277 function assertStrongClass(C) { | 311 function assertStrongClass(x) { |
| 278 assertTrue(%IsStrong(C)); | 312 assertTrue(%IsStrong(x)); |
| 279 // TODO(rossberg): prototype object is not yet strongified | 313 // TODO(rossberg): strongify class prototype and instance |
| 280 // assertTrue(%IsStrong(C.prototype)); | 314 // assertTrue(%IsStrong(x.prototype)); |
| 315 // assertTrue(%IsStrong(new x)); |
| 281 } | 316 } |
| 282 class C {}; | 317 class C {}; |
| 283 class D extends C {}; | 318 class D extends C {}; |
| 284 class E extends Object {}; | 319 class E extends Object {}; |
| 285 class F extends null {}; | |
| 286 const W = (1, eval)(() => {'use strict'; return class {}})(); | 320 const W = (1, eval)(() => {'use strict'; return class {}})(); |
| 287 class G extends W {}; | 321 class G extends W {}; |
| 288 assertStrongClass(C); | 322 assertStrongClass(C); |
| 289 assertStrongClass(D); | 323 assertStrongClass(D); |
| 290 assertStrongClass(E); | 324 assertStrongClass(E); |
| 291 assertStrongClass(F); | |
| 292 assertStrongClass(G); | 325 assertStrongClass(G); |
| 293 assertStrongClass(class {}); | 326 assertStrongClass(class {}); |
| 294 assertStrongClass(class extends Object {}); | 327 assertStrongClass(class extends Object {}); |
| 295 assertStrongClass(class extends null {}); | |
| 296 assertStrongClass(class extends C {}); | 328 assertStrongClass(class extends C {}); |
| 297 assertStrongClass(class extends W {}); | 329 assertStrongClass(class extends W {}); |
| 298 assertStrongClass(class extends class {} {}); | 330 assertStrongClass(class extends class {} {}); |
| 299 assertStrongClass(class C {}); | 331 assertStrongClass(class C {}); |
| 300 assertStrongClass(class D extends Object {}); | 332 assertStrongClass(class D extends Object {}); |
| 301 assertStrongClass(class D extends null {}); | |
| 302 assertStrongClass(class D extends C {}); | 333 assertStrongClass(class D extends C {}); |
| 303 assertStrongClass(class D extends W {}); | 334 assertStrongClass(class D extends W {}); |
| 304 assertStrongClass(class D extends class {} {}); | 335 assertStrongClass(class D extends class {} {}); |
| 305 })(); | 336 })(); |
| 306 | 337 |
| 307 (function WeakRegExpLiterals() { | 338 (function WeakRegExpLiterals() { |
| 308 assertTrue(!%IsStrong(/abc/)); | 339 function assertWeakRegExp(x) { |
| 340 assertFalse(%IsStrong(x)); |
| 341 } |
| 342 assertWeakRegExp(/abc/); |
| 309 })(); | 343 })(); |
| 310 | 344 |
| 311 (function StrongRegExpLiterals() { | 345 (function StrongRegExpLiterals() { |
| 312 'use strong'; | 346 'use strong'; |
| 313 // TODO(rossberg): implement strong regexp literals | 347 function assertStrongRegExp(x) { |
| 314 // assertTrue(%IsStrong(/abc/)); | 348 // TODO(rossberg): strongify regexps |
| 349 // assertTrue(%IsStrong(x)); |
| 350 } |
| 351 assertStrongRegExp(/abc/); |
| 315 })(); | 352 })(); |
| OLD | NEW |