Index: src/objects-inl.h |
=================================================================== |
--- src/objects-inl.h (revision 10171) |
+++ src/objects-inl.h (working copy) |
@@ -90,7 +90,7 @@ |
type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \ |
void holder::set_##name(type* value, WriteBarrierMode mode) { \ |
WRITE_FIELD(this, offset, value); \ |
- CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); \ |
+ CONDITIONAL_WRITE_BARRIER(this, offset, value, mode); \ |
} |
@@ -846,15 +846,25 @@ |
#define WRITE_FIELD(p, offset, value) \ |
(*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value) |
-#define WRITE_BARRIER(heap, object, offset, value) \ |
- heap->incremental_marking()->RecordWrite( \ |
- object, HeapObject::RawField(object, offset), value); \ |
- if (heap->InNewSpace(value)) { \ |
- heap->RecordWrite(object->address(), offset); \ |
+#define WRITE_BARRIER(object, offset, value) \ |
+ Address value_addr = reinterpret_cast<HeapObject*>(value)->address(); \ |
+ if (!value->IsSmi() && Page::FromAddress(value_addr)->IsFlagSet( \ |
+ MemoryChunk::POINTERS_TO_HERE_ARE_INTERESTING)) { \ |
+ Heap* heap = object->GetHeap(); \ |
+ heap->incremental_marking()->RecordWrite( \ |
+ object, HeapObject::RawField(object, offset), value); \ |
+ if (heap->InNewSpace(value)) { \ |
+ heap->RecordWrite(object->address(), offset); \ |
+ } \ |
} |
-#define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode) \ |
- if (mode == UPDATE_WRITE_BARRIER) { \ |
+#define CONDITIONAL_WRITE_BARRIER(object, offset, value, mode) \ |
+ Address value_addr = reinterpret_cast<HeapObject*>(value)->address(); \ |
+ if (mode == UPDATE_WRITE_BARRIER && \ |
+ !value->IsSmi() && \ |
+ Page::FromAddress(value_addr)->IsFlagSet( \ |
+ MemoryChunk::POINTERS_TO_HERE_ARE_INTERESTING)) { \ |
+ Heap* heap = object->GetHeap(); \ |
heap->incremental_marking()->RecordWrite( \ |
object, HeapObject::RawField(object, offset), value); \ |
if (heap->InNewSpace(value)) { \ |
@@ -862,6 +872,15 @@ |
} \ |
} |
+#define CONDITIONAL_WRITE_BARRIER_WITH_HEAP(heap, object, offset, value, mode) \ |
+ if (mode == UPDATE_WRITE_BARRIER) { \ |
+ heap->incremental_marking()->RecordWrite( \ |
+ object, HeapObject::RawField(object, offset), value); \ |
+ if (heap->InNewSpace(value)) { \ |
+ heap->RecordWrite(object->address(), offset); \ |
+ } \ |
+ } |
+ |
#ifndef V8_TARGET_ARCH_MIPS |
#define READ_DOUBLE_FIELD(p, offset) \ |
(*reinterpret_cast<double*>(FIELD_ADDR(p, offset))) |
@@ -1258,7 +1277,7 @@ |
ValidateSmiOnlyElements(); |
#endif |
WRITE_FIELD(this, kElementsOffset, value); |
- CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode); |
+ CONDITIONAL_WRITE_BARRIER(this, kElementsOffset, value, mode); |
} |
@@ -1381,7 +1400,7 @@ |
// to adjust the index here. |
int offset = GetHeaderSize() + (kPointerSize * index); |
WRITE_FIELD(this, offset, value); |
- WRITE_BARRIER(GetHeap(), this, offset, value); |
+ WRITE_BARRIER(this, offset, value); |
} |
@@ -1417,7 +1436,7 @@ |
if (index < 0) { |
int offset = map()->instance_size() + (index * kPointerSize); |
WRITE_FIELD(this, offset, value); |
- WRITE_BARRIER(GetHeap(), this, offset, value); |
+ WRITE_BARRIER(this, offset, value); |
} else { |
ASSERT(index < properties()->length()); |
properties()->set(index, value); |
@@ -1451,7 +1470,7 @@ |
ASSERT(index < 0); |
int offset = map()->instance_size() + (index * kPointerSize); |
WRITE_FIELD(this, offset, value); |
- CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); |
+ CONDITIONAL_WRITE_BARRIER(this, offset, value, mode); |
return value; |
} |
@@ -1562,7 +1581,7 @@ |
ASSERT(index >= 0 && index < this->length()); |
int offset = kHeaderSize + index * kPointerSize; |
WRITE_FIELD(this, offset, value); |
- WRITE_BARRIER(GetHeap(), this, offset, value); |
+ WRITE_BARRIER(this, offset, value); |
} |
@@ -1699,7 +1718,7 @@ |
ASSERT(index >= 0 && index < this->length()); |
int offset = kHeaderSize + index * kPointerSize; |
WRITE_FIELD(this, offset, value); |
- CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); |
+ CONDITIONAL_WRITE_BARRIER(this, offset, value, mode); |
} |
@@ -1762,7 +1781,7 @@ |
WriteBarrierMode mode) { |
int offset = kHeaderSize + index * kPointerSize; |
WRITE_FIELD(this, offset, value); |
- CONDITIONAL_WRITE_BARRIER(heap, this, offset, value, mode); |
+ CONDITIONAL_WRITE_BARRIER_WITH_HEAP(heap, this, offset, value, mode); |
} |
@@ -2277,7 +2296,7 @@ |
void ConsString::set_first(String* value, WriteBarrierMode mode) { |
WRITE_FIELD(this, kFirstOffset, value); |
- CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kFirstOffset, value, mode); |
+ CONDITIONAL_WRITE_BARRIER(this, kFirstOffset, value, mode); |
} |
@@ -2293,7 +2312,7 @@ |
void ConsString::set_second(String* value, WriteBarrierMode mode) { |
WRITE_FIELD(this, kSecondOffset, value); |
- CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kSecondOffset, value, mode); |
+ CONDITIONAL_WRITE_BARRIER(this, kSecondOffset, value, mode); |
} |
@@ -3209,7 +3228,7 @@ |
void Map::set_prototype(Object* value, WriteBarrierMode mode) { |
ASSERT(value->IsNull() || value->IsJSReceiver()); |
WRITE_FIELD(this, kPrototypeOffset, value); |
- CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value, mode); |
+ CONDITIONAL_WRITE_BARRIER(this, kPrototypeOffset, value, mode); |
} |
@@ -3258,7 +3277,7 @@ |
} |
ASSERT(!is_shared()); |
WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, value); |
- CONDITIONAL_WRITE_BARRIER( |
+ CONDITIONAL_WRITE_BARRIER_WITH_HEAP( |
heap, this, kInstanceDescriptorsOrBitField3Offset, value, mode); |
} |
@@ -3630,7 +3649,7 @@ |
void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) { |
WRITE_FIELD(this, kCodeOffset, value); |
- CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value, mode); |
+ CONDITIONAL_WRITE_BARRIER(this, kCodeOffset, value, mode); |
} |
@@ -3642,8 +3661,7 @@ |
void SharedFunctionInfo::set_scope_info(ScopeInfo* value, |
WriteBarrierMode mode) { |
WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value)); |
- CONDITIONAL_WRITE_BARRIER(GetHeap(), |
- this, |
+ CONDITIONAL_WRITE_BARRIER(this, |
kScopeInfoOffset, |
reinterpret_cast<Object*>(value), |
mode); |
@@ -3789,7 +3807,7 @@ |
void JSFunction::set_context(Object* value) { |
ASSERT(value->IsUndefined() || value->IsContext()); |
WRITE_FIELD(this, kContextOffset, value); |
- WRITE_BARRIER(GetHeap(), this, kContextOffset, value); |
+ WRITE_BARRIER(this, kContextOffset, value); |
} |
ACCESSORS(JSFunction, prototype_or_initial_map, Object, |
@@ -3892,7 +3910,7 @@ |
Object* value) { |
ASSERT(id < kJSBuiltinsCount); // id is unsigned. |
WRITE_FIELD(this, OffsetOfFunctionWithId(id), value); |
- WRITE_BARRIER(GetHeap(), this, OffsetOfFunctionWithId(id), value); |
+ WRITE_BARRIER(this, OffsetOfFunctionWithId(id), value); |
} |