| 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:
|
|
|