Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/scavenger.h" | 5 #include "vm/scavenger.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 520 ASSERT(reference_set != NULL); | 520 ASSERT(reference_set != NULL); |
| 521 bool is_unreachable = true; | 521 bool is_unreachable = true; |
| 522 // Test each key object for reachability. If a key object is | 522 // Test each key object for reachability. If a key object is |
| 523 // reachable, all value objects should be scavenged. | 523 // reachable, all value objects should be scavenged. |
| 524 for (intptr_t k = 0; k < reference_set->num_keys(); ++k) { | 524 for (intptr_t k = 0; k < reference_set->num_keys(); ++k) { |
| 525 if (!IsUnreachable(reference_set->get_key(k))) { | 525 if (!IsUnreachable(reference_set->get_key(k))) { |
| 526 for (intptr_t v = 0; v < reference_set->num_values(); ++v) { | 526 for (intptr_t v = 0; v < reference_set->num_values(); ++v) { |
| 527 visitor->VisitPointer(reference_set->get_value(v)); | 527 visitor->VisitPointer(reference_set->get_value(v)); |
| 528 } | 528 } |
| 529 is_unreachable = false; | 529 is_unreachable = false; |
| 530 delete reference_set; | |
| 531 break; | 530 break; |
|
Ivan Posva
2014/04/17 23:47:44
ditto
siva
2014/04/21 18:04:14
Done.
| |
| 532 } | 531 } |
| 533 } | 532 } |
| 534 // If all key objects are unreachable put the reference on a | 533 // If all key objects are unreachable put the reference on a |
| 535 // delay queue. This reference will be revisited if another | 534 // delay queue. This reference will be revisited if another |
| 536 // reference is scavenged. | 535 // reference is scavenged. |
| 537 if (is_unreachable) { | 536 if (is_unreachable) { |
| 538 state->DelayWeakReferenceSet(reference_set); | 537 state->DelayWeakReferenceSet(reference_set); |
| 539 } | 538 } |
| 540 } | 539 } |
| 541 if ((resolved_top_ < top_) || PromotedStackHasMore()) { | 540 if ((resolved_top_ < top_) || PromotedStackHasMore()) { |
| 542 ProcessToSpace(visitor); | 541 ProcessToSpace(visitor); |
| 543 } else { | 542 } else { |
| 544 // Break out of the loop if there has been no forward process. | 543 // Break out of the loop if there has been no forward process. |
| 545 break; | 544 break; |
| 546 } | 545 } |
| 547 } | 546 } |
| 548 // Deallocate any unreachable references on the delay queue. | 547 // All weak reference sets are zone allocated and unmarked references on |
| 549 if (state->delayed_weak_reference_sets() != NULL) { | 548 // the delay queue will be freed when the zone is released in the epilog |
| 550 WeakReferenceSet* queue = state->delayed_weak_reference_sets(); | 549 // callback. |
| 551 state->set_delayed_weak_reference_sets(NULL); | |
| 552 while (queue != NULL) { | |
| 553 delete WeakReferenceSet::Pop(&queue); | |
| 554 } | |
| 555 } | |
| 556 } | 550 } |
| 557 | 551 |
| 558 | 552 |
| 559 void Scavenger::IterateWeakRoots(Isolate* isolate, | 553 void Scavenger::IterateWeakRoots(Isolate* isolate, |
| 560 HandleVisitor* visitor, | 554 HandleVisitor* visitor, |
| 561 bool visit_prologue_weak_persistent_handles) { | 555 bool visit_prologue_weak_persistent_handles) { |
| 562 isolate->VisitWeakPersistentHandles(visitor, | 556 isolate->VisitWeakPersistentHandles(visitor, |
| 563 visit_prologue_weak_persistent_handles); | 557 visit_prologue_weak_persistent_handles); |
| 564 } | 558 } |
| 565 | 559 |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 769 } | 763 } |
| 770 | 764 |
| 771 | 765 |
| 772 void Scavenger::FreeExternal(intptr_t size) { | 766 void Scavenger::FreeExternal(intptr_t size) { |
| 773 ASSERT(size >= 0); | 767 ASSERT(size >= 0); |
| 774 external_size_ -= size; | 768 external_size_ -= size; |
| 775 ASSERT(external_size_ >= 0); | 769 ASSERT(external_size_ >= 0); |
| 776 } | 770 } |
| 777 | 771 |
| 778 } // namespace dart | 772 } // namespace dart |
| OLD | NEW |