OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 7412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7423 } | 7423 } |
7424 } | 7424 } |
7425 | 7425 |
7426 | 7426 |
7427 void Map::ClearNonLiveTransitions(Heap* heap) { | 7427 void Map::ClearNonLiveTransitions(Heap* heap) { |
7428 DescriptorArray* d = DescriptorArray::cast( | 7428 DescriptorArray* d = DescriptorArray::cast( |
7429 *RawField(this, Map::kInstanceDescriptorsOrBitField3Offset)); | 7429 *RawField(this, Map::kInstanceDescriptorsOrBitField3Offset)); |
7430 if (d->IsEmpty()) return; | 7430 if (d->IsEmpty()) return; |
7431 Smi* NullDescriptorDetails = | 7431 Smi* NullDescriptorDetails = |
7432 PropertyDetails(NONE, NULL_DESCRIPTOR).AsSmi(); | 7432 PropertyDetails(NONE, NULL_DESCRIPTOR).AsSmi(); |
7433 FixedArray* contents = FixedArray::cast( | 7433 for (int i = 0; i < d->number_of_descriptors(); ++i) { |
7434 d->get(DescriptorArray::kContentArrayIndex)); | |
7435 ASSERT(contents->length() >= 2); | |
7436 for (int i = 0; i < contents->length(); i += 2) { | |
7437 // If the pair (value, details) is a map transition, check if the target is | 7434 // If the pair (value, details) is a map transition, check if the target is |
7438 // live. If not, null the descriptor. Also drop the back pointer for that | 7435 // live. If not, null the descriptor. Also drop the back pointer for that |
7439 // map transition, so that this map is not reached again by following a back | 7436 // map transition, so that this map is not reached again by following a back |
7440 // pointer from that non-live map. | 7437 // pointer from that non-live map. |
7441 bool keep_entry = false; | 7438 bool keep_entry = false; |
7442 PropertyDetails details(Smi::cast(contents->get(i + 1))); | 7439 PropertyDetails details(d->GetDetails(i)); |
7443 switch (details.type()) { | 7440 switch (details.type()) { |
7444 case MAP_TRANSITION: | 7441 case MAP_TRANSITION: |
7445 case CONSTANT_TRANSITION: | 7442 case CONSTANT_TRANSITION: |
7446 ClearBackPointer(heap, contents->get(i), &keep_entry); | 7443 ClearBackPointer(heap, d->GetValue(i), &keep_entry); |
7447 break; | 7444 break; |
7448 case ELEMENTS_TRANSITION: { | 7445 case ELEMENTS_TRANSITION: { |
7449 Object* object = contents->get(i); | 7446 Object* object = d->GetValue(i); |
7450 if (object->IsMap()) { | 7447 if (object->IsMap()) { |
7451 ClearBackPointer(heap, object, &keep_entry); | 7448 ClearBackPointer(heap, object, &keep_entry); |
7452 } else { | 7449 } else { |
7453 FixedArray* array = FixedArray::cast(object); | 7450 FixedArray* array = FixedArray::cast(object); |
7454 for (int j = 0; j < array->length(); ++j) { | 7451 for (int j = 0; j < array->length(); ++j) { |
7455 if (ClearBackPointer(heap, array->get(j), &keep_entry)) { | 7452 if (ClearBackPointer(heap, array->get(j), &keep_entry)) { |
7456 array->set_undefined(j); | 7453 array->set_undefined(j); |
7457 } | 7454 } |
7458 } | 7455 } |
7459 } | 7456 } |
7460 break; | 7457 break; |
7461 } | 7458 } |
7462 case CALLBACKS: { | 7459 case CALLBACKS: { |
7463 Object* object = contents->get(i); | 7460 Object* object = d->GetValue(i); |
7464 if (object->IsAccessorPair()) { | 7461 if (object->IsAccessorPair()) { |
7465 AccessorPair* accessors = AccessorPair::cast(object); | 7462 AccessorPair* accessors = AccessorPair::cast(object); |
7466 if (ClearBackPointer(heap, accessors->getter(), &keep_entry)) { | 7463 if (ClearBackPointer(heap, accessors->getter(), &keep_entry)) { |
7467 accessors->set_getter(heap->the_hole_value()); | 7464 accessors->set_getter(heap->the_hole_value()); |
7468 } | 7465 } |
7469 if (ClearBackPointer(heap, accessors->setter(), &keep_entry)) { | 7466 if (ClearBackPointer(heap, accessors->setter(), &keep_entry)) { |
7470 accessors->set_setter(heap->the_hole_value()); | 7467 accessors->set_setter(heap->the_hole_value()); |
7471 } | 7468 } |
7472 } else { | 7469 } else { |
7473 keep_entry = true; | 7470 keep_entry = true; |
7474 } | 7471 } |
7475 break; | 7472 break; |
7476 } | 7473 } |
7477 case NORMAL: | 7474 case NORMAL: |
7478 case FIELD: | 7475 case FIELD: |
7479 case CONSTANT_FUNCTION: | 7476 case CONSTANT_FUNCTION: |
7480 case HANDLER: | 7477 case HANDLER: |
7481 case INTERCEPTOR: | 7478 case INTERCEPTOR: |
7482 case NULL_DESCRIPTOR: | 7479 case NULL_DESCRIPTOR: |
7483 keep_entry = true; | 7480 keep_entry = true; |
7484 break; | 7481 break; |
7485 } | 7482 } |
7486 // Make sure that an entry containing only dead transitions gets collected. | 7483 // Make sure that an entry containing only dead transitions gets collected. |
7487 // What we *really* want to do here is removing this entry completely, but | 7484 // What we *really* want to do here is removing this entry completely, but |
7488 // for technical reasons we can't do this, so we zero it out instead. | 7485 // for technical reasons we can't do this, so we zero it out instead. |
7489 if (!keep_entry) { | 7486 if (!keep_entry) { |
7490 contents->set_unchecked(i + 1, NullDescriptorDetails); | 7487 d->SetDetailsUnchecked(i, NullDescriptorDetails); |
7491 contents->set_null_unchecked(heap, i); | 7488 d->SetNullValueUnchecked(i, heap); |
7492 } | 7489 } |
7493 } | 7490 } |
7494 } | 7491 } |
7495 | 7492 |
7496 | 7493 |
7497 int Map::Hash() { | 7494 int Map::Hash() { |
7498 // For performance reasons we only hash the 3 most variable fields of a map: | 7495 // For performance reasons we only hash the 3 most variable fields of a map: |
7499 // constructor, prototype and bit_field2. | 7496 // constructor, prototype and bit_field2. |
7500 | 7497 |
7501 // Shift away the tag. | 7498 // Shift away the tag. |
(...skipping 5732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13234 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 13231 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
13235 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 13232 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
13236 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 13233 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
13237 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 13234 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
13238 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 13235 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
13239 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 13236 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
13240 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 13237 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
13241 } | 13238 } |
13242 | 13239 |
13243 } } // namespace v8::internal | 13240 } } // namespace v8::internal |
OLD | NEW |