| Index: src/parser.cc | 
| diff --git a/src/parser.cc b/src/parser.cc | 
| index 68a9b7e0db529503f40c33188cdfba7456f36bf3..b4b522cf48e3f7735c8bfce586964d3bb5ceaf37 100644 | 
| --- a/src/parser.cc | 
| +++ b/src/parser.cc | 
| @@ -1,4 +1,4 @@ | 
| -// Copyright 2010 the V8 project authors. All rights reserved. | 
| +// 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: | 
| @@ -463,7 +463,7 @@ class TargetScope BASE_EMBEDDED { | 
| // Parser's scope stack. The constructor sets the parser's top scope | 
| // to the incoming scope, and the destructor resets it. | 
| // | 
| -// Additionlaly, it stores transient information used during parsing. | 
| +// Additionally, it stores transient information used during parsing. | 
| // These scopes are not kept around after parsing or referenced by syntax | 
| // trees so they can be stack-allocated and hence used by the pre-parser. | 
|  | 
| @@ -497,9 +497,6 @@ class LexicalScope BASE_EMBEDDED { | 
| void AddProperty() { expected_property_count_++; } | 
| int expected_property_count() { return expected_property_count_; } | 
|  | 
| -  void AddLoop() { loop_count_++; } | 
| -  bool ContainsLoops() const { return loop_count_ > 0; } | 
| - | 
| private: | 
| // Captures the number of literals that need materialization in the | 
| // function.  Includes regexp literals, and boilerplate for object | 
| @@ -514,15 +511,13 @@ class LexicalScope BASE_EMBEDDED { | 
| bool only_simple_this_property_assignments_; | 
| Handle<FixedArray> this_property_assignments_; | 
|  | 
| -  // Captures the number of loops inside the scope. | 
| -  int loop_count_; | 
| - | 
| // Bookkeeping | 
| Parser* parser_; | 
| // Previous values | 
| LexicalScope* lexical_scope_parent_; | 
| Scope* previous_scope_; | 
| int previous_with_nesting_level_; | 
| +  unsigned previous_ast_node_id_; | 
| }; | 
|  | 
|  | 
| @@ -531,14 +526,15 @@ LexicalScope::LexicalScope(Parser* parser, Scope* scope, Isolate* isolate) | 
| expected_property_count_(0), | 
| only_simple_this_property_assignments_(false), | 
| this_property_assignments_(isolate->factory()->empty_fixed_array()), | 
| -    loop_count_(0), | 
| parser_(parser), | 
| lexical_scope_parent_(parser->lexical_scope_), | 
| previous_scope_(parser->top_scope_), | 
| -    previous_with_nesting_level_(parser->with_nesting_level_) { | 
| +    previous_with_nesting_level_(parser->with_nesting_level_), | 
| +    previous_ast_node_id_(isolate->ast_node_id()) { | 
| parser->top_scope_ = scope; | 
| parser->lexical_scope_ = this; | 
| parser->with_nesting_level_ = 0; | 
| +  isolate->set_ast_node_id(AstNode::kRootAstId + 1); | 
| } | 
|  | 
|  | 
| @@ -547,6 +543,7 @@ LexicalScope::~LexicalScope() { | 
| parser_->top_scope_ = previous_scope_; | 
| parser_->lexical_scope_ = lexical_scope_parent_; | 
| parser_->with_nesting_level_ = previous_with_nesting_level_; | 
| +  parser_->isolate()->set_ast_node_id(previous_ast_node_id_); | 
| } | 
|  | 
|  | 
| @@ -664,8 +661,7 @@ FunctionLiteral* Parser::DoParseProgram(Handle<String> source, | 
| 0, | 
| 0, | 
| source->length(), | 
| -          false, | 
| -          lexical_scope.ContainsLoops()); | 
| +          false); | 
| } else if (stack_overflow_) { | 
| isolate()->StackOverflow(); | 
| } | 
| @@ -2163,7 +2159,6 @@ DoWhileStatement* Parser::ParseDoWhileStatement(ZoneStringList* labels, | 
| // DoStatement :: | 
| //   'do' Statement 'while' '(' Expression ')' ';' | 
|  | 
| -  lexical_scope_->AddLoop(); | 
| DoWhileStatement* loop = new(zone()) DoWhileStatement(labels); | 
| Target target(&this->target_stack_, loop); | 
|  | 
| @@ -2196,7 +2191,6 @@ WhileStatement* Parser::ParseWhileStatement(ZoneStringList* labels, bool* ok) { | 
| // WhileStatement :: | 
| //   'while' '(' Expression ')' Statement | 
|  | 
| -  lexical_scope_->AddLoop(); | 
| WhileStatement* loop = new(zone()) WhileStatement(labels); | 
| Target target(&this->target_stack_, loop); | 
|  | 
| @@ -2216,7 +2210,6 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { | 
| // ForStatement :: | 
| //   'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement | 
|  | 
| -  lexical_scope_->AddLoop(); | 
| Statement* init = NULL; | 
|  | 
| Expect(Token::FOR, CHECK_OK); | 
| @@ -3534,16 +3527,22 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, | 
| } | 
|  | 
| int num_parameters = 0; | 
| +  Scope* scope = NewScope(top_scope_, Scope::FUNCTION_SCOPE, inside_with()); | 
| +  ZoneList<Statement*>* body = new ZoneList<Statement*>(8); | 
| +  int materialized_literal_count; | 
| +  int expected_property_count; | 
| +  int start_pos; | 
| +  int end_pos; | 
| +  bool only_simple_this_property_assignments; | 
| +  Handle<FixedArray> this_property_assignments; | 
| // Parse function body. | 
| -  { Scope* scope = | 
| -        NewScope(top_scope_, Scope::FUNCTION_SCOPE, inside_with()); | 
| -    LexicalScope lexical_scope(this, scope, isolate()); | 
| +  { LexicalScope lexical_scope(this, scope, isolate()); | 
| top_scope_->SetScopeName(name); | 
|  | 
| //  FormalParameterList :: | 
| //    '(' (Identifier)*[','] ')' | 
| Expect(Token::LPAREN, CHECK_OK); | 
| -    int start_pos = scanner().location().beg_pos; | 
| +    start_pos = scanner().location().beg_pos; | 
| Scanner::Location name_loc = Scanner::NoLocation(); | 
| Scanner::Location dupe_loc = Scanner::NoLocation(); | 
| Scanner::Location reserved_loc = Scanner::NoLocation(); | 
| @@ -3580,7 +3579,6 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, | 
| Expect(Token::RPAREN, CHECK_OK); | 
|  | 
| Expect(Token::LBRACE, CHECK_OK); | 
| -    ZoneList<Statement*>* body = new ZoneList<Statement*>(8); | 
|  | 
| // If we have a named function expression, we add a local variable | 
| // declaration to the body of the function with the name of the | 
| @@ -3608,11 +3606,6 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, | 
| parenthesized_function_ = false;  // The bit was set for this function only. | 
|  | 
| int function_block_pos = scanner().location().beg_pos; | 
| -    int materialized_literal_count; | 
| -    int expected_property_count; | 
| -    int end_pos; | 
| -    bool only_simple_this_property_assignments; | 
| -    Handle<FixedArray> this_property_assignments; | 
| if (is_lazily_compiled && pre_data() != NULL) { | 
| FunctionEntry entry = pre_data()->GetFunctionEntry(function_block_pos); | 
| if (!entry.is_valid()) { | 
| @@ -3687,25 +3680,24 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, | 
| } | 
| CheckOctalLiteral(start_pos, end_pos, CHECK_OK); | 
| } | 
| - | 
| -    FunctionLiteral* function_literal = | 
| -        new(zone()) FunctionLiteral(name, | 
| -                            top_scope_, | 
| -                            body, | 
| -                            materialized_literal_count, | 
| -                            expected_property_count, | 
| -                            only_simple_this_property_assignments, | 
| -                            this_property_assignments, | 
| -                            num_parameters, | 
| -                            start_pos, | 
| -                            end_pos, | 
| -                            function_name->length() > 0, | 
| -                            lexical_scope.ContainsLoops()); | 
| -    function_literal->set_function_token_position(function_token_position); | 
| - | 
| -    if (fni_ != NULL && !is_named) fni_->AddFunction(function_literal); | 
| -    return function_literal; | 
| } | 
| + | 
| +  FunctionLiteral* function_literal = | 
| +      new(zone()) FunctionLiteral(name, | 
| +                                  scope, | 
| +                                  body, | 
| +                                  materialized_literal_count, | 
| +                                  expected_property_count, | 
| +                                  only_simple_this_property_assignments, | 
| +                                  this_property_assignments, | 
| +                                  num_parameters, | 
| +                                  start_pos, | 
| +                                  end_pos, | 
| +                                  (function_name->length() > 0)); | 
| +  function_literal->set_function_token_position(function_token_position); | 
| + | 
| +  if (fni_ != NULL && !is_named) fni_->AddFunction(function_literal); | 
| +  return function_literal; | 
| } | 
|  | 
|  | 
|  |