From 868470ddc9b9b731a2315adcbdfd03b7bdcc3de2 Mon Sep 17 00:00:00 2001 From: marja Date: Mon, 16 Feb 2015 09:57:31 -0800 Subject: [PATCH] [strong] Adding regression cases which should always continue working. 1) Mutually recursive functions 2) Strong code using non-strong var before declaration. These test cases ensure that we don't accidentally kill these wanted behaviors when adding restrictions to strong mode. BUG= Review URL: https://codereview.chromium.org/927143002 Cr-Commit-Position: refs/heads/master@{#26671} --- .../strong/mutually-recursive-funcs.js | 25 +++++++++++++++++++ test/mjsunit/strong/use-before-var.js | 20 +++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 test/mjsunit/strong/mutually-recursive-funcs.js create mode 100644 test/mjsunit/strong/use-before-var.js diff --git a/test/mjsunit/strong/mutually-recursive-funcs.js b/test/mjsunit/strong/mutually-recursive-funcs.js new file mode 100644 index 0000000000..726eed839c --- /dev/null +++ b/test/mjsunit/strong/mutually-recursive-funcs.js @@ -0,0 +1,25 @@ +// 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 strong"; + +function foo(param, fooCount, barCount) { + if (param === 0) + return {'foo': fooCount, 'bar': barCount}; + return bar(param - 1, fooCount + 1, barCount); +} + +function bar(param, fooCount, barCount) { + if (param === 0) + return {'foo': fooCount, 'bar': barCount}; + return foo(param - 1, fooCount, barCount + 1); +} + +(function TestMutuallyRecursiveFunctions() { + let obj = foo(10, 0, 0); + assertEquals(obj.foo, 5); + assertEquals(obj.bar, 5); +})(); diff --git a/test/mjsunit/strong/use-before-var.js b/test/mjsunit/strong/use-before-var.js new file mode 100644 index 0000000000..5155292f84 --- /dev/null +++ b/test/mjsunit/strong/use-before-var.js @@ -0,0 +1,20 @@ +// 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 + +function strongFunction() { + "use strong"; + // This should not be a "use before declaration" error, even though the + // variable is defined later (by non-strong code). Rationale: Non-strong code + // is allowed to use var declarations, and the semantics of var declarations + // say that the variable should be usable before the declaration. + return notStrong + 123; +} + +var notStrong = 456; + +(function TestStrongFunctionUsingLaterDefinedNonStrongVar() { + assertEquals(strongFunction(), 579); +})();