Chromium Code Reviews| Index: test/mjsunit/strong/class-literals.js |
| diff --git a/test/mjsunit/strong/class-literals.js b/test/mjsunit/strong/class-literals.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..414ebd8959980b0ae950358218df4feeb96ab47d |
| --- /dev/null |
| +++ b/test/mjsunit/strong/class-literals.js |
| @@ -0,0 +1,138 @@ |
| +// Copyright 2015 the V8 project authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +// Flags: --strong-mode --allow-natives-syntax |
| + |
| +'use strict'; |
| + |
| +function assertWeakClassWeakInstances(x) { |
| + assertFalse(%IsStrong(x)); |
| + assertFalse(%IsStrong(x.prototype)); |
| + assertFalse(%IsStrong(new x)); |
| +} |
| + |
| +function assertWeakClassStrongInstances(x) { |
| + assertFalse(%IsStrong(x)); |
| + assertFalse(%IsStrong(x.prototype)); |
| + assertTrue(%IsStrong(new x)); |
| +} |
| + |
| +function assertStrongClassWeakInstances(x) { |
| + assertTrue(%IsStrong(x)); |
| + assertTrue(%IsStrong(x.prototype)); |
| + assertFalse(%IsStrong(new x)); |
| +} |
| + |
| +function assertStrongClassStrongInstances(x) { |
| + assertTrue(%IsStrong(x)); |
| + assertTrue(%IsStrong(x.prototype)); |
| + assertTrue(%IsStrong(new x)); |
| +} |
| + |
| +function getWeakClass() { |
| + return (class {}); |
| +} |
| + |
| +function getWeakClassExtends(x) { |
| + return (class extends x {}); |
| +} |
| + |
| +function getStrongClass() { |
| + "use strong"; |
| + return (class {}); |
| +} |
| + |
| +function getStrongClassExtends(x) { |
| + "use strong"; |
| + return (class extends x {}); |
| +} |
| + |
| +(function SimpleWeakClassLiterals() { |
| + class C {}; |
| + class D extends C {}; |
| + class E extends Object {}; |
| + |
| + assertWeakClassWeakInstances(C); |
| + assertWeakClassWeakInstances(D); |
| + assertWeakClassWeakInstances(E); |
| + |
| + assertWeakClassWeakInstances(class {}); |
| + assertWeakClassWeakInstances(class extends Object {}); |
| + assertWeakClassWeakInstances(class extends C {}); |
| + assertWeakClassWeakInstances(class extends class {} {}); |
| +})(); |
| + |
| +(function SimpleStrongClassLiterals() { |
| + 'use strong'; |
| + class C {}; |
| + class D extends C {}; |
| + |
| + assertStrongClassStrongInstances(C); |
| + assertStrongClassStrongInstances(D); |
| + |
| + assertStrongClassStrongInstances(class {}); |
| + assertStrongClassStrongInstances(class extends C {}); |
| + assertStrongClassStrongInstances(class extends class {} {}); |
| +})(); |
| + |
| +(function MixedWeakClassLiterals() { |
| + class C extends getStrongClass() {}; |
| + class D extends getStrongClassExtends((class {})) {}; |
| + class E extends getStrongClassExtends(C) {}; |
| + |
| + assertWeakClassStrongInstances(C); |
| + assertWeakClassStrongInstances(class extends getStrongClass() {}); |
| + |
| + assertWeakClassWeakInstances(D); |
| + assertWeakClassWeakInstances( |
| + class extends getStrongClassExtends((class {})) {}); |
| + |
| + assertWeakClassStrongInstances(E); |
| + assertWeakClassStrongInstances( |
| + class extends getStrongClassExtends(class extends getStrongClass() {}) {}); |
| +})(); |
| + |
| +(function MixedStrongClassLiterals() { |
| + 'use strong'; |
| + class C extends getWeakClass() {}; |
| + class D extends getWeakClassExtends((class {})) {}; |
| + class E extends getWeakClassExtends(C) {}; |
| + class F extends Object {}; |
| + |
| + assertStrongClassWeakInstances(C); |
| + assertStrongClassWeakInstances(class extends getWeakClass() {}); |
| + |
| + assertStrongClassStrongInstances(D); |
| + assertStrongClassStrongInstances( |
| + class extends getWeakClassExtends((class {})) {}); |
| + |
| + assertStrongClassWeakInstances(E); |
| + assertStrongClassWeakInstances( |
| + class extends getWeakClassExtends(class extends getWeakClass() {}) {}); |
| + |
| + assertStrongClassWeakInstances(F); |
| + assertStrongClassWeakInstances(class extends Object {}); |
| +})(); |
| + |
| +(function MonkeyPatchedClassLiterals() { |
|
rossberg
2015/09/22 15:26:28
Maybe add cases that change from StrongClassWeak/S
|
| + class C {}; |
| + assertWeakClassWeakInstances(C); |
| + C.__proto__ = getStrongClass(); |
| + // C's default constructor doesn't call super. |
| + assertWeakClassWeakInstances(C); |
| + |
| + class D extends Object {}; |
| + assertWeakClassWeakInstances(D); |
| + D.__proto__ = getStrongClass(); |
| + // D is a derived class, so its default constructor calls super. |
| + assertWeakClassStrongInstances(D); |
| + |
| + class E extends (class {}) {}; |
| + E.__proto__ = C; |
| + assertWeakClassWeakInstances(E); |
| + |
| + class F extends (class {}) {}; |
| + F.__proto__ = D; |
| + assertWeakClassStrongInstances(F); |
| +})(); |