| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/base/atomicops.h" | 7 #include "src/base/atomicops.h" |
| 8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" |
| (...skipping 2450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2461 descriptors == dead_transition->instance_descriptors() && | 2461 descriptors == dead_transition->instance_descriptors() && |
| 2462 number_of_own_descriptors > 0) { | 2462 number_of_own_descriptors > 0) { |
| 2463 TrimDescriptorArray(map, descriptors, number_of_own_descriptors); | 2463 TrimDescriptorArray(map, descriptors, number_of_own_descriptors); |
| 2464 DCHECK(descriptors->number_of_descriptors() == number_of_own_descriptors); | 2464 DCHECK(descriptors->number_of_descriptors() == number_of_own_descriptors); |
| 2465 map->set_owns_descriptors(true); | 2465 map->set_owns_descriptors(true); |
| 2466 return; | 2466 return; |
| 2467 } | 2467 } |
| 2468 | 2468 |
| 2469 int transition_index = 0; | 2469 int transition_index = 0; |
| 2470 | 2470 |
| 2471 // This flag will be cleared if we find the live owner in the loop below. | 2471 bool descriptors_owner_died = false; |
| 2472 bool descriptors_owner_died = true; | |
| 2473 | 2472 |
| 2474 // Compact all live descriptors to the left. | 2473 // Compact all live descriptors to the left. |
| 2475 if (TransitionArray::IsFullTransitionArray(transitions)) { | 2474 for (int i = 0; i < num_transitions; ++i) { |
| 2476 for (int i = 0; i < num_transitions; ++i) { | 2475 Map* target = TransitionArray::GetTarget(transitions, i); |
| 2477 WeakCell* target_cell = | 2476 if (ClearMapBackPointer(target)) { |
| 2478 TransitionArray::cast(transitions)->GetTargetCell(i); | 2477 if (target->instance_descriptors() == descriptors) { |
| 2479 if (!target_cell->cleared()) { | 2478 descriptors_owner_died = true; |
| 2480 if (Map::cast(target_cell->value())->instance_descriptors() == | |
| 2481 descriptors) { | |
| 2482 descriptors_owner_died = false; | |
| 2483 } | |
| 2484 if (i != transition_index) { | |
| 2485 TransitionArray* t = TransitionArray::cast(transitions); | |
| 2486 Name* key = t->GetKey(i); | |
| 2487 t->SetKey(transition_index, key); | |
| 2488 Object** key_slot = t->GetKeySlot(transition_index); | |
| 2489 RecordSlot(key_slot, key_slot, key); | |
| 2490 WeakCell* target_cell = t->GetTargetCell(i); | |
| 2491 t->SetTargetCell(transition_index, target_cell); | |
| 2492 Object** target_slot = t->GetTargetSlot(transition_index); | |
| 2493 RecordSlot(target_slot, target_slot, target_cell); | |
| 2494 } | |
| 2495 transition_index++; | |
| 2496 } | 2479 } |
| 2497 } | 2480 } else { |
| 2498 } else if (transitions->IsWeakCell()) { | 2481 if (i != transition_index) { |
| 2499 WeakCell* target_cell = WeakCell::cast(transitions); | 2482 DCHECK(TransitionArray::IsFullTransitionArray(transitions)); |
| 2500 if (!target_cell->cleared()) { | 2483 TransitionArray* t = TransitionArray::cast(transitions); |
| 2501 if (Map::cast(target_cell->value())->instance_descriptors() == | 2484 Name* key = t->GetKey(i); |
| 2502 descriptors) { | 2485 t->SetKey(transition_index, key); |
| 2503 descriptors_owner_died = false; | 2486 Object** key_slot = t->GetKeySlot(transition_index); |
| 2487 RecordSlot(key_slot, key_slot, key); |
| 2488 // Target slots do not need to be recorded since maps are not compacted. |
| 2489 t->SetTarget(transition_index, t->GetTarget(i)); |
| 2504 } | 2490 } |
| 2505 transition_index++; | 2491 transition_index++; |
| 2506 } | 2492 } |
| 2507 } | 2493 } |
| 2508 | 2494 |
| 2509 // If there are no transitions to be cleared, return. | 2495 // If there are no transitions to be cleared, return. |
| 2510 // TODO(verwaest) Should be an assert, otherwise back pointers are not | 2496 // TODO(verwaest) Should be an assert, otherwise back pointers are not |
| 2511 // properly cleared. | 2497 // properly cleared. |
| 2512 if (transition_index == num_transitions) return; | 2498 if (transition_index == num_transitions) return; |
| 2513 | 2499 |
| (...skipping 2236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4750 SlotsBuffer* buffer = *buffer_address; | 4736 SlotsBuffer* buffer = *buffer_address; |
| 4751 while (buffer != NULL) { | 4737 while (buffer != NULL) { |
| 4752 SlotsBuffer* next_buffer = buffer->next(); | 4738 SlotsBuffer* next_buffer = buffer->next(); |
| 4753 DeallocateBuffer(buffer); | 4739 DeallocateBuffer(buffer); |
| 4754 buffer = next_buffer; | 4740 buffer = next_buffer; |
| 4755 } | 4741 } |
| 4756 *buffer_address = NULL; | 4742 *buffer_address = NULL; |
| 4757 } | 4743 } |
| 4758 } // namespace internal | 4744 } // namespace internal |
| 4759 } // namespace v8 | 4745 } // namespace v8 |
| OLD | NEW |