24ec2a0baa
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}
160 lines
4.3 KiB
JavaScript
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);
|
|
})();
|