| Index: src/parser.cc
 | 
| diff --git a/src/parser.cc b/src/parser.cc
 | 
| index 0664e2a6a9211062bfbaccc325e2e77e562bf64e..adb797d8d0c27bbb6b0f473efa83e5fa198861cc 100644
 | 
| --- a/src/parser.cc
 | 
| +++ b/src/parser.cc
 | 
| @@ -750,7 +750,7 @@ Parser::Parser(CompilationInfo* info, ParseInfo* parse_info)
 | 
|        pending_error_char_arg_(NULL),
 | 
|        total_preparse_skipped_(0),
 | 
|        pre_parse_timer_(NULL) {
 | 
| -  DCHECK(!script().is_null() || info->source_stream() != NULL);
 | 
| +  DCHECK(!script().is_null());
 | 
|    set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping);
 | 
|    set_allow_modules(!info->is_native() && FLAG_harmony_modules);
 | 
|    set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native());
 | 
| @@ -798,9 +798,6 @@ FunctionLiteral* Parser::ParseProgram() {
 | 
|  
 | 
|    source = String::Flatten(source);
 | 
|    FunctionLiteral* result;
 | 
| -
 | 
| -  Scope* top_scope = NULL;
 | 
| -  Scope* eval_scope = NULL;
 | 
|    if (source->IsExternalTwoByteString()) {
 | 
|      // Notice that the stream is destroyed at the end of the branch block.
 | 
|      // The last line of the blocks can't be moved outside, even though they're
 | 
| @@ -808,15 +805,11 @@ FunctionLiteral* Parser::ParseProgram() {
 | 
|      ExternalTwoByteStringUtf16CharacterStream stream(
 | 
|          Handle<ExternalTwoByteString>::cast(source), 0, source->length());
 | 
|      scanner_.Initialize(&stream);
 | 
| -    result = DoParseProgram(info(), &top_scope, &eval_scope);
 | 
| +    result = DoParseProgram(info(), source);
 | 
|    } else {
 | 
|      GenericStringUtf16CharacterStream stream(source, 0, source->length());
 | 
|      scanner_.Initialize(&stream);
 | 
| -    result = DoParseProgram(info(), &top_scope, &eval_scope);
 | 
| -  }
 | 
| -  top_scope->set_end_position(source->length());
 | 
| -  if (eval_scope != NULL) {
 | 
| -    eval_scope->set_end_position(source->length());
 | 
| +    result = DoParseProgram(info(), source);
 | 
|    }
 | 
|    HandleSourceURLComments();
 | 
|  
 | 
| @@ -841,52 +834,51 @@ FunctionLiteral* Parser::ParseProgram() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, Scope** scope,
 | 
| -                                        Scope** eval_scope) {
 | 
| +FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info,
 | 
| +                                        Handle<String> source) {
 | 
|    DCHECK(scope_ == NULL);
 | 
|    DCHECK(target_stack_ == NULL);
 | 
|  
 | 
|    FunctionLiteral* result = NULL;
 | 
| -  {
 | 
| -    *scope = NewScope(scope_, GLOBAL_SCOPE);
 | 
| -    info->SetGlobalScope(*scope);
 | 
| +  { Scope* scope = NewScope(scope_, GLOBAL_SCOPE);
 | 
| +    info->SetGlobalScope(scope);
 | 
|      if (!info->context().is_null() && !info->context()->IsNativeContext()) {
 | 
| -      *scope = Scope::DeserializeScopeChain(*info->context(), *scope, zone());
 | 
| +      scope = Scope::DeserializeScopeChain(*info->context(), scope, zone());
 | 
|        // The Scope is backed up by ScopeInfo (which is in the V8 heap); this
 | 
|        // means the Parser cannot operate independent of the V8 heap. Tell the
 | 
|        // string table to internalize strings and values right after they're
 | 
|        // created.
 | 
|        ast_value_factory()->Internalize(isolate());
 | 
|      }
 | 
| -    original_scope_ = *scope;
 | 
| +    original_scope_ = scope;
 | 
|      if (info->is_eval()) {
 | 
| -      if (!(*scope)->is_global_scope() || info->strict_mode() == STRICT) {
 | 
| -        *scope = NewScope(*scope, EVAL_SCOPE);
 | 
| +      if (!scope->is_global_scope() || info->strict_mode() == STRICT) {
 | 
| +        scope = NewScope(scope, EVAL_SCOPE);
 | 
|        }
 | 
|      } else if (info->is_global()) {
 | 
| -      *scope = NewScope(*scope, GLOBAL_SCOPE);
 | 
| +      scope = NewScope(scope, GLOBAL_SCOPE);
 | 
|      }
 | 
| -    (*scope)->set_start_position(0);
 | 
| -    // End position will be set by the caller.
 | 
| +    scope->set_start_position(0);
 | 
| +    scope->set_end_position(source->length());
 | 
|  
 | 
|      // Compute the parsing mode.
 | 
|      Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY;
 | 
| -    if (allow_natives_syntax() || extension_ != NULL ||
 | 
| -        (*scope)->is_eval_scope()) {
 | 
| +    if (allow_natives_syntax() ||
 | 
| +        extension_ != NULL ||
 | 
| +        scope->is_eval_scope()) {
 | 
|        mode = PARSE_EAGERLY;
 | 
|      }
 | 
|      ParsingModeScope parsing_mode(this, mode);
 | 
|  
 | 
|      // Enters 'scope'.
 | 
| -    FunctionState function_state(&function_state_, &scope_, *scope, zone(),
 | 
| +    FunctionState function_state(&function_state_, &scope_, scope, zone(),
 | 
|                                   ast_value_factory(), info->ast_node_id_gen());
 | 
|  
 | 
|      scope_->SetStrictMode(info->strict_mode());
 | 
|      ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
 | 
|      bool ok = true;
 | 
|      int beg_pos = scanner()->location().beg_pos;
 | 
| -    ParseSourceElements(body, Token::EOS, info->is_eval(), true, eval_scope,
 | 
| -                        &ok);
 | 
| +    ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok);
 | 
|  
 | 
|      if (ok && strict_mode() == STRICT) {
 | 
|        CheckOctalLiteral(beg_pos, scanner()->location().end_pos, &ok);
 | 
| @@ -1031,8 +1023,10 @@ FunctionLiteral* Parser::ParseLazy(Utf16CharacterStream* source) {
 | 
|  
 | 
|  
 | 
|  void* Parser::ParseSourceElements(ZoneList<Statement*>* processor,
 | 
| -                                  int end_token, bool is_eval, bool is_global,
 | 
| -                                  Scope** eval_scope, bool* ok) {
 | 
| +                                  int end_token,
 | 
| +                                  bool is_eval,
 | 
| +                                  bool is_global,
 | 
| +                                  bool* ok) {
 | 
|    // SourceElements ::
 | 
|    //   (ModuleElement)* <end_token>
 | 
|  
 | 
| @@ -1088,10 +1082,6 @@ void* Parser::ParseSourceElements(ZoneList<Statement*>* processor,
 | 
|              scope->set_start_position(scope_->start_position());
 | 
|              scope->set_end_position(scope_->end_position());
 | 
|              scope_ = scope;
 | 
| -            if (eval_scope != NULL) {
 | 
| -              // Caller will correct the positions of the ad hoc eval scope.
 | 
| -              *eval_scope = scope;
 | 
| -            }
 | 
|              mode_ = PARSE_EAGERLY;
 | 
|            }
 | 
|            scope_->SetStrictMode(STRICT);
 | 
| @@ -3732,7 +3722,7 @@ ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
 | 
|          yield, RelocInfo::kNoPosition), zone());
 | 
|    }
 | 
|  
 | 
| -  ParseSourceElements(body, Token::RBRACE, false, false, NULL, CHECK_OK);
 | 
| +  ParseSourceElements(body, Token::RBRACE, false, false, CHECK_OK);
 | 
|  
 | 
|    if (is_generator) {
 | 
|      VariableProxy* get_proxy = factory()->NewVariableProxy(
 | 
| @@ -4849,46 +4839,4 @@ bool Parser::Parse() {
 | 
|    return (result != NULL);
 | 
|  }
 | 
|  
 | 
| -
 | 
| -void Parser::ParseOnBackground() {
 | 
| -  DCHECK(info()->function() == NULL);
 | 
| -  FunctionLiteral* result = NULL;
 | 
| -  fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone());
 | 
| -
 | 
| -  CompleteParserRecorder recorder;
 | 
| -  if (compile_options() == ScriptCompiler::kProduceParserCache) {
 | 
| -    log_ = &recorder;
 | 
| -  }
 | 
| -
 | 
| -  DCHECK(info()->source_stream() != NULL);
 | 
| -  ExternalStreamingStream stream(info()->source_stream(),
 | 
| -                                 info()->source_stream_encoding());
 | 
| -  scanner_.Initialize(&stream);
 | 
| -  DCHECK(info()->context().is_null() || info()->context()->IsNativeContext());
 | 
| -
 | 
| -  // When streaming, we don't know the length of the source until we have parsed
 | 
| -  // it. The raw data can be UTF-8, so we wouldn't know the source length until
 | 
| -  // we have decoded it anyway even if we knew the raw data length (which we
 | 
| -  // don't). We work around this by storing all the scopes which need their end
 | 
| -  // position set at the end of the script (the top scope and possible eval
 | 
| -  // scopes) and set their end position after we know the script length.
 | 
| -  Scope* top_scope = NULL;
 | 
| -  Scope* eval_scope = NULL;
 | 
| -  result = DoParseProgram(info(), &top_scope, &eval_scope);
 | 
| -
 | 
| -  top_scope->set_end_position(scanner()->location().end_pos);
 | 
| -  if (eval_scope != NULL) {
 | 
| -    eval_scope->set_end_position(scanner()->location().end_pos);
 | 
| -  }
 | 
| -
 | 
| -  info()->SetFunction(result);
 | 
| -
 | 
| -  // We cannot internalize on a background thread; a foreground task will take
 | 
| -  // care of calling Parser::Internalize just before compilation.
 | 
| -
 | 
| -  if (compile_options() == ScriptCompiler::kProduceParserCache) {
 | 
| -    if (result != NULL) *info_->cached_data() = recorder.GetScriptData();
 | 
| -    log_ = NULL;
 | 
| -  }
 | 
| -}
 | 
|  } }  // namespace v8::internal
 | 
| 
 |