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