Fix a bug in scope analysis.
Function declarations inside catch are hoisted to the nearest enclosing function scope, but we compiled their bodies as if occurring inside the catch scope. BUG=chrome:91120 TEST=regress/regress-91120 attached Review URL: http://codereview.chromium.org/7548011 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8783 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
b333719607
commit
f37f6e88ca
@ -3641,7 +3641,10 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name,
|
||||
}
|
||||
|
||||
int num_parameters = 0;
|
||||
Scope* scope = NewScope(top_scope_, Scope::FUNCTION_SCOPE, inside_with());
|
||||
// Function declarations are hoisted.
|
||||
Scope* scope = (type == DECLARATION)
|
||||
? NewScope(top_scope_->DeclarationScope(), Scope::FUNCTION_SCOPE, false)
|
||||
: NewScope(top_scope_, Scope::FUNCTION_SCOPE, inside_with());
|
||||
ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(8);
|
||||
int materialized_literal_count;
|
||||
int expected_property_count;
|
||||
|
48
test/mjsunit/regress/regress-91120.js
Normal file
48
test/mjsunit/regress/regress-91120.js
Normal file
@ -0,0 +1,48 @@
|
||||
// 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:
|
||||
//
|
||||
// * 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.
|
||||
|
||||
// We intend that the function declaration for g inside catch is hoisted to
|
||||
// function f's scope. Invoke it before try/catch, in the try block, in the
|
||||
// catch block, after try/catch, and outside f, and verify that it has
|
||||
// access to the proper binding of x.
|
||||
var x = 'global';
|
||||
|
||||
function f() {
|
||||
var x = 'function';
|
||||
assertEquals('function', g());
|
||||
try {
|
||||
assertEquals('function', g());
|
||||
throw 'catch';
|
||||
} catch (x) {
|
||||
function g() { return x; }
|
||||
assertEquals('function', g());
|
||||
}
|
||||
assertEquals('function', g());
|
||||
return g;
|
||||
}
|
||||
|
||||
assertEquals('function', f()());
|
Loading…
Reference in New Issue
Block a user