v8/test/mjsunit/strong/class-literals.js
conradw 24ec2a0baa [strong] Implement revised strong class semantics
Weak classes can inherit from strong ones again, a strong base class makes
instances strong.

BUG=v8:3956
LOG=N

Review URL: https://codereview.chromium.org/1347243004

Cr-Commit-Position: refs/heads/master@{#30867}
2015-09-22 16:34:52 +00:00

160 lines
4.3 KiB
JavaScript

// 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);
})();