Revision: 12689
Author: [email protected]
Date: Wed Oct 10 06:13:35 2012
Log: Transition ownership back if the descriptors were shared via
elements transitions.
BUG=
Review URL: https://chromiumcodereview.appspot.com/11091044
http://code.google.com/p/v8/source/detail?r=12689
Modified:
/branches/bleeding_edge/src/objects.cc
=======================================
--- /branches/bleeding_edge/src/objects.cc Wed Oct 10 05:31:50 2012
+++ /branches/bleeding_edge/src/objects.cc Wed Oct 10 06:13:35 2012
@@ -7429,15 +7429,6 @@
fprintf(file, "%c", Get(i));
}
}
-
-
-// Clear a possible back pointer in case the transition leads to a dead
map.
-// Return true in case a back pointer has been cleared and false otherwise.
-static bool ClearBackPointer(Heap* heap, Map* target) {
- if (Marking::MarkBitFrom(target).Get()) return false;
- target->SetBackPointer(heap->undefined_value(), SKIP_WRITE_BARRIER);
- return true;
-}
static void TrimEnumCache(Heap* heap, Map* map, DescriptorArray*
descriptors) {
@@ -7483,6 +7474,21 @@
if (descriptors->HasEnumCache()) TrimEnumCache(heap, map, descriptors);
descriptors->Sort();
}
+
+
+// Clear a possible back pointer in case the transition leads to a dead
map.
+// Return true in case a back pointer has been cleared and false otherwise.
+static bool ClearBackPointer(Heap* heap,
+ Map* target,
+ DescriptorArray* descriptors,
+ bool* descriptors_owner_died) {
+ if (Marking::MarkBitFrom(target).Get()) return false;
+ if (target->instance_descriptors() == descriptors) {
+ *descriptors_owner_died = true;
+ }
+ target->SetBackPointer(heap->undefined_value(), SKIP_WRITE_BARRIER);
+ return true;
+}
// TODO(mstarzinger): This method should be moved into
MarkCompactCollector,
@@ -7505,15 +7511,7 @@
// Compact all live descriptors to the left.
for (int i = 0; i < t->number_of_transitions(); ++i) {
Map* target = t->GetTarget(i);
- if (ClearBackPointer(heap, target)) {
- ASSERT(!Marking::IsGrey(Marking::MarkBitFrom(target)));
- DescriptorArray* target_descriptors = target->instance_descriptors();
- if ((target_descriptors->number_of_descriptors() == 0 &&
- target->NumberOfOwnDescriptors() > 0) ||
- target_descriptors == descriptors) {
- descriptors_owner_died = true;
- }
- } else {
+ if (!ClearBackPointer(heap, target, descriptors,
&descriptors_owner_died)) {
if (i != transition_index) {
String* key = t->GetKey(i);
t->SetKey(transition_index, key);
@@ -7527,10 +7525,10 @@
}
if (t->HasElementsTransition() &&
- ClearBackPointer(heap, t->elements_transition())) {
- if (t->elements_transition()->instance_descriptors() == descriptors) {
- descriptors_owner_died = true;
- }
+ ClearBackPointer(heap,
+ t->elements_transition(),
+ descriptors,
+ &descriptors_owner_died)) {
t->ClearElementsTransition();
} else {
// If there are no transitions to be cleared, return.
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev