| Index: test/mjsunit/strong/mutually-recursive-classes.js
|
| diff --git a/test/mjsunit/strong/mutually-recursive-classes.js b/test/mjsunit/strong/mutually-recursive-classes.js
|
| deleted file mode 100644
|
| index 204c3964de6022ecd61a4b58452b11ecb3253834..0000000000000000000000000000000000000000
|
| --- a/test/mjsunit/strong/mutually-recursive-classes.js
|
| +++ /dev/null
|
| @@ -1,229 +0,0 @@
|
| -// 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
|
| -"use strict"
|
| -
|
| -let prologue_dead = "(function outer() { if (false) { ";
|
| -let epilogue_dead = " } })();";
|
| -
|
| -let prologue_live = "(function outer() { ";
|
| -let epilogue_live = "})();";
|
| -
|
| -// For code which already throws a run-time error in non-strong mode; we assert
|
| -// that we now get the error already compilation time.
|
| -function assertLateErrorsBecomeEarly(code) {
|
| - assertThrows("'use strong'; " + prologue_dead + code + epilogue_dead,
|
| - ReferenceError);
|
| -
|
| - // Make sure the error happens only in strong mode (note that we need strict
|
| - // mode here because of let).
|
| - assertDoesNotThrow("'use strict'; " + prologue_dead + code + epilogue_dead);
|
| -
|
| - // But if we don't put the references inside a dead code, it throws a run-time
|
| - // error (also in strict mode).
|
| - assertThrows("'use strong'; " + prologue_live + code + epilogue_live,
|
| - ReferenceError);
|
| - assertThrows("'use strict'; " + prologue_live + code + epilogue_live,
|
| - ReferenceError);
|
| -}
|
| -
|
| -// For code which doesn't throw an error at all in non-strong mode.
|
| -function assertNonErrorsBecomeEarly(code) {
|
| - assertThrows("'use strong'; " + prologue_dead + code + epilogue_dead,
|
| - ReferenceError);
|
| - assertDoesNotThrow("'use strict'; " + prologue_dead + code + epilogue_dead);
|
| -
|
| - assertThrows("'use strong'; " + prologue_live + code + epilogue_live,
|
| - ReferenceError);
|
| - assertDoesNotThrow("'use strict'; " + prologue_live + code + epilogue_live,
|
| - ReferenceError);
|
| -}
|
| -
|
| -(function InitTimeReferenceForward() {
|
| - // It's never OK to have an init time reference to a class which hasn't been
|
| - // declared.
|
| - assertLateErrorsBecomeEarly(
|
| - `class A extends B { }
|
| - class B {}`);
|
| -
|
| - assertLateErrorsBecomeEarly(
|
| - `class A {
|
| - [B.sm()]() { }
|
| - }
|
| - class B {
|
| - static sm() { return 0; }
|
| - }`);
|
| -})();
|
| -
|
| -(function InitTimeReferenceBackward() {
|
| - // Backwards is of course fine.
|
| - "use strong";
|
| - class A {
|
| - static sm() { return 0; }
|
| - }
|
| - let i = "making these classes non-consecutive";
|
| - class B extends A {};
|
| - "by inserting statements and declarations in between";
|
| - class C {
|
| - [A.sm()]() { }
|
| - };
|
| -})();
|
| -
|
| -(function BasicMutualRecursion() {
|
| - "use strong";
|
| - class A {
|
| - m() { B; }
|
| - static sm() { B; }
|
| - }
|
| - // No statements or declarations between the classes.
|
| - class B {
|
| - m() { A; }
|
| - static sm() { A; }
|
| - }
|
| -})();
|
| -
|
| -(function MutualRecursionWithMoreClasses() {
|
| - "use strong";
|
| - class A {
|
| - m() { B; C; }
|
| - static sm() { B; C; }
|
| - }
|
| - class B {
|
| - m() { A; C; }
|
| - static sm() { A; C; }
|
| - }
|
| - class C {
|
| - m() { A; B; }
|
| - static sm() { A; B; }
|
| - }
|
| -})();
|
| -
|
| -(function ReferringForwardInDeeperScopes() {
|
| - "use strong";
|
| -
|
| - function foo() {
|
| - class A1 {
|
| - m() { B1; }
|
| - }
|
| - class B1 { }
|
| - }
|
| -
|
| - class Outer {
|
| - m() {
|
| - class A2 {
|
| - m() { B2; }
|
| - }
|
| - class B2 { }
|
| - }
|
| - }
|
| -
|
| - for (let i = 0; i < 1; ++i) {
|
| - class A3 {
|
| - m() { B3; }
|
| - }
|
| - class B3 { }
|
| - }
|
| -
|
| - (a, b) => {
|
| - class A4 {
|
| - m() { B4; }
|
| - }
|
| - class B4 { }
|
| - }
|
| -})();
|
| -
|
| -(function ReferringForwardButClassesNotConsecutive() {
|
| - assertNonErrorsBecomeEarly(
|
| - `class A {
|
| - m() { B; }
|
| - }
|
| - ;
|
| - class B {}`);
|
| -
|
| - assertNonErrorsBecomeEarly(
|
| - `let A = class {
|
| - m() { B; }
|
| - }
|
| - class B {}`);
|
| -
|
| - assertNonErrorsBecomeEarly(
|
| - `class A {
|
| - m() { B1; } // Just a normal use-before-declaration.
|
| - }
|
| - let B1 = class B2 {}`);
|
| -
|
| - assertNonErrorsBecomeEarly(
|
| - `class A {
|
| - m() { B; }
|
| - }
|
| - let i = 0;
|
| - class B {}`);
|
| -
|
| - assertNonErrorsBecomeEarly(
|
| - `class A {
|
| - m() { B; }
|
| - }
|
| - function foo() {}
|
| - class B {}`);
|
| -
|
| - assertNonErrorsBecomeEarly(
|
| - `function foo() {
|
| - class A {
|
| - m() { B; }
|
| - }
|
| - }
|
| - class B {}`);
|
| -
|
| - assertNonErrorsBecomeEarly(
|
| - `class A extends class B { m() { C; } } {
|
| - }
|
| - class C { }`);
|
| -
|
| - assertLateErrorsBecomeEarly(
|
| - `class A extends class B { [C.sm()]() { } } {
|
| - }
|
| - class C { static sm() { return 'a';} }`);
|
| -
|
| - assertLateErrorsBecomeEarly(
|
| - `class A extends class B extends C { } {
|
| - }
|
| - class C { }`);
|
| -})();
|
| -
|
| -
|
| -(function RegressionForClassResolution() {
|
| - assertNonErrorsBecomeEarly(
|
| - `let A = class B {
|
| - m() { C; }
|
| - }
|
| - ;;;;
|
| - class C {}
|
| - class B {}`);
|
| -})();
|
| -
|
| -
|
| -(function TestMultipleMethodScopes() {
|
| - "use strong";
|
| -
|
| - // Test cases where the reference is inside multiple method scopes.
|
| - class A1 {
|
| - m() {
|
| - class C1 {
|
| - m() { B1; }
|
| - }
|
| - }
|
| - }
|
| - class B1 { }
|
| -
|
| - ;
|
| -
|
| - class A2 {
|
| - m() {
|
| - class C2 extends B2 {
|
| - }
|
| - }
|
| - }
|
| - class B2 { }
|
| -})();
|
|
|