| Index: src/objects-inl.h | 
| diff --git a/src/objects-inl.h b/src/objects-inl.h | 
| index c358ee6584525e4415aacce8615efd687acda79e..db506fe5e3ab4e2009dd5eb1f40c7d24c6946049 100644 | 
| --- a/src/objects-inl.h | 
| +++ b/src/objects-inl.h | 
| @@ -125,6 +125,15 @@ PropertyDetails PropertyDetails::AsDeleted() const { | 
| WRITE_FIELD(this, offset, Smi::FromInt(value));     \ | 
| } | 
|  | 
| +#define SYNCHRONIZED_SMI_ACCESSORS(holder, name, offset)    \ | 
| +  int holder::synchronized_##name() {                       \ | 
| +    Object* value = ACQUIRE_READ_FIELD(this, offset);       \ | 
| +    return Smi::cast(value)->value();                       \ | 
| +  }                                                         \ | 
| +  void holder::synchronized_set_##name(int value) {         \ | 
| +    RELEASE_WRITE_FIELD(this, offset, Smi::FromInt(value)); \ | 
| +  } | 
| + | 
|  | 
| #define BOOL_GETTER(holder, field, name, offset)           \ | 
| bool holder::name() {                                    \ | 
| @@ -1095,9 +1104,25 @@ MaybeObject* Object::GetProperty(Name* key, PropertyAttributes* attributes) { | 
| #define READ_FIELD(p, offset) \ | 
| (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset))) | 
|  | 
| +#define ACQUIRE_READ_FIELD(p, offset)                                    \ | 
| +  reinterpret_cast<Object*>(                                             \ | 
| +      Acquire_Load(reinterpret_cast<AtomicWord*>(FIELD_ADDR(p, offset)))) | 
| + | 
| +#define NO_BARRIER_READ_FIELD(p, offset)                                    \ | 
| +  reinterpret_cast<Object*>(                                                \ | 
| +      NoBarrier_Load(reinterpret_cast<AtomicWord*>(FIELD_ADDR(p, offset)))) | 
| + | 
| #define WRITE_FIELD(p, offset, value) \ | 
| (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value) | 
|  | 
| +#define RELEASE_WRITE_FIELD(p, offset, value)                           \ | 
| +  Release_Store(reinterpret_cast<AtomicWord*>(FIELD_ADDR(p, offset)),   \ | 
| +                reinterpret_cast<AtomicWord>(value)); | 
| + | 
| +#define NO_BARRIER_WRITE_FIELD(p, offset, value)                           \ | 
| +  NoBarrier_Store(reinterpret_cast<AtomicWord*>(FIELD_ADDR(p, offset)),    \ | 
| +                  reinterpret_cast<AtomicWord>(value)); | 
| + | 
| #define WRITE_BARRIER(heap, object, offset, value)                      \ | 
| heap->incremental_marking()->RecordWrite(                             \ | 
| object, HeapObject::RawField(object, offset), value);             \ | 
| @@ -1348,6 +1373,21 @@ void HeapObject::set_map(Map* value) { | 
| } | 
|  | 
|  | 
| +Map* HeapObject::synchronized_map() { | 
| +  return synchronized_map_word().ToMap(); | 
| +} | 
| + | 
| + | 
| +void HeapObject::synchronized_set_map(Map* value) { | 
| +  synchronized_set_map_word(MapWord::FromMap(value)); | 
| +  if (value != NULL) { | 
| +    // TODO(1600) We are passing NULL as a slot because maps can never be on | 
| +    // evacuation candidate. | 
| +    value->GetHeap()->incremental_marking()->RecordWrite(this, NULL, value); | 
| +  } | 
| +} | 
| + | 
| + | 
| // Unsafe accessor omitting write barrier. | 
| void HeapObject::set_map_no_write_barrier(Map* value) { | 
| set_map_word(MapWord::FromMap(value)); | 
| @@ -1355,14 +1395,26 @@ void HeapObject::set_map_no_write_barrier(Map* value) { | 
|  | 
|  | 
| MapWord HeapObject::map_word() { | 
| -  return MapWord(reinterpret_cast<uintptr_t>(READ_FIELD(this, kMapOffset))); | 
| +  return MapWord( | 
| +      reinterpret_cast<uintptr_t>(NO_BARRIER_READ_FIELD(this, kMapOffset))); | 
| } | 
|  | 
|  | 
| void HeapObject::set_map_word(MapWord map_word) { | 
| -  // WRITE_FIELD does not invoke write barrier, but there is no need | 
| -  // here. | 
| -  WRITE_FIELD(this, kMapOffset, reinterpret_cast<Object*>(map_word.value_)); | 
| +  NO_BARRIER_WRITE_FIELD( | 
| +      this, kMapOffset, reinterpret_cast<Object*>(map_word.value_)); | 
| +} | 
| + | 
| + | 
| +MapWord HeapObject::synchronized_map_word() { | 
| +  return MapWord( | 
| +      reinterpret_cast<uintptr_t>(ACQUIRE_READ_FIELD(this, kMapOffset))); | 
| +} | 
| + | 
| + | 
| +void HeapObject::synchronized_set_map_word(MapWord map_word) { | 
| +  RELEASE_WRITE_FIELD( | 
| +      this, kMapOffset, reinterpret_cast<Object*>(map_word.value_)); | 
| } | 
|  | 
|  | 
| @@ -2914,9 +2966,12 @@ HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) { | 
|  | 
|  | 
| SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset) | 
| +SYNCHRONIZED_SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset) | 
| + | 
| SMI_ACCESSORS(FreeSpace, size, kSizeOffset) | 
|  | 
| SMI_ACCESSORS(String, length, kLengthOffset) | 
| +SYNCHRONIZED_SMI_ACCESSORS(String, length, kLengthOffset) | 
|  | 
|  | 
| uint32_t Name::hash_field() { | 
|  |