mirror of
https://github.com/nodejs/node.git
synced 2025-05-19 08:24:38 +00:00

Pick up the latest branch head for V8 4.7:
be169f8df0
Full change history for the 4.7 branch:
https://chromium.googlesource.com/v8/v8.git/+log/branch-heads/4.7
V8 blog post about what is new on V8 4.7:
http://v8project.blogspot.de/2015/10/v8-release-47.html
PR-URL: https://github.com/nodejs/node/pull/4106
Reviewed-By: bnoordhuis - Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: targos - Michaël Zasso <mic.besace@gmail.com>
Reviewed-By: rvagg - Rod Vagg <rod@vagg.org>
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);
|
|
})();
|