Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index d6571bff090a5eb9cf568d054b3b490599d3104d..f9def82d23f707ec4c9e6f2145672c931092ee34 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -1166,6 +1166,8 @@ HeapObject* JSObject::elements() { |
void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) { |
+ ASSERT(map()->has_fast_elements() == |
+ (value->map() == Heap::fixed_array_map())); |
// In the assert below Dictionary is covered under FixedArray. |
ASSERT(value->IsFixedArray() || value->IsPixelArray() || |
value->IsExternalArray()); |
@@ -1181,11 +1183,21 @@ void JSObject::initialize_properties() { |
void JSObject::initialize_elements() { |
+ ASSERT(map()->has_fast_elements()); |
ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); |
WRITE_FIELD(this, kElementsOffset, Heap::empty_fixed_array()); |
} |
+Object* JSObject::ResetElements() { |
+ Object* obj = map()->GetFastElementsMap(); |
+ if (obj->IsFailure()) return obj; |
+ set_map(Map::cast(obj)); |
+ initialize_elements(); |
+ return this; |
+} |
+ |
+ |
ACCESSORS(Oddball, to_string, String, kToStringOffset) |
ACCESSORS(Oddball, to_number, Object, kToNumberOffset) |
@@ -2335,6 +2347,26 @@ void Map::set_prototype(Object* value, WriteBarrierMode mode) { |
} |
+Object* Map::GetFastElementsMap() { |
+ if (has_fast_elements()) return this; |
+ Object* obj = CopyDropTransitions(); |
+ if (obj->IsFailure()) return obj; |
+ Map* new_map = Map::cast(obj); |
+ new_map->set_has_fast_elements(true); |
+ return new_map; |
+} |
+ |
+ |
+Object* Map::GetSlowElementsMap() { |
+ if (!has_fast_elements()) return this; |
+ Object* obj = CopyDropTransitions(); |
+ if (obj->IsFailure()) return obj; |
+ Map* new_map = Map::cast(obj); |
+ new_map->set_has_fast_elements(false); |
+ return new_map; |
+} |
+ |
+ |
ACCESSORS(Map, instance_descriptors, DescriptorArray, |
kInstanceDescriptorsOffset) |
ACCESSORS(Map, code_cache, Object, kCodeCacheOffset) |
@@ -2838,11 +2870,14 @@ JSObject::ElementsKind JSObject::GetElementsKind() { |
if (array->IsFixedArray()) { |
// FAST_ELEMENTS or DICTIONARY_ELEMENTS are both stored in a FixedArray. |
if (array->map() == Heap::fixed_array_map()) { |
+ ASSERT(map()->has_fast_elements()); |
return FAST_ELEMENTS; |
} |
ASSERT(array->IsDictionary()); |
+ ASSERT(!map()->has_fast_elements()); |
return DICTIONARY_ELEMENTS; |
} |
+ ASSERT(!map()->has_fast_elements()); |
if (array->IsExternalArray()) { |
switch (array->map()->instance_type()) { |
case EXTERNAL_BYTE_ARRAY_TYPE: |