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 |