| Index: src/parser.cc | 
| =================================================================== | 
| --- src/parser.cc	(revision 10686) | 
| +++ src/parser.cc	(working copy) | 
| @@ -503,7 +503,9 @@ | 
| Parser::FunctionState::~FunctionState() { | 
| parser_->top_scope_ = outer_scope_; | 
| parser_->current_function_state_ = outer_function_state_; | 
| -  parser_->isolate()->set_ast_node_id(saved_ast_node_id_); | 
| +  if (outer_function_state_ != NULL) { | 
| +    parser_->isolate()->set_ast_node_id(saved_ast_node_id_); | 
| +  } | 
| } | 
|  | 
|  | 
| @@ -550,7 +552,7 @@ | 
| allow_modules_((parser_flags & kAllowModules) != 0), | 
| stack_overflow_(false), | 
| parenthesized_function_(false) { | 
| -  AstNode::ResetIds(); | 
| +  isolate_->set_ast_node_id(0); | 
| if ((parser_flags & kLanguageModeMask) == EXTENDED_MODE) { | 
| scanner().SetHarmonyScoping(true); | 
| } | 
| @@ -602,7 +604,8 @@ | 
| FunctionLiteral* result = NULL; | 
| { Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE); | 
| info->SetGlobalScope(scope); | 
| -    if (!info->is_global()) { | 
| +    if (!info->is_global() && | 
| +        (info->shared_info().is_null() || info->shared_info()->is_function())) { | 
| scope = Scope::DeserializeScopeChain(*info->calling_context(), scope); | 
| scope = NewScope(scope, EVAL_SCOPE); | 
| } | 
| @@ -633,9 +636,9 @@ | 
| function_state.only_simple_this_property_assignments(), | 
| function_state.this_property_assignments(), | 
| 0, | 
| -          false,  // Does not have duplicate parameters. | 
| +          FunctionLiteral::kNoDuplicateParameters, | 
| FunctionLiteral::ANONYMOUS_EXPRESSION, | 
| -          false);  // Top-level literal doesn't count for the AST's properties. | 
| +          FunctionLiteral::kGlobalOrEval); | 
| result->set_ast_properties(factory()->visitor()->ast_properties()); | 
| } else if (stack_overflow_) { | 
| isolate()->StackOverflow(); | 
| @@ -4015,7 +4018,8 @@ | 
| int handler_count = 0; | 
| bool only_simple_this_property_assignments; | 
| Handle<FixedArray> this_property_assignments; | 
| -  bool has_duplicate_parameters = false; | 
| +  FunctionLiteral::ParameterFlag duplicate_parameters = | 
| +      FunctionLiteral::kNoDuplicateParameters; | 
| AstProperties ast_properties; | 
| // Parse function body. | 
| { FunctionState function_state(this, scope, isolate()); | 
| @@ -4041,7 +4045,7 @@ | 
| name_loc = scanner().location(); | 
| } | 
| if (!dupe_loc.IsValid() && top_scope_->IsDeclared(param_name)) { | 
| -        has_duplicate_parameters = true; | 
| +        duplicate_parameters = FunctionLiteral::kHasDuplicateParameters; | 
| dupe_loc = scanner().location(); | 
| } | 
| if (!reserved_loc.IsValid() && is_strict_reserved) { | 
| @@ -4252,9 +4256,9 @@ | 
| only_simple_this_property_assignments, | 
| this_property_assignments, | 
| num_parameters, | 
| -                                    has_duplicate_parameters, | 
| +                                    duplicate_parameters, | 
| type, | 
| -                                    true); | 
| +                                    FunctionLiteral::kIsFunction); | 
| function_literal->set_function_token_position(function_token_position); | 
| function_literal->set_ast_properties(&ast_properties); | 
|  | 
| @@ -5594,7 +5598,11 @@ | 
| if (info->is_lazy()) { | 
| ASSERT(!info->is_eval()); | 
| Parser parser(script, parsing_flags, NULL, NULL); | 
| -    result = parser.ParseLazy(info); | 
| +    if (info->shared_info()->is_function()) { | 
| +      result = parser.ParseLazy(info); | 
| +    } else { | 
| +      result = parser.ParseProgram(info); | 
| +    } | 
| } else { | 
| ScriptDataImpl* pre_data = info->pre_parse_data(); | 
| Parser parser(script, parsing_flags, info->extension(), pre_data); | 
|  |