Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(767)

Unified Diff: src/mark-compact.cc

Issue 12224035: Generalize map dependent codes array to allow multiple dependency groups. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/lithium.cc ('k') | src/objects.h » ('j') | src/objects.h » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/mark-compact.cc
diff --git a/src/mark-compact.cc b/src/mark-compact.cc
index 869b318f547572257b66beb0df92c9e32b2ed814..32516845dfdef73a30032fdf179127097a71ca52 100644
--- a/src/mark-compact.cc
+++ b/src/mark-compact.cc
@@ -2369,7 +2369,9 @@ void MarkCompactCollector::ClearNonLiveMapTransitions(Map* map,
void MarkCompactCollector::ClearAndDeoptimizeDependentCodes(Map* map) {
AssertNoAllocation no_allocation_scope;
DependentCodes* codes = map->dependent_codes();
- int number_of_codes = codes->number_of_codes();
+ DependentCodes::GroupStartIndexes starts;
+ codes->ComputeGroupStartIndexes(starts);
+ int number_of_codes = starts[DependentCodes::kGroupCount];
if (number_of_codes == 0) return;
for (int i = 0; i < number_of_codes; i++) {
Code* code = codes->code_at(i);
@@ -2385,24 +2387,33 @@ void MarkCompactCollector::ClearAndDeoptimizeDependentCodes(Map* map) {
void MarkCompactCollector::ClearNonLiveDependentCodes(Map* map) {
AssertNoAllocation no_allocation_scope;
DependentCodes* codes = map->dependent_codes();
- int number_of_codes = codes->number_of_codes();
+ DependentCodes::GroupStartIndexes starts;
+ codes->ComputeGroupStartIndexes(starts);
+ int number_of_codes = starts[DependentCodes::kGroupCount];
if (number_of_codes == 0) return;
int new_number_of_codes = 0;
- for (int i = 0; i < number_of_codes; i++) {
- Code* code = codes->code_at(i);
- if (IsMarked(code) && !code->marked_for_deoptimization()) {
- if (new_number_of_codes != i) {
- codes->set_code_at(new_number_of_codes, code);
+ // Go through all groups, remove dead codes and compact.
+ for (int g = 0; g < DependentCodes::kGroupCount; g++) {
+ int group_number_of_codes = 0;
+ for (int i = starts[g]; i < starts[g + 1]; i++) {
+ Code* code = codes->code_at(i);
+ if (IsMarked(code) && !code->marked_for_deoptimization()) {
+ if (new_number_of_codes + group_number_of_codes != i) {
+ codes->set_code_at(new_number_of_codes + group_number_of_codes, code);
+ }
+ Object** slot = codes->code_slot_at(new_number_of_codes +
+ group_number_of_codes);
+ RecordSlot(slot, slot, code);
+ group_number_of_codes++;
}
- Object** slot = codes->code_slot_at(new_number_of_codes);
- RecordSlot(slot, slot, code);
- new_number_of_codes++;
}
+ codes->set_number_of_codes(static_cast<DependentCodes::DependencyGroup>(g),
+ group_number_of_codes);
+ new_number_of_codes += group_number_of_codes;
}
for (int i = new_number_of_codes; i < number_of_codes; i++) {
codes->clear_code_at(i);
}
- codes->set_number_of_codes(new_number_of_codes);
}
« no previous file with comments | « src/lithium.cc ('k') | src/objects.h » ('j') | src/objects.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698