| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 5609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5620 return object; | 5620 return object; |
| 5621 } | 5621 } |
| 5622 | 5622 |
| 5623 | 5623 |
| 5624 void JSObject::SetObserved(Handle<JSObject> object) { | 5624 void JSObject::SetObserved(Handle<JSObject> object) { |
| 5625 Isolate* isolate = object->GetIsolate(); | 5625 Isolate* isolate = object->GetIsolate(); |
| 5626 | 5626 |
| 5627 if (object->map()->is_observed()) | 5627 if (object->map()->is_observed()) |
| 5628 return; | 5628 return; |
| 5629 | 5629 |
| 5630 if (!object->HasExternalArrayElements()) { | |
| 5631 // Go to dictionary mode, so that we don't skip map checks. | |
| 5632 NormalizeElements(object); | |
| 5633 ASSERT(!object->HasFastElements()); | |
| 5634 } | |
| 5635 | |
| 5636 LookupResult result(isolate); | 5630 LookupResult result(isolate); |
| 5637 object->map()->LookupTransition(*object, | 5631 object->map()->LookupTransition(*object, |
| 5638 isolate->heap()->observed_symbol(), | 5632 isolate->heap()->observed_symbol(), |
| 5639 &result); | 5633 &result); |
| 5640 | 5634 |
| 5641 Handle<Map> new_map; | 5635 Handle<Map> new_map; |
| 5642 if (result.IsTransition()) { | 5636 if (result.IsTransition()) { |
| 5643 new_map = handle(result.GetTransitionTarget()); | 5637 new_map = handle(result.GetTransitionTarget()); |
| 5644 ASSERT(new_map->is_observed()); | 5638 ASSERT(new_map->is_observed()); |
| 5645 } else if (object->map()->CanHaveMoreTransitions()) { | 5639 } else if (object->map()->CanHaveMoreTransitions()) { |
| 5646 new_map = Map::CopyForObserved(handle(object->map())); | 5640 new_map = Map::CopyForObserved(handle(object->map())); |
| 5647 } else { | 5641 } else { |
| 5648 new_map = Map::Copy(handle(object->map())); | 5642 new_map = Map::Copy(handle(object->map())); |
| 5649 new_map->set_is_observed(true); | 5643 new_map->set_is_observed(); |
| 5650 } | 5644 } |
| 5651 object->set_map(*new_map); | 5645 object->set_map(*new_map); |
| 5652 } | 5646 } |
| 5653 | 5647 |
| 5654 | 5648 |
| 5655 Handle<JSObject> JSObject::Copy(Handle<JSObject> object, | 5649 Handle<JSObject> JSObject::Copy(Handle<JSObject> object, |
| 5656 Handle<AllocationSite> site) { | 5650 Handle<AllocationSite> site) { |
| 5657 Isolate* isolate = object->GetIsolate(); | 5651 Isolate* isolate = object->GetIsolate(); |
| 5658 CALL_HEAP_FUNCTION(isolate, | 5652 CALL_HEAP_FUNCTION(isolate, |
| 5659 isolate->heap()->CopyJSObject(*object, *site), JSObject); | 5653 isolate->heap()->CopyJSObject(*object, *site), JSObject); |
| (...skipping 1284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6944 } else { | 6938 } else { |
| 6945 new_map = Map::Copy(map); | 6939 new_map = Map::Copy(map); |
| 6946 } | 6940 } |
| 6947 | 6941 |
| 6948 Handle<TransitionArray> transitions = | 6942 Handle<TransitionArray> transitions = |
| 6949 Map::AddTransition(map, isolate->factory()->observed_symbol(), new_map, | 6943 Map::AddTransition(map, isolate->factory()->observed_symbol(), new_map, |
| 6950 FULL_TRANSITION); | 6944 FULL_TRANSITION); |
| 6951 | 6945 |
| 6952 map->set_transitions(*transitions); | 6946 map->set_transitions(*transitions); |
| 6953 | 6947 |
| 6954 new_map->set_is_observed(true); | 6948 new_map->set_is_observed(); |
| 6955 | 6949 |
| 6956 if (map->owns_descriptors()) { | 6950 if (map->owns_descriptors()) { |
| 6957 new_map->InitializeDescriptors(map->instance_descriptors()); | 6951 new_map->InitializeDescriptors(map->instance_descriptors()); |
| 6958 map->set_owns_descriptors(false); | 6952 map->set_owns_descriptors(false); |
| 6959 } | 6953 } |
| 6960 | 6954 |
| 6961 new_map->SetBackPointer(*map); | 6955 new_map->SetBackPointer(*map); |
| 6962 return new_map; | 6956 return new_map; |
| 6963 } | 6957 } |
| 6964 | 6958 |
| (...skipping 4164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11129 #endif // ENABLE_DISASSEMBLER | 11123 #endif // ENABLE_DISASSEMBLER |
| 11130 | 11124 |
| 11131 | 11125 |
| 11132 MaybeObject* JSObject::SetFastElementsCapacityAndLength( | 11126 MaybeObject* JSObject::SetFastElementsCapacityAndLength( |
| 11133 int capacity, | 11127 int capacity, |
| 11134 int length, | 11128 int length, |
| 11135 SetFastElementsCapacitySmiMode smi_mode) { | 11129 SetFastElementsCapacitySmiMode smi_mode) { |
| 11136 Heap* heap = GetHeap(); | 11130 Heap* heap = GetHeap(); |
| 11137 // We should never end in here with a pixel or external array. | 11131 // We should never end in here with a pixel or external array. |
| 11138 ASSERT(!HasExternalArrayElements()); | 11132 ASSERT(!HasExternalArrayElements()); |
| 11139 ASSERT(!map()->is_observed()); | |
| 11140 | 11133 |
| 11141 // Allocate a new fast elements backing store. | 11134 // Allocate a new fast elements backing store. |
| 11142 FixedArray* new_elements; | 11135 FixedArray* new_elements; |
| 11143 MaybeObject* maybe = heap->AllocateUninitializedFixedArray(capacity); | 11136 MaybeObject* maybe = heap->AllocateUninitializedFixedArray(capacity); |
| 11144 if (!maybe->To(&new_elements)) return maybe; | 11137 if (!maybe->To(&new_elements)) return maybe; |
| 11145 | 11138 |
| 11146 ElementsKind elements_kind = GetElementsKind(); | 11139 ElementsKind elements_kind = GetElementsKind(); |
| 11147 ElementsKind new_elements_kind; | 11140 ElementsKind new_elements_kind; |
| 11148 // The resized array has FAST_*_SMI_ELEMENTS if the capacity mode forces it, | 11141 // The resized array has FAST_*_SMI_ELEMENTS if the capacity mode forces it, |
| 11149 // or if it's allowed and the old elements array contained only SMIs. | 11142 // or if it's allowed and the old elements array contained only SMIs. |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11214 | 11207 |
| 11215 return false; | 11208 return false; |
| 11216 } | 11209 } |
| 11217 | 11210 |
| 11218 MaybeObject* JSObject::SetFastDoubleElementsCapacityAndLength( | 11211 MaybeObject* JSObject::SetFastDoubleElementsCapacityAndLength( |
| 11219 int capacity, | 11212 int capacity, |
| 11220 int length) { | 11213 int length) { |
| 11221 Heap* heap = GetHeap(); | 11214 Heap* heap = GetHeap(); |
| 11222 // We should never end in here with a pixel or external array. | 11215 // We should never end in here with a pixel or external array. |
| 11223 ASSERT(!HasExternalArrayElements()); | 11216 ASSERT(!HasExternalArrayElements()); |
| 11224 ASSERT(!map()->is_observed()); | |
| 11225 | 11217 |
| 11226 FixedArrayBase* elems; | 11218 FixedArrayBase* elems; |
| 11227 { MaybeObject* maybe_obj = | 11219 { MaybeObject* maybe_obj = |
| 11228 heap->AllocateUninitializedFixedDoubleArray(capacity); | 11220 heap->AllocateUninitializedFixedDoubleArray(capacity); |
| 11229 if (!maybe_obj->To(&elems)) return maybe_obj; | 11221 if (!maybe_obj->To(&elems)) return maybe_obj; |
| 11230 } | 11222 } |
| 11231 | 11223 |
| 11232 ElementsKind elements_kind = GetElementsKind(); | 11224 ElementsKind elements_kind = GetElementsKind(); |
| 11233 ElementsKind new_elements_kind = elements_kind; | 11225 ElementsKind new_elements_kind = elements_kind; |
| 11234 if (IsHoleyElementsKind(elements_kind)) { | 11226 if (IsHoleyElementsKind(elements_kind)) { |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11363 List<uint32_t> indices; | 11355 List<uint32_t> indices; |
| 11364 List<Handle<Object> > old_values; | 11356 List<Handle<Object> > old_values; |
| 11365 Handle<Object> old_length_handle(self->length(), isolate); | 11357 Handle<Object> old_length_handle(self->length(), isolate); |
| 11366 Handle<Object> new_length_handle(len, isolate); | 11358 Handle<Object> new_length_handle(len, isolate); |
| 11367 uint32_t old_length = 0; | 11359 uint32_t old_length = 0; |
| 11368 CHECK(old_length_handle->ToArrayIndex(&old_length)); | 11360 CHECK(old_length_handle->ToArrayIndex(&old_length)); |
| 11369 uint32_t new_length = 0; | 11361 uint32_t new_length = 0; |
| 11370 if (!new_length_handle->ToArrayIndex(&new_length)) | 11362 if (!new_length_handle->ToArrayIndex(&new_length)) |
| 11371 return Failure::InternalError(); | 11363 return Failure::InternalError(); |
| 11372 | 11364 |
| 11365 // TODO(adamk): The below used to be true but is no longer. |
| 11373 // Observed arrays should always be in dictionary mode; | 11366 // Observed arrays should always be in dictionary mode; |
| 11374 // if they were in fast mode, the below is slower than necessary | 11367 // if they were in fast mode, the below is slower than necessary |
| 11375 // as it iterates over the array backing store multiple times. | 11368 // as it iterates over the array backing store multiple times. |
| 11376 ASSERT(self->HasDictionaryElements()); | |
| 11377 static const PropertyAttributes kNoAttrFilter = NONE; | 11369 static const PropertyAttributes kNoAttrFilter = NONE; |
| 11378 int num_elements = self->NumberOfLocalElements(kNoAttrFilter); | 11370 int num_elements = self->NumberOfLocalElements(kNoAttrFilter); |
| 11379 if (num_elements > 0) { | 11371 if (num_elements > 0) { |
| 11380 if (old_length == static_cast<uint32_t>(num_elements)) { | 11372 if (old_length == static_cast<uint32_t>(num_elements)) { |
| 11381 // Simple case for arrays without holes. | 11373 // Simple case for arrays without holes. |
| 11382 for (uint32_t i = old_length - 1; i + 1 > new_length; --i) { | 11374 for (uint32_t i = old_length - 1; i + 1 > new_length; --i) { |
| 11383 if (!GetOldValue(isolate, self, i, &old_values, &indices)) break; | 11375 if (!GetOldValue(isolate, self, i, &old_values, &indices)) break; |
| 11384 } | 11376 } |
| 11385 } else { | 11377 } else { |
| 11386 // For sparse arrays, only iterate over existing elements. | 11378 // For sparse arrays, only iterate over existing elements. |
| (...skipping 1376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12763 ElementsKindToString(to_kind)); | 12755 ElementsKindToString(to_kind)); |
| 12764 } | 12756 } |
| 12765 site->set_transition_info(Smi::FromInt(to_kind)); | 12757 site->set_transition_info(Smi::FromInt(to_kind)); |
| 12766 } | 12758 } |
| 12767 } | 12759 } |
| 12768 return this; | 12760 return this; |
| 12769 } | 12761 } |
| 12770 | 12762 |
| 12771 | 12763 |
| 12772 MaybeObject* JSObject::TransitionElementsKind(ElementsKind to_kind) { | 12764 MaybeObject* JSObject::TransitionElementsKind(ElementsKind to_kind) { |
| 12773 ASSERT(!map()->is_observed()); | |
| 12774 ElementsKind from_kind = map()->elements_kind(); | 12765 ElementsKind from_kind = map()->elements_kind(); |
| 12775 | 12766 |
| 12776 if (IsFastHoleyElementsKind(from_kind)) { | 12767 if (IsFastHoleyElementsKind(from_kind)) { |
| 12777 to_kind = GetHoleyElementsKind(to_kind); | 12768 to_kind = GetHoleyElementsKind(to_kind); |
| 12778 } | 12769 } |
| 12779 | 12770 |
| 12780 if (from_kind == to_kind) return this; | 12771 if (from_kind == to_kind) return this; |
| 12781 | 12772 |
| 12782 MaybeObject* maybe_failure = UpdateAllocationSite(to_kind); | 12773 MaybeObject* maybe_failure = UpdateAllocationSite(to_kind); |
| 12783 if (maybe_failure->IsFailure()) return maybe_failure; | 12774 if (maybe_failure->IsFailure()) return maybe_failure; |
| (...skipping 3612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16396 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16387 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16397 static const char* error_messages_[] = { | 16388 static const char* error_messages_[] = { |
| 16398 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16389 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16399 }; | 16390 }; |
| 16400 #undef ERROR_MESSAGES_TEXTS | 16391 #undef ERROR_MESSAGES_TEXTS |
| 16401 return error_messages_[reason]; | 16392 return error_messages_[reason]; |
| 16402 } | 16393 } |
| 16403 | 16394 |
| 16404 | 16395 |
| 16405 } } // namespace v8::internal | 16396 } } // namespace v8::internal |
| OLD | NEW |