From: rossberg@chromium.org Date: Fri, 5 Oct 2012 09:07:53 +0000 (+0000) Subject: Reject uses of lexical for-loop variable on the RHS. X-Git-Tag: upstream/4.7.83~15897 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3f7b5c338afcba4d9d15b0c9ed4e747fb135c47b;p=platform%2Fupstream%2Fv8.git Reject uses of lexical for-loop variable on the RHS. R=mstarzinger@chromium.org BUG=v8:2322 Review URL: https://codereview.chromium.org/11031045 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12664 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/parser.cc b/src/parser.cc index a626d99..e796964 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -2790,8 +2790,6 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { if (peek() == Token::IN && !name.is_null()) { Interface* interface = is_const ? Interface::NewConst() : Interface::NewValue(); - VariableProxy* each = - top_scope_->NewUnresolved(factory(), name, interface); ForInStatement* loop = factory()->NewForInStatement(labels); Target target(&this->target_stack_, loop); @@ -2799,6 +2797,8 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { Expression* enumerable = ParseExpression(true, CHECK_OK); Expect(Token::RPAREN, CHECK_OK); + VariableProxy* each = + top_scope_->NewUnresolved(factory(), name, interface); Statement* body = ParseStatement(NULL, CHECK_OK); loop->Initialize(each, enumerable, body); Block* result = factory()->NewBlock(NULL, 2, false); @@ -2838,16 +2838,18 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { // implementing stack allocated block scoped variables. Variable* temp = top_scope_->DeclarationScope()->NewTemporary(name); VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); - Interface* interface = Interface::NewValue(); - VariableProxy* each = - top_scope_->NewUnresolved(factory(), name, interface); ForInStatement* loop = factory()->NewForInStatement(labels); Target target(&this->target_stack_, loop); + // The expression does not see the loop variable. Expect(Token::IN, CHECK_OK); + top_scope_ = saved_scope; Expression* enumerable = ParseExpression(true, CHECK_OK); + top_scope_ = for_scope; Expect(Token::RPAREN, CHECK_OK); + VariableProxy* each = + top_scope_->NewUnresolved(factory(), name, Interface::NewValue()); Statement* body = ParseStatement(NULL, CHECK_OK); Block* body_block = factory()->NewBlock(NULL, 3, false); Assignment* assignment = factory()->NewAssignment( diff --git a/test/mjsunit/regress/regress-2322.js b/test/mjsunit/regress/regress-2322.js new file mode 100644 index 0000000..a60af06 --- /dev/null +++ b/test/mjsunit/regress/regress-2322.js @@ -0,0 +1,31 @@ +// Copyright 2012 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: +// +// * 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 + +assertThrows("'use strict'; for (let x in x);", ReferenceError); +