| 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 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 visitor->DelayWeakProperty(raw_weak); | 551 visitor->DelayWeakProperty(raw_weak); |
| 552 return raw_weak->Size(); | 552 return raw_weak->Size(); |
| 553 } | 553 } |
| 554 } | 554 } |
| 555 // Key is gray or black. Make the weak property black. | 555 // Key is gray or black. Make the weak property black. |
| 556 return raw_weak->VisitPointers(visitor); | 556 return raw_weak->VisitPointers(visitor); |
| 557 } | 557 } |
| 558 | 558 |
| 559 | 559 |
| 560 void Scavenger::ProcessWeakTables() { | 560 void Scavenger::ProcessWeakTables() { |
| 561 for (Heap::WeakSelector sel = static_cast<Heap::WeakSelector>(0); | 561 for (int sel = 0; |
| 562 sel < Heap::kNumWeakSelectors; | 562 sel < Heap::kNumWeakSelectors; |
| 563 sel++) { | 563 sel++) { |
| 564 WeakTable* table = heap_->GetWeakTable(Heap::kNew, sel); | 564 WeakTable* table = heap_->GetWeakTable( |
| 565 Heap::kNew, static_cast<Heap::WeakSelector>(sel)); |
| 565 intptr_t size = table->size(); | 566 intptr_t size = table->size(); |
| 566 heap_->SetWeakTable(Heap::kNew, sel, WeakTable::NewFrom(table)); | 567 heap_->SetWeakTable(Heap::kNew, |
| 568 static_cast<Heap::WeakSelector>(sel), |
| 569 WeakTable::NewFrom(table)); |
| 567 for (intptr_t i = 0; i < size; i++) { | 570 for (intptr_t i = 0; i < size; i++) { |
| 568 if (table->IsValidEntryAt(i)) { | 571 if (table->IsValidEntryAt(i)) { |
| 569 RawObject* raw_obj = table->ObjectAt(i); | 572 RawObject* raw_obj = table->ObjectAt(i); |
| 570 ASSERT(raw_obj->IsHeapObject()); | 573 ASSERT(raw_obj->IsHeapObject()); |
| 571 uword raw_addr = RawObject::ToAddr(raw_obj); | 574 uword raw_addr = RawObject::ToAddr(raw_obj); |
| 572 uword header = *reinterpret_cast<uword*>(raw_addr); | 575 uword header = *reinterpret_cast<uword*>(raw_addr); |
| 573 if (IsForwarding(header)) { | 576 if (IsForwarding(header)) { |
| 574 // The object has survived. Preserve its record. | 577 // The object has survived. Preserve its record. |
| 575 uword new_addr = ForwardedAddr(header); | 578 uword new_addr = ForwardedAddr(header); |
| 576 raw_obj = RawObject::FromAddr(new_addr); | 579 raw_obj = RawObject::FromAddr(new_addr); |
| 577 heap_->SetWeakEntry(raw_obj, sel, table->ValueAt(i)); | 580 heap_->SetWeakEntry(raw_obj, |
| 581 static_cast<Heap::WeakSelector>(sel), |
| 582 table->ValueAt(i)); |
| 578 } | 583 } |
| 579 } | 584 } |
| 580 } | 585 } |
| 581 } | 586 } |
| 582 } | 587 } |
| 583 | 588 |
| 584 | 589 |
| 585 void Scavenger::VisitObjectPointers(ObjectPointerVisitor* visitor) const { | 590 void Scavenger::VisitObjectPointers(ObjectPointerVisitor* visitor) const { |
| 586 uword cur = FirstObjectStart(); | 591 uword cur = FirstObjectStart(); |
| 587 while (cur < top_) { | 592 while (cur < top_) { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 } | 656 } |
| 652 | 657 |
| 653 | 658 |
| 654 void Scavenger::WriteProtect(bool read_only) { | 659 void Scavenger::WriteProtect(bool read_only) { |
| 655 space_->Protect( | 660 space_->Protect( |
| 656 read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite); | 661 read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite); |
| 657 } | 662 } |
| 658 | 663 |
| 659 | 664 |
| 660 } // namespace dart | 665 } // namespace dart |
| OLD | NEW |