Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 5ea1c5e083ac44a15ea4ac100f1f6848d9d4fffd..3730a4577cf6f1e70440637b575f8547d96892a0 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -600,7 +600,8 @@ Parser::Parser(Handle<Script> script, |
extension_(extension), |
pre_data_(pre_data), |
fni_(NULL), |
- stack_overflow_(false) { |
+ stack_overflow_(false), |
+ parenthesized_function_(false) { |
AstNode::ResetIds(); |
} |
@@ -2482,9 +2483,13 @@ Expression* Parser::ParseLeftHandSideExpression(bool* ok) { |
// The calls that need special treatment are the |
// direct (i.e. not aliased) eval calls. These calls are all of the |
// form eval(...) with no explicit receiver object where eval is not |
- // declared in the current scope chain. These calls are marked as |
- // potentially direct eval calls. Whether they are actually direct calls |
- // to eval is determined at run time. |
+ // declared in the current scope chain. |
+ // These calls are marked as potentially direct eval calls. Whether |
+ // they are actually direct calls to eval is determined at run time. |
+ // TODO(994): In ES5, it doesn't matter if the "eval" var is declared |
+ // in the local scope chain. It only matters that it's called "eval", |
+ // is called without a receiver and it refers to the original eval |
+ // function. |
VariableProxy* callee = result->AsVariableProxy(); |
if (callee != NULL && callee->IsVariable(Factory::eval_symbol())) { |
Handle<String> name = callee->name(); |
@@ -2734,6 +2739,9 @@ Expression* Parser::ParsePrimaryExpression(bool* ok) { |
case Token::LPAREN: |
Consume(Token::LPAREN); |
+ // Heuristically try to detect immediately called functions before |
+ // seeing the call parentheses. |
+ parenthesized_function_ = (peek() == Token::FUNCTION); |
result = ParseExpression(true, CHECK_OK); |
Expect(Token::RPAREN, CHECK_OK); |
break; |
@@ -3225,8 +3233,11 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
// Determine if the function will be lazily compiled. The mode can |
// only be PARSE_LAZILY if the --lazy flag is true. |
- bool is_lazily_compiled = |
- mode() == PARSE_LAZILY && top_scope_->HasTrivialOuterContext(); |
+ bool is_lazily_compiled = (mode() == PARSE_LAZILY && |
+ top_scope_->outer_scope()->is_global_scope() && |
+ top_scope_->HasTrivialOuterContext() && |
+ !parenthesized_function_); |
+ parenthesized_function_ = false; // The bit was set for this function only. |
int function_block_pos = scanner().location().beg_pos; |
int materialized_literal_count; |