| 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..a0e7280abce4eb2b0bd04258e42ecff06639faa1
|
| --- /dev/null
|
| +++ b/test/mjsunit/strong/class-literals.js
|
| @@ -0,0 +1,159 @@
|
| +// 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 WeakMonkeyPatchedClassLiterals() {
|
| + 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);
|
| +
|
| + class G extends getStrongClass() {};
|
| + G.__proto__ = getWeakClass();
|
| + assertWeakClassWeakInstances(G);
|
| +})();
|
| +
|
| +(function StrongMonkeyPatchedClassLiterals() {
|
| + let C = getStrongClassExtends(getWeakClassExtends(getStrongClass()));
|
| + let D = getStrongClassExtends(getWeakClassExtends(getWeakClass()));
|
| +
|
| + assertStrongClassStrongInstances(C);
|
| + C.__proto__.__proto__ = getWeakClass();
|
| + assertStrongClassWeakInstances(C);
|
| + C.__proto__.__proto__ = getStrongClass();
|
| + assertStrongClassStrongInstances(C);
|
| +
|
| + assertStrongClassWeakInstances(D);
|
| + D.__proto__.__proto__ = getStrongClass();
|
| + assertStrongClassStrongInstances(D);
|
| + D.__proto__.__proto__ = getWeakClass();
|
| + assertStrongClassWeakInstances(D);
|
| +})();
|
|
|