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

Side by Side Diff: src/elements.cc

Issue 177683002: Mode clean-up pt 1: rename classic/non-strict mode to sloppy mode (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 9 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 // - FixedUint8ElementsAccessor 61 // - FixedUint8ElementsAccessor
62 // - FixedInt8ElementsAccessor 62 // - FixedInt8ElementsAccessor
63 // - FixedUint16ElementsAccessor 63 // - FixedUint16ElementsAccessor
64 // - FixedInt16ElementsAccessor 64 // - FixedInt16ElementsAccessor
65 // - FixedUint32ElementsAccessor 65 // - FixedUint32ElementsAccessor
66 // - FixedInt32ElementsAccessor 66 // - FixedInt32ElementsAccessor
67 // - FixedFloat32ElementsAccessor 67 // - FixedFloat32ElementsAccessor
68 // - FixedFloat64ElementsAccessor 68 // - FixedFloat64ElementsAccessor
69 // - FixedUint8ClampedElementsAccessor 69 // - FixedUint8ClampedElementsAccessor
70 // - DictionaryElementsAccessor 70 // - DictionaryElementsAccessor
71 // - NonStrictArgumentsElementsAccessor 71 // - SloppyArgumentsElementsAccessor
72 72
73 73
74 namespace v8 { 74 namespace v8 {
75 namespace internal { 75 namespace internal {
76 76
77 77
78 static const int kPackedSizeNotKnown = -1; 78 static const int kPackedSizeNotKnown = -1;
79 79
80 80
81 // First argument in list is the accessor class, the second argument is the 81 // First argument in list is the accessor class, the second argument is the
82 // accessor ElementsKind, and the third is the backing store class. Use the 82 // accessor ElementsKind, and the third is the backing store class. Use the
83 // fast element handler for smi-only arrays. The implementation is currently 83 // fast element handler for smi-only arrays. The implementation is currently
84 // identical. Note that the order must match that of the ElementsKind enum for 84 // identical. Note that the order must match that of the ElementsKind enum for
85 // the |accessor_array[]| below to work. 85 // the |accessor_array[]| below to work.
86 #define ELEMENTS_LIST(V) \ 86 #define ELEMENTS_LIST(V) \
87 V(FastPackedSmiElementsAccessor, FAST_SMI_ELEMENTS, FixedArray) \ 87 V(FastPackedSmiElementsAccessor, FAST_SMI_ELEMENTS, FixedArray) \
88 V(FastHoleySmiElementsAccessor, FAST_HOLEY_SMI_ELEMENTS, \ 88 V(FastHoleySmiElementsAccessor, FAST_HOLEY_SMI_ELEMENTS, \
89 FixedArray) \ 89 FixedArray) \
90 V(FastPackedObjectElementsAccessor, FAST_ELEMENTS, FixedArray) \ 90 V(FastPackedObjectElementsAccessor, FAST_ELEMENTS, FixedArray) \
91 V(FastHoleyObjectElementsAccessor, FAST_HOLEY_ELEMENTS, FixedArray) \ 91 V(FastHoleyObjectElementsAccessor, FAST_HOLEY_ELEMENTS, FixedArray) \
92 V(FastPackedDoubleElementsAccessor, FAST_DOUBLE_ELEMENTS, \ 92 V(FastPackedDoubleElementsAccessor, FAST_DOUBLE_ELEMENTS, \
93 FixedDoubleArray) \ 93 FixedDoubleArray) \
94 V(FastHoleyDoubleElementsAccessor, FAST_HOLEY_DOUBLE_ELEMENTS, \ 94 V(FastHoleyDoubleElementsAccessor, FAST_HOLEY_DOUBLE_ELEMENTS, \
95 FixedDoubleArray) \ 95 FixedDoubleArray) \
96 V(DictionaryElementsAccessor, DICTIONARY_ELEMENTS, \ 96 V(DictionaryElementsAccessor, DICTIONARY_ELEMENTS, \
97 SeededNumberDictionary) \ 97 SeededNumberDictionary) \
98 V(NonStrictArgumentsElementsAccessor, NON_STRICT_ARGUMENTS_ELEMENTS, \ 98 V(SloppyArgumentsElementsAccessor, SLOPPY_ARGUMENTS_ELEMENTS, \
99 FixedArray) \ 99 FixedArray) \
100 V(ExternalInt8ElementsAccessor, EXTERNAL_INT8_ELEMENTS, \ 100 V(ExternalInt8ElementsAccessor, EXTERNAL_INT8_ELEMENTS, \
101 ExternalInt8Array) \ 101 ExternalInt8Array) \
102 V(ExternalUint8ElementsAccessor, \ 102 V(ExternalUint8ElementsAccessor, \
103 EXTERNAL_UINT8_ELEMENTS, ExternalUint8Array) \ 103 EXTERNAL_UINT8_ELEMENTS, ExternalUint8Array) \
104 V(ExternalInt16ElementsAccessor, EXTERNAL_INT16_ELEMENTS, \ 104 V(ExternalInt16ElementsAccessor, EXTERNAL_INT16_ELEMENTS, \
105 ExternalInt16Array) \ 105 ExternalInt16Array) \
106 V(ExternalUint16ElementsAccessor, \ 106 V(ExternalUint16ElementsAccessor, \
107 EXTERNAL_UINT16_ELEMENTS, ExternalUint16Array) \ 107 EXTERNAL_UINT16_ELEMENTS, ExternalUint16Array) \
108 V(ExternalInt32ElementsAccessor, EXTERNAL_INT32_ELEMENTS, \ 108 V(ExternalInt32ElementsAccessor, EXTERNAL_INT32_ELEMENTS, \
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after
913 typename KindTraits, 913 typename KindTraits,
914 int ElementSize> 914 int ElementSize>
915 class FastElementsAccessor 915 class FastElementsAccessor
916 : public ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits> { 916 : public ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits> {
917 public: 917 public:
918 explicit FastElementsAccessor(const char* name) 918 explicit FastElementsAccessor(const char* name)
919 : ElementsAccessorBase<FastElementsAccessorSubclass, 919 : ElementsAccessorBase<FastElementsAccessorSubclass,
920 KindTraits>(name) {} 920 KindTraits>(name) {}
921 protected: 921 protected:
922 friend class ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits>; 922 friend class ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits>;
923 friend class NonStrictArgumentsElementsAccessor; 923 friend class SloppyArgumentsElementsAccessor;
924 924
925 typedef typename KindTraits::BackingStore BackingStore; 925 typedef typename KindTraits::BackingStore BackingStore;
926 926
927 // Adjusts the length of the fast backing store or returns the new length or 927 // Adjusts the length of the fast backing store or returns the new length or
928 // undefined in case conversion to a slow backing store should be performed. 928 // undefined in case conversion to a slow backing store should be performed.
929 static MaybeObject* SetLengthWithoutNormalize(FixedArrayBase* backing_store, 929 static MaybeObject* SetLengthWithoutNormalize(FixedArrayBase* backing_store,
930 JSArray* array, 930 JSArray* array,
931 Object* length_object, 931 Object* length_object,
932 uint32_t length) { 932 uint32_t length) {
933 uint32_t old_capacity = backing_store->length(); 933 uint32_t old_capacity = backing_store->length();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
991 ASSERT(obj->HasFastSmiOrObjectElements() || 991 ASSERT(obj->HasFastSmiOrObjectElements() ||
992 obj->HasFastDoubleElements() || 992 obj->HasFastDoubleElements() ||
993 obj->HasFastArgumentsElements()); 993 obj->HasFastArgumentsElements());
994 Heap* heap = obj->GetHeap(); 994 Heap* heap = obj->GetHeap();
995 Object* elements = obj->elements(); 995 Object* elements = obj->elements();
996 if (elements == heap->empty_fixed_array()) { 996 if (elements == heap->empty_fixed_array()) {
997 return heap->true_value(); 997 return heap->true_value();
998 } 998 }
999 typename KindTraits::BackingStore* backing_store = 999 typename KindTraits::BackingStore* backing_store =
1000 KindTraits::BackingStore::cast(elements); 1000 KindTraits::BackingStore::cast(elements);
1001 bool is_non_strict_arguments_elements_map = 1001 bool is_sloppy_arguments_elements_map =
1002 backing_store->map() == heap->non_strict_arguments_elements_map(); 1002 backing_store->map() == heap->sloppy_arguments_elements_map();
1003 if (is_non_strict_arguments_elements_map) { 1003 if (is_sloppy_arguments_elements_map) {
1004 backing_store = KindTraits::BackingStore::cast( 1004 backing_store = KindTraits::BackingStore::cast(
1005 FixedArray::cast(backing_store)->get(1)); 1005 FixedArray::cast(backing_store)->get(1));
1006 } 1006 }
1007 uint32_t length = static_cast<uint32_t>( 1007 uint32_t length = static_cast<uint32_t>(
1008 obj->IsJSArray() 1008 obj->IsJSArray()
1009 ? Smi::cast(JSArray::cast(obj)->length())->value() 1009 ? Smi::cast(JSArray::cast(obj)->length())->value()
1010 : backing_store->length()); 1010 : backing_store->length());
1011 if (key < length) { 1011 if (key < length) {
1012 if (!is_non_strict_arguments_elements_map) { 1012 if (!is_sloppy_arguments_elements_map) {
1013 ElementsKind kind = KindTraits::Kind; 1013 ElementsKind kind = KindTraits::Kind;
1014 if (IsFastPackedElementsKind(kind)) { 1014 if (IsFastPackedElementsKind(kind)) {
1015 MaybeObject* transitioned = 1015 MaybeObject* transitioned =
1016 obj->TransitionElementsKind(GetHoleyElementsKind(kind)); 1016 obj->TransitionElementsKind(GetHoleyElementsKind(kind));
1017 if (transitioned->IsFailure()) return transitioned; 1017 if (transitioned->IsFailure()) return transitioned;
1018 } 1018 }
1019 if (IsFastSmiOrObjectElementsKind(KindTraits::Kind)) { 1019 if (IsFastSmiOrObjectElementsKind(KindTraits::Kind)) {
1020 Object* writable; 1020 Object* writable;
1021 MaybeObject* maybe = obj->EnsureWritableFastElements(); 1021 MaybeObject* maybe = obj->EnsureWritableFastElements();
1022 if (!maybe->ToObject(&writable)) return maybe; 1022 if (!maybe->ToObject(&writable)) return maybe;
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1145 from, from_kind, from_start, to, to_kind, to_start, copy_size); 1145 from, from_kind, from_start, to, to_kind, to_start, copy_size);
1146 return to->GetHeap()->undefined_value(); 1146 return to->GetHeap()->undefined_value();
1147 case FAST_DOUBLE_ELEMENTS: 1147 case FAST_DOUBLE_ELEMENTS:
1148 case FAST_HOLEY_DOUBLE_ELEMENTS: 1148 case FAST_HOLEY_DOUBLE_ELEMENTS:
1149 return CopyDoubleToObjectElements( 1149 return CopyDoubleToObjectElements(
1150 from, from_start, to, to_kind, to_start, copy_size); 1150 from, from_start, to, to_kind, to_start, copy_size);
1151 case DICTIONARY_ELEMENTS: 1151 case DICTIONARY_ELEMENTS:
1152 CopyDictionaryToObjectElements( 1152 CopyDictionaryToObjectElements(
1153 from, from_start, to, to_kind, to_start, copy_size); 1153 from, from_start, to, to_kind, to_start, copy_size);
1154 return to->GetHeap()->undefined_value(); 1154 return to->GetHeap()->undefined_value();
1155 case NON_STRICT_ARGUMENTS_ELEMENTS: { 1155 case SLOPPY_ARGUMENTS_ELEMENTS: {
1156 // TODO(verwaest): This is a temporary hack to support extending 1156 // TODO(verwaest): This is a temporary hack to support extending
1157 // NON_STRICT_ARGUMENTS_ELEMENTS in SetFastElementsCapacityAndLength. 1157 // SLOPPY_ARGUMENTS_ELEMENTS in SetFastElementsCapacityAndLength.
1158 // This case should be UNREACHABLE(). 1158 // This case should be UNREACHABLE().
1159 FixedArray* parameter_map = FixedArray::cast(from); 1159 FixedArray* parameter_map = FixedArray::cast(from);
1160 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); 1160 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
1161 ElementsKind from_kind = ElementsKindForArray(arguments); 1161 ElementsKind from_kind = ElementsKindForArray(arguments);
1162 return CopyElementsImpl(arguments, from_start, to, from_kind, 1162 return CopyElementsImpl(arguments, from_start, to, from_kind,
1163 to_start, packed_size, copy_size); 1163 to_start, packed_size, copy_size);
1164 } 1164 }
1165 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ 1165 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
1166 case EXTERNAL_##TYPE##_ELEMENTS: \ 1166 case EXTERNAL_##TYPE##_ELEMENTS: \
1167 case TYPE##_ELEMENTS: \ 1167 case TYPE##_ELEMENTS: \
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1275 CopyDoubleToDoubleElements(from, from_start, to, to_start, copy_size); 1275 CopyDoubleToDoubleElements(from, from_start, to, to_start, copy_size);
1276 break; 1276 break;
1277 case FAST_ELEMENTS: 1277 case FAST_ELEMENTS:
1278 case FAST_HOLEY_ELEMENTS: 1278 case FAST_HOLEY_ELEMENTS:
1279 CopyObjectToDoubleElements(from, from_start, to, to_start, copy_size); 1279 CopyObjectToDoubleElements(from, from_start, to, to_start, copy_size);
1280 break; 1280 break;
1281 case DICTIONARY_ELEMENTS: 1281 case DICTIONARY_ELEMENTS:
1282 CopyDictionaryToDoubleElements( 1282 CopyDictionaryToDoubleElements(
1283 from, from_start, to, to_start, copy_size); 1283 from, from_start, to, to_start, copy_size);
1284 break; 1284 break;
1285 case NON_STRICT_ARGUMENTS_ELEMENTS: 1285 case SLOPPY_ARGUMENTS_ELEMENTS:
1286 UNREACHABLE(); 1286 UNREACHABLE();
1287 1287
1288 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ 1288 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
1289 case EXTERNAL_##TYPE##_ELEMENTS: \ 1289 case EXTERNAL_##TYPE##_ELEMENTS: \
1290 case TYPE##_ELEMENTS: \ 1290 case TYPE##_ELEMENTS: \
1291 UNREACHABLE(); 1291 UNREACHABLE();
1292 TYPED_ARRAYS(TYPED_ARRAY_CASE) 1292 TYPED_ARRAYS(TYPED_ARRAY_CASE)
1293 #undef TYPED_ARRAY_CASE 1293 #undef TYPED_ARRAY_CASE
1294 } 1294 }
1295 return to->GetHeap()->undefined_value(); 1295 return to->GetHeap()->undefined_value();
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1485 } 1485 }
1486 1486
1487 MUST_USE_RESULT static MaybeObject* DeleteCommon( 1487 MUST_USE_RESULT static MaybeObject* DeleteCommon(
1488 JSObject* obj, 1488 JSObject* obj,
1489 uint32_t key, 1489 uint32_t key,
1490 JSReceiver::DeleteMode mode) { 1490 JSReceiver::DeleteMode mode) {
1491 Isolate* isolate = obj->GetIsolate(); 1491 Isolate* isolate = obj->GetIsolate();
1492 Heap* heap = isolate->heap(); 1492 Heap* heap = isolate->heap();
1493 FixedArray* backing_store = FixedArray::cast(obj->elements()); 1493 FixedArray* backing_store = FixedArray::cast(obj->elements());
1494 bool is_arguments = 1494 bool is_arguments =
1495 (obj->GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS); 1495 (obj->GetElementsKind() == SLOPPY_ARGUMENTS_ELEMENTS);
1496 if (is_arguments) { 1496 if (is_arguments) {
1497 backing_store = FixedArray::cast(backing_store->get(1)); 1497 backing_store = FixedArray::cast(backing_store->get(1));
1498 } 1498 }
1499 SeededNumberDictionary* dictionary = 1499 SeededNumberDictionary* dictionary =
1500 SeededNumberDictionary::cast(backing_store); 1500 SeededNumberDictionary::cast(backing_store);
1501 int entry = dictionary->FindEntry(key); 1501 int entry = dictionary->FindEntry(key);
1502 if (entry != SeededNumberDictionary::kNotFound) { 1502 if (entry != SeededNumberDictionary::kNotFound) {
1503 Object* result = dictionary->DeleteProperty(entry, mode); 1503 Object* result = dictionary->DeleteProperty(entry, mode);
1504 if (result == heap->false_value()) { 1504 if (result == heap->false_value()) {
1505 if (mode == JSObject::STRICT_DELETION) { 1505 if (mode == JSObject::STRICT_DELETION) {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1625 1625
1626 static uint32_t GetKeyForIndexImpl(FixedArrayBase* store, 1626 static uint32_t GetKeyForIndexImpl(FixedArrayBase* store,
1627 uint32_t index) { 1627 uint32_t index) {
1628 SeededNumberDictionary* dict = SeededNumberDictionary::cast(store); 1628 SeededNumberDictionary* dict = SeededNumberDictionary::cast(store);
1629 Object* key = dict->KeyAt(index); 1629 Object* key = dict->KeyAt(index);
1630 return Smi::cast(key)->value(); 1630 return Smi::cast(key)->value();
1631 } 1631 }
1632 }; 1632 };
1633 1633
1634 1634
1635 class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase< 1635 class SloppyArgumentsElementsAccessor : public ElementsAccessorBase<
1636 NonStrictArgumentsElementsAccessor, 1636 SloppyArgumentsElementsAccessor,
1637 ElementsKindTraits<NON_STRICT_ARGUMENTS_ELEMENTS> > { 1637 ElementsKindTraits<SLOPPY_ARGUMENTS_ELEMENTS> > {
1638 public: 1638 public:
1639 explicit NonStrictArgumentsElementsAccessor(const char* name) 1639 explicit SloppyArgumentsElementsAccessor(const char* name)
1640 : ElementsAccessorBase< 1640 : ElementsAccessorBase<
1641 NonStrictArgumentsElementsAccessor, 1641 SloppyArgumentsElementsAccessor,
1642 ElementsKindTraits<NON_STRICT_ARGUMENTS_ELEMENTS> >(name) {} 1642 ElementsKindTraits<SLOPPY_ARGUMENTS_ELEMENTS> >(name) {}
1643 protected: 1643 protected:
1644 friend class ElementsAccessorBase< 1644 friend class ElementsAccessorBase<
1645 NonStrictArgumentsElementsAccessor, 1645 SloppyArgumentsElementsAccessor,
1646 ElementsKindTraits<NON_STRICT_ARGUMENTS_ELEMENTS> >; 1646 ElementsKindTraits<SLOPPY_ARGUMENTS_ELEMENTS> >;
1647 1647
1648 MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver, 1648 MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
1649 JSObject* obj, 1649 JSObject* obj,
1650 uint32_t key, 1650 uint32_t key,
1651 FixedArrayBase* parameters) { 1651 FixedArrayBase* parameters) {
1652 FixedArray* parameter_map = FixedArray::cast(parameters); 1652 FixedArray* parameter_map = FixedArray::cast(parameters);
1653 Object* probe = GetParameterMapArg(obj, parameter_map, key); 1653 Object* probe = GetParameterMapArg(obj, parameter_map, key);
1654 if (!probe->IsTheHole()) { 1654 if (!probe->IsTheHole()) {
1655 Context* context = Context::cast(parameter_map->get(0)); 1655 Context* context = Context::cast(parameter_map->get(0));
1656 int context_index = Smi::cast(probe)->value(); 1656 int context_index = Smi::cast(probe)->value();
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
1992 UNREACHABLE(); 1992 UNREACHABLE();
1993 break; 1993 break;
1994 } 1994 }
1995 1995
1996 array->set_elements(elms); 1996 array->set_elements(elms);
1997 array->set_length(Smi::FromInt(number_of_elements)); 1997 array->set_length(Smi::FromInt(number_of_elements));
1998 return array; 1998 return array;
1999 } 1999 }
2000 2000
2001 } } // namespace v8::internal 2001 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/elements.h ('k') | src/elements-kind.h » ('j') | src/globals.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698