Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index f3584d5017c0cda9c6f0f0db532b52780c55b116..96edf2d3b92478545674cb920dc2e4dde18ee9da 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -2,10 +2,10 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "src/v8.h" |
- |
#include "src/compiler.h" |
+#include <algorithm> |
+ |
#include "src/ast-numbering.h" |
#include "src/bootstrapper.h" |
#include "src/codegen.h" |
@@ -81,57 +81,8 @@ bool CompilationInfo::has_shared_info() const { |
CompilationInfo::CompilationInfo(ParseInfo* parse_info) |
- : parse_info_(parse_info), |
- flags_(0), |
- osr_ast_id_(BailoutId::None()), |
- parameter_count_(0), |
- optimization_id_(-1), |
- aborted_due_to_dependency_change_(false), |
- osr_expr_stack_height_(0) { |
- Initialize(parse_info->isolate(), BASE, parse_info->zone()); |
-} |
- |
- |
-CompilationInfo::CompilationInfo(CodeStub* stub, Isolate* isolate, Zone* zone) |
- : parse_info_(nullptr), |
- flags_(0), |
- osr_ast_id_(BailoutId::None()), |
- parameter_count_(0), |
- optimization_id_(-1), |
- aborted_due_to_dependency_change_(false), |
- osr_expr_stack_height_(0) { |
- Initialize(isolate, STUB, zone); |
- code_stub_ = stub; |
-} |
- |
- |
-void CompilationInfo::Initialize(Isolate* isolate, |
- Mode mode, |
- Zone* zone) { |
- isolate_ = isolate; |
- zone_ = zone; |
- deferred_handles_ = NULL; |
- code_stub_ = NULL; |
- prologue_offset_ = Code::kPrologueOffsetNotSet; |
- opt_count_ = has_shared_info() ? shared_info()->opt_count() : 0; |
- no_frame_ranges_ = isolate->cpu_profiler()->is_profiling() |
- ? new List<OffsetRange>(2) : NULL; |
- if (FLAG_hydrogen_track_positions) { |
- inlined_function_infos_ = new std::vector<InlinedFunctionInfo>(); |
- track_positions_ = true; |
- } else { |
- inlined_function_infos_ = NULL; |
- track_positions_ = false; |
- } |
- |
- for (int i = 0; i < DependentCode::kGroupCount; i++) { |
- dependencies_[i] = NULL; |
- } |
- if (mode == STUB) { |
- mode_ = STUB; |
- return; |
- } |
- mode_ = mode; |
+ : CompilationInfo(parse_info, nullptr, BASE, parse_info->isolate(), |
+ parse_info->zone()) { |
// Compiling for the snapshot typically results in different code than |
// compiling later on. This means that code recompiled with deoptimization |
// support won't be "equivalent" (as defined by SharedFunctionInfo:: |
@@ -147,22 +98,48 @@ void CompilationInfo::Initialize(Isolate* isolate, |
if (FLAG_turbo_splitting) MarkAsSplittingEnabled(); |
if (FLAG_turbo_types) MarkAsTypingEnabled(); |
- bailout_reason_ = kNoReason; |
- |
if (has_shared_info() && shared_info()->is_compiled()) { |
// We should initialize the CompilationInfo feedback vector from the |
// passed in shared info, rather than creating a new one. |
- feedback_vector_ = |
- Handle<TypeFeedbackVector>(shared_info()->feedback_vector(), isolate); |
+ feedback_vector_ = Handle<TypeFeedbackVector>( |
+ shared_info()->feedback_vector(), parse_info->isolate()); |
} |
} |
+CompilationInfo::CompilationInfo(CodeStub* stub, Isolate* isolate, Zone* zone) |
+ : CompilationInfo(nullptr, stub, STUB, isolate, zone) {} |
+ |
+ |
+CompilationInfo::CompilationInfo(ParseInfo* parse_info, CodeStub* code_stub, |
+ Mode mode, Isolate* isolate, Zone* zone) |
+ : parse_info_(parse_info), |
+ isolate_(isolate), |
+ flags_(0), |
+ code_stub_(code_stub), |
+ mode_(mode), |
+ osr_ast_id_(BailoutId::None()), |
+ zone_(zone), |
+ deferred_handles_(nullptr), |
+ bailout_reason_(kNoReason), |
+ prologue_offset_(Code::kPrologueOffsetNotSet), |
+ no_frame_ranges_(isolate->cpu_profiler()->is_profiling() |
+ ? new List<OffsetRange>(2) |
+ : nullptr), |
+ track_positions_(FLAG_hydrogen_track_positions), |
+ opt_count_(has_shared_info() ? shared_info()->opt_count() : 0), |
+ parameter_count_(0), |
+ optimization_id_(-1), |
+ aborted_due_to_dependency_change_(false), |
+ osr_expr_stack_height_(0) { |
+ std::fill_n(dependencies_, DependentCode::kGroupCount, nullptr); |
+} |
+ |
+ |
CompilationInfo::~CompilationInfo() { |
DisableFutureOptimization(); |
delete deferred_handles_; |
delete no_frame_ranges_; |
- delete inlined_function_infos_; |
#ifdef DEBUG |
// Check that no dependent maps have been added or added dependent maps have |
// been rolled back or committed. |
@@ -267,9 +244,8 @@ int CompilationInfo::TraceInlinedFunction(Handle<SharedFunctionInfo> shared, |
SourcePosition position, |
int parent_id) { |
DCHECK(track_positions_); |
- DCHECK(inlined_function_infos_); |
- int inline_id = static_cast<int>(inlined_function_infos_->size()); |
+ int inline_id = static_cast<int>(inlined_function_infos_.size()); |
InlinedFunctionInfo info(parent_id, position, UnboundScript::kNoScriptId, |
shared->start_position()); |
if (!shared->script()->IsUndefined()) { |
@@ -296,7 +272,7 @@ int CompilationInfo::TraceInlinedFunction(Handle<SharedFunctionInfo> shared, |
} |
} |
- inlined_function_infos_->push_back(info); |
+ inlined_function_infos_.push_back(info); |
if (FLAG_hydrogen_track_positions && inline_id != 0) { |
CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer()); |
@@ -312,9 +288,8 @@ int CompilationInfo::TraceInlinedFunction(Handle<SharedFunctionInfo> shared, |
void CompilationInfo::LogDeoptCallPosition(int pc_offset, int inlining_id) { |
if (!track_positions_ || IsStub()) return; |
- DCHECK_LT(static_cast<size_t>(inlining_id), inlined_function_infos_->size()); |
- inlined_function_infos_->at(inlining_id) |
- .deopt_pc_offsets.push_back(pc_offset); |
+ DCHECK_LT(static_cast<size_t>(inlining_id), inlined_function_infos_.size()); |
+ inlined_function_infos_.at(inlining_id).deopt_pc_offsets.push_back(pc_offset); |
} |
@@ -926,7 +901,9 @@ MaybeHandle<Code> Compiler::GetUnoptimizedCode( |
DCHECK(!shared->GetIsolate()->has_pending_exception()); |
DCHECK(!shared->is_compiled()); |
- CompilationInfoWithZone info(shared); |
+ Zone zone; |
+ ParseInfo parse_info(&zone, shared); |
+ CompilationInfo info(&parse_info); |
return GetUnoptimizedCodeCommon(&info); |
} |
@@ -953,10 +930,10 @@ bool Compiler::EnsureCompiled(Handle<JSFunction> function, |
bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) { |
DCHECK(info->function() != NULL); |
DCHECK(info->scope() != NULL); |
- if (!info->shared_info()->has_deoptimization_support()) { |
+ Handle<SharedFunctionInfo> shared = info->shared_info(); |
+ if (!shared->has_deoptimization_support()) { |
// TODO(titzer): just reuse the ParseInfo for the unoptimized compile. |
- Handle<SharedFunctionInfo> shared = info->shared_info(); |
- CompilationInfoWithZone unoptimized(shared); |
+ CompilationInfoWithZone unoptimized(info->closure()); |
// Note that we use the same AST that we will use for generating the |
// optimized code. |
ParseInfo* parse_info = unoptimized.parse_info(); |
@@ -1581,11 +1558,6 @@ CompilationInfoWithZone::CompilationInfoWithZone(Handle<JSFunction> function) |
: CompilationInfo(new ParseInfo(&zone_, function)) {} |
-CompilationInfoWithZone::CompilationInfoWithZone( |
- Handle<SharedFunctionInfo> shared_info) |
- : CompilationInfo(new ParseInfo(&zone_, shared_info)) {} |
- |
- |
CompilationInfoWithZone::~CompilationInfoWithZone() { |
DisableFutureOptimization(); |
RollbackDependencies(); |