Home | History | Annotate | Download | only in src
      1 // Copyright 2014 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "src/background-parsing-task.h"
      6 
      7 namespace v8 {
      8 namespace internal {
      9 
     10 BackgroundParsingTask::BackgroundParsingTask(
     11     StreamedSource* source, ScriptCompiler::CompileOptions options,
     12     int stack_size, Isolate* isolate)
     13     : source_(source), options_(options), stack_size_(stack_size) {
     14   // Prepare the data for the internalization phase and compilation phase, which
     15   // will happen in the main thread after parsing.
     16   source->info.Reset(new i::CompilationInfoWithZone(source->source_stream.get(),
     17                                                     source->encoding, isolate));
     18   source->info->MarkAsGlobal();
     19 
     20   // We don't set the context to the CompilationInfo yet, because the background
     21   // thread cannot do anything with it anyway. We set it just before compilation
     22   // on the foreground thread.
     23   DCHECK(options == ScriptCompiler::kProduceParserCache ||
     24          options == ScriptCompiler::kProduceCodeCache ||
     25          options == ScriptCompiler::kNoCompileOptions);
     26   source->allow_lazy =
     27       !i::Compiler::DebuggerWantsEagerCompilation(source->info.get());
     28   source->hash_seed = isolate->heap()->HashSeed();
     29 }
     30 
     31 
     32 void BackgroundParsingTask::Run() {
     33   DisallowHeapAllocation no_allocation;
     34   DisallowHandleAllocation no_handles;
     35   DisallowHandleDereference no_deref;
     36 
     37   ScriptData* script_data = NULL;
     38   if (options_ == ScriptCompiler::kProduceParserCache ||
     39       options_ == ScriptCompiler::kProduceCodeCache) {
     40     source_->info->SetCachedData(&script_data, options_);
     41   }
     42 
     43   uintptr_t limit = reinterpret_cast<uintptr_t>(&limit) - stack_size_ * KB;
     44   Parser::ParseInfo parse_info = {limit, source_->hash_seed,
     45                                   &source_->unicode_cache};
     46 
     47   // Parser needs to stay alive for finalizing the parsing on the main
     48   // thread. Passing &parse_info is OK because Parser doesn't store it.
     49   source_->parser.Reset(new Parser(source_->info.get(), &parse_info));
     50   source_->parser->set_allow_lazy(source_->allow_lazy);
     51   source_->parser->ParseOnBackground();
     52 
     53   if (script_data != NULL) {
     54     source_->cached_data.Reset(new ScriptCompiler::CachedData(
     55         script_data->data(), script_data->length(),
     56         ScriptCompiler::CachedData::BufferOwned));
     57     script_data->ReleaseDataOwnership();
     58     delete script_data;
     59   }
     60 }
     61 }
     62 }  // namespace v8::internal
     63