Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(501)

Side by Side Diff: src/elements.cc

Issue 1232463005: Use entry rather than index in ElementsAccessor::Set (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add comment Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/elements.h ('k') | src/lookup.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/v8.h" 5 #include "src/v8.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/elements.h" 9 #include "src/elements.h"
10 #include "src/messages.h" 10 #include "src/messages.h"
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 Handle<FixedArrayBase> backing_store) { 567 Handle<FixedArrayBase> backing_store) {
568 if (index < 568 if (index <
569 ElementsAccessorSubclass::GetCapacityImpl(*obj, *backing_store)) { 569 ElementsAccessorSubclass::GetCapacityImpl(*obj, *backing_store)) {
570 return BackingStore::get(Handle<BackingStore>::cast(backing_store), 570 return BackingStore::get(Handle<BackingStore>::cast(backing_store),
571 index); 571 index);
572 } else { 572 } else {
573 return backing_store->GetIsolate()->factory()->the_hole_value(); 573 return backing_store->GetIsolate()->factory()->the_hole_value();
574 } 574 }
575 } 575 }
576 576
577 virtual void Set(FixedArrayBase* backing_store, uint32_t index, 577 virtual void Set(FixedArrayBase* backing_store, uint32_t entry,
578 Object* value) final { 578 Object* value) final {
579 ElementsAccessorSubclass::SetImpl(backing_store, index, value); 579 ElementsAccessorSubclass::SetImpl(backing_store, entry, value);
580 } 580 }
581 581
582 static void SetImpl(FixedArrayBase* backing_store, uint32_t index, 582 static void SetImpl(FixedArrayBase* backing_store, uint32_t entry,
583 Object* value) { 583 Object* value) {
584 BackingStore::cast(backing_store)->SetValue(index, value); 584 BackingStore::cast(backing_store)->SetValue(entry, value);
585 } 585 }
586 586
587 virtual void Reconfigure(Handle<JSObject> object, 587 virtual void Reconfigure(Handle<JSObject> object,
588 Handle<FixedArrayBase> store, uint32_t entry, 588 Handle<FixedArrayBase> store, uint32_t entry,
589 Handle<Object> value, 589 Handle<Object> value,
590 PropertyAttributes attributes) final { 590 PropertyAttributes attributes) final {
591 ElementsAccessorSubclass::ReconfigureImpl(object, store, entry, value, 591 ElementsAccessorSubclass::ReconfigureImpl(object, store, entry, value,
592 attributes); 592 attributes);
593 } 593 }
594 594
595 static void ReconfigureImpl(Handle<JSObject> object, 595 static void ReconfigureImpl(Handle<JSObject> object,
596 Handle<FixedArrayBase> store, uint32_t entry, 596 Handle<FixedArrayBase> store, uint32_t entry,
597 Handle<Object> value, 597 Handle<Object> value,
598 PropertyAttributes attributes) { 598 PropertyAttributes attributes) {
599 UNREACHABLE(); 599 UNREACHABLE();
600 } 600 }
601 601
602 virtual void Add(Handle<JSObject> object, uint32_t entry, 602 virtual void Add(Handle<JSObject> object, uint32_t index,
603 Handle<Object> value, PropertyAttributes attributes, 603 Handle<Object> value, PropertyAttributes attributes,
604 uint32_t new_capacity) final { 604 uint32_t new_capacity) final {
605 ElementsAccessorSubclass::AddImpl(object, entry, value, attributes, 605 ElementsAccessorSubclass::AddImpl(object, index, value, attributes,
606 new_capacity); 606 new_capacity);
607 } 607 }
608 608
609 static void AddImpl(Handle<JSObject> object, uint32_t entry, 609 static void AddImpl(Handle<JSObject> object, uint32_t index,
610 Handle<Object> value, PropertyAttributes attributes, 610 Handle<Object> value, PropertyAttributes attributes,
611 uint32_t new_capacity) { 611 uint32_t new_capacity) {
612 UNREACHABLE(); 612 UNREACHABLE();
613 } 613 }
614 614
615 virtual void SetLength(Handle<JSArray> array, uint32_t length) final { 615 virtual void SetLength(Handle<JSArray> array, uint32_t length) final {
616 ElementsAccessorSubclass::SetLengthImpl(array, length, 616 ElementsAccessorSubclass::SetLengthImpl(array, length,
617 handle(array->elements())); 617 handle(array->elements()));
618 } 618 }
619 619
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
950 Handle<SeededNumberDictionary> backing_store = 950 Handle<SeededNumberDictionary> backing_store =
951 Handle<SeededNumberDictionary>::cast(store); 951 Handle<SeededNumberDictionary>::cast(store);
952 Isolate* isolate = backing_store->GetIsolate(); 952 Isolate* isolate = backing_store->GetIsolate();
953 int entry = backing_store->FindEntry(index); 953 int entry = backing_store->FindEntry(index);
954 if (entry != SeededNumberDictionary::kNotFound) { 954 if (entry != SeededNumberDictionary::kNotFound) {
955 return handle(backing_store->ValueAt(entry), isolate); 955 return handle(backing_store->ValueAt(entry), isolate);
956 } 956 }
957 return isolate->factory()->the_hole_value(); 957 return isolate->factory()->the_hole_value();
958 } 958 }
959 959
960 static void SetImpl(FixedArrayBase* store, uint32_t index, Object* value) { 960 static void SetImpl(FixedArrayBase* store, uint32_t entry, Object* value) {
961 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(store); 961 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(store);
962 int entry = dictionary->FindEntry(index);
963 DCHECK_NE(SeededNumberDictionary::kNotFound, entry);
964 dictionary->ValueAtPut(entry, value); 962 dictionary->ValueAtPut(entry, value);
965 } 963 }
966 964
967 static void ReconfigureImpl(Handle<JSObject> object, 965 static void ReconfigureImpl(Handle<JSObject> object,
968 Handle<FixedArrayBase> store, uint32_t entry, 966 Handle<FixedArrayBase> store, uint32_t entry,
969 Handle<Object> value, 967 Handle<Object> value,
970 PropertyAttributes attributes) { 968 PropertyAttributes attributes) {
971 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(*store); 969 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(*store);
972 if (attributes != NONE) dictionary->set_requires_slow_elements(); 970 if (attributes != NONE) dictionary->set_requires_slow_elements();
973 dictionary->ValueAtPut(entry, *value); 971 dictionary->ValueAtPut(entry, *value);
974 PropertyDetails details = dictionary->DetailsAt(entry); 972 PropertyDetails details = dictionary->DetailsAt(entry);
975 details = PropertyDetails(attributes, DATA, details.dictionary_index(), 973 details = PropertyDetails(attributes, DATA, details.dictionary_index(),
976 PropertyCellType::kNoCell); 974 PropertyCellType::kNoCell);
977 dictionary->DetailsAtPut(entry, details); 975 dictionary->DetailsAtPut(entry, details);
978 } 976 }
979 977
980 static void AddImpl(Handle<JSObject> object, uint32_t entry, 978 static void AddImpl(Handle<JSObject> object, uint32_t index,
981 Handle<Object> value, PropertyAttributes attributes, 979 Handle<Object> value, PropertyAttributes attributes,
982 uint32_t new_capacity) { 980 uint32_t new_capacity) {
983 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell); 981 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell);
984 Handle<SeededNumberDictionary> dictionary = 982 Handle<SeededNumberDictionary> dictionary =
985 object->HasFastElements() 983 object->HasFastElements()
986 ? JSObject::NormalizeElements(object) 984 ? JSObject::NormalizeElements(object)
987 : handle(SeededNumberDictionary::cast(object->elements())); 985 : handle(SeededNumberDictionary::cast(object->elements()));
988 Handle<SeededNumberDictionary> new_dictionary = 986 Handle<SeededNumberDictionary> new_dictionary =
989 SeededNumberDictionary::AddNumberEntry(dictionary, entry, value, 987 SeededNumberDictionary::AddNumberEntry(dictionary, index, value,
990 details); 988 details);
991 if (attributes != NONE) new_dictionary->set_requires_slow_elements(); 989 if (attributes != NONE) new_dictionary->set_requires_slow_elements();
992 if (dictionary.is_identical_to(new_dictionary)) return; 990 if (dictionary.is_identical_to(new_dictionary)) return;
993 object->set_elements(*new_dictionary); 991 object->set_elements(*new_dictionary);
994 } 992 }
995 993
996 static bool HasEntryImpl(FixedArrayBase* store, uint32_t entry) { 994 static bool HasEntryImpl(FixedArrayBase* store, uint32_t entry) {
997 DisallowHeapAllocation no_gc; 995 DisallowHeapAllocation no_gc;
998 SeededNumberDictionary* dict = SeededNumberDictionary::cast(store); 996 SeededNumberDictionary* dict = SeededNumberDictionary::cast(store);
999 Object* index = dict->KeyAt(entry); 997 Object* index = dict->KeyAt(entry);
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1114 Handle<FixedArrayBase> store, uint32_t entry, 1112 Handle<FixedArrayBase> store, uint32_t entry,
1115 Handle<Object> value, 1113 Handle<Object> value,
1116 PropertyAttributes attributes) { 1114 PropertyAttributes attributes) {
1117 Handle<SeededNumberDictionary> dictionary = 1115 Handle<SeededNumberDictionary> dictionary =
1118 JSObject::NormalizeElements(object); 1116 JSObject::NormalizeElements(object);
1119 entry = dictionary->FindEntry(entry); 1117 entry = dictionary->FindEntry(entry);
1120 DictionaryElementsAccessor::ReconfigureImpl(object, dictionary, entry, 1118 DictionaryElementsAccessor::ReconfigureImpl(object, dictionary, entry,
1121 value, attributes); 1119 value, attributes);
1122 } 1120 }
1123 1121
1124 static void AddImpl(Handle<JSObject> object, uint32_t entry, 1122 static void AddImpl(Handle<JSObject> object, uint32_t index,
1125 Handle<Object> value, PropertyAttributes attributes, 1123 Handle<Object> value, PropertyAttributes attributes,
1126 uint32_t new_capacity) { 1124 uint32_t new_capacity) {
1127 DCHECK_EQ(NONE, attributes); 1125 DCHECK_EQ(NONE, attributes);
1128 ElementsKind from_kind = object->GetElementsKind(); 1126 ElementsKind from_kind = object->GetElementsKind();
1129 ElementsKind to_kind = FastElementsAccessorSubclass::kind(); 1127 ElementsKind to_kind = FastElementsAccessorSubclass::kind();
1130 if (IsDictionaryElementsKind(from_kind) || 1128 if (IsDictionaryElementsKind(from_kind) ||
1131 IsFastDoubleElementsKind(from_kind) != 1129 IsFastDoubleElementsKind(from_kind) !=
1132 IsFastDoubleElementsKind(to_kind) || 1130 IsFastDoubleElementsKind(to_kind) ||
1133 FastElementsAccessorSubclass::GetCapacityImpl( 1131 FastElementsAccessorSubclass::GetCapacityImpl(
1134 *object, object->elements()) != new_capacity) { 1132 *object, object->elements()) != new_capacity) {
1135 FastElementsAccessorSubclass::GrowCapacityAndConvertImpl(object, 1133 FastElementsAccessorSubclass::GrowCapacityAndConvertImpl(object,
1136 new_capacity); 1134 new_capacity);
1137 } else { 1135 } else {
1138 if (from_kind != to_kind) { 1136 if (from_kind != to_kind) {
1139 JSObject::TransitionElementsKind(object, to_kind); 1137 JSObject::TransitionElementsKind(object, to_kind);
1140 } 1138 }
1141 if (IsFastSmiOrObjectElementsKind(from_kind)) { 1139 if (IsFastSmiOrObjectElementsKind(from_kind)) {
1142 DCHECK(IsFastSmiOrObjectElementsKind(to_kind)); 1140 DCHECK(IsFastSmiOrObjectElementsKind(to_kind));
1143 JSObject::EnsureWritableFastElements(object); 1141 JSObject::EnsureWritableFastElements(object);
1144 } 1142 }
1145 } 1143 }
1146 FastElementsAccessorSubclass::SetImpl(object->elements(), entry, *value); 1144 FastElementsAccessorSubclass::SetImpl(object->elements(), index, *value);
1147 } 1145 }
1148 1146
1149 static void DeleteImpl(Handle<JSObject> obj, uint32_t entry) { 1147 static void DeleteImpl(Handle<JSObject> obj, uint32_t entry) {
1150 ElementsKind kind = KindTraits::Kind; 1148 ElementsKind kind = KindTraits::Kind;
1151 if (IsFastPackedElementsKind(kind)) { 1149 if (IsFastPackedElementsKind(kind)) {
1152 JSObject::TransitionElementsKind(obj, GetHoleyElementsKind(kind)); 1150 JSObject::TransitionElementsKind(obj, GetHoleyElementsKind(kind));
1153 } 1151 }
1154 if (IsFastSmiOrObjectElementsKind(KindTraits::Kind)) { 1152 if (IsFastSmiOrObjectElementsKind(KindTraits::Kind)) {
1155 JSObject::EnsureWritableFastElements(obj); 1153 JSObject::EnsureWritableFastElements(obj);
1156 } 1154 }
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
1471 return result; 1469 return result;
1472 } 1470 }
1473 } 1471 }
1474 } 1472 }
1475 1473
1476 static void GrowCapacityAndConvertImpl(Handle<JSObject> object, 1474 static void GrowCapacityAndConvertImpl(Handle<JSObject> object,
1477 uint32_t capacity) { 1475 uint32_t capacity) {
1478 UNREACHABLE(); 1476 UNREACHABLE();
1479 } 1477 }
1480 1478
1481 static void SetImpl(FixedArrayBase* store, uint32_t index, Object* value) { 1479 static void SetImpl(FixedArrayBase* store, uint32_t entry, Object* value) {
1482 FixedArray* parameter_map = FixedArray::cast(store); 1480 FixedArray* parameter_map = FixedArray::cast(store);
1483 Object* probe = GetParameterMapArg(parameter_map, index); 1481 uint32_t length = parameter_map->length() - 2;
1484 if (!probe->IsTheHole()) { 1482 if (entry < length) {
1483 Object* probe = parameter_map->get(entry + 2);
1485 Context* context = Context::cast(parameter_map->get(0)); 1484 Context* context = Context::cast(parameter_map->get(0));
1486 int context_entry = Smi::cast(probe)->value(); 1485 int context_entry = Smi::cast(probe)->value();
1487 DCHECK(!context->get(context_entry)->IsTheHole()); 1486 DCHECK(!context->get(context_entry)->IsTheHole());
1488 context->set(context_entry, value); 1487 context->set(context_entry, value);
1489 } else { 1488 } else {
1490 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); 1489 FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
1491 ArgumentsAccessor::SetImpl(arguments, index, value); 1490 ArgumentsAccessor::SetImpl(arguments, entry - length, value);
1492 } 1491 }
1493 } 1492 }
1494 1493
1495 static void SetLengthImpl(Handle<JSArray> array, uint32_t length, 1494 static void SetLengthImpl(Handle<JSArray> array, uint32_t length,
1496 Handle<FixedArrayBase> parameter_map) { 1495 Handle<FixedArrayBase> parameter_map) {
1497 // Sloppy arguments objects are not arrays. 1496 // Sloppy arguments objects are not arrays.
1498 UNREACHABLE(); 1497 UNREACHABLE();
1499 } 1498 }
1500 1499
1501 static uint32_t GetCapacityImpl(JSObject* holder, 1500 static uint32_t GetCapacityImpl(JSObject* holder,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1541 return (parameter_map->length() - 2) + entry; 1540 return (parameter_map->length() - 2) + entry;
1542 } 1541 }
1543 1542
1544 static PropertyDetails GetDetailsImpl(FixedArrayBase* parameters, 1543 static PropertyDetails GetDetailsImpl(FixedArrayBase* parameters,
1545 uint32_t entry) { 1544 uint32_t entry) {
1546 FixedArray* parameter_map = FixedArray::cast(parameters); 1545 FixedArray* parameter_map = FixedArray::cast(parameters);
1547 uint32_t length = parameter_map->length() - 2; 1546 uint32_t length = parameter_map->length() - 2;
1548 if (entry < length) { 1547 if (entry < length) {
1549 return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell); 1548 return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell);
1550 } 1549 }
1551 entry -= length;
1552 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); 1550 FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
1553 return ArgumentsAccessor::GetDetailsImpl(arguments, entry); 1551 return ArgumentsAccessor::GetDetailsImpl(arguments, entry - length);
1554 } 1552 }
1555 1553
1556 static Object* GetParameterMapArg(FixedArray* parameter_map, uint32_t index) { 1554 static Object* GetParameterMapArg(FixedArray* parameter_map, uint32_t index) {
1557 uint32_t length = parameter_map->length() - 2; 1555 uint32_t length = parameter_map->length() - 2;
1558 return index < length 1556 return index < length
1559 ? parameter_map->get(index + 2) 1557 ? parameter_map->get(index + 2)
1560 : Object::cast(parameter_map->GetHeap()->the_hole_value()); 1558 : Object::cast(parameter_map->GetHeap()->the_hole_value());
1561 } 1559 }
1562 1560
1563 static void DeleteImpl(Handle<JSObject> obj, uint32_t entry) { 1561 static void DeleteImpl(Handle<JSObject> obj, uint32_t entry) {
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1679 Handle<Object> value, PropertyAttributes attributes, 1677 Handle<Object> value, PropertyAttributes attributes,
1680 uint32_t new_capacity) { 1678 uint32_t new_capacity) {
1681 DCHECK_EQ(NONE, attributes); 1679 DCHECK_EQ(NONE, attributes);
1682 Handle<FixedArray> parameter_map(FixedArray::cast(object->elements())); 1680 Handle<FixedArray> parameter_map(FixedArray::cast(object->elements()));
1683 Handle<FixedArrayBase> old_elements( 1681 Handle<FixedArrayBase> old_elements(
1684 FixedArrayBase::cast(parameter_map->get(1))); 1682 FixedArrayBase::cast(parameter_map->get(1)));
1685 if (old_elements->IsSeededNumberDictionary() || 1683 if (old_elements->IsSeededNumberDictionary() ||
1686 static_cast<uint32_t>(old_elements->length()) < new_capacity) { 1684 static_cast<uint32_t>(old_elements->length()) < new_capacity) {
1687 GrowCapacityAndConvertImpl(object, new_capacity); 1685 GrowCapacityAndConvertImpl(object, new_capacity);
1688 } 1686 }
1689 SetImpl(object->elements(), index, *value); 1687 FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
1688 // For fast holey objects, the entry equals the index. The code above made
1689 // sure that there's enough space to store the value. We cannot convert
1690 // index to entry explicitly since the slot still contains the hole, so the
1691 // current EntryForIndex would indicate that it is "absent" by returning
1692 // kMaxUInt32.
1693 FastHoleyObjectElementsAccessor::SetImpl(arguments, index, *value);
1690 } 1694 }
1691 1695
1692 static void ReconfigureImpl(Handle<JSObject> object, 1696 static void ReconfigureImpl(Handle<JSObject> object,
1693 Handle<FixedArrayBase> store, uint32_t entry, 1697 Handle<FixedArrayBase> store, uint32_t entry,
1694 Handle<Object> value, 1698 Handle<Object> value,
1695 PropertyAttributes attributes) { 1699 PropertyAttributes attributes) {
1696 Handle<SeededNumberDictionary> dictionary = 1700 Handle<SeededNumberDictionary> dictionary =
1697 JSObject::NormalizeElements(object); 1701 JSObject::NormalizeElements(object);
1698 FixedArray::cast(*store)->set(1, *dictionary); 1702 FixedArray::cast(*store)->set(1, *dictionary);
1699 uint32_t length = static_cast<uint32_t>(store->length()) - 2; 1703 uint32_t length = static_cast<uint32_t>(store->length()) - 2;
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
1935 #define ACCESSOR_DELETE(Class, Kind, Store) delete elements_accessors_[Kind]; 1939 #define ACCESSOR_DELETE(Class, Kind, Store) delete elements_accessors_[Kind];
1936 ELEMENTS_LIST(ACCESSOR_DELETE) 1940 ELEMENTS_LIST(ACCESSOR_DELETE)
1937 #undef ACCESSOR_DELETE 1941 #undef ACCESSOR_DELETE
1938 elements_accessors_ = NULL; 1942 elements_accessors_ = NULL;
1939 } 1943 }
1940 1944
1941 1945
1942 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; 1946 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL;
1943 } // namespace internal 1947 } // namespace internal
1944 } // namespace v8 1948 } // namespace v8
OLDNEW
« no previous file with comments | « src/elements.h ('k') | src/lookup.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698