From f1d8668e38216ccf41417ff2593d5edec09290aa Mon Sep 17 00:00:00 2001 From: dslomov Date: Tue, 25 Nov 2014 06:48:27 -0800 Subject: [PATCH] harmony-scoping: Catch variable should be VAR, not LET R=rossberg@chromium.org BUG=v8:2858 LOG=N Review URL: https://codereview.chromium.org/748113003 Cr-Commit-Position: refs/heads/master@{#25503} --- src/parser.cc | 4 +-- test/mjsunit/harmony/block-conflicts.js | 29 ++------------------ test/mjsunit/harmony/regress/regress-2858.js | 27 ++++++++++++++++++ 3 files changed, 31 insertions(+), 29 deletions(-) create mode 100644 test/mjsunit/harmony/regress/regress-2858.js diff --git a/src/parser.cc b/src/parser.cc index e6c0e2645e..159fee87d7 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -2796,9 +2796,7 @@ TryStatement* Parser::ParseTryStatement(bool* ok) { Expect(Token::RPAREN, CHECK_OK); Target target(&this->target_stack_, &catch_collector); - VariableMode mode = - allow_harmony_scoping() && strict_mode() == STRICT ? LET : VAR; - catch_variable = catch_scope->DeclareLocal(name, mode, kCreatedInitialized); + catch_variable = catch_scope->DeclareLocal(name, VAR, kCreatedInitialized); BlockState block_state(&scope_, catch_scope); catch_block = ParseBlock(NULL, CHECK_OK); diff --git a/test/mjsunit/harmony/block-conflicts.js b/test/mjsunit/harmony/block-conflicts.js index 1eedb682aa..d19a34a2c3 100644 --- a/test/mjsunit/harmony/block-conflicts.js +++ b/test/mjsunit/harmony/block-conflicts.js @@ -1,30 +1,7 @@ // Copyright 2011 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. // -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - // Flags: --harmony-scoping // Test for conflicting variable bindings. @@ -175,7 +152,7 @@ for (var v = 0; v < varbinds.length; ++v) { // Test conflicting catch/var bindings. for (var v = 0; v < varbinds.length; ++v) { - TestConflict('try {} catch(x) {' + varbinds[v] + '}'); + TestNoConflict('try {} catch(x) {' + varbinds[v] + '}'); } // Test conflicting parameter/var bindings. diff --git a/test/mjsunit/harmony/regress/regress-2858.js b/test/mjsunit/harmony/regress/regress-2858.js new file mode 100644 index 0000000000..4ce9478497 --- /dev/null +++ b/test/mjsunit/harmony/regress/regress-2858.js @@ -0,0 +1,27 @@ +// Copyright 2014 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: --harmony-scoping +"use strict"; + +function f() { + var y = 1; + var q1; + var q; + var z = new Error(); + try { + throw z; + } catch (y) { + assertTrue(z === y); + q1 = function() { return y; } + var y = 15; + q = function() { return y; } + assertSame(15, y); + } + assertSame(1, y); + assertSame(15, q1()); + assertSame(15, q()); +} + +f();