| Index: src/objects-inl.h
|
| ===================================================================
|
| --- src/objects-inl.h (revision 564)
|
| +++ src/objects-inl.h (working copy)
|
| @@ -66,12 +66,13 @@
|
|
|
| #define ACCESSORS(holder, name, type, offset) \
|
| type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \
|
| - void holder::set_##name(type* value) { \
|
| + void holder::set_##name(type* value, WriteBarrierMode mode) { \
|
| WRITE_FIELD(this, offset, value); \
|
| - WRITE_BARRIER(this, offset); \
|
| + CONDITIONAL_WRITE_BARRIER(this, offset, mode); \
|
| }
|
|
|
|
|
| +
|
| #define SMI_ACCESSORS(holder, name, offset) \
|
| int holder::name() { \
|
| Object* value = READ_FIELD(this, offset); \
|
| @@ -505,9 +506,21 @@
|
| #define WRITE_FIELD(p, offset, value) \
|
| (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value)
|
|
|
| +
|
| #define WRITE_BARRIER(object, offset) \
|
| Heap::RecordWrite(object->address(), offset);
|
|
|
| +// CONITIONAL_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))); \
|
| + }
|
| +
|
| #define READ_DOUBLE_FIELD(p, offset) \
|
| (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)))
|
|
|
| @@ -940,7 +953,7 @@
|
| // Access fast-case object properties at index. The use of these routines
|
| // is needed to correctly distinguish between properties stored in-object and
|
| // properties stored in the properties array.
|
| -inline Object* JSObject::FastPropertyAt(int index) {
|
| +Object* JSObject::FastPropertyAt(int index) {
|
| // Adjust for the number of properties stored in the object.
|
| index -= map()->inobject_properties();
|
| if (index < 0) {
|
| @@ -953,7 +966,7 @@
|
| }
|
|
|
|
|
| -inline Object* JSObject::FastPropertyAtPut(int index, Object* value) {
|
| +Object* JSObject::FastPropertyAtPut(int index, Object* value) {
|
| // Adjust for the number of properties stored in the object.
|
| index -= map()->inobject_properties();
|
| if (index < 0) {
|
| @@ -968,6 +981,20 @@
|
| }
|
|
|
|
|
| +Object* JSObject::InObjectPropertyAtPut(int index,
|
| + Object* value,
|
| + WriteBarrierMode mode) {
|
| + // Adjust for the number of properties stored in the object.
|
| + index -= map()->inobject_properties();
|
| + ASSERT(index < 0);
|
| + int offset = map()->instance_size() + (index * kPointerSize);
|
| + WRITE_FIELD(this, offset, value);
|
| + CONDITIONAL_WRITE_BARRIER(this, offset, mode);
|
| + return value;
|
| +}
|
| +
|
| +
|
| +
|
| void JSObject::InitializeBody(int object_size) {
|
| Object* value = Heap::undefined_value();
|
| for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
|
| @@ -1035,7 +1062,7 @@
|
| }
|
|
|
|
|
| -FixedArray::WriteBarrierMode FixedArray::GetWriteBarrierMode() {
|
| +WriteBarrierMode HeapObject::GetWriteBarrierMode() {
|
| if (Heap::InNewSpace(this)) return SKIP_WRITE_BARRIER;
|
| return UPDATE_WRITE_BARRIER;
|
| }
|
| @@ -1043,16 +1070,11 @@
|
|
|
| void FixedArray::set(int index,
|
| Object* value,
|
| - FixedArray::WriteBarrierMode mode) {
|
| + WriteBarrierMode mode) {
|
| ASSERT(index >= 0 && index < this->length());
|
| int offset = kHeaderSize + index * kPointerSize;
|
| WRITE_FIELD(this, offset, value);
|
| - if (mode == UPDATE_WRITE_BARRIER) {
|
| - WRITE_BARRIER(this, offset);
|
| - } else {
|
| - ASSERT(mode == SKIP_WRITE_BARRIER);
|
| - ASSERT(Heap::InNewSpace(this) || !Heap::InNewSpace(value));
|
| - }
|
| + CONDITIONAL_WRITE_BARRIER(this, offset, mode);
|
| }
|
|
|
|
|
| @@ -1804,10 +1826,10 @@
|
| }
|
|
|
|
|
| -void Map::set_prototype(Object* value) {
|
| +void Map::set_prototype(Object* value, WriteBarrierMode mode) {
|
| ASSERT(value->IsNull() || value->IsJSObject());
|
| WRITE_FIELD(this, kPrototypeOffset, value);
|
| - WRITE_BARRIER(this, kPrototypeOffset);
|
| + CONDITIONAL_WRITE_BARRIER(this, kPrototypeOffset, mode);
|
| }
|
|
|
|
|
| @@ -1948,9 +1970,9 @@
|
| }
|
|
|
|
|
| -void SharedFunctionInfo::set_code(Code* value) {
|
| +void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
|
| WRITE_FIELD(this, kCodeOffset, value);
|
| - WRITE_BARRIER(this, kCodeOffset);
|
| + CONDITIONAL_WRITE_BARRIER(this, kCodeOffset, mode);
|
| }
|
|
|
|
|
| @@ -2347,6 +2369,7 @@
|
| #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
|
|
|