ClearNonLiveTransitions indepedent of ContentArray
Review URL: https://chromiumcodereview.appspot.com/10387231 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@11693 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
c8a99c221b
commit
dd54b0acf7
@ -1943,6 +1943,12 @@ Object* DescriptorArray::GetValue(int descriptor_number) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DescriptorArray::SetNullValueUnchecked(int descriptor_number, Heap* heap) {
|
||||||
|
ASSERT(descriptor_number < number_of_descriptors());
|
||||||
|
GetContentArray()->set_null_unchecked(heap, ToValueIndex(descriptor_number));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
PropertyDetails DescriptorArray::GetDetails(int descriptor_number) {
|
PropertyDetails DescriptorArray::GetDetails(int descriptor_number) {
|
||||||
ASSERT(descriptor_number < number_of_descriptors());
|
ASSERT(descriptor_number < number_of_descriptors());
|
||||||
Object* details = GetContentArray()->get(ToDetailsIndex(descriptor_number));
|
Object* details = GetContentArray()->get(ToDetailsIndex(descriptor_number));
|
||||||
@ -1950,6 +1956,12 @@ PropertyDetails DescriptorArray::GetDetails(int descriptor_number) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DescriptorArray::SetDetailsUnchecked(int descriptor_number, Smi* value) {
|
||||||
|
ASSERT(descriptor_number < number_of_descriptors());
|
||||||
|
GetContentArray()->set_unchecked(ToDetailsIndex(descriptor_number), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
PropertyType DescriptorArray::GetType(int descriptor_number) {
|
PropertyType DescriptorArray::GetType(int descriptor_number) {
|
||||||
return GetDetails(descriptor_number).type();
|
return GetDetails(descriptor_number).type();
|
||||||
}
|
}
|
||||||
|
@ -7440,23 +7440,20 @@ void Map::ClearNonLiveTransitions(Heap* heap) {
|
|||||||
if (d->IsEmpty()) return;
|
if (d->IsEmpty()) return;
|
||||||
Smi* NullDescriptorDetails =
|
Smi* NullDescriptorDetails =
|
||||||
PropertyDetails(NONE, NULL_DESCRIPTOR).AsSmi();
|
PropertyDetails(NONE, NULL_DESCRIPTOR).AsSmi();
|
||||||
FixedArray* contents = FixedArray::cast(
|
for (int i = 0; i < d->number_of_descriptors(); ++i) {
|
||||||
d->get(DescriptorArray::kContentArrayIndex));
|
|
||||||
ASSERT(contents->length() >= 2);
|
|
||||||
for (int i = 0; i < contents->length(); i += 2) {
|
|
||||||
// If the pair (value, details) is a map transition, check if the target is
|
// 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
|
// 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
|
// map transition, so that this map is not reached again by following a back
|
||||||
// pointer from that non-live map.
|
// pointer from that non-live map.
|
||||||
bool keep_entry = false;
|
bool keep_entry = false;
|
||||||
PropertyDetails details(Smi::cast(contents->get(i + 1)));
|
PropertyDetails details(d->GetDetails(i));
|
||||||
switch (details.type()) {
|
switch (details.type()) {
|
||||||
case MAP_TRANSITION:
|
case MAP_TRANSITION:
|
||||||
case CONSTANT_TRANSITION:
|
case CONSTANT_TRANSITION:
|
||||||
ClearBackPointer(heap, contents->get(i), &keep_entry);
|
ClearBackPointer(heap, d->GetValue(i), &keep_entry);
|
||||||
break;
|
break;
|
||||||
case ELEMENTS_TRANSITION: {
|
case ELEMENTS_TRANSITION: {
|
||||||
Object* object = contents->get(i);
|
Object* object = d->GetValue(i);
|
||||||
if (object->IsMap()) {
|
if (object->IsMap()) {
|
||||||
ClearBackPointer(heap, object, &keep_entry);
|
ClearBackPointer(heap, object, &keep_entry);
|
||||||
} else {
|
} else {
|
||||||
@ -7470,7 +7467,7 @@ void Map::ClearNonLiveTransitions(Heap* heap) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CALLBACKS: {
|
case CALLBACKS: {
|
||||||
Object* object = contents->get(i);
|
Object* object = d->GetValue(i);
|
||||||
if (object->IsAccessorPair()) {
|
if (object->IsAccessorPair()) {
|
||||||
AccessorPair* accessors = AccessorPair::cast(object);
|
AccessorPair* accessors = AccessorPair::cast(object);
|
||||||
if (ClearBackPointer(heap, accessors->getter(), &keep_entry)) {
|
if (ClearBackPointer(heap, accessors->getter(), &keep_entry)) {
|
||||||
@ -7497,8 +7494,8 @@ void Map::ClearNonLiveTransitions(Heap* heap) {
|
|||||||
// What we *really* want to do here is removing this entry completely, but
|
// 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.
|
// for technical reasons we can't do this, so we zero it out instead.
|
||||||
if (!keep_entry) {
|
if (!keep_entry) {
|
||||||
contents->set_unchecked(i + 1, NullDescriptorDetails);
|
d->SetDetailsUnchecked(i, NullDescriptorDetails);
|
||||||
contents->set_null_unchecked(heap, i);
|
d->SetNullValueUnchecked(i, heap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2451,7 +2451,9 @@ class DescriptorArray: public FixedArray {
|
|||||||
inline String* GetKey(int descriptor_number);
|
inline String* GetKey(int descriptor_number);
|
||||||
inline Object* GetValue(int descriptor_number);
|
inline Object* GetValue(int descriptor_number);
|
||||||
inline Object** GetValueSlot(int descriptor_number);
|
inline Object** GetValueSlot(int descriptor_number);
|
||||||
|
inline void SetNullValueUnchecked(int descriptor_number, Heap* heap);
|
||||||
inline PropertyDetails GetDetails(int descriptor_number);
|
inline PropertyDetails GetDetails(int descriptor_number);
|
||||||
|
inline void SetDetailsUnchecked(int descriptor_number, Smi* value);
|
||||||
inline PropertyType GetType(int descriptor_number);
|
inline PropertyType GetType(int descriptor_number);
|
||||||
inline int GetFieldIndex(int descriptor_number);
|
inline int GetFieldIndex(int descriptor_number);
|
||||||
inline JSFunction* GetConstantFunction(int descriptor_number);
|
inline JSFunction* GetConstantFunction(int descriptor_number);
|
||||||
|
Loading…
Reference in New Issue
Block a user