| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/elements.h" | 5 #include "src/elements.h" |
| 6 | 6 |
| 7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/conversions.h" | 8 #include "src/conversions.h" |
| 9 #include "src/factory.h" | 9 #include "src/factory.h" |
| 10 #include "src/isolate-inl.h" | 10 #include "src/isolate-inl.h" |
| (...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1034 // Collect the element indices into a new list. | 1034 // Collect the element indices into a new list. |
| 1035 uint32_t nof_indices = 0; | 1035 uint32_t nof_indices = 0; |
| 1036 Handle<FixedArray> combined_keys = | 1036 Handle<FixedArray> combined_keys = |
| 1037 isolate->factory()->NewFixedArray(initial_list_length); | 1037 isolate->factory()->NewFixedArray(initial_list_length); |
| 1038 combined_keys = Subclass::DirectCollectElementIndicesImpl( | 1038 combined_keys = Subclass::DirectCollectElementIndicesImpl( |
| 1039 isolate, object, backing_store, | 1039 isolate, object, backing_store, |
| 1040 needs_sorting ? GetKeysConversion::kKeepNumbers : convert, filter, | 1040 needs_sorting ? GetKeysConversion::kKeepNumbers : convert, filter, |
| 1041 combined_keys, &nof_indices); | 1041 combined_keys, &nof_indices); |
| 1042 | 1042 |
| 1043 if (needs_sorting) { | 1043 if (needs_sorting) { |
| 1044 SortIndices(combined_keys, nof_indices, SKIP_WRITE_BARRIER); | 1044 SortIndices(combined_keys, nof_indices); |
| 1045 uint32_t array_length = 0; | |
| 1046 // Indices from dictionary elements should only be converted after | 1045 // Indices from dictionary elements should only be converted after |
| 1047 // sorting. | 1046 // sorting. |
| 1048 if (convert == GetKeysConversion::kConvertToString) { | 1047 if (convert == GetKeysConversion::kConvertToString) { |
| 1049 for (uint32_t i = 0; i < nof_indices; i++) { | 1048 for (uint32_t i = 0; i < nof_indices; i++) { |
| 1050 Handle<Object> index_string = isolate->factory()->Uint32ToString( | 1049 Handle<Object> index_string = isolate->factory()->Uint32ToString( |
| 1051 combined_keys->get(i)->Number()); | 1050 combined_keys->get(i)->Number()); |
| 1052 combined_keys->set(i, *index_string); | 1051 combined_keys->set(i, *index_string); |
| 1053 } | 1052 } |
| 1054 } else if (!(object->IsJSArray() && | |
| 1055 JSArray::cast(*object)->length()->ToArrayLength( | |
| 1056 &array_length) && | |
| 1057 array_length <= Smi::kMaxValue)) { | |
| 1058 // Since we use std::sort above, the GC will no longer know where the | |
| 1059 // HeapNumbers are. For Arrays with valid Smi length, we are sure to | |
| 1060 // have no HeapNumber indices and thus we can skip this step. | |
| 1061 FIXED_ARRAY_ELEMENTS_WRITE_BARRIER(isolate->heap(), *combined_keys, 0, | |
| 1062 nof_indices); | |
| 1063 } | 1053 } |
| 1064 } | 1054 } |
| 1065 | 1055 |
| 1066 // Copy over the passed-in property keys. | 1056 // Copy over the passed-in property keys. |
| 1067 CopyObjectToObjectElements(*keys, FAST_ELEMENTS, 0, *combined_keys, | 1057 CopyObjectToObjectElements(*keys, FAST_ELEMENTS, 0, *combined_keys, |
| 1068 FAST_ELEMENTS, nof_indices, nof_property_keys); | 1058 FAST_ELEMENTS, nof_indices, nof_property_keys); |
| 1069 | 1059 |
| 1070 // For holey elements and arguments we might have to shrink the collected | 1060 // For holey elements and arguments we might have to shrink the collected |
| 1071 // keys since the estimates might be off. | 1061 // keys since the estimates might be off. |
| 1072 if (IsHoleyElementsKind(kind()) || IsSloppyArgumentsElements(kind())) { | 1062 if (IsHoleyElementsKind(kind()) || IsSloppyArgumentsElements(kind())) { |
| (...skipping 2018 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3091 insertion_index += len; | 3081 insertion_index += len; |
| 3092 } | 3082 } |
| 3093 | 3083 |
| 3094 DCHECK_EQ(insertion_index, result_len); | 3084 DCHECK_EQ(insertion_index, result_len); |
| 3095 return result_array; | 3085 return result_array; |
| 3096 } | 3086 } |
| 3097 | 3087 |
| 3098 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; | 3088 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; |
| 3099 } // namespace internal | 3089 } // namespace internal |
| 3100 } // namespace v8 | 3090 } // namespace v8 |
| OLD | NEW |