Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 6512c607799dd34fd71e69aa8e656681ff3f5e42..bdd0818fceafcceedc155b88b92ad2f8e8c6aa7e 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -11091,6 +11091,24 @@ void Map::ZapPrototypeTransitions() { |
} |
+void Map::AddDependentCompilationInfo(DependentCode::DependencyGroup group, |
+ CompilationInfo* info) { |
+ Handle<DependentCode> dep(dependent_code()); |
+ Handle<DependentCode> codes = |
+ DependentCode::Insert(dep, group, info->object_wrapper()); |
+ if (*codes != dependent_code()) set_dependent_code(*codes); |
+ info->dependent_maps(group)->Add(Handle<Map>(this), info->zone()); |
+} |
+ |
+ |
+void Map::AddDependentCode(DependentCode::DependencyGroup group, |
+ Handle<Code> code) { |
+ Handle<DependentCode> codes = DependentCode::Insert( |
+ Handle<DependentCode>(dependent_code()), group, code); |
+ if (*codes != dependent_code()) set_dependent_code(*codes); |
+} |
+ |
+ |
DependentCode::GroupStartIndexes::GroupStartIndexes(DependentCode* entries) { |
Recompute(entries); |
} |
@@ -11107,13 +11125,13 @@ void DependentCode::GroupStartIndexes::Recompute(DependentCode* entries) { |
Handle<DependentCode> DependentCode::Insert(Handle<DependentCode> entries, |
DependencyGroup group, |
- Handle<Code> value) { |
+ Handle<Object> object) { |
GroupStartIndexes starts(*entries); |
int start = starts.at(group); |
int end = starts.at(group + 1); |
int number_of_entries = starts.number_of_entries(); |
- if (start < end && entries->code_at(end - 1) == *value) { |
- // Do not append the code if it is already in the array. |
+ if (start < end && entries->object_at(end - 1) == *object) { |
+ // Do not append the compilation info if it is already in the array. |
// It is sufficient to just check only the last element because |
// we process embedded maps of an optimized code in one batch. |
return entries; |
@@ -11130,7 +11148,7 @@ Handle<DependentCode> DependentCode::Insert(Handle<DependentCode> entries, |
end = starts.at(group + 1); |
number_of_entries = starts.number_of_entries(); |
for (int i = 0; i < number_of_entries; i++) { |
- entries->clear_code_at(i); |
+ entries->clear_at(i); |
} |
// If the old fixed array was empty, we need to reset counters of the |
// new array. |
@@ -11142,17 +11160,79 @@ Handle<DependentCode> DependentCode::Insert(Handle<DependentCode> entries, |
entries = new_entries; |
} |
entries->ExtendGroup(group); |
- entries->set_code_at(end, *value); |
+ entries->set_object_at(end, *object); |
entries->set_number_of_entries(group, end + 1 - start); |
return entries; |
} |
+void DependentCode::UpdateToFinishedCode(DependencyGroup group, |
+ CompilationInfo* info, |
+ Code* code) { |
+ DisallowHeapAllocation no_gc; |
+ AllowDeferredHandleDereference get_object_wrapper; |
+ Foreign* info_wrapper = *info->object_wrapper(); |
+ GroupStartIndexes starts(this); |
+ int start = starts.at(group); |
+ int end = starts.at(group + 1); |
+ for (int i = start; i < end; i++) { |
+ if (object_at(i) == info_wrapper) { |
+ set_object_at(i, code); |
+ break; |
+ } |
+ } |
+ |
+#ifdef DEBUG |
+ for (int i = start; i < end; i++) { |
+ ASSERT(is_code_at(i) || compilation_info_at(i) != info); |
+ } |
+#endif |
+} |
+ |
+ |
+void DependentCode::RemoveCompilationInfo(DependentCode::DependencyGroup group, |
+ CompilationInfo* info) { |
+ DisallowHeapAllocation no_allocation; |
+ AllowDeferredHandleDereference get_object_wrapper; |
+ Foreign* info_wrapper = *info->object_wrapper(); |
+ GroupStartIndexes starts(this); |
+ int start = starts.at(group); |
+ int end = starts.at(group + 1); |
+ // Find compilation info wrapper. |
+ int info_pos = -1; |
+ for (int i = start; i < end; i++) { |
+ if (object_at(i) == info_wrapper) { |
+ info_pos = i; |
+ break; |
+ } |
+ } |
+ if (info_pos == -1) return; // Not found. |
+ int gap = info_pos; |
+ // Use the last of each group to fill the gap in the previous group. |
+ for (int i = group; i < kGroupCount; i++) { |
+ int last_of_group = starts.at(i + 1) - 1; |
+ ASSERT(last_of_group >= gap); |
+ if (last_of_group == gap) continue; |
+ copy(last_of_group, gap); |
+ gap = last_of_group; |
+ } |
+ ASSERT(gap == starts.number_of_entries() - 1); |
+ clear_at(gap); // Clear last gap. |
+ set_number_of_entries(group, end - start - 1); |
+ |
+#ifdef DEBUG |
+ for (int i = start; i < end - 1; i++) { |
+ ASSERT(is_code_at(i) || compilation_info_at(i) != info); |
+ } |
+#endif |
+} |
+ |
+ |
bool DependentCode::Contains(DependencyGroup group, Code* code) { |
GroupStartIndexes starts(this); |
- int number_of_entries = starts.at(kGroupCount); |
+ int number_of_entries = starts.number_of_entries(); |
for (int i = 0; i < number_of_entries; i++) { |
- if (code_at(i) == code) return true; |
+ if (object_at(i) == code) return true; |
} |
return false; |
} |
@@ -11173,20 +11253,25 @@ void DependentCode::DeoptimizeDependentCodeGroup( |
DependentCode::GroupStartIndexes starts(this); |
int start = starts.at(group); |
int end = starts.at(group + 1); |
- int number_of_entries = starts.at(DependentCode::kGroupCount); |
+ int code_entries = starts.number_of_entries(); |
if (start == end) return; |
for (int i = start; i < end; i++) { |
- Code* code = code_at(i); |
- code->set_marked_for_deoptimization(true); |
+ if (is_code_at(i)) { |
+ Code* code = code_at(i); |
+ code->set_marked_for_deoptimization(true); |
+ } else { |
+ CompilationInfo* info = compilation_info_at(i); |
+ info->AbortDueToDependentMap(); |
+ } |
} |
// Compact the array by moving all subsequent groups to fill in the new holes. |
- for (int src = end, dst = start; src < number_of_entries; src++, dst++) { |
- set_code_at(dst, code_at(src)); |
+ for (int src = end, dst = start; src < code_entries; src++, dst++) { |
+ copy(src, dst); |
} |
// Now the holes are at the end of the array, zap them for heap-verifier. |
int removed = end - start; |
- for (int i = number_of_entries - removed; i < number_of_entries; i++) { |
- clear_code_at(i); |
+ for (int i = code_entries - removed; i < code_entries; i++) { |
+ clear_at(i); |
} |
set_number_of_entries(group, 0); |
DeoptimizeDependentCodeFilter filter; |