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

Side by Side Diff: src/elements.cc

Issue 1233493007: Update the context if Set on slow-mode argument targets an aliased arguments entry (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: 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 | « no previous file | test/test262-es6/test262-es6.status » ('j') | test/test262-es6/test262-es6.status » ('J')
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 912 matching lines...) Expand 10 before | Expand all | Expand 10 after
923 SeededNumberDictionary::cast(obj->elements())); 923 SeededNumberDictionary::cast(obj->elements()));
924 uint32_t index = GetIndexForEntryImpl(*dict, entry); 924 uint32_t index = GetIndexForEntryImpl(*dict, entry);
925 Handle<Object> result = SeededNumberDictionary::DeleteProperty(dict, entry); 925 Handle<Object> result = SeededNumberDictionary::DeleteProperty(dict, entry);
926 USE(result); 926 USE(result);
927 DCHECK(result->IsTrue()); 927 DCHECK(result->IsTrue());
928 Handle<FixedArray> new_elements = 928 Handle<FixedArray> new_elements =
929 SeededNumberDictionary::Shrink(dict, index); 929 SeededNumberDictionary::Shrink(dict, index);
930 obj->set_elements(*new_elements); 930 obj->set_elements(*new_elements);
931 } 931 }
932 932
933 static Object* GetRaw(FixedArrayBase* store, uint32_t entry) {
934 SeededNumberDictionary* backing_store = SeededNumberDictionary::cast(store);
935 return backing_store->ValueAt(entry);
936 }
937
933 static Handle<Object> GetImpl(Handle<FixedArrayBase> store, uint32_t entry) { 938 static Handle<Object> GetImpl(Handle<FixedArrayBase> store, uint32_t entry) {
934 Handle<SeededNumberDictionary> backing_store = 939 Isolate* isolate = store->GetIsolate();
935 Handle<SeededNumberDictionary>::cast(store); 940 return handle(GetRaw(*store, entry), isolate);
936 Isolate* isolate = backing_store->GetIsolate();
937 return handle(backing_store->ValueAt(entry), isolate);
938 } 941 }
939 942
940 static void SetImpl(FixedArrayBase* store, uint32_t entry, Object* value) { 943 static void SetImpl(FixedArrayBase* store, uint32_t entry, Object* value) {
941 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(store); 944 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(store);
942 dictionary->ValueAtPut(entry, value); 945 dictionary->ValueAtPut(entry, value);
943 } 946 }
944 947
945 static void ReconfigureImpl(Handle<JSObject> object, 948 static void ReconfigureImpl(Handle<JSObject> object,
946 Handle<FixedArrayBase> store, uint32_t entry, 949 Handle<FixedArrayBase> store, uint32_t entry,
947 Handle<Object> value, 950 Handle<Object> value,
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
1168 1171
1169 template<typename FastElementsAccessorSubclass, 1172 template<typename FastElementsAccessorSubclass,
1170 typename KindTraits> 1173 typename KindTraits>
1171 class FastSmiOrObjectElementsAccessor 1174 class FastSmiOrObjectElementsAccessor
1172 : public FastElementsAccessor<FastElementsAccessorSubclass, KindTraits> { 1175 : public FastElementsAccessor<FastElementsAccessorSubclass, KindTraits> {
1173 public: 1176 public:
1174 explicit FastSmiOrObjectElementsAccessor(const char* name) 1177 explicit FastSmiOrObjectElementsAccessor(const char* name)
1175 : FastElementsAccessor<FastElementsAccessorSubclass, 1178 : FastElementsAccessor<FastElementsAccessorSubclass,
1176 KindTraits>(name) {} 1179 KindTraits>(name) {}
1177 1180
1181 static Object* GetRaw(FixedArray* backing_store, uint32_t entry) {
1182 uint32_t index = FastElementsAccessorSubclass::GetIndexForEntryImpl(
1183 backing_store, entry);
1184 return backing_store->get(index);
1185 }
1186
1178 // NOTE: this method violates the handlified function signature convention: 1187 // NOTE: this method violates the handlified function signature convention:
1179 // raw pointer parameters in the function that allocates. 1188 // raw pointer parameters in the function that allocates.
1180 // See ElementsAccessor::CopyElements() for details. 1189 // See ElementsAccessor::CopyElements() for details.
1181 // This method could actually allocate if copying from double elements to 1190 // This method could actually allocate if copying from double elements to
1182 // object elements. 1191 // object elements.
1183 static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, 1192 static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start,
1184 FixedArrayBase* to, ElementsKind from_kind, 1193 FixedArrayBase* to, ElementsKind from_kind,
1185 uint32_t to_start, int packed_size, 1194 uint32_t to_start, int packed_size,
1186 int copy_size) { 1195 int copy_size) {
1187 DisallowHeapAllocation no_gc; 1196 DisallowHeapAllocation no_gc;
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
1438 return handle(context->get(context_entry), isolate); 1447 return handle(context->get(context_entry), isolate);
1439 } else { 1448 } else {
1440 // Object is not mapped, defer to the arguments. 1449 // Object is not mapped, defer to the arguments.
1441 Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1)), 1450 Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1)),
1442 isolate); 1451 isolate);
1443 Handle<Object> result = 1452 Handle<Object> result =
1444 ArgumentsAccessor::GetImpl(arguments, entry - length); 1453 ArgumentsAccessor::GetImpl(arguments, entry - length);
1445 // Elements of the arguments object in slow mode might be slow aliases. 1454 // Elements of the arguments object in slow mode might be slow aliases.
1446 if (result->IsAliasedArgumentsEntry()) { 1455 if (result->IsAliasedArgumentsEntry()) {
1447 DisallowHeapAllocation no_gc; 1456 DisallowHeapAllocation no_gc;
1448 AliasedArgumentsEntry* entry = AliasedArgumentsEntry::cast(*result); 1457 AliasedArgumentsEntry* alias = AliasedArgumentsEntry::cast(*result);
1449 Context* context = Context::cast(parameter_map->get(0)); 1458 Context* context = Context::cast(parameter_map->get(0));
1450 int context_entry = entry->aliased_context_slot(); 1459 int context_entry = alias->aliased_context_slot();
1451 DCHECK(!context->get(context_entry)->IsTheHole()); 1460 DCHECK(!context->get(context_entry)->IsTheHole());
1452 return handle(context->get(context_entry), isolate); 1461 return handle(context->get(context_entry), isolate);
1453 } 1462 }
1454 return result; 1463 return result;
1455 } 1464 }
1456 } 1465 }
1457 1466
1458 static void GrowCapacityAndConvertImpl(Handle<JSObject> object, 1467 static void GrowCapacityAndConvertImpl(Handle<JSObject> object,
1459 uint32_t capacity) { 1468 uint32_t capacity) {
1460 UNREACHABLE(); 1469 UNREACHABLE();
1461 } 1470 }
1462 1471
1463 static void SetImpl(FixedArrayBase* store, uint32_t entry, Object* value) { 1472 static void SetImpl(FixedArrayBase* store, uint32_t entry, Object* value) {
1464 FixedArray* parameter_map = FixedArray::cast(store); 1473 FixedArray* parameter_map = FixedArray::cast(store);
1465 uint32_t length = parameter_map->length() - 2; 1474 uint32_t length = parameter_map->length() - 2;
1466 if (entry < length) { 1475 if (entry < length) {
1467 Object* probe = parameter_map->get(entry + 2); 1476 Object* probe = parameter_map->get(entry + 2);
1468 Context* context = Context::cast(parameter_map->get(0)); 1477 Context* context = Context::cast(parameter_map->get(0));
1469 int context_entry = Smi::cast(probe)->value(); 1478 int context_entry = Smi::cast(probe)->value();
1470 DCHECK(!context->get(context_entry)->IsTheHole()); 1479 DCHECK(!context->get(context_entry)->IsTheHole());
1471 context->set(context_entry, value); 1480 context->set(context_entry, value);
1472 } else { 1481 } else {
1473 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); 1482 FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
1474 ArgumentsAccessor::SetImpl(arguments, entry - length, value); 1483 Object* current = ArgumentsAccessor::GetRaw(arguments, entry - length);
1484 if (current->IsAliasedArgumentsEntry()) {
1485 AliasedArgumentsEntry* alias = AliasedArgumentsEntry::cast(current);
1486 Context* context = Context::cast(parameter_map->get(0));
1487 int context_entry = alias->aliased_context_slot();
1488 DCHECK(!context->get(context_entry)->IsTheHole());
1489 context->set(context_entry, value);
1490 } else {
1491 ArgumentsAccessor::SetImpl(arguments, entry - length, value);
1492 }
1475 } 1493 }
1476 } 1494 }
1477 1495
1478 static void SetLengthImpl(Handle<JSArray> array, uint32_t length, 1496 static void SetLengthImpl(Handle<JSArray> array, uint32_t length,
1479 Handle<FixedArrayBase> parameter_map) { 1497 Handle<FixedArrayBase> parameter_map) {
1480 // Sloppy arguments objects are not arrays. 1498 // Sloppy arguments objects are not arrays.
1481 UNREACHABLE(); 1499 UNREACHABLE();
1482 } 1500 }
1483 1501
1484 static uint32_t GetCapacityImpl(JSObject* holder, 1502 static uint32_t GetCapacityImpl(JSObject* holder,
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
1919 #define ACCESSOR_DELETE(Class, Kind, Store) delete elements_accessors_[Kind]; 1937 #define ACCESSOR_DELETE(Class, Kind, Store) delete elements_accessors_[Kind];
1920 ELEMENTS_LIST(ACCESSOR_DELETE) 1938 ELEMENTS_LIST(ACCESSOR_DELETE)
1921 #undef ACCESSOR_DELETE 1939 #undef ACCESSOR_DELETE
1922 elements_accessors_ = NULL; 1940 elements_accessors_ = NULL;
1923 } 1941 }
1924 1942
1925 1943
1926 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; 1944 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL;
1927 } // namespace internal 1945 } // namespace internal
1928 } // namespace v8 1946 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/test262-es6/test262-es6.status » ('j') | test/test262-es6/test262-es6.status » ('J')

Powered by Google App Engine
This is Rietveld 408576698