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

Side by Side Diff: src/elements.cc

Issue 10383088: Declare more functions returing a MaybeObject* with MUST_USE_RESULT. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 8 years, 7 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
« no previous file with comments | « no previous file | src/objects.h » ('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 // 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 406 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 JSObject* holder, 417 JSObject* holder,
418 uint32_t key, 418 uint32_t key,
419 FixedArrayBase* backing_store) { 419 FixedArrayBase* backing_store) {
420 if (backing_store == NULL) { 420 if (backing_store == NULL) {
421 backing_store = holder->elements(); 421 backing_store = holder->elements();
422 } 422 }
423 return ElementsAccessorSubclass::HasElementImpl( 423 return ElementsAccessorSubclass::HasElementImpl(
424 receiver, holder, key, BackingStore::cast(backing_store)); 424 receiver, holder, key, BackingStore::cast(backing_store));
425 } 425 }
426 426
427 virtual MaybeObject* Get(Object* receiver, 427 MUST_USE_RESULT virtual MaybeObject* Get(Object* receiver,
428 JSObject* holder, 428 JSObject* holder,
429 uint32_t key, 429 uint32_t key,
430 FixedArrayBase* backing_store) { 430 FixedArrayBase* backing_store) {
431 if (backing_store == NULL) { 431 if (backing_store == NULL) {
432 backing_store = holder->elements(); 432 backing_store = holder->elements();
433 } 433 }
434 return ElementsAccessorSubclass::GetImpl( 434 return ElementsAccessorSubclass::GetImpl(
435 receiver, holder, key, BackingStore::cast(backing_store)); 435 receiver, holder, key, BackingStore::cast(backing_store));
436 } 436 }
437 437
438 static MaybeObject* GetImpl(Object* receiver, 438 MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
439 JSObject* obj, 439 JSObject* obj,
440 uint32_t key, 440 uint32_t key,
441 BackingStore* backing_store) { 441 BackingStore* backing_store) {
442 return (key < ElementsAccessorSubclass::GetCapacityImpl(backing_store)) 442 return (key < ElementsAccessorSubclass::GetCapacityImpl(backing_store))
443 ? backing_store->get(key) 443 ? backing_store->get(key)
444 : backing_store->GetHeap()->the_hole_value(); 444 : backing_store->GetHeap()->the_hole_value();
445 } 445 }
446 446
447 virtual MaybeObject* SetLength(JSArray* array, 447 MUST_USE_RESULT virtual MaybeObject* SetLength(JSArray* array,
448 Object* length) { 448 Object* length) {
449 return ElementsAccessorSubclass::SetLengthImpl( 449 return ElementsAccessorSubclass::SetLengthImpl(
450 array, length, BackingStore::cast(array->elements())); 450 array, length, BackingStore::cast(array->elements()));
451 } 451 }
452 452
453 static MaybeObject* SetLengthImpl(JSObject* obj, 453 MUST_USE_RESULT static MaybeObject* SetLengthImpl(
454 Object* length, 454 JSObject* obj,
455 BackingStore* backing_store); 455 Object* length,
456 BackingStore* backing_store);
456 457
457 virtual MaybeObject* SetCapacityAndLength(JSArray* array, 458 MUST_USE_RESULT virtual MaybeObject* SetCapacityAndLength(JSArray* array,
458 int capacity, 459 int capacity,
459 int length) { 460 int length) {
460 return ElementsAccessorSubclass::SetFastElementsCapacityAndLength( 461 return ElementsAccessorSubclass::SetFastElementsCapacityAndLength(
461 array, 462 array,
462 capacity, 463 capacity,
463 length); 464 length);
464 } 465 }
465 466
466 static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj, 467 MUST_USE_RESULT static MaybeObject* SetFastElementsCapacityAndLength(
467 int capacity, 468 JSObject* obj,
468 int length) { 469 int capacity,
470 int length) {
469 UNIMPLEMENTED(); 471 UNIMPLEMENTED();
470 return obj; 472 return obj;
471 } 473 }
472 474
473 virtual MaybeObject* Delete(JSObject* obj, 475 MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
474 uint32_t key, 476 uint32_t key,
475 JSReceiver::DeleteMode mode) = 0; 477 JSReceiver::DeleteMode mode) = 0;
476 478
477 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, 479 MUST_USE_RESULT static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
478 uint32_t from_start, 480 uint32_t from_start,
479 FixedArrayBase* to, 481 FixedArrayBase* to,
480 ElementsKind to_kind, 482 ElementsKind to_kind,
481 uint32_t to_start, 483 uint32_t to_start,
482 int copy_size) { 484 int copy_size) {
483 UNREACHABLE(); 485 UNREACHABLE();
484 return NULL; 486 return NULL;
485 } 487 }
486 488
487 virtual MaybeObject* CopyElements(JSObject* from_holder, 489 MUST_USE_RESULT virtual MaybeObject* CopyElements(JSObject* from_holder,
488 uint32_t from_start, 490 uint32_t from_start,
489 FixedArrayBase* to, 491 FixedArrayBase* to,
490 ElementsKind to_kind, 492 ElementsKind to_kind,
491 uint32_t to_start, 493 uint32_t to_start,
492 int copy_size, 494 int copy_size,
493 FixedArrayBase* from) { 495 FixedArrayBase* from) {
494 if (from == NULL) { 496 if (from == NULL) {
495 from = from_holder->elements(); 497 from = from_holder->elements();
496 } 498 }
497 if (from->length() == 0) { 499 if (from->length() == 0) {
498 return from; 500 return from;
499 } 501 }
500 return ElementsAccessorSubclass::CopyElementsImpl( 502 return ElementsAccessorSubclass::CopyElementsImpl(
501 from, from_start, to, to_kind, to_start, copy_size); 503 from, from_start, to, to_kind, to_start, copy_size);
502 } 504 }
503 505
504 virtual MaybeObject* AddElementsToFixedArray(Object* receiver, 506 MUST_USE_RESULT virtual MaybeObject* AddElementsToFixedArray(
505 JSObject* holder, 507 Object* receiver,
506 FixedArray* to, 508 JSObject* holder,
507 FixedArrayBase* from) { 509 FixedArray* to,
510 FixedArrayBase* from) {
508 int len0 = to->length(); 511 int len0 = to->length();
509 #ifdef DEBUG 512 #ifdef DEBUG
510 if (FLAG_enable_slow_asserts) { 513 if (FLAG_enable_slow_asserts) {
511 for (int i = 0; i < len0; i++) { 514 for (int i = 0; i < len0; i++) {
512 ASSERT(!to->get(i)->IsTheHole()); 515 ASSERT(!to->get(i)->IsTheHole());
513 } 516 }
514 } 517 }
515 #endif 518 #endif
516 if (from == NULL) { 519 if (from == NULL) {
517 from = holder->elements(); 520 from = holder->elements();
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 explicit ExternalElementsAccessor(const char* name) 862 explicit ExternalElementsAccessor(const char* name)
860 : ElementsAccessorBase<ExternalElementsAccessorSubclass, 863 : ElementsAccessorBase<ExternalElementsAccessorSubclass,
861 ElementsKindTraits<Kind> >(name) {} 864 ElementsKindTraits<Kind> >(name) {}
862 865
863 protected: 866 protected:
864 typedef typename ElementsKindTraits<Kind>::BackingStore BackingStore; 867 typedef typename ElementsKindTraits<Kind>::BackingStore BackingStore;
865 868
866 friend class ElementsAccessorBase<ExternalElementsAccessorSubclass, 869 friend class ElementsAccessorBase<ExternalElementsAccessorSubclass,
867 ElementsKindTraits<Kind> >; 870 ElementsKindTraits<Kind> >;
868 871
869 static MaybeObject* GetImpl(Object* receiver, 872 MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
870 JSObject* obj, 873 JSObject* obj,
871 uint32_t key, 874 uint32_t key,
872 BackingStore* backing_store) { 875 BackingStore* backing_store) {
873 return 876 return
874 key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store) 877 key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store)
875 ? backing_store->get(key) 878 ? backing_store->get(key)
876 : backing_store->GetHeap()->undefined_value(); 879 : backing_store->GetHeap()->undefined_value();
877 } 880 }
878 881
879 static MaybeObject* SetLengthImpl(JSObject* obj, 882 MUST_USE_RESULT static MaybeObject* SetLengthImpl(
880 Object* length, 883 JSObject* obj,
881 BackingStore* backing_store) { 884 Object* length,
885 BackingStore* backing_store) {
882 // External arrays do not support changing their length. 886 // External arrays do not support changing their length.
883 UNREACHABLE(); 887 UNREACHABLE();
884 return obj; 888 return obj;
885 } 889 }
886 890
887 virtual MaybeObject* Delete(JSObject* obj, 891 MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
888 uint32_t key, 892 uint32_t key,
889 JSReceiver::DeleteMode mode) { 893 JSReceiver::DeleteMode mode) {
890 // External arrays always ignore deletes. 894 // External arrays always ignore deletes.
891 return obj->GetHeap()->true_value(); 895 return obj->GetHeap()->true_value();
892 } 896 }
893 897
894 static bool HasElementImpl(Object* receiver, 898 static bool HasElementImpl(Object* receiver,
895 JSObject* holder, 899 JSObject* holder,
896 uint32_t key, 900 uint32_t key,
897 BackingStore* backing_store) { 901 BackingStore* backing_store) {
898 uint32_t capacity = 902 uint32_t capacity =
899 ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store); 903 ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
995 class DictionaryElementsAccessor 999 class DictionaryElementsAccessor
996 : public ElementsAccessorBase<DictionaryElementsAccessor, 1000 : public ElementsAccessorBase<DictionaryElementsAccessor,
997 ElementsKindTraits<DICTIONARY_ELEMENTS> > { 1001 ElementsKindTraits<DICTIONARY_ELEMENTS> > {
998 public: 1002 public:
999 explicit DictionaryElementsAccessor(const char* name) 1003 explicit DictionaryElementsAccessor(const char* name)
1000 : ElementsAccessorBase<DictionaryElementsAccessor, 1004 : ElementsAccessorBase<DictionaryElementsAccessor,
1001 ElementsKindTraits<DICTIONARY_ELEMENTS> >(name) {} 1005 ElementsKindTraits<DICTIONARY_ELEMENTS> >(name) {}
1002 1006
1003 // Adjusts the length of the dictionary backing store and returns the new 1007 // Adjusts the length of the dictionary backing store and returns the new
1004 // length according to ES5 section 15.4.5.2 behavior. 1008 // length according to ES5 section 15.4.5.2 behavior.
1005 static MaybeObject* SetLengthWithoutNormalize(SeededNumberDictionary* dict, 1009 MUST_USE_RESULT static MaybeObject* SetLengthWithoutNormalize(
1006 JSArray* array, 1010 SeededNumberDictionary* dict,
1007 Object* length_object, 1011 JSArray* array,
1008 uint32_t length) { 1012 Object* length_object,
1013 uint32_t length) {
1009 if (length == 0) { 1014 if (length == 0) {
1010 // If the length of a slow array is reset to zero, we clear 1015 // If the length of a slow array is reset to zero, we clear
1011 // the array and flush backing storage. This has the added 1016 // the array and flush backing storage. This has the added
1012 // benefit that the array returns to fast mode. 1017 // benefit that the array returns to fast mode.
1013 Object* obj; 1018 Object* obj;
1014 MaybeObject* maybe_obj = array->ResetElements(); 1019 MaybeObject* maybe_obj = array->ResetElements();
1015 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 1020 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1016 } else { 1021 } else {
1017 uint32_t new_length = length; 1022 uint32_t new_length = length;
1018 uint32_t old_length = static_cast<uint32_t>(array->length()->Number()); 1023 uint32_t old_length = static_cast<uint32_t>(array->length()->Number());
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 } 1055 }
1051 } 1056 }
1052 1057
1053 // Update the number of elements. 1058 // Update the number of elements.
1054 dict->ElementsRemoved(removed_entries); 1059 dict->ElementsRemoved(removed_entries);
1055 } 1060 }
1056 } 1061 }
1057 return length_object; 1062 return length_object;
1058 } 1063 }
1059 1064
1060 static MaybeObject* DeleteCommon(JSObject* obj, 1065 MUST_USE_RESULT static MaybeObject* DeleteCommon(
1061 uint32_t key, 1066 JSObject* obj,
1062 JSReceiver::DeleteMode mode) { 1067 uint32_t key,
1068 JSReceiver::DeleteMode mode) {
1063 Isolate* isolate = obj->GetIsolate(); 1069 Isolate* isolate = obj->GetIsolate();
1064 Heap* heap = isolate->heap(); 1070 Heap* heap = isolate->heap();
1065 FixedArray* backing_store = FixedArray::cast(obj->elements()); 1071 FixedArray* backing_store = FixedArray::cast(obj->elements());
1066 bool is_arguments = 1072 bool is_arguments =
1067 (obj->GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS); 1073 (obj->GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS);
1068 if (is_arguments) { 1074 if (is_arguments) {
1069 backing_store = FixedArray::cast(backing_store->get(1)); 1075 backing_store = FixedArray::cast(backing_store->get(1));
1070 } 1076 }
1071 SeededNumberDictionary* dictionary = 1077 SeededNumberDictionary* dictionary =
1072 SeededNumberDictionary::cast(backing_store); 1078 SeededNumberDictionary::cast(backing_store);
(...skipping 22 matching lines...) Expand all
1095 Handle<Object> args[2] = { name, holder }; 1101 Handle<Object> args[2] = { name, holder };
1096 Handle<Object> error = 1102 Handle<Object> error =
1097 isolate->factory()->NewTypeError("strict_delete_property", 1103 isolate->factory()->NewTypeError("strict_delete_property",
1098 HandleVector(args, 2)); 1104 HandleVector(args, 2));
1099 return isolate->Throw(*error); 1105 return isolate->Throw(*error);
1100 } 1106 }
1101 } 1107 }
1102 return heap->true_value(); 1108 return heap->true_value();
1103 } 1109 }
1104 1110
1105 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, 1111 MUST_USE_RESULT static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
1106 uint32_t from_start, 1112 uint32_t from_start,
1107 FixedArrayBase* to, 1113 FixedArrayBase* to,
1108 ElementsKind to_kind, 1114 ElementsKind to_kind,
1109 uint32_t to_start, 1115 uint32_t to_start,
1110 int copy_size) { 1116 int copy_size) {
1111 switch (to_kind) { 1117 switch (to_kind) {
1112 case FAST_SMI_ONLY_ELEMENTS: 1118 case FAST_SMI_ONLY_ELEMENTS:
1113 case FAST_ELEMENTS: 1119 case FAST_ELEMENTS:
1114 CopyDictionaryToObjectElements( 1120 CopyDictionaryToObjectElements(
1115 SeededNumberDictionary::cast(from), from_start, 1121 SeededNumberDictionary::cast(from), from_start,
1116 FixedArray::cast(to), to_kind, to_start, copy_size); 1122 FixedArray::cast(to), to_kind, to_start, copy_size);
1117 return from; 1123 return from;
1118 case FAST_DOUBLE_ELEMENTS: 1124 case FAST_DOUBLE_ELEMENTS:
1119 CopyDictionaryToDoubleElements( 1125 CopyDictionaryToDoubleElements(
1120 SeededNumberDictionary::cast(from), from_start, 1126 SeededNumberDictionary::cast(from), from_start,
1121 FixedDoubleArray::cast(to), to_start, copy_size); 1127 FixedDoubleArray::cast(to), to_start, copy_size);
1122 return from; 1128 return from;
1123 default: 1129 default:
1124 UNREACHABLE(); 1130 UNREACHABLE();
1125 } 1131 }
1126 return to->GetHeap()->undefined_value(); 1132 return to->GetHeap()->undefined_value();
1127 } 1133 }
1128 1134
1129 1135
1130 protected: 1136 protected:
1131 friend class ElementsAccessorBase<DictionaryElementsAccessor, 1137 friend class ElementsAccessorBase<DictionaryElementsAccessor,
1132 ElementsKindTraits<DICTIONARY_ELEMENTS> >; 1138 ElementsKindTraits<DICTIONARY_ELEMENTS> >;
1133 1139
1134 virtual MaybeObject* Delete(JSObject* obj, 1140 MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
1135 uint32_t key, 1141 uint32_t key,
1136 JSReceiver::DeleteMode mode) { 1142 JSReceiver::DeleteMode mode) {
1137 return DeleteCommon(obj, key, mode); 1143 return DeleteCommon(obj, key, mode);
1138 } 1144 }
1139 1145
1140 static MaybeObject* GetImpl(Object* receiver, 1146 MUST_USE_RESULT static MaybeObject* GetImpl(
1141 JSObject* obj, 1147 Object* receiver,
1142 uint32_t key, 1148 JSObject* obj,
1143 SeededNumberDictionary* backing_store) { 1149 uint32_t key,
1150 SeededNumberDictionary* backing_store) {
1144 int entry = backing_store->FindEntry(key); 1151 int entry = backing_store->FindEntry(key);
1145 if (entry != SeededNumberDictionary::kNotFound) { 1152 if (entry != SeededNumberDictionary::kNotFound) {
1146 Object* element = backing_store->ValueAt(entry); 1153 Object* element = backing_store->ValueAt(entry);
1147 PropertyDetails details = backing_store->DetailsAt(entry); 1154 PropertyDetails details = backing_store->DetailsAt(entry);
1148 if (details.type() == CALLBACKS) { 1155 if (details.type() == CALLBACKS) {
1149 return obj->GetElementWithCallback(receiver, 1156 return obj->GetElementWithCallback(receiver,
1150 element, 1157 element,
1151 key, 1158 key,
1152 obj); 1159 obj);
1153 } else { 1160 } else {
(...skipping 25 matching lines...) Expand all
1179 public: 1186 public:
1180 explicit NonStrictArgumentsElementsAccessor(const char* name) 1187 explicit NonStrictArgumentsElementsAccessor(const char* name)
1181 : ElementsAccessorBase< 1188 : ElementsAccessorBase<
1182 NonStrictArgumentsElementsAccessor, 1189 NonStrictArgumentsElementsAccessor,
1183 ElementsKindTraits<NON_STRICT_ARGUMENTS_ELEMENTS> >(name) {} 1190 ElementsKindTraits<NON_STRICT_ARGUMENTS_ELEMENTS> >(name) {}
1184 protected: 1191 protected:
1185 friend class ElementsAccessorBase< 1192 friend class ElementsAccessorBase<
1186 NonStrictArgumentsElementsAccessor, 1193 NonStrictArgumentsElementsAccessor,
1187 ElementsKindTraits<NON_STRICT_ARGUMENTS_ELEMENTS> >; 1194 ElementsKindTraits<NON_STRICT_ARGUMENTS_ELEMENTS> >;
1188 1195
1189 static MaybeObject* GetImpl(Object* receiver, 1196 MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
1190 JSObject* obj, 1197 JSObject* obj,
1191 uint32_t key, 1198 uint32_t key,
1192 FixedArray* parameter_map) { 1199 FixedArray* parameter_map) {
1193 Object* probe = GetParameterMapArg(obj, parameter_map, key); 1200 Object* probe = GetParameterMapArg(obj, parameter_map, key);
1194 if (!probe->IsTheHole()) { 1201 if (!probe->IsTheHole()) {
1195 Context* context = Context::cast(parameter_map->get(0)); 1202 Context* context = Context::cast(parameter_map->get(0));
1196 int context_index = Smi::cast(probe)->value(); 1203 int context_index = Smi::cast(probe)->value();
1197 ASSERT(!context->get(context_index)->IsTheHole()); 1204 ASSERT(!context->get(context_index)->IsTheHole());
1198 return context->get(context_index); 1205 return context->get(context_index);
1199 } else { 1206 } else {
1200 // Object is not mapped, defer to the arguments. 1207 // Object is not mapped, defer to the arguments.
1201 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); 1208 FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
1202 MaybeObject* maybe_result = ElementsAccessor::ForArray(arguments)->Get( 1209 MaybeObject* maybe_result = ElementsAccessor::ForArray(arguments)->Get(
1203 receiver, obj, key, arguments); 1210 receiver, obj, key, arguments);
1204 Object* result; 1211 Object* result;
1205 if (!maybe_result->ToObject(&result)) return maybe_result; 1212 if (!maybe_result->ToObject(&result)) return maybe_result;
1206 // Elements of the arguments object in slow mode might be slow aliases. 1213 // Elements of the arguments object in slow mode might be slow aliases.
1207 if (result->IsAliasedArgumentsEntry()) { 1214 if (result->IsAliasedArgumentsEntry()) {
1208 AliasedArgumentsEntry* entry = AliasedArgumentsEntry::cast(result); 1215 AliasedArgumentsEntry* entry = AliasedArgumentsEntry::cast(result);
1209 Context* context = Context::cast(parameter_map->get(0)); 1216 Context* context = Context::cast(parameter_map->get(0));
1210 int context_index = entry->aliased_context_slot(); 1217 int context_index = entry->aliased_context_slot();
1211 ASSERT(!context->get(context_index)->IsTheHole()); 1218 ASSERT(!context->get(context_index)->IsTheHole());
1212 return context->get(context_index); 1219 return context->get(context_index);
1213 } else { 1220 } else {
1214 return result; 1221 return result;
1215 } 1222 }
1216 } 1223 }
1217 } 1224 }
1218 1225
1219 static MaybeObject* SetLengthImpl(JSObject* obj, 1226 MUST_USE_RESULT static MaybeObject* SetLengthImpl(
1220 Object* length, 1227 JSObject* obj,
1221 FixedArray* parameter_map) { 1228 Object* length,
1229 FixedArray* parameter_map) {
1222 // TODO(mstarzinger): This was never implemented but will be used once we 1230 // TODO(mstarzinger): This was never implemented but will be used once we
1223 // correctly implement [[DefineOwnProperty]] on arrays. 1231 // correctly implement [[DefineOwnProperty]] on arrays.
1224 UNIMPLEMENTED(); 1232 UNIMPLEMENTED();
1225 return obj; 1233 return obj;
1226 } 1234 }
1227 1235
1228 virtual MaybeObject* Delete(JSObject* obj, 1236 MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
1229 uint32_t key, 1237 uint32_t key,
1230 JSReceiver::DeleteMode mode) { 1238 JSReceiver::DeleteMode mode) {
1231 FixedArray* parameter_map = FixedArray::cast(obj->elements()); 1239 FixedArray* parameter_map = FixedArray::cast(obj->elements());
1232 Object* probe = GetParameterMapArg(obj, parameter_map, key); 1240 Object* probe = GetParameterMapArg(obj, parameter_map, key);
1233 if (!probe->IsTheHole()) { 1241 if (!probe->IsTheHole()) {
1234 // TODO(kmillikin): We could check if this was the last aliased 1242 // TODO(kmillikin): We could check if this was the last aliased
1235 // parameter, and revert to normal elements in that case. That 1243 // parameter, and revert to normal elements in that case. That
1236 // would enable GC of the context. 1244 // would enable GC of the context.
1237 parameter_map->set_the_hole(key + 2); 1245 parameter_map->set_the_hole(key + 2);
1238 } else { 1246 } else {
1239 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); 1247 FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
1240 if (arguments->IsDictionary()) { 1248 if (arguments->IsDictionary()) {
1241 return DictionaryElementsAccessor::DeleteCommon(obj, key, mode); 1249 return DictionaryElementsAccessor::DeleteCommon(obj, key, mode);
1242 } else { 1250 } else {
1243 return FastObjectElementsAccessor::DeleteCommon(obj, key); 1251 return FastObjectElementsAccessor::DeleteCommon(obj, key);
1244 } 1252 }
1245 } 1253 }
1246 return obj->GetHeap()->true_value(); 1254 return obj->GetHeap()->true_value();
1247 } 1255 }
1248 1256
1249 static MaybeObject* CopyElementsImpl(FixedArrayBase* from, 1257 MUST_USE_RESULT static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
1250 uint32_t from_start, 1258 uint32_t from_start,
1251 FixedArrayBase* to, 1259 FixedArrayBase* to,
1252 ElementsKind to_kind, 1260 ElementsKind to_kind,
1253 uint32_t to_start, 1261 uint32_t to_start,
1254 int copy_size) { 1262 int copy_size) {
1255 FixedArray* parameter_map = FixedArray::cast(from); 1263 FixedArray* parameter_map = FixedArray::cast(from);
1256 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); 1264 FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
1257 ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments); 1265 ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments);
1258 return accessor->CopyElements(NULL, from_start, to, to_kind, 1266 return accessor->CopyElements(NULL, from_start, to, to_kind,
1259 to_start, copy_size, arguments); 1267 to_start, copy_size, arguments);
1260 } 1268 }
1261 1269
1262 static uint32_t GetCapacityImpl(FixedArray* parameter_map) { 1270 static uint32_t GetCapacityImpl(FixedArray* parameter_map) {
1263 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); 1271 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
1264 return Max(static_cast<uint32_t>(parameter_map->length() - 2), 1272 return Max(static_cast<uint32_t>(parameter_map->length() - 2),
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1347 1355
1348 void ElementsAccessor::TearDown() { 1356 void ElementsAccessor::TearDown() {
1349 #define ACCESSOR_DELETE(Class, Kind, Store) delete elements_accessors_[Kind]; 1357 #define ACCESSOR_DELETE(Class, Kind, Store) delete elements_accessors_[Kind];
1350 ELEMENTS_LIST(ACCESSOR_DELETE) 1358 ELEMENTS_LIST(ACCESSOR_DELETE)
1351 #undef ACCESSOR_DELETE 1359 #undef ACCESSOR_DELETE
1352 elements_accessors_ = NULL; 1360 elements_accessors_ = NULL;
1353 } 1361 }
1354 1362
1355 1363
1356 template <typename ElementsAccessorSubclass, typename ElementsKindTraits> 1364 template <typename ElementsAccessorSubclass, typename ElementsKindTraits>
1357 MaybeObject* ElementsAccessorBase<ElementsAccessorSubclass, 1365 MUST_USE_RESULT MaybeObject* ElementsAccessorBase<ElementsAccessorSubclass,
1358 ElementsKindTraits>:: 1366 ElementsKindTraits>::
1359 SetLengthImpl(JSObject* obj, 1367 SetLengthImpl(JSObject* obj,
1360 Object* length, 1368 Object* length,
1361 typename ElementsKindTraits::BackingStore* backing_store) { 1369 typename ElementsKindTraits::BackingStore* backing_store) {
1362 JSArray* array = JSArray::cast(obj); 1370 JSArray* array = JSArray::cast(obj);
1363 1371
1364 // Fast case: The new length fits into a Smi. 1372 // Fast case: The new length fits into a Smi.
1365 MaybeObject* maybe_smi_length = length->ToSmi(); 1373 MaybeObject* maybe_smi_length = length->ToSmi();
1366 Object* smi_length = Smi::FromInt(0); 1374 Object* smi_length = Smi::FromInt(0);
1367 if (maybe_smi_length->ToObject(&smi_length) && smi_length->IsSmi()) { 1375 if (maybe_smi_length->ToObject(&smi_length) && smi_length->IsSmi()) {
1368 const int value = Smi::cast(smi_length)->value(); 1376 const int value = Smi::cast(smi_length)->value();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1408 if (!maybe_obj->To(&new_backing_store)) return maybe_obj; 1416 if (!maybe_obj->To(&new_backing_store)) return maybe_obj;
1409 new_backing_store->set(0, length); 1417 new_backing_store->set(0, length);
1410 { MaybeObject* result = array->SetContent(new_backing_store); 1418 { MaybeObject* result = array->SetContent(new_backing_store);
1411 if (result->IsFailure()) return result; 1419 if (result->IsFailure()) return result;
1412 } 1420 }
1413 return array; 1421 return array;
1414 } 1422 }
1415 1423
1416 1424
1417 } } // namespace v8::internal 1425 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698