Chromium Code Reviews| Index: src/objects-inl.h |
| diff --git a/src/objects-inl.h b/src/objects-inl.h |
| index 0493401d8358adeb8a5acd50f88cafab57898b96..13334c78260d434bbc7a1503d149ab77a7aa1cad 100644 |
| --- a/src/objects-inl.h |
| +++ b/src/objects-inl.h |
| @@ -44,6 +44,8 @@ |
| #include "spaces.h" |
| #include "store-buffer.h" |
| +#include "incremental-marking.h" |
| + |
| namespace v8 { |
| namespace internal { |
| @@ -79,7 +81,7 @@ PropertyDetails PropertyDetails::AsDeleted() { |
| 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(this, offset, mode); \ |
| + WRITE_BARRIER(this, offset, value); \ |
|
Erik Corry
2011/02/22 12:27:19
Indentation of backslashes is now wrong.
Vyacheslav Egorov (Chromium)
2011/02/23 14:31:46
Done.
|
| } |
| @@ -803,22 +805,10 @@ MaybeObject* Object::GetProperty(String* key, PropertyAttributes* attributes) { |
| #define WRITE_FIELD(p, offset, value) \ |
| (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value) |
| - |
| -#define WRITE_BARRIER(object, offset) \ |
| +#define WRITE_BARRIER(object, offset, value) \ |
| + IncrementalMarking::RecordWrite(object, value); \ |
| Heap::RecordWrite(object->address(), offset); |
| -// CONDITIONAL_WRITE_BARRIER must be issued after the actual |
| -// write due to the assert validating the written value. |
| -#define CONDITIONAL_WRITE_BARRIER(object, offset, mode) \ |
| - if (mode == UPDATE_WRITE_BARRIER) { \ |
| - Heap::RecordWrite(object->address(), offset); \ |
| - } else { \ |
| - ASSERT(mode == SKIP_WRITE_BARRIER); \ |
| - ASSERT(Heap::InNewSpace(object) || \ |
| - !Heap::InNewSpace(READ_FIELD(object, offset)) || \ |
| - StoreBuffer::CellIsInStoreBuffer(object->address() + offset)); \ |
| - } |
| - |
| #define READ_DOUBLE_FIELD(p, offset) \ |
| (*reinterpret_cast<double*>(FIELD_ADDR(p, offset))) |
| @@ -1016,6 +1006,7 @@ Map* HeapObject::map() { |
| void HeapObject::set_map(Map* value) { |
| set_map_word(MapWord::FromMap(value)); |
| + IncrementalMarking::RecordWrite(this, value); |
| } |
| @@ -1099,7 +1090,7 @@ void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) { |
| ASSERT(value->IsFixedArray() || value->IsPixelArray() || |
| value->IsExternalArray()); |
| WRITE_FIELD(this, kElementsOffset, value); |
| - CONDITIONAL_WRITE_BARRIER(this, kElementsOffset, mode); |
| + WRITE_BARRIER(this, kElementsOffset, value); |
| } |
| @@ -1140,6 +1131,7 @@ void JSGlobalPropertyCell::set_value(Object* val, WriteBarrierMode ignored) { |
| // The write barrier is not used for global property cells. |
| ASSERT(!val->IsJSGlobalPropertyCell()); |
| WRITE_FIELD(this, kValueOffset, val); |
| + IncrementalMarking::RecordWrite(this, val); |
| } |
| @@ -1200,7 +1192,7 @@ void JSObject::SetInternalField(int index, Object* value) { |
| // to adjust the index here. |
| int offset = GetHeaderSize() + (kPointerSize * index); |
| WRITE_FIELD(this, offset, value); |
| - WRITE_BARRIER(this, offset); |
| + WRITE_BARRIER(this, offset, value); |
| } |
| @@ -1226,7 +1218,7 @@ Object* JSObject::FastPropertyAtPut(int index, Object* value) { |
| if (index < 0) { |
| int offset = map()->instance_size() + (index * kPointerSize); |
| WRITE_FIELD(this, offset, value); |
| - WRITE_BARRIER(this, offset); |
| + WRITE_BARRIER(this, offset, value); |
| } else { |
| ASSERT(index < properties()->length()); |
| properties()->set(index, value); |
| @@ -1252,7 +1244,7 @@ Object* JSObject::InObjectPropertyAtPut(int index, |
| ASSERT(index < 0); |
| int offset = map()->instance_size() + (index * kPointerSize); |
| WRITE_FIELD(this, offset, value); |
| - CONDITIONAL_WRITE_BARRIER(this, offset, mode); |
| + WRITE_BARRIER(this, offset, value); |
| return value; |
| } |
| @@ -1340,7 +1332,7 @@ void FixedArray::set(int index, Object* value) { |
| ASSERT(index >= 0 && index < this->length()); |
| int offset = kHeaderSize + index * kPointerSize; |
| WRITE_FIELD(this, offset, value); |
| - WRITE_BARRIER(this, offset); |
| + WRITE_BARRIER(this, offset, value); |
| } |
| @@ -1357,7 +1349,7 @@ void FixedArray::set(int index, |
| ASSERT(index >= 0 && index < this->length()); |
| int offset = kHeaderSize + index * kPointerSize; |
| WRITE_FIELD(this, offset, value); |
| - CONDITIONAL_WRITE_BARRIER(this, offset, mode); |
| + WRITE_BARRIER(this, offset, value); |
| } |
| @@ -1366,6 +1358,7 @@ void FixedArray::fast_set(FixedArray* array, int index, Object* value) { |
| ASSERT(index >= 0 && index < array->length()); |
| ASSERT(!Heap::InNewSpace(value)); |
| WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value); |
| + IncrementalMarking::RecordWrite(array, value); |
| } |
| @@ -1406,7 +1399,7 @@ void FixedArray::set_unchecked(int index, |
| WriteBarrierMode mode) { |
| int offset = kHeaderSize + index * kPointerSize; |
| WRITE_FIELD(this, offset, value); |
| - CONDITIONAL_WRITE_BARRIER(this, offset, mode); |
| + WRITE_BARRIER(this, offset, value); |
| } |
| @@ -1817,7 +1810,7 @@ Object* ConsString::unchecked_first() { |
| void ConsString::set_first(String* value, WriteBarrierMode mode) { |
| WRITE_FIELD(this, kFirstOffset, value); |
| - CONDITIONAL_WRITE_BARRIER(this, kFirstOffset, mode); |
| + WRITE_BARRIER(this, kFirstOffset, value); |
| } |
| @@ -1833,7 +1826,7 @@ Object* ConsString::unchecked_second() { |
| void ConsString::set_second(String* value, WriteBarrierMode mode) { |
| WRITE_FIELD(this, kSecondOffset, value); |
| - CONDITIONAL_WRITE_BARRIER(this, kSecondOffset, mode); |
| + WRITE_BARRIER(this, kSecondOffset, value); |
| } |
| @@ -2593,7 +2586,7 @@ Object* Map::prototype() { |
| void Map::set_prototype(Object* value, WriteBarrierMode mode) { |
| ASSERT(value->IsNull() || value->IsJSObject()); |
| WRITE_FIELD(this, kPrototypeOffset, value); |
| - CONDITIONAL_WRITE_BARRIER(this, kPrototypeOffset, mode); |
| + WRITE_BARRIER(this, kPrototypeOffset, value); |
| } |
| @@ -2943,7 +2936,7 @@ Code* SharedFunctionInfo::unchecked_code() { |
| void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) { |
| WRITE_FIELD(this, kCodeOffset, value); |
| - CONDITIONAL_WRITE_BARRIER(this, kCodeOffset, mode); |
| + WRITE_BARRIER(this, kCodeOffset, value); |
| } |
| @@ -2956,7 +2949,7 @@ SerializedScopeInfo* SharedFunctionInfo::scope_info() { |
| void SharedFunctionInfo::set_scope_info(SerializedScopeInfo* value, |
| WriteBarrierMode mode) { |
| WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value)); |
| - CONDITIONAL_WRITE_BARRIER(this, kScopeInfoOffset, mode); |
| + WRITE_BARRIER(this, kScopeInfoOffset, reinterpret_cast<Object*>(value)); |
| } |
| @@ -3051,6 +3044,7 @@ void JSFunction::set_code(Code* value) { |
| ASSERT(!Heap::InNewSpace(value)); |
| Address entry = value->entry(); |
| WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry)); |
| + IncrementalMarking::RecordWrite(this, value); |
| } |
| @@ -3090,7 +3084,7 @@ SharedFunctionInfo* JSFunction::unchecked_shared() { |
| void JSFunction::set_context(Object* value) { |
| ASSERT(value == Heap::undefined_value() || value->IsContext()); |
| WRITE_FIELD(this, kContextOffset, value); |
| - WRITE_BARRIER(this, kContextOffset); |
| + WRITE_BARRIER(this, kContextOffset, value); |
| } |
| ACCESSORS(JSFunction, prototype_or_initial_map, Object, |
| @@ -3164,7 +3158,7 @@ void JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id, |
| Object* value) { |
| ASSERT(id < kJSBuiltinsCount); // id is unsigned. |
| WRITE_FIELD(this, OffsetOfFunctionWithId(id), value); |
| - WRITE_BARRIER(this, OffsetOfFunctionWithId(id)); |
| + WRITE_BARRIER(this, OffsetOfFunctionWithId(id), value); |
| } |
| @@ -3796,7 +3790,6 @@ void FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj, |
| #undef READ_FIELD |
| #undef WRITE_FIELD |
| #undef WRITE_BARRIER |
| -#undef CONDITIONAL_WRITE_BARRIER |
| #undef READ_MEMADDR_FIELD |
| #undef WRITE_MEMADDR_FIELD |
| #undef READ_DOUBLE_FIELD |