Reviewers: Michael Starzinger,
Description:
ClearNonLiveTransitions indepedent of ContentArray
Please review this at https://chromiumcodereview.appspot.com/10387231/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/objects-inl.h
M src/objects.h
M src/objects.cc
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index
6e7b116283c4f1b91bc1f935ce7fc3d2ce89ae4f..410dc191b2bd9493b592c148684d9e2366424ab5
100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -1938,12 +1938,23 @@ Object* DescriptorArray::GetValue(int
descriptor_number) {
return GetContentArray()->get(ToValueIndex(descriptor_number));
}
+void DescriptorArray::SetNullValueUnchecked(int descriptor_number, Heap*
heap) {
+ ASSERT(descriptor_number < number_of_descriptors());
+ ASSERT(!HEAP->InNewSpace(heap->null_value()));
+ GetContentArray()->set_null_unchecked(heap,
ToValueIndex(descriptor_number));
+}
+
PropertyDetails DescriptorArray::GetDetails(int descriptor_number) {
ASSERT(descriptor_number < number_of_descriptors());
Object* details =
GetContentArray()->get(ToDetailsIndex(descriptor_number));
return PropertyDetails(Smi::cast(details));
}
+void DescriptorArray::SetDetailsUnchecked(int descriptor_number, Smi*
value) {
+ ASSERT(descriptor_number < number_of_descriptors());
+ GetContentArray()->set_unchecked(ToDetailsIndex(descriptor_number),
value);
+}
+
FixedArray* DescriptorArray::RawGetContentArray() {
Object* array = this->get(DescriptorArray::kContentArrayIndex);
return static_cast<FixedArray*>(array);
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
ca290780fca6aa1f85ffdb8c1e1fbb10b5054be4..312c50a595b57ca880957261f83919774913dac8
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -7211,23 +7211,20 @@ void Map::ClearNonLiveTransitions(Heap* heap) {
if (d->IsEmpty()) return;
Smi* NullDescriptorDetails =
PropertyDetails(NONE, NULL_DESCRIPTOR).AsSmi();
- FixedArray* contents = FixedArray::cast(
- d->get(DescriptorArray::kContentArrayIndex));
- ASSERT(contents->length() >= 2);
- for (int i = 0; i < contents->length(); i += 2) {
+ for (int i = 0; i < d->number_of_descriptors(); ++i) {
// If the pair (value, details) is a map transition, check if the
target is
// live. If not, null the descriptor. Also drop the back pointer for
that
// map transition, so that this map is not reached again by following
a back
// pointer from that non-live map.
bool keep_entry = false;
- PropertyDetails details(Smi::cast(contents->get(i + 1)));
+ PropertyDetails details(d->GetDetails(i));
switch (details.type()) {
case MAP_TRANSITION:
case CONSTANT_TRANSITION:
- ClearBackPointer(heap, contents->get(i), &keep_entry);
+ ClearBackPointer(heap, d->GetValue(i), &keep_entry);
break;
case ELEMENTS_TRANSITION: {
- Object* object = contents->get(i);
+ Object* object = d->GetValue(i);
if (object->IsMap()) {
ClearBackPointer(heap, object, &keep_entry);
} else {
@@ -7241,7 +7238,7 @@ void Map::ClearNonLiveTransitions(Heap* heap) {
break;
}
case CALLBACKS: {
- Object* object = contents->get(i);
+ Object* object = d->GetValue(i);
if (object->IsAccessorPair()) {
AccessorPair* accessors = AccessorPair::cast(object);
if (ClearBackPointer(heap, accessors->getter(), &keep_entry)) {
@@ -7268,8 +7265,8 @@ void Map::ClearNonLiveTransitions(Heap* heap) {
// What we *really* want to do here is removing this entry completely,
but
// for technical reasons we can't do this, so we zero it out instead.
if (!keep_entry) {
- contents->set_unchecked(i + 1, NullDescriptorDetails);
- contents->set_null_unchecked(heap, i);
+ d->SetDetailsUnchecked(i, NullDescriptorDetails);
+ d->SetNullValueUnchecked(i, heap);
}
}
}
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index
c9a47c599c6ece3bade6c02acd0c50c39feebbf9..a7207ab4282fcaf9e8f2fe8d63d578ca806e44f3
100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -2475,7 +2475,9 @@ class DescriptorArray: public FixedArray {
inline String* GetKey(int descriptor_number);
inline Object* GetValue(int descriptor_number);
inline Object** GetValueSlot(int descriptor_number);
+ inline void SetNullValueUnchecked(int descriptor_number, Heap* heap);
inline PropertyDetails GetDetails(int descriptor_number);
+ inline void SetDetailsUnchecked(int descriptor_number, Smi* value);
inline Object* RawGetValue(int descriptor_number);
inline PropertyDetails RawGetDetails(int descriptor_number);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev