| Index: src/background-parsing-task.cc
|
| diff --git a/src/background-parsing-task.cc b/src/background-parsing-task.cc
|
| index cbfaae5fe98eaa9ea39f9851b293bb59301890cf..99d9e9f74e0350d72a52b3ccf4137684a4e0c8d1 100644
|
| --- a/src/background-parsing-task.cc
|
| +++ b/src/background-parsing-task.cc
|
| @@ -11,7 +11,7 @@ namespace internal {
|
| BackgroundParsingTask::BackgroundParsingTask(
|
| StreamedSource* source, ScriptCompiler::CompileOptions options,
|
| int stack_size, Isolate* isolate)
|
| - : source_(source), stack_size_(stack_size) {
|
| + : source_(source), stack_size_(stack_size), script_data_(nullptr) {
|
| // We don't set the context to the CompilationInfo yet, because the background
|
| // thread cannot do anything with it anyway. We set it just before compilation
|
| // on the foreground thread.
|
| @@ -34,6 +34,14 @@ BackgroundParsingTask::BackgroundParsingTask(
|
| info->set_compile_options(options);
|
| // Parse eagerly with ignition since we will compile eagerly.
|
| info->set_allow_lazy_parsing(!(i::FLAG_ignition && i::FLAG_ignition_eager));
|
| +
|
| + if (options == ScriptCompiler::kProduceParserCache ||
|
| + options == ScriptCompiler::kProduceCodeCache) {
|
| + source_->info->set_cached_data(&script_data_);
|
| + }
|
| + // Parser needs to stay alive for finalizing the parsing on the main
|
| + // thread.
|
| + source_->parser.reset(new Parser(source_->info.get()));
|
| }
|
|
|
|
|
| @@ -42,33 +50,26 @@ void BackgroundParsingTask::Run() {
|
| DisallowHandleAllocation no_handles;
|
| DisallowHandleDereference no_deref;
|
|
|
| - ScriptData* script_data = NULL;
|
| - ScriptCompiler::CompileOptions options = source_->info->compile_options();
|
| - if (options == ScriptCompiler::kProduceParserCache ||
|
| - options == ScriptCompiler::kProduceCodeCache) {
|
| - source_->info->set_cached_data(&script_data);
|
| - }
|
| + // Reset the stack limit of the parser to reflect correctly that we're on a
|
| + // background thread.
|
| + uintptr_t stack_limit =
|
| + reinterpret_cast<uintptr_t>(&stack_limit) - stack_size_ * KB;
|
| + source_->parser->set_stack_limit(stack_limit);
|
|
|
| // Nullify the Isolate temporarily so that the background parser doesn't
|
| // accidentally use it.
|
| Isolate* isolate = source_->info->isolate();
|
| source_->info->set_isolate(nullptr);
|
|
|
| - uintptr_t stack_limit =
|
| - reinterpret_cast<uintptr_t>(&stack_limit) - stack_size_ * KB;
|
| -
|
| - source_->info->set_stack_limit(stack_limit);
|
| - // Parser needs to stay alive for finalizing the parsing on the main
|
| - // thread. Passing &parse_info is OK because Parser doesn't store it.
|
| - source_->parser.reset(new Parser(source_->info.get()));
|
| source_->parser->ParseOnBackground(source_->info.get());
|
|
|
| - if (script_data != NULL) {
|
| + if (script_data_ != nullptr) {
|
| source_->cached_data.reset(new ScriptCompiler::CachedData(
|
| - script_data->data(), script_data->length(),
|
| + script_data_->data(), script_data_->length(),
|
| ScriptCompiler::CachedData::BufferOwned));
|
| - script_data->ReleaseDataOwnership();
|
| - delete script_data;
|
| + script_data_->ReleaseDataOwnership();
|
| + delete script_data_;
|
| + script_data_ = nullptr;
|
| }
|
| source_->info->set_isolate(isolate);
|
| }
|
|
|