| 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 1229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1240 | 1240 |
| 1241 uint32_t GetEntryForIndex(Isolate* isolate, JSObject* holder, | 1241 uint32_t GetEntryForIndex(Isolate* isolate, JSObject* holder, |
| 1242 FixedArrayBase* backing_store, | 1242 FixedArrayBase* backing_store, |
| 1243 uint32_t index) final { | 1243 uint32_t index) final { |
| 1244 return Subclass::GetEntryForIndexImpl(isolate, holder, backing_store, index, | 1244 return Subclass::GetEntryForIndexImpl(isolate, holder, backing_store, index, |
| 1245 ALL_PROPERTIES); | 1245 ALL_PROPERTIES); |
| 1246 } | 1246 } |
| 1247 | 1247 |
| 1248 static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store, | 1248 static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store, |
| 1249 uint32_t entry) { | 1249 uint32_t entry) { |
| 1250 return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell); | 1250 return PropertyDetails(kData, NONE, 0, PropertyCellType::kNoCell); |
| 1251 } | 1251 } |
| 1252 | 1252 |
| 1253 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { | 1253 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { |
| 1254 return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell); | 1254 return PropertyDetails(kData, NONE, 0, PropertyCellType::kNoCell); |
| 1255 } | 1255 } |
| 1256 | 1256 |
| 1257 PropertyDetails GetDetails(JSObject* holder, uint32_t entry) final { | 1257 PropertyDetails GetDetails(JSObject* holder, uint32_t entry) final { |
| 1258 return Subclass::GetDetailsImpl(holder, entry); | 1258 return Subclass::GetDetailsImpl(holder, entry); |
| 1259 } | 1259 } |
| 1260 | 1260 |
| 1261 Handle<FixedArray> CreateListFromArray(Isolate* isolate, | 1261 Handle<FixedArray> CreateListFromArray(Isolate* isolate, |
| 1262 Handle<JSArray> array) final { | 1262 Handle<JSArray> array) final { |
| 1263 return Subclass::CreateListFromArrayImpl(isolate, array); | 1263 return Subclass::CreateListFromArrayImpl(isolate, array); |
| 1264 }; | 1264 }; |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1410 } | 1410 } |
| 1411 | 1411 |
| 1412 static void ReconfigureImpl(Handle<JSObject> object, | 1412 static void ReconfigureImpl(Handle<JSObject> object, |
| 1413 Handle<FixedArrayBase> store, uint32_t entry, | 1413 Handle<FixedArrayBase> store, uint32_t entry, |
| 1414 Handle<Object> value, | 1414 Handle<Object> value, |
| 1415 PropertyAttributes attributes) { | 1415 PropertyAttributes attributes) { |
| 1416 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(*store); | 1416 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(*store); |
| 1417 if (attributes != NONE) object->RequireSlowElements(dictionary); | 1417 if (attributes != NONE) object->RequireSlowElements(dictionary); |
| 1418 dictionary->ValueAtPut(entry, *value); | 1418 dictionary->ValueAtPut(entry, *value); |
| 1419 PropertyDetails details = dictionary->DetailsAt(entry); | 1419 PropertyDetails details = dictionary->DetailsAt(entry); |
| 1420 details = PropertyDetails(attributes, DATA, details.dictionary_index(), | 1420 details = PropertyDetails(kData, attributes, details.dictionary_index(), |
| 1421 PropertyCellType::kNoCell); | 1421 PropertyCellType::kNoCell); |
| 1422 dictionary->DetailsAtPut(entry, details); | 1422 dictionary->DetailsAtPut(entry, details); |
| 1423 } | 1423 } |
| 1424 | 1424 |
| 1425 static void AddImpl(Handle<JSObject> object, uint32_t index, | 1425 static void AddImpl(Handle<JSObject> object, uint32_t index, |
| 1426 Handle<Object> value, PropertyAttributes attributes, | 1426 Handle<Object> value, PropertyAttributes attributes, |
| 1427 uint32_t new_capacity) { | 1427 uint32_t new_capacity) { |
| 1428 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell); | 1428 PropertyDetails details(kData, attributes, 0, PropertyCellType::kNoCell); |
| 1429 Handle<SeededNumberDictionary> dictionary = | 1429 Handle<SeededNumberDictionary> dictionary = |
| 1430 object->HasFastElements() || object->HasFastStringWrapperElements() | 1430 object->HasFastElements() || object->HasFastStringWrapperElements() |
| 1431 ? JSObject::NormalizeElements(object) | 1431 ? JSObject::NormalizeElements(object) |
| 1432 : handle(SeededNumberDictionary::cast(object->elements())); | 1432 : handle(SeededNumberDictionary::cast(object->elements())); |
| 1433 Handle<SeededNumberDictionary> new_dictionary = | 1433 Handle<SeededNumberDictionary> new_dictionary = |
| 1434 SeededNumberDictionary::AddNumberEntry(dictionary, index, value, | 1434 SeededNumberDictionary::AddNumberEntry(dictionary, index, value, |
| 1435 details, object); | 1435 details, object); |
| 1436 if (attributes != NONE) object->RequireSlowElements(*new_dictionary); | 1436 if (attributes != NONE) object->RequireSlowElements(*new_dictionary); |
| 1437 if (dictionary.is_identical_to(new_dictionary)) return; | 1437 if (dictionary.is_identical_to(new_dictionary)) return; |
| 1438 object->set_elements(*new_dictionary); | 1438 object->set_elements(*new_dictionary); |
| (...skipping 1275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2714 Object* value, WriteBarrierMode mode) { | 2714 Object* value, WriteBarrierMode mode) { |
| 2715 BackingStore::cast(backing_store)->SetValue(entry, value); | 2715 BackingStore::cast(backing_store)->SetValue(entry, value); |
| 2716 } | 2716 } |
| 2717 | 2717 |
| 2718 static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* backing_store, | 2718 static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* backing_store, |
| 2719 uint32_t entry) { | 2719 uint32_t entry) { |
| 2720 return BackingStore::get(BackingStore::cast(backing_store), entry); | 2720 return BackingStore::get(BackingStore::cast(backing_store), entry); |
| 2721 } | 2721 } |
| 2722 | 2722 |
| 2723 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { | 2723 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { |
| 2724 return PropertyDetails(DONT_DELETE, DATA, 0, PropertyCellType::kNoCell); | 2724 return PropertyDetails(kData, DONT_DELETE, 0, PropertyCellType::kNoCell); |
| 2725 } | 2725 } |
| 2726 | 2726 |
| 2727 static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store, | 2727 static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store, |
| 2728 uint32_t entry) { | 2728 uint32_t entry) { |
| 2729 return PropertyDetails(DONT_DELETE, DATA, 0, PropertyCellType::kNoCell); | 2729 return PropertyDetails(kData, DONT_DELETE, 0, PropertyCellType::kNoCell); |
| 2730 } | 2730 } |
| 2731 | 2731 |
| 2732 static bool HasElementImpl(Isolate* isolate, Handle<JSObject> holder, | 2732 static bool HasElementImpl(Isolate* isolate, Handle<JSObject> holder, |
| 2733 uint32_t index, | 2733 uint32_t index, |
| 2734 Handle<FixedArrayBase> backing_store, | 2734 Handle<FixedArrayBase> backing_store, |
| 2735 PropertyFilter filter) { | 2735 PropertyFilter filter) { |
| 2736 return index < AccessorClass::GetCapacityImpl(*holder, *backing_store); | 2736 return index < AccessorClass::GetCapacityImpl(*holder, *backing_store); |
| 2737 } | 2737 } |
| 2738 | 2738 |
| 2739 static bool HasAccessorsImpl(JSObject* holder, | 2739 static bool HasAccessorsImpl(JSObject* holder, |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3078 uint32_t entry = ArgumentsAccessor::GetEntryForIndexImpl( | 3078 uint32_t entry = ArgumentsAccessor::GetEntryForIndexImpl( |
| 3079 isolate, holder, arguments, index, filter); | 3079 isolate, holder, arguments, index, filter); |
| 3080 if (entry == kMaxUInt32) return kMaxUInt32; | 3080 if (entry == kMaxUInt32) return kMaxUInt32; |
| 3081 return (parameter_map->length() - 2) + entry; | 3081 return (parameter_map->length() - 2) + entry; |
| 3082 } | 3082 } |
| 3083 | 3083 |
| 3084 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { | 3084 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { |
| 3085 FixedArray* parameter_map = FixedArray::cast(holder->elements()); | 3085 FixedArray* parameter_map = FixedArray::cast(holder->elements()); |
| 3086 uint32_t length = parameter_map->length() - 2; | 3086 uint32_t length = parameter_map->length() - 2; |
| 3087 if (entry < length) { | 3087 if (entry < length) { |
| 3088 return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell); | 3088 return PropertyDetails(kData, NONE, 0, PropertyCellType::kNoCell); |
| 3089 } | 3089 } |
| 3090 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); | 3090 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); |
| 3091 return ArgumentsAccessor::GetDetailsImpl(arguments, entry - length); | 3091 return ArgumentsAccessor::GetDetailsImpl(arguments, entry - length); |
| 3092 } | 3092 } |
| 3093 | 3093 |
| 3094 static bool HasParameterMapArg(FixedArray* parameter_map, uint32_t index) { | 3094 static bool HasParameterMapArg(FixedArray* parameter_map, uint32_t index) { |
| 3095 uint32_t length = parameter_map->length() - 2; | 3095 uint32_t length = parameter_map->length() - 2; |
| 3096 if (index >= length) return false; | 3096 if (index >= length) return false; |
| 3097 return !parameter_map->get(index + 2)->IsTheHole( | 3097 return !parameter_map->get(index + 2)->IsTheHole( |
| 3098 parameter_map->GetIsolate()); | 3098 parameter_map->GetIsolate()); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3265 static void AddImpl(Handle<JSObject> object, uint32_t index, | 3265 static void AddImpl(Handle<JSObject> object, uint32_t index, |
| 3266 Handle<Object> value, PropertyAttributes attributes, | 3266 Handle<Object> value, PropertyAttributes attributes, |
| 3267 uint32_t new_capacity) { | 3267 uint32_t new_capacity) { |
| 3268 Handle<FixedArray> parameter_map(FixedArray::cast(object->elements())); | 3268 Handle<FixedArray> parameter_map(FixedArray::cast(object->elements())); |
| 3269 Handle<FixedArrayBase> old_elements( | 3269 Handle<FixedArrayBase> old_elements( |
| 3270 FixedArrayBase::cast(parameter_map->get(1))); | 3270 FixedArrayBase::cast(parameter_map->get(1))); |
| 3271 Handle<SeededNumberDictionary> dictionary = | 3271 Handle<SeededNumberDictionary> dictionary = |
| 3272 old_elements->IsSeededNumberDictionary() | 3272 old_elements->IsSeededNumberDictionary() |
| 3273 ? Handle<SeededNumberDictionary>::cast(old_elements) | 3273 ? Handle<SeededNumberDictionary>::cast(old_elements) |
| 3274 : JSObject::NormalizeElements(object); | 3274 : JSObject::NormalizeElements(object); |
| 3275 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell); | 3275 PropertyDetails details(kData, attributes, 0, PropertyCellType::kNoCell); |
| 3276 Handle<SeededNumberDictionary> new_dictionary = | 3276 Handle<SeededNumberDictionary> new_dictionary = |
| 3277 SeededNumberDictionary::AddNumberEntry(dictionary, index, value, | 3277 SeededNumberDictionary::AddNumberEntry(dictionary, index, value, |
| 3278 details, object); | 3278 details, object); |
| 3279 if (attributes != NONE) object->RequireSlowElements(*new_dictionary); | 3279 if (attributes != NONE) object->RequireSlowElements(*new_dictionary); |
| 3280 if (*dictionary != *new_dictionary) { | 3280 if (*dictionary != *new_dictionary) { |
| 3281 FixedArray::cast(object->elements())->set(1, *new_dictionary); | 3281 FixedArray::cast(object->elements())->set(1, *new_dictionary); |
| 3282 } | 3282 } |
| 3283 } | 3283 } |
| 3284 | 3284 |
| 3285 static void ReconfigureImpl(Handle<JSObject> object, | 3285 static void ReconfigureImpl(Handle<JSObject> object, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3297 DCHECK(!context->get(context_entry)->IsTheHole(isolate)); | 3297 DCHECK(!context->get(context_entry)->IsTheHole(isolate)); |
| 3298 context->set(context_entry, *value); | 3298 context->set(context_entry, *value); |
| 3299 | 3299 |
| 3300 // Redefining attributes of an aliased element destroys fast aliasing. | 3300 // Redefining attributes of an aliased element destroys fast aliasing. |
| 3301 parameter_map->set_the_hole(isolate, entry + 2); | 3301 parameter_map->set_the_hole(isolate, entry + 2); |
| 3302 // For elements that are still writable we re-establish slow aliasing. | 3302 // For elements that are still writable we re-establish slow aliasing. |
| 3303 if ((attributes & READ_ONLY) == 0) { | 3303 if ((attributes & READ_ONLY) == 0) { |
| 3304 value = isolate->factory()->NewAliasedArgumentsEntry(context_entry); | 3304 value = isolate->factory()->NewAliasedArgumentsEntry(context_entry); |
| 3305 } | 3305 } |
| 3306 | 3306 |
| 3307 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell); | 3307 PropertyDetails details(kData, attributes, 0, PropertyCellType::kNoCell); |
| 3308 Handle<SeededNumberDictionary> arguments( | 3308 Handle<SeededNumberDictionary> arguments( |
| 3309 SeededNumberDictionary::cast(parameter_map->get(1)), isolate); | 3309 SeededNumberDictionary::cast(parameter_map->get(1)), isolate); |
| 3310 arguments = SeededNumberDictionary::AddNumberEntry( | 3310 arguments = SeededNumberDictionary::AddNumberEntry( |
| 3311 arguments, entry, value, details, object); | 3311 arguments, entry, value, details, object); |
| 3312 // If the attributes were NONE, we would have called set rather than | 3312 // If the attributes were NONE, we would have called set rather than |
| 3313 // reconfigure. | 3313 // reconfigure. |
| 3314 DCHECK_NE(NONE, attributes); | 3314 DCHECK_NE(NONE, attributes); |
| 3315 object->RequireSlowElements(*arguments); | 3315 object->RequireSlowElements(*arguments); |
| 3316 parameter_map->set(1, *arguments); | 3316 parameter_map->set(1, *arguments); |
| 3317 } else { | 3317 } else { |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3476 uint32_t entry) { | 3476 uint32_t entry) { |
| 3477 UNREACHABLE(); | 3477 UNREACHABLE(); |
| 3478 return Handle<Object>(); | 3478 return Handle<Object>(); |
| 3479 } | 3479 } |
| 3480 | 3480 |
| 3481 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { | 3481 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { |
| 3482 uint32_t length = static_cast<uint32_t>(GetString(holder)->length()); | 3482 uint32_t length = static_cast<uint32_t>(GetString(holder)->length()); |
| 3483 if (entry < length) { | 3483 if (entry < length) { |
| 3484 PropertyAttributes attributes = | 3484 PropertyAttributes attributes = |
| 3485 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); | 3485 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); |
| 3486 return PropertyDetails(attributes, v8::internal::DATA, 0, | 3486 return PropertyDetails(kData, attributes, 0, PropertyCellType::kNoCell); |
| 3487 PropertyCellType::kNoCell); | |
| 3488 } | 3487 } |
| 3489 return BackingStoreAccessor::GetDetailsImpl(holder, entry - length); | 3488 return BackingStoreAccessor::GetDetailsImpl(holder, entry - length); |
| 3490 } | 3489 } |
| 3491 | 3490 |
| 3492 static uint32_t GetEntryForIndexImpl(Isolate* isolate, JSObject* holder, | 3491 static uint32_t GetEntryForIndexImpl(Isolate* isolate, JSObject* holder, |
| 3493 FixedArrayBase* backing_store, | 3492 FixedArrayBase* backing_store, |
| 3494 uint32_t index, PropertyFilter filter) { | 3493 uint32_t index, PropertyFilter filter) { |
| 3495 uint32_t length = static_cast<uint32_t>(GetString(holder)->length()); | 3494 uint32_t length = static_cast<uint32_t>(GetString(holder)->length()); |
| 3496 if (index < length) return index; | 3495 if (index < length) return index; |
| 3497 uint32_t backing_store_entry = BackingStoreAccessor::GetEntryForIndexImpl( | 3496 uint32_t backing_store_entry = BackingStoreAccessor::GetEntryForIndexImpl( |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3853 insertion_index += len; | 3852 insertion_index += len; |
| 3854 } | 3853 } |
| 3855 | 3854 |
| 3856 DCHECK_EQ(insertion_index, result_len); | 3855 DCHECK_EQ(insertion_index, result_len); |
| 3857 return result_array; | 3856 return result_array; |
| 3858 } | 3857 } |
| 3859 | 3858 |
| 3860 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; | 3859 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; |
| 3861 } // namespace internal | 3860 } // namespace internal |
| 3862 } // namespace v8 | 3861 } // namespace v8 |
| OLD | NEW |