| Index: src/objects-inl.h
 | 
| diff --git a/src/objects-inl.h b/src/objects-inl.h
 | 
| index d82d73ec50108cd6526799bc30601a8ccf364681..c10c930d31958cce7cc7953f63da4119636f69c1 100644
 | 
| --- a/src/objects-inl.h
 | 
| +++ b/src/objects-inl.h
 | 
| @@ -759,7 +759,8 @@ Object* Object::GetProperty(String* key, PropertyAttributes* attributes) {
 | 
|      ASSERT(mode == SKIP_WRITE_BARRIER); \
 | 
|      ASSERT(Heap::InNewSpace(object) || \
 | 
|             !Heap::InNewSpace(READ_FIELD(object, offset)) || \
 | 
| -           Page::IsRSetSet(object->address(), offset)); \
 | 
| +           Page::FromAddress(object->address())->           \
 | 
| +               IsRegionDirty(object->address() + offset));  \
 | 
|    }
 | 
|  
 | 
|  #define READ_DOUBLE_FIELD(p, offset) \
 | 
| @@ -1045,6 +1046,10 @@ Address MapWord::ToEncodedAddress() {
 | 
|  void HeapObject::VerifyObjectField(int offset) {
 | 
|    VerifyPointer(READ_FIELD(this, offset));
 | 
|  }
 | 
| +
 | 
| +void HeapObject::VerifySmiField(int offset) {
 | 
| +  ASSERT(READ_FIELD(this, offset)->IsSmi());
 | 
| +}
 | 
|  #endif
 | 
|  
 | 
|  
 | 
| @@ -1064,7 +1069,7 @@ MapWord HeapObject::map_word() {
 | 
|  
 | 
|  
 | 
|  void HeapObject::set_map_word(MapWord map_word) {
 | 
| -  // WRITE_FIELD does not update the remembered set, but there is no need
 | 
| +  // WRITE_FIELD does not invoke write barrier, but there is no need
 | 
|    // here.
 | 
|    WRITE_FIELD(this, kMapOffset, reinterpret_cast<Object*>(map_word.value_));
 | 
|  }
 | 
| @@ -1162,16 +1167,16 @@ int HeapNumber::get_sign() {
 | 
|  ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset)
 | 
|  
 | 
|  
 | 
| -Array* JSObject::elements() {
 | 
| +HeapObject* JSObject::elements() {
 | 
|    Object* array = READ_FIELD(this, kElementsOffset);
 | 
|    // In the assert below Dictionary is covered under FixedArray.
 | 
|    ASSERT(array->IsFixedArray() || array->IsPixelArray() ||
 | 
|           array->IsExternalArray());
 | 
| -  return reinterpret_cast<Array*>(array);
 | 
| +  return reinterpret_cast<HeapObject*>(array);
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void JSObject::set_elements(Array* value, WriteBarrierMode mode) {
 | 
| +void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) {
 | 
|    // In the assert below Dictionary is covered under FixedArray.
 | 
|    ASSERT(value->IsFixedArray() || value->IsPixelArray() ||
 | 
|           value->IsExternalArray());
 | 
| @@ -1342,15 +1347,15 @@ bool JSObject::HasFastProperties() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -bool Array::IndexFromObject(Object* object, uint32_t* index) {
 | 
| -  if (object->IsSmi()) {
 | 
| -    int value = Smi::cast(object)->value();
 | 
| +bool Object::ToArrayIndex(uint32_t* index) {
 | 
| +  if (IsSmi()) {
 | 
| +    int value = Smi::cast(this)->value();
 | 
|      if (value < 0) return false;
 | 
|      *index = value;
 | 
|      return true;
 | 
|    }
 | 
| -  if (object->IsHeapNumber()) {
 | 
| -    double value = HeapNumber::cast(object)->value();
 | 
| +  if (IsHeapNumber()) {
 | 
| +    double value = HeapNumber::cast(this)->value();
 | 
|      uint32_t uint_value = static_cast<uint32_t>(value);
 | 
|      if (value == static_cast<double>(uint_value)) {
 | 
|        *index = uint_value;
 | 
| @@ -1665,7 +1670,11 @@ HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -INT_ACCESSORS(Array, length, kLengthOffset)
 | 
| +SMI_ACCESSORS(FixedArray, length, kLengthOffset)
 | 
| +SMI_ACCESSORS(ByteArray, length, kLengthOffset)
 | 
| +
 | 
| +INT_ACCESSORS(PixelArray, length, kLengthOffset)
 | 
| +INT_ACCESSORS(ExternalArray, length, kLengthOffset)
 | 
|  
 | 
|  
 | 
|  SMI_ACCESSORS(String, length, kLengthOffset)
 | 
| @@ -1678,6 +1687,9 @@ uint32_t String::hash_field() {
 | 
|  
 | 
|  void String::set_hash_field(uint32_t value) {
 | 
|    WRITE_UINT32_FIELD(this, kHashFieldOffset, value);
 | 
| +#if V8_HOST_ARCH_64_BIT
 | 
| +  WRITE_UINT32_FIELD(this, kHashFieldOffset + kIntSize, 0);
 | 
| +#endif
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -2456,22 +2468,65 @@ BOOL_ACCESSORS(SharedFunctionInfo,
 | 
|                 try_full_codegen,
 | 
|                 kTryFullCodegen)
 | 
|  
 | 
| -INT_ACCESSORS(SharedFunctionInfo, length, kLengthOffset)
 | 
| -INT_ACCESSORS(SharedFunctionInfo, formal_parameter_count,
 | 
| +#if V8_HOST_ARCH_32_BIT
 | 
| +SMI_ACCESSORS(SharedFunctionInfo, length, kLengthOffset)
 | 
| +SMI_ACCESSORS(SharedFunctionInfo, formal_parameter_count,
 | 
|                kFormalParameterCountOffset)
 | 
| -INT_ACCESSORS(SharedFunctionInfo, expected_nof_properties,
 | 
| +SMI_ACCESSORS(SharedFunctionInfo, expected_nof_properties,
 | 
|                kExpectedNofPropertiesOffset)
 | 
| -INT_ACCESSORS(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
 | 
| -INT_ACCESSORS(SharedFunctionInfo, start_position_and_type,
 | 
| +SMI_ACCESSORS(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
 | 
| +SMI_ACCESSORS(SharedFunctionInfo, start_position_and_type,
 | 
|                kStartPositionAndTypeOffset)
 | 
| -INT_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset)
 | 
| -INT_ACCESSORS(SharedFunctionInfo, function_token_position,
 | 
| +SMI_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset)
 | 
| +SMI_ACCESSORS(SharedFunctionInfo, function_token_position,
 | 
|                kFunctionTokenPositionOffset)
 | 
| -INT_ACCESSORS(SharedFunctionInfo, compiler_hints,
 | 
| +SMI_ACCESSORS(SharedFunctionInfo, compiler_hints,
 | 
|                kCompilerHintsOffset)
 | 
| -INT_ACCESSORS(SharedFunctionInfo, this_property_assignments_count,
 | 
| +SMI_ACCESSORS(SharedFunctionInfo, this_property_assignments_count,
 | 
|                kThisPropertyAssignmentsCountOffset)
 | 
| +#else
 | 
| +
 | 
| +#define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset)             \
 | 
| +  int holder::name() {                                            \
 | 
| +    int value = READ_INT_FIELD(this, offset);                     \
 | 
| +    ASSERT(kHeapObjectTag == 1);                                  \
 | 
| +    ASSERT((value & kHeapObjectTag) == 0);                        \
 | 
| +    return value >> 1;                                            \
 | 
| +  }                                                               \
 | 
| +  void holder::set_##name(int value) {                            \
 | 
| +    ASSERT(kHeapObjectTag == 1);                                  \
 | 
| +    ASSERT((value & 0xC0000000) == 0xC0000000 ||                  \
 | 
| +           (value & 0xC0000000) == 0x000000000);                  \
 | 
| +    WRITE_INT_FIELD(this,                                         \
 | 
| +                    offset,                                       \
 | 
| +                    (value << 1) & ~kHeapObjectTag);              \
 | 
| +  }
 | 
| +
 | 
| +#define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset) \
 | 
| +  INT_ACCESSORS(holder, name, offset)
 | 
| +
 | 
| +
 | 
| +
 | 
| +PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, length, kLengthOffset)
 | 
| +PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, formal_parameter_count,
 | 
| +              kFormalParameterCountOffset)
 | 
| +
 | 
| +PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, expected_nof_properties,
 | 
| +              kExpectedNofPropertiesOffset)
 | 
| +PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
 | 
|  
 | 
| +PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, start_position_and_type,
 | 
| +              kStartPositionAndTypeOffset)
 | 
| +PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, end_position, kEndPositionOffset)
 | 
| +
 | 
| +PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, function_token_position,
 | 
| +              kFunctionTokenPositionOffset)
 | 
| +PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, compiler_hints,
 | 
| +              kCompilerHintsOffset)
 | 
| +
 | 
| +PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, this_property_assignments_count,
 | 
| +              kThisPropertyAssignmentsCountOffset)
 | 
| +#endif
 | 
|  
 | 
|  ACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset)
 | 
|  ACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset)
 | 
| @@ -2785,7 +2840,7 @@ void JSRegExp::SetDataAt(int index, Object* value) {
 | 
|  
 | 
|  
 | 
|  JSObject::ElementsKind JSObject::GetElementsKind() {
 | 
| -  Array* array = elements();
 | 
| +  HeapObject* array = elements();
 | 
|    if (array->IsFixedArray()) {
 | 
|      // FAST_ELEMENTS or DICTIONARY_ELEMENTS are both stored in a FixedArray.
 | 
|      if (array->map() == Heap::fixed_array_map()) {
 | 
| @@ -2908,15 +2963,20 @@ NumberDictionary* JSObject::element_dictionary() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +bool String::IsHashFieldComputed(uint32_t field) {
 | 
| +  return (field & kHashNotComputedMask) == 0;
 | 
| +}
 | 
| +
 | 
| +
 | 
|  bool String::HasHashCode() {
 | 
| -  return (hash_field() & kHashComputedMask) != 0;
 | 
| +  return IsHashFieldComputed(hash_field());
 | 
|  }
 | 
|  
 | 
|  
 | 
|  uint32_t String::Hash() {
 | 
|    // Fast case: has hash code already been computed?
 | 
|    uint32_t field = hash_field();
 | 
| -  if (field & kHashComputedMask) return field >> kHashShift;
 | 
| +  if (IsHashFieldComputed(field)) return field >> kHashShift;
 | 
|    // Slow case: compute hash code and set it.
 | 
|    return ComputeAndSetHash();
 | 
|  }
 | 
| @@ -2989,7 +3049,7 @@ uint32_t StringHasher::GetHash() {
 | 
|  
 | 
|  bool String::AsArrayIndex(uint32_t* index) {
 | 
|    uint32_t field = hash_field();
 | 
| -  if ((field & kHashComputedMask) && !(field & kIsArrayIndexMask)) return false;
 | 
| +  if (IsHashFieldComputed(field) && !(field & kIsArrayIndexMask)) return false;
 | 
|    return SlowAsArrayIndex(index);
 | 
|  }
 | 
|  
 | 
| @@ -3113,7 +3173,7 @@ void Map::ClearCodeCache() {
 | 
|  
 | 
|  void JSArray::EnsureSize(int required_size) {
 | 
|    ASSERT(HasFastElements());
 | 
| -  Array* elts = elements();
 | 
| +  FixedArray* elts = FixedArray::cast(elements());
 | 
|    const int kArraySizeThatFitsComfortablyInNewSpace = 128;
 | 
|    if (elts->length() < required_size) {
 | 
|      // Doubling in size would be overkill, but leave some slack to avoid
 | 
| 
 |