summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler.cc')
-rw-r--r--deps/v8/src/compiler.cc167
1 files changed, 63 insertions, 104 deletions
diff --git a/deps/v8/src/compiler.cc b/deps/v8/src/compiler.cc
index a01750b23a..6c5211b74d 100644
--- a/deps/v8/src/compiler.cc
+++ b/deps/v8/src/compiler.cc
@@ -94,7 +94,7 @@ void LogFunctionCompilation(CodeEventListener::LogEventsAndTags tag,
int column_num = Script::GetColumnNumber(script, shared->StartPosition()) + 1;
String* script_name = script->name()->IsString()
? String::cast(script->name())
- : isolate->heap()->empty_string();
+ : ReadOnlyRoots(isolate).empty_string();
CodeEventListener::LogEventsAndTags log_tag =
Logger::ToNativeByScript(tag, *script);
PROFILE(isolate, CodeCreateEvent(log_tag, *abstract_code, *shared,
@@ -119,7 +119,7 @@ void LogFunctionCompilation(CodeEventListener::LogEventsAndTags tag,
UNREACHABLE();
}
- LOG(isolate, FunctionEvent(name.c_str(), nullptr, script->id(), time_taken_ms,
+ LOG(isolate, FunctionEvent(name.c_str(), script->id(), time_taken_ms,
shared->StartPosition(), shared->EndPosition(),
shared->DebugName()));
}
@@ -198,7 +198,7 @@ CompilationJob::Status OptimizedCompilationJob::PrepareJob(Isolate* isolate) {
DisallowJavascriptExecution no_js(isolate);
if (FLAG_trace_opt && compilation_info()->IsOptimizing()) {
- OFStream os(stdout);
+ StdoutStream os;
os << "[compiling method " << Brief(*compilation_info()->closure())
<< " using " << compiler_name_;
if (compilation_info()->is_osr()) os << " OSR";
@@ -227,8 +227,6 @@ CompilationJob::Status OptimizedCompilationJob::FinalizeJob(Isolate* isolate) {
DCHECK(ThreadId::Current().Equals(isolate->thread_id()));
DisallowCodeDependencyChange no_dependency_change;
DisallowJavascriptExecution no_js(isolate);
- CHECK(!compilation_info()->dependencies() ||
- !compilation_info()->dependencies()->HasAborted());
// Delegate to the underlying implementation.
DCHECK_EQ(state(), State::kReadyToFinalize);
@@ -285,7 +283,7 @@ void OptimizedCompilationJob::RecordFunctionCompilation(
time_taken_to_finalize_.InMillisecondsF();
Handle<Script> script(
- Script::cast(compilation_info()->shared_info()->script()));
+ Script::cast(compilation_info()->shared_info()->script()), isolate);
LogFunctionCompilation(tag, compilation_info()->shared_info(), script,
abstract_code, true, time_taken_ms, isolate);
}
@@ -342,7 +340,7 @@ void InstallBytecodeArray(Handle<BytecodeArray> bytecode_array,
Script::GetColumnNumber(script, shared_info->StartPosition()) + 1;
String* script_name = script->name()->IsString()
? String::cast(script->name())
- : isolate->heap()->empty_string();
+ : ReadOnlyRoots(isolate).empty_string();
CodeEventListener::LogEventsAndTags log_tag = Logger::ToNativeByScript(
CodeEventListener::INTERPRETED_FUNCTION_TAG, *script);
PROFILE(isolate, CodeCreateEvent(log_tag, *abstract_code, *shared_info,
@@ -374,7 +372,7 @@ void InstallUnoptimizedCode(UnoptimizedCompilationInfo* compilation_info,
DCHECK(compilation_info->has_asm_wasm_data());
shared_info->set_asm_wasm_data(*compilation_info->asm_wasm_data());
shared_info->set_feedback_metadata(
- isolate->heap()->empty_feedback_metadata());
+ ReadOnlyRoots(isolate).empty_feedback_metadata());
}
// Install coverage info on the shared function info.
@@ -509,8 +507,7 @@ bool FinalizeUnoptimizedCode(
DCHECK(AllowCompilation::IsAllowed(isolate));
// Allocate scope infos for the literal.
- DeclarationScope::AllocateScopeInfos(parse_info, isolate,
- AnalyzeMode::kRegular);
+ DeclarationScope::AllocateScopeInfos(parse_info, isolate);
// Finalize the outer-most function's compilation job.
if (FinalizeUnoptimizedCompilationJob(outer_function_job, shared_info,
@@ -548,7 +545,7 @@ V8_WARN_UNUSED_RESULT MaybeHandle<Code> GetCodeFromOptimizedCodeCache(
RuntimeCallTimerScope runtimeTimer(
function->GetIsolate(),
RuntimeCallCounterId::kCompileGetFromOptimizedCodeMap);
- Handle<SharedFunctionInfo> shared(function->shared());
+ Handle<SharedFunctionInfo> shared(function->shared(), function->GetIsolate());
DisallowHeapAllocation no_gc;
if (osr_offset.IsNone()) {
if (function->feedback_cell()->value()->IsFeedbackVector()) {
@@ -561,7 +558,7 @@ V8_WARN_UNUSED_RESULT MaybeHandle<Code> GetCodeFromOptimizedCodeCache(
// Caching of optimized code enabled and optimized code found.
DCHECK(!code->marked_for_deoptimization());
DCHECK(function->shared()->is_compiled());
- return Handle<Code>(code);
+ return Handle<Code>(code, feedback_vector->GetIsolate());
}
}
}
@@ -593,8 +590,9 @@ void InsertCodeIntoOptimizedCodeCache(
// Cache optimized context-specific code.
Handle<JSFunction> function = compilation_info->closure();
- Handle<SharedFunctionInfo> shared(function->shared());
- Handle<Context> native_context(function->context()->native_context());
+ Handle<SharedFunctionInfo> shared(function->shared(), function->GetIsolate());
+ Handle<Context> native_context(function->context()->native_context(),
+ function->GetIsolate());
if (compilation_info->osr_offset().IsNone()) {
Handle<FeedbackVector> vector =
handle(function->feedback_vector(), function->GetIsolate());
@@ -711,7 +709,7 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function,
// tolerate the lack of a script without bytecode.
DCHECK_IMPLIES(!has_script, shared->HasBytecodeArray());
std::unique_ptr<OptimizedCompilationJob> job(
- compiler::Pipeline::NewCompilationJob(function, has_script));
+ compiler::Pipeline::NewCompilationJob(isolate, function, has_script));
OptimizedCompilationInfo* compilation_info = job->compilation_info();
compilation_info->SetOptimizingForOsr(osr_offset, osr_frame);
@@ -755,7 +753,7 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function,
CanonicalHandleScope canonical(isolate);
// Reopen handles in the new CompilationHandleScope.
- compilation_info->ReopenHandlesInNewHandleScope();
+ compilation_info->ReopenHandlesInNewHandleScope(isolate);
if (mode == ConcurrencyMode::kConcurrent) {
if (GetOptimizedCodeLater(job.get(), isolate)) {
@@ -802,8 +800,6 @@ CompilationJob::Status FinalizeOptimizedCompilationJob(
if (job->state() == CompilationJob::State::kReadyToFinalize) {
if (shared->optimization_disabled()) {
job->RetryOptimization(BailoutReason::kOptimizationDisabled);
- } else if (compilation_info->dependencies()->HasAborted()) {
- job->RetryOptimization(BailoutReason::kBailedOutDueToDependencyChange);
} else if (job->FinalizeJob(isolate) == CompilationJob::SUCCEEDED) {
job->RecordCompilationStats();
job->RecordFunctionCompilation(CodeEventListener::LAZY_COMPILE_TAG,
@@ -973,8 +969,9 @@ BackgroundCompileTask::BackgroundCompileTask(ScriptStreamingData* source,
// Prepare the data for the internalization phase and compilation phase, which
// will happen in the main thread after parsing.
- ParseInfo* info = new ParseInfo(isolate->allocator());
- info->InitFromIsolate(isolate);
+ ParseInfo* info = new ParseInfo(isolate);
+ LOG(isolate, ScriptEvent(Logger::ScriptEventType::kStreamingCompile,
+ info->script_id()));
if (V8_UNLIKELY(FLAG_runtime_stats)) {
info->set_runtime_call_stats(new (info->zone()) RuntimeCallStats());
} else {
@@ -1000,7 +997,7 @@ BackgroundCompileTask::BackgroundCompileTask(ScriptStreamingData* source,
// Parser needs to stay alive for finalizing the parsing on the main
// thread.
source_->parser.reset(new Parser(source_->info.get()));
- source_->parser->DeserializeScopeChain(source_->info.get(),
+ source_->parser->DeserializeScopeChain(isolate, source_->info.get(),
MaybeHandle<ScopeInfo>());
}
@@ -1077,7 +1074,7 @@ bool Compiler::Compile(Handle<SharedFunctionInfo> shared_info,
AggregatedHistogramTimerScope timer(isolate->counters()->compile_lazy());
// Set up parse info.
- ParseInfo parse_info(shared_info);
+ ParseInfo parse_info(isolate, shared_info);
parse_info.set_lazy_compile();
// Check if the compiler dispatcher has shared_info enqueued for compile.
@@ -1090,13 +1087,11 @@ bool Compiler::Compile(Handle<SharedFunctionInfo> shared_info,
}
if (FLAG_preparser_scope_analysis) {
- if (shared_info->HasPreParsedScopeData()) {
- Handle<PreParsedScopeData> data(
- PreParsedScopeData::cast(shared_info->preparsed_scope_data()));
- parse_info.consumed_preparsed_scope_data()->SetData(data);
- // After we've compiled the function, we don't need data about its
- // skippable functions any more.
- shared_info->ClearPreParsedScopeData();
+ if (shared_info->HasUncompiledDataWithPreParsedScope()) {
+ parse_info.consumed_preparsed_scope_data()->SetData(
+ isolate, handle(shared_info->uncompiled_data_with_pre_parsed_scope()
+ ->pre_parsed_scope_data(),
+ isolate));
}
}
@@ -1136,7 +1131,7 @@ bool Compiler::Compile(Handle<JSFunction> function, ClearExceptionFlag flag) {
DCHECK(!function->HasOptimizedCode());
Isolate* isolate = function->GetIsolate();
- Handle<SharedFunctionInfo> shared_info = handle(function->shared());
+ Handle<SharedFunctionInfo> shared_info = handle(function->shared(), isolate);
// Ensure shared function info is compiled.
if (!shared_info->is_compiled() && !Compile(shared_info, flag)) return false;
@@ -1202,37 +1197,9 @@ bool Compiler::CompileOptimized(Handle<JSFunction> function,
return true;
}
-MaybeHandle<JSArray> Compiler::CompileForLiveEdit(Handle<Script> script) {
- Isolate* isolate = script->GetIsolate();
- DCHECK(AllowCompilation::IsAllowed(isolate));
-
- // In order to ensure that live edit function info collection finds the newly
- // generated shared function infos, clear the script's list temporarily
- // and restore it at the end of this method.
- Handle<WeakFixedArray> old_function_infos(script->shared_function_infos(),
- isolate);
- script->set_shared_function_infos(isolate->heap()->empty_weak_fixed_array());
-
- // Start a compilation.
- ParseInfo parse_info(script);
- parse_info.set_eager();
-
- // TODO(635): support extensions.
- Handle<JSArray> infos;
- Handle<SharedFunctionInfo> shared_info;
- if (CompileToplevel(&parse_info, isolate).ToHandle(&shared_info)) {
- // Check postconditions on success.
- DCHECK(!isolate->has_pending_exception());
- infos = LiveEditFunctionTracker::Collect(parse_info.literal(), script,
- parse_info.zone(), isolate);
- }
-
- // Restore the original function info list in order to remain side-effect
- // free as much as possible, since some code expects the old shared function
- // infos to stick around.
- script->set_shared_function_infos(*old_function_infos);
-
- return infos;
+MaybeHandle<SharedFunctionInfo> Compiler::CompileForLiveEdit(
+ ParseInfo* parse_info, Isolate* isolate) {
+ return CompileToplevel(parse_info, isolate);
}
MaybeHandle<JSFunction> Compiler::GetFunctionFromEval(
@@ -1242,7 +1209,7 @@ MaybeHandle<JSFunction> Compiler::GetFunctionFromEval(
int eval_scope_position, int eval_position, int line_offset,
int column_offset, Handle<Object> script_name,
ScriptOriginOptions options) {
- Isolate* isolate = source->GetIsolate();
+ Isolate* isolate = context->GetIsolate();
int source_length = source->length();
isolate->counters()->total_eval_size()->Increment(source_length);
isolate->counters()->total_compile_size()->Increment(source_length);
@@ -1279,24 +1246,22 @@ MaybeHandle<JSFunction> Compiler::GetFunctionFromEval(
script = Handle<Script>(Script::cast(shared_info->script()), isolate);
allow_eval_cache = true;
} else {
- script = isolate->factory()->NewScript(source);
- if (isolate->NeedsSourcePositionsForProfiling()) {
- Script::InitLineEnds(script);
- }
+ ParseInfo parse_info(isolate);
+ script = parse_info.CreateScript(isolate, source, options);
if (!script_name.is_null()) {
+ // TODO(cbruni): check whether we can store this data in options
script->set_name(*script_name);
script->set_line_offset(line_offset);
script->set_column_offset(column_offset);
+ LOG(isolate, ScriptDetails(*script));
}
- script->set_origin_options(options);
script->set_compilation_type(Script::COMPILATION_TYPE_EVAL);
-
script->set_eval_from_shared(*outer_info);
if (eval_position == kNoSourcePosition) {
// If the position is missing, attempt to get the code offset by
// walking the stack. Do not translate the code offset into source
// position, but store it as negative value for lazy translation.
- StackTraceFrameIterator it(script->GetIsolate());
+ StackTraceFrameIterator it(isolate);
if (!it.done() && it.is_javascript()) {
FrameSummary summary = FrameSummary::GetTop(it.javascript_frame());
script->set_eval_from_shared(
@@ -1308,13 +1273,12 @@ MaybeHandle<JSFunction> Compiler::GetFunctionFromEval(
}
script->set_eval_from_position(eval_position);
- ParseInfo parse_info(script);
parse_info.set_eval();
parse_info.set_language_mode(language_mode);
parse_info.set_parse_restriction(restriction);
parse_info.set_parameters_end_pos(parameters_end_pos);
if (!context->IsNativeContext()) {
- parse_info.set_outer_scope_info(handle(context->scope_info()));
+ parse_info.set_outer_scope_info(handle(context->scope_info(), isolate));
}
DCHECK(!parse_info.is_module());
@@ -1399,7 +1363,7 @@ MaybeHandle<JSFunction> Compiler::GetFunctionFromString(
int eval_scope_position = 0;
int eval_position = kNoSourcePosition;
Handle<SharedFunctionInfo> outer_info(
- native_context->empty_function()->shared());
+ native_context->empty_function()->shared(), isolate);
return Compiler::GetFunctionFromEval(
source, outer_info, native_context, LanguageMode::kSloppy, restriction,
parameters_end_pos, eval_scope_position, eval_position);
@@ -1602,29 +1566,20 @@ struct ScriptCompileTimerScope {
}
};
-Handle<Script> NewScript(Isolate* isolate, Handle<String> source,
+Handle<Script> NewScript(Isolate* isolate, ParseInfo* parse_info,
+ Handle<String> source,
Compiler::ScriptDetails script_details,
ScriptOriginOptions origin_options,
NativesFlag natives) {
// Create a script object describing the script to be compiled.
- Handle<Script> script = isolate->factory()->NewScript(source);
- if (isolate->NeedsSourcePositionsForProfiling()) {
- Script::InitLineEnds(script);
- }
- if (natives == NATIVES_CODE) {
- script->set_type(Script::TYPE_NATIVE);
- } else if (natives == EXTENSION_CODE) {
- script->set_type(Script::TYPE_EXTENSION);
- } else if (natives == INSPECTOR_CODE) {
- script->set_type(Script::TYPE_INSPECTOR);
- }
+ Handle<Script> script =
+ parse_info->CreateScript(isolate, source, origin_options, natives);
Handle<Object> script_name;
if (script_details.name_obj.ToHandle(&script_name)) {
script->set_name(*script_name);
script->set_line_offset(script_details.line_offset);
script->set_column_offset(script_details.column_offset);
}
- script->set_origin_options(origin_options);
Handle<Object> source_map_url;
if (script_details.source_map_url.ToHandle(&source_map_url)) {
script->set_source_mapping_url(*source_map_url);
@@ -1633,6 +1588,7 @@ Handle<Script> NewScript(Isolate* isolate, Handle<String> source,
if (script_details.host_defined_options.ToHandle(&host_defined_options)) {
script->set_host_defined_options(*host_defined_options);
}
+ LOG(isolate, ScriptDetails(*script));
return script;
}
@@ -1666,7 +1622,7 @@ MaybeHandle<SharedFunctionInfo> Compiler::GetSharedFunctionInfoForScript(
if (extension == nullptr) {
bool can_consume_code_cache =
compile_options == ScriptCompiler::kConsumeCodeCache &&
- !isolate->debug()->is_loaded();
+ !isolate->debug()->is_active();
if (can_consume_code_cache) {
compile_timer.set_consuming_code_cache();
}
@@ -1687,7 +1643,8 @@ MaybeHandle<SharedFunctionInfo> Compiler::GetSharedFunctionInfoForScript(
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"),
"V8.CompileDeserialize");
Handle<SharedFunctionInfo> inner_result;
- if (CodeSerializer::Deserialize(isolate, cached_data, source)
+ if (CodeSerializer::Deserialize(isolate, cached_data, source,
+ origin_options)
.ToHandle(&inner_result)) {
// Promote to per-isolate compilation cache.
DCHECK(inner_result->is_compiled());
@@ -1703,12 +1660,12 @@ MaybeHandle<SharedFunctionInfo> Compiler::GetSharedFunctionInfoForScript(
}
if (maybe_result.is_null()) {
+ ParseInfo parse_info(isolate);
// No cache entry found compile the script.
- Handle<Script> script =
- NewScript(isolate, source, script_details, origin_options, natives);
+ NewScript(isolate, &parse_info, source, script_details, origin_options,
+ natives);
// Compile the function and add it to the isolate cache.
- ParseInfo parse_info(script);
Zone compile_zone(isolate->allocator(), ZONE_NAME);
if (origin_options.IsModule()) parse_info.set_module();
parse_info.set_extension(extension);
@@ -1737,7 +1694,7 @@ MaybeHandle<JSFunction> Compiler::GetWrappedFunction(
ScriptOriginOptions origin_options, ScriptData* cached_data,
v8::ScriptCompiler::CompileOptions compile_options,
v8::ScriptCompiler::NoCacheReason no_cache_reason) {
- Isolate* isolate = source->GetIsolate();
+ Isolate* isolate = context->GetIsolate();
ScriptCompileTimerScope compile_timer(isolate, no_cache_reason);
if (compile_options == ScriptCompiler::kNoCompileOptions ||
@@ -1756,7 +1713,7 @@ MaybeHandle<JSFunction> Compiler::GetWrappedFunction(
MaybeHandle<SharedFunctionInfo> maybe_result;
bool can_consume_code_cache =
compile_options == ScriptCompiler::kConsumeCodeCache &&
- !isolate->debug()->is_loaded();
+ !isolate->debug()->is_active();
if (can_consume_code_cache) {
compile_timer.set_consuming_code_cache();
// Then check cached code provided by embedder.
@@ -1765,7 +1722,8 @@ MaybeHandle<JSFunction> Compiler::GetWrappedFunction(
isolate, RuntimeCallCounterId::kCompileDeserialize);
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"),
"V8.CompileDeserialize");
- maybe_result = CodeSerializer::Deserialize(isolate, cached_data, source);
+ maybe_result = CodeSerializer::Deserialize(isolate, cached_data, source,
+ origin_options);
if (maybe_result.is_null()) {
// Deserializer failed. Fall through to compile.
compile_timer.set_consuming_code_cache_failed();
@@ -1775,16 +1733,16 @@ MaybeHandle<JSFunction> Compiler::GetWrappedFunction(
Handle<SharedFunctionInfo> wrapped;
Handle<Script> script;
if (!maybe_result.ToHandle(&wrapped)) {
- script = NewScript(isolate, source, script_details, origin_options,
- NOT_NATIVES_CODE);
+ ParseInfo parse_info(isolate);
+ script = NewScript(isolate, &parse_info, source, script_details,
+ origin_options, NOT_NATIVES_CODE);
script->set_wrapped_arguments(*arguments);
- ParseInfo parse_info(script);
parse_info.set_eval(); // Use an eval scope as declaration scope.
parse_info.set_wrapped_as_function();
// parse_info.set_eager(compile_options == ScriptCompiler::kEagerCompile);
if (!context->IsNativeContext()) {
- parse_info.set_outer_scope_info(handle(context->scope_info()));
+ parse_info.set_outer_scope_info(handle(context->scope_info(), isolate));
}
parse_info.set_language_mode(
stricter_language_mode(parse_info.language_mode(), language_mode));
@@ -1794,7 +1752,7 @@ MaybeHandle<JSFunction> Compiler::GetWrappedFunction(
if (maybe_result.is_null()) isolate->ReportPendingMessages();
ASSIGN_RETURN_ON_EXCEPTION(isolate, top_level, maybe_result, JSFunction);
- SharedFunctionInfo::ScriptIterator infos(script);
+ SharedFunctionInfo::ScriptIterator infos(isolate, *script);
while (SharedFunctionInfo* info = infos.Next()) {
if (info->is_wrapped()) {
wrapped = Handle<SharedFunctionInfo>(info, isolate);
@@ -1846,9 +1804,9 @@ Compiler::GetSharedFunctionInfoForStreamedScript(
if (maybe_result.is_null()) {
// No cache entry found, finalize compilation of the script and add it to
// the isolate cache.
- Handle<Script> script = NewScript(isolate, source, script_details,
- origin_options, NOT_NATIVES_CODE);
- parse_info->set_script(script);
+ Handle<Script> script =
+ NewScript(isolate, parse_info, source, script_details, origin_options,
+ NOT_NATIVES_CODE);
streaming_data->parser->UpdateStatistics(isolate, script);
streaming_data->parser->HandleSourceURLComments(isolate, script);
@@ -1933,7 +1891,7 @@ bool Compiler::FinalizeCompilationJob(UnoptimizedCompilationJob* raw_job,
void Compiler::PostInstantiation(Handle<JSFunction> function,
PretenureFlag pretenure) {
- Handle<SharedFunctionInfo> shared(function->shared());
+ Handle<SharedFunctionInfo> shared(function->shared(), function->GetIsolate());
if (FLAG_always_opt && shared->allows_lazy_compilation() &&
!shared->optimization_disabled() && !shared->HasAsmWasmData() &&
@@ -1962,8 +1920,9 @@ void Compiler::PostInstantiation(Handle<JSFunction> function,
if (shared->is_toplevel() || shared->is_wrapped()) {
// If it's a top-level script, report compilation to the debugger.
- Handle<Script> script(handle(Script::cast(shared->script())));
- script->GetIsolate()->debug()->OnAfterCompile(script);
+ Handle<Script> script(
+ handle(Script::cast(shared->script()), function->GetIsolate()));
+ function->GetIsolate()->debug()->OnAfterCompile(script);
}
}