Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index 0d9c2787b7ecf9e85757d4c9ad9975d7579acb22..4553f2e1075b86c4de3a0717222306949323015b 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -87,7 +87,7 @@ |
// called when cast as a CompilationInfo. |
virtual ~CompilationInfoWithZone() { |
DisableFutureOptimization(); |
- dependencies()->Rollback(); |
+ RollbackDependencies(); |
delete parse_info_; |
parse_info_ = nullptr; |
} |
@@ -143,7 +143,6 @@ |
osr_ast_id_(BailoutId::None()), |
zone_(zone), |
deferred_handles_(nullptr), |
- dependencies_(isolate, zone), |
bailout_reason_(kNoReason), |
prologue_offset_(Code::kPrologueOffsetNotSet), |
no_frame_ranges_(isolate->cpu_profiler()->is_profiling() |
@@ -154,7 +153,10 @@ |
opt_count_(has_shared_info() ? shared_info()->opt_count() : 0), |
parameter_count_(0), |
optimization_id_(-1), |
- osr_expr_stack_height_(0) {} |
+ aborted_due_to_dependency_change_(false), |
+ osr_expr_stack_height_(0) { |
+ std::fill_n(dependencies_, DependentCode::kGroupCount, nullptr); |
+} |
CompilationInfo::~CompilationInfo() { |
@@ -164,8 +166,57 @@ |
#ifdef DEBUG |
// Check that no dependent maps have been added or added dependent maps have |
// been rolled back or committed. |
- DCHECK(dependencies()->IsEmpty()); |
+ for (int i = 0; i < DependentCode::kGroupCount; i++) { |
+ DCHECK(!dependencies_[i]); |
+ } |
#endif // DEBUG |
+} |
+ |
+ |
+void CompilationInfo::CommitDependencies(Handle<Code> code) { |
+ bool has_dependencies = false; |
+ for (int i = 0; i < DependentCode::kGroupCount; i++) { |
+ has_dependencies |= |
+ dependencies_[i] != NULL && dependencies_[i]->length() > 0; |
+ } |
+ // Avoid creating a weak cell for code with no dependencies. |
+ if (!has_dependencies) return; |
+ |
+ AllowDeferredHandleDereference get_object_wrapper; |
+ WeakCell* cell = *Code::WeakCellFor(code); |
+ for (int i = 0; i < DependentCode::kGroupCount; i++) { |
+ ZoneList<Handle<HeapObject> >* group_objects = dependencies_[i]; |
+ if (group_objects == NULL) continue; |
+ DCHECK(!object_wrapper_.is_null()); |
+ for (int j = 0; j < group_objects->length(); j++) { |
+ DependentCode::DependencyGroup group = |
+ static_cast<DependentCode::DependencyGroup>(i); |
+ Foreign* info = *object_wrapper(); |
+ DependentCode* dependent_code = |
+ DependentCode::ForObject(group_objects->at(j), group); |
+ dependent_code->UpdateToFinishedCode(group, info, cell); |
+ } |
+ dependencies_[i] = NULL; // Zone-allocated, no need to delete. |
+ } |
+} |
+ |
+ |
+void CompilationInfo::RollbackDependencies() { |
+ AllowDeferredHandleDereference get_object_wrapper; |
+ // Unregister from all dependent maps if not yet committed. |
+ for (int i = 0; i < DependentCode::kGroupCount; i++) { |
+ ZoneList<Handle<HeapObject> >* group_objects = dependencies_[i]; |
+ if (group_objects == NULL) continue; |
+ for (int j = 0; j < group_objects->length(); j++) { |
+ DependentCode::DependencyGroup group = |
+ static_cast<DependentCode::DependencyGroup>(i); |
+ Foreign* info = *object_wrapper(); |
+ DependentCode* dependent_code = |
+ DependentCode::ForObject(group_objects->at(j), group); |
+ dependent_code->RemoveCompilationInfo(group, info); |
+ } |
+ dependencies_[i] = NULL; // Zone-allocated, no need to delete. |
+ } |
} |
@@ -442,7 +493,7 @@ |
if (graph_ == NULL) return SetLastStatus(BAILED_OUT); |
- if (info()->dependencies()->HasAborted()) { |
+ if (info()->HasAbortedDueToDependencyChange()) { |
// Dependency has changed during graph creation. Let's try again later. |
return RetryOptimization(kBailedOutDueToDependencyChange); |
} |
@@ -490,7 +541,7 @@ |
return last_status(); |
} |
- DCHECK(!info()->dependencies()->HasAborted()); |
+ DCHECK(!info()->HasAbortedDueToDependencyChange()); |
DisallowCodeDependencyChange no_dependency_change; |
DisallowJavascriptExecution no_js(isolate()); |
{ // Scope for timer. |
@@ -1471,7 +1522,7 @@ |
if (job->last_status() == OptimizedCompileJob::SUCCEEDED) { |
if (shared->optimization_disabled()) { |
job->RetryOptimization(kOptimizationDisabled); |
- } else if (info->dependencies()->HasAborted()) { |
+ } else if (info->HasAbortedDueToDependencyChange()) { |
job->RetryOptimization(kBailedOutDueToDependencyChange); |
} else if (isolate->debug()->has_break_points()) { |
job->RetryOptimization(kDebuggerHasBreakPoints); |