Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Unified Diff: src/mark-compact.h

Issue 6713075: Create an abstraction (MarkBit) object to hold the location of the... (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/gc/
Patch Set: '' Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/mark-compact.h
===================================================================
--- src/mark-compact.h (revision 7247)
+++ src/mark-compact.h (working copy)
@@ -45,61 +45,30 @@
class Marking {
public:
- INLINE(static bool IsMarked(HeapObject* obj)) {
- return IsMarked(obj->address());
+ static inline MarkBit MarkBitFrom(HeapObject* obj) {
+ return MarkBitFrom(reinterpret_cast<Address>(obj));
}
- INLINE(static void SetMark(HeapObject* obj)) {
- SetMark(obj->address());
+ static inline MarkBit MarkBitFromNewSpace(HeapObject* obj) {
+ ASSERT(Heap::InNewSpace(obj));
+ uint32_t index = Heap::new_space()->AddressToMarkbitIndex(
+ reinterpret_cast<Address>(obj));
+ return new_space_bitmap_->MarkBitFromIndex(index);
}
- INLINE(static void ClearMark(HeapObject* obj)) {
- ClearMark(obj->address());
- }
-
- INLINE(static bool TestAndMark(Address addr)) {
+ static inline MarkBit MarkBitFrom(Address addr) {
if (Heap::InNewSpace(addr)) {
uint32_t index = Heap::new_space()->AddressToMarkbitIndex(addr);
- return new_space_bitmap_->TestAndSet(index);
+ return new_space_bitmap_->MarkBitFromIndex(index);
} else {
Page *p = Page::FromAddress(addr);
- return p->markbits()->TestAndSet(p->AddressToMarkbitIndex(addr));
+ return p->markbits()->MarkBitFromIndex(p->AddressToMarkbitIndex(addr));
}
}
- INLINE(static bool IsMarked(Address addr)) {
+ static void ClearRange(Address addr, int size) {
if (Heap::InNewSpace(addr)) {
uint32_t index = Heap::new_space()->AddressToMarkbitIndex(addr);
- return new_space_bitmap_->Get(index);
- } else {
- Page *p = Page::FromAddress(addr);
- return p->markbits()->Get(p->AddressToMarkbitIndex(addr));
- }
- }
-
- INLINE(static void SetMark(Address addr)) {
- if (Heap::InNewSpace(addr)) {
- uint32_t index = Heap::new_space()->AddressToMarkbitIndex(addr);
- new_space_bitmap_->Set(index);
- } else {
- Page *p = Page::FromAddress(addr);
- p->markbits()->Set(p->FastAddressToMarkbitIndex(addr));
- }
- }
-
- INLINE(static void ClearMark(Address addr)) {
- if (Heap::InNewSpace(addr)) {
- uint32_t index = Heap::new_space()->AddressToMarkbitIndex(addr);
- new_space_bitmap_->Clear(index);
- } else {
- Page *p = Page::FromAddress(addr);
- p->markbits()->Clear(p->FastAddressToMarkbitIndex(addr));
- }
- }
-
- INLINE(static void ClearRange(Address addr, int size)) {
- if (Heap::InNewSpace(addr)) {
- uint32_t index = Heap::new_space()->AddressToMarkbitIndex(addr);
new_space_bitmap_->ClearRange(index, size >> kPointerSizeLog2);
} else {
Page *p = Page::FromAddress(addr);
@@ -252,6 +221,14 @@
static const uint32_t kSingleFreeEncoding = 0;
static const uint32_t kMultiFreeEncoding = 1;
+#ifdef DEBUG
+ static bool IsMarked(Object* obj) {
+ ASSERT(obj->IsHeapObject());
+ HeapObject* heap_object = HeapObject::cast(obj);
+ return Marking::MarkBitFrom(heap_object).Get();
+ }
+#endif
+
private:
#ifdef DEBUG
enum CollectorState {
@@ -312,8 +289,10 @@
static void AfterMarking();
- INLINE(static void MarkObject(HeapObject* obj)) {
- if (!Marking::TestAndMark(obj->address())) {
+ INLINE(static void MarkObject(HeapObject* obj, MarkBit mark_bit)) {
+ ASSERT(Marking::MarkBitFrom(obj) == mark_bit);
+ if (!mark_bit.Get()) {
+ mark_bit.Set();
tracer_->increment_marked_count();
#ifdef DEBUG
UpdateLiveObjectCount(obj);
@@ -322,8 +301,9 @@
}
}
- INLINE(static void SetMark(HeapObject* obj)) {
- Marking::SetMark(obj);
+ INLINE(static void SetMark(HeapObject* obj, MarkBit mark_bit)) {
+ ASSERT(Marking::MarkBitFrom(obj) == mark_bit);
+ mark_bit.Set();
tracer_->increment_marked_count();
#ifdef DEBUG
UpdateLiveObjectCount(obj);

Powered by Google App Engine
This is Rietveld 408576698