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

Side by Side Diff: src/objects.cc

Issue 293023: Added infrastructure for optimizing new CanvasArray types in WebGL... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 2 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 | « src/objects.h ('k') | src/objects-debug.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 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 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 987 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 break; 998 break;
999 case FIXED_ARRAY_TYPE: 999 case FIXED_ARRAY_TYPE:
1000 accumulator->Add("<FixedArray[%u]>", FixedArray::cast(this)->length()); 1000 accumulator->Add("<FixedArray[%u]>", FixedArray::cast(this)->length());
1001 break; 1001 break;
1002 case BYTE_ARRAY_TYPE: 1002 case BYTE_ARRAY_TYPE:
1003 accumulator->Add("<ByteArray[%u]>", ByteArray::cast(this)->length()); 1003 accumulator->Add("<ByteArray[%u]>", ByteArray::cast(this)->length());
1004 break; 1004 break;
1005 case PIXEL_ARRAY_TYPE: 1005 case PIXEL_ARRAY_TYPE:
1006 accumulator->Add("<PixelArray[%u]>", PixelArray::cast(this)->length()); 1006 accumulator->Add("<PixelArray[%u]>", PixelArray::cast(this)->length());
1007 break; 1007 break;
1008 case EXTERNAL_BYTE_ARRAY_TYPE:
1009 accumulator->Add("<ExternalByteArray[%u]>",
1010 ExternalByteArray::cast(this)->length());
1011 break;
1012 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
1013 accumulator->Add("<ExternalUnsignedByteArray[%u]>",
1014 ExternalUnsignedByteArray::cast(this)->length());
1015 break;
1016 case EXTERNAL_SHORT_ARRAY_TYPE:
1017 accumulator->Add("<ExternalShortArray[%u]>",
1018 ExternalShortArray::cast(this)->length());
1019 break;
1020 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
1021 accumulator->Add("<ExternalUnsignedShortArray[%u]>",
1022 ExternalUnsignedShortArray::cast(this)->length());
1023 break;
1024 case EXTERNAL_INT_ARRAY_TYPE:
1025 accumulator->Add("<ExternalIntArray[%u]>",
1026 ExternalIntArray::cast(this)->length());
1027 break;
1028 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
1029 accumulator->Add("<ExternalUnsignedIntArray[%u]>",
1030 ExternalUnsignedIntArray::cast(this)->length());
1031 break;
1032 case EXTERNAL_FLOAT_ARRAY_TYPE:
1033 accumulator->Add("<ExternalFloatArray[%u]>",
1034 ExternalFloatArray::cast(this)->length());
1035 break;
1008 case SHARED_FUNCTION_INFO_TYPE: 1036 case SHARED_FUNCTION_INFO_TYPE:
1009 accumulator->Add("<SharedFunctionInfo>"); 1037 accumulator->Add("<SharedFunctionInfo>");
1010 break; 1038 break;
1011 #define MAKE_STRUCT_CASE(NAME, Name, name) \ 1039 #define MAKE_STRUCT_CASE(NAME, Name, name) \
1012 case NAME##_TYPE: \ 1040 case NAME##_TYPE: \
1013 accumulator->Put('<'); \ 1041 accumulator->Put('<'); \
1014 accumulator->Add(#Name); \ 1042 accumulator->Add(#Name); \
1015 accumulator->Put('>'); \ 1043 accumulator->Put('>'); \
1016 break; 1044 break;
1017 STRUCT_LIST(MAKE_STRUCT_CASE) 1045 STRUCT_LIST(MAKE_STRUCT_CASE)
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1140 reinterpret_cast<Code*>(this)->CodeIterateBody(v); 1168 reinterpret_cast<Code*>(this)->CodeIterateBody(v);
1141 break; 1169 break;
1142 case JS_GLOBAL_PROPERTY_CELL_TYPE: 1170 case JS_GLOBAL_PROPERTY_CELL_TYPE:
1143 reinterpret_cast<JSGlobalPropertyCell*>(this) 1171 reinterpret_cast<JSGlobalPropertyCell*>(this)
1144 ->JSGlobalPropertyCellIterateBody(v); 1172 ->JSGlobalPropertyCellIterateBody(v);
1145 break; 1173 break;
1146 case HEAP_NUMBER_TYPE: 1174 case HEAP_NUMBER_TYPE:
1147 case FILLER_TYPE: 1175 case FILLER_TYPE:
1148 case BYTE_ARRAY_TYPE: 1176 case BYTE_ARRAY_TYPE:
1149 case PIXEL_ARRAY_TYPE: 1177 case PIXEL_ARRAY_TYPE:
1178 case EXTERNAL_BYTE_ARRAY_TYPE:
1179 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
1180 case EXTERNAL_SHORT_ARRAY_TYPE:
1181 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
1182 case EXTERNAL_INT_ARRAY_TYPE:
1183 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
1184 case EXTERNAL_FLOAT_ARRAY_TYPE:
1150 break; 1185 break;
1151 case SHARED_FUNCTION_INFO_TYPE: { 1186 case SHARED_FUNCTION_INFO_TYPE: {
1152 SharedFunctionInfo* shared = reinterpret_cast<SharedFunctionInfo*>(this); 1187 SharedFunctionInfo* shared = reinterpret_cast<SharedFunctionInfo*>(this);
1153 shared->SharedFunctionInfoIterateBody(v); 1188 shared->SharedFunctionInfoIterateBody(v);
1154 break; 1189 break;
1155 } 1190 }
1156 #define MAKE_STRUCT_CASE(NAME, Name, name) \ 1191 #define MAKE_STRUCT_CASE(NAME, Name, name) \
1157 case NAME##_TYPE: 1192 case NAME##_TYPE:
1158 STRUCT_LIST(MAKE_STRUCT_CASE) 1193 STRUCT_LIST(MAKE_STRUCT_CASE)
1159 #undef MAKE_STRUCT_CASE 1194 #undef MAKE_STRUCT_CASE
(...skipping 1070 matching lines...) Expand 10 before | Expand all | Expand 10 after
2230 2265
2231 Object* JSObject::TransformToFastProperties(int unused_property_fields) { 2266 Object* JSObject::TransformToFastProperties(int unused_property_fields) {
2232 if (HasFastProperties()) return this; 2267 if (HasFastProperties()) return this;
2233 ASSERT(!IsGlobalObject()); 2268 ASSERT(!IsGlobalObject());
2234 return property_dictionary()-> 2269 return property_dictionary()->
2235 TransformPropertiesToFastFor(this, unused_property_fields); 2270 TransformPropertiesToFastFor(this, unused_property_fields);
2236 } 2271 }
2237 2272
2238 2273
2239 Object* JSObject::NormalizeElements() { 2274 Object* JSObject::NormalizeElements() {
2240 ASSERT(!HasPixelElements()); 2275 ASSERT(!HasPixelElements() && !HasExternalArrayElements());
2241 if (HasDictionaryElements()) return this; 2276 if (HasDictionaryElements()) return this;
2242 2277
2243 // Get number of entries. 2278 // Get number of entries.
2244 FixedArray* array = FixedArray::cast(elements()); 2279 FixedArray* array = FixedArray::cast(elements());
2245 2280
2246 // Compute the effective length. 2281 // Compute the effective length.
2247 int length = IsJSArray() ? 2282 int length = IsJSArray() ?
2248 Smi::cast(JSArray::cast(this)->length())->value() : 2283 Smi::cast(JSArray::cast(this)->length())->value() :
2249 array->length(); 2284 array->length();
2250 Object* obj = NumberDictionary::Allocate(length); 2285 Object* obj = NumberDictionary::Allocate(length);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2315 } 2350 }
2316 Object* raw_result = 2351 Object* raw_result =
2317 this_handle->DeletePropertyPostInterceptor(*name_handle, NORMAL_DELETION); 2352 this_handle->DeletePropertyPostInterceptor(*name_handle, NORMAL_DELETION);
2318 RETURN_IF_SCHEDULED_EXCEPTION(); 2353 RETURN_IF_SCHEDULED_EXCEPTION();
2319 return raw_result; 2354 return raw_result;
2320 } 2355 }
2321 2356
2322 2357
2323 Object* JSObject::DeleteElementPostInterceptor(uint32_t index, 2358 Object* JSObject::DeleteElementPostInterceptor(uint32_t index,
2324 DeleteMode mode) { 2359 DeleteMode mode) {
2325 ASSERT(!HasPixelElements()); 2360 ASSERT(!HasPixelElements() && !HasExternalArrayElements());
2326 switch (GetElementsKind()) { 2361 switch (GetElementsKind()) {
2327 case FAST_ELEMENTS: { 2362 case FAST_ELEMENTS: {
2328 uint32_t length = IsJSArray() ? 2363 uint32_t length = IsJSArray() ?
2329 static_cast<uint32_t>(Smi::cast(JSArray::cast(this)->length())->value()) : 2364 static_cast<uint32_t>(Smi::cast(JSArray::cast(this)->length())->value()) :
2330 static_cast<uint32_t>(FixedArray::cast(elements())->length()); 2365 static_cast<uint32_t>(FixedArray::cast(elements())->length());
2331 if (index < length) { 2366 if (index < length) {
2332 FixedArray::cast(elements())->set_the_hole(index); 2367 FixedArray::cast(elements())->set_the_hole(index);
2333 } 2368 }
2334 break; 2369 break;
2335 } 2370 }
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
2406 switch (GetElementsKind()) { 2441 switch (GetElementsKind()) {
2407 case FAST_ELEMENTS: { 2442 case FAST_ELEMENTS: {
2408 uint32_t length = IsJSArray() ? 2443 uint32_t length = IsJSArray() ?
2409 static_cast<uint32_t>(Smi::cast(JSArray::cast(this)->length())->value()) : 2444 static_cast<uint32_t>(Smi::cast(JSArray::cast(this)->length())->value()) :
2410 static_cast<uint32_t>(FixedArray::cast(elements())->length()); 2445 static_cast<uint32_t>(FixedArray::cast(elements())->length());
2411 if (index < length) { 2446 if (index < length) {
2412 FixedArray::cast(elements())->set_the_hole(index); 2447 FixedArray::cast(elements())->set_the_hole(index);
2413 } 2448 }
2414 break; 2449 break;
2415 } 2450 }
2416 case PIXEL_ELEMENTS: { 2451 case PIXEL_ELEMENTS:
2417 // Pixel elements cannot be deleted. Just silently ignore here. 2452 case EXTERNAL_BYTE_ELEMENTS:
2453 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
2454 case EXTERNAL_SHORT_ELEMENTS:
2455 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
2456 case EXTERNAL_INT_ELEMENTS:
2457 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
2458 case EXTERNAL_FLOAT_ELEMENTS:
2459 // Pixel and external array elements cannot be deleted. Just
2460 // silently ignore here.
2418 break; 2461 break;
2419 }
2420 case DICTIONARY_ELEMENTS: { 2462 case DICTIONARY_ELEMENTS: {
2421 NumberDictionary* dictionary = element_dictionary(); 2463 NumberDictionary* dictionary = element_dictionary();
2422 int entry = dictionary->FindEntry(index); 2464 int entry = dictionary->FindEntry(index);
2423 if (entry != NumberDictionary::kNotFound) { 2465 if (entry != NumberDictionary::kNotFound) {
2424 return dictionary->DeleteProperty(entry, mode); 2466 return dictionary->DeleteProperty(entry, mode);
2425 } 2467 }
2426 break; 2468 break;
2427 } 2469 }
2428 default: 2470 default:
2429 UNREACHABLE(); 2471 UNREACHABLE();
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
2500 2542
2501 // Check if the object is among the named properties. 2543 // Check if the object is among the named properties.
2502 Object* key = SlowReverseLookup(obj); 2544 Object* key = SlowReverseLookup(obj);
2503 if (key != Heap::undefined_value()) { 2545 if (key != Heap::undefined_value()) {
2504 return true; 2546 return true;
2505 } 2547 }
2506 2548
2507 // Check if the object is among the indexed properties. 2549 // Check if the object is among the indexed properties.
2508 switch (GetElementsKind()) { 2550 switch (GetElementsKind()) {
2509 case PIXEL_ELEMENTS: 2551 case PIXEL_ELEMENTS:
2510 // Raw pixels do not reference other objects. 2552 case EXTERNAL_BYTE_ELEMENTS:
2553 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
2554 case EXTERNAL_SHORT_ELEMENTS:
2555 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
2556 case EXTERNAL_INT_ELEMENTS:
2557 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
2558 case EXTERNAL_FLOAT_ELEMENTS:
2559 // Raw pixels and external arrays do not reference other
2560 // objects.
2511 break; 2561 break;
2512 case FAST_ELEMENTS: { 2562 case FAST_ELEMENTS: {
2513 int length = IsJSArray() ? 2563 int length = IsJSArray() ?
2514 Smi::cast(JSArray::cast(this)->length())->value() : 2564 Smi::cast(JSArray::cast(this)->length())->value() :
2515 FixedArray::cast(elements())->length(); 2565 FixedArray::cast(elements())->length();
2516 for (int i = 0; i < length; i++) { 2566 for (int i = 0; i < length; i++) {
2517 Object* element = FixedArray::cast(elements())->get(i); 2567 Object* element = FixedArray::cast(elements())->get(i);
2518 if (!element->IsTheHole() && element == obj) { 2568 if (!element->IsTheHole() && element == obj) {
2519 return true; 2569 return true;
2520 } 2570 }
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
2745 2795
2746 uint32_t index; 2796 uint32_t index;
2747 bool is_element = name->AsArrayIndex(&index); 2797 bool is_element = name->AsArrayIndex(&index);
2748 if (is_element && IsJSArray()) return Heap::undefined_value(); 2798 if (is_element && IsJSArray()) return Heap::undefined_value();
2749 2799
2750 if (is_element) { 2800 if (is_element) {
2751 switch (GetElementsKind()) { 2801 switch (GetElementsKind()) {
2752 case FAST_ELEMENTS: 2802 case FAST_ELEMENTS:
2753 break; 2803 break;
2754 case PIXEL_ELEMENTS: 2804 case PIXEL_ELEMENTS:
2755 // Ignore getters and setters on pixel elements. 2805 case EXTERNAL_BYTE_ELEMENTS:
2806 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
2807 case EXTERNAL_SHORT_ELEMENTS:
2808 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
2809 case EXTERNAL_INT_ELEMENTS:
2810 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
2811 case EXTERNAL_FLOAT_ELEMENTS:
2812 // Ignore getters and setters on pixel and external array
2813 // elements.
2756 return Heap::undefined_value(); 2814 return Heap::undefined_value();
2757 case DICTIONARY_ELEMENTS: { 2815 case DICTIONARY_ELEMENTS: {
2758 // Lookup the index. 2816 // Lookup the index.
2759 NumberDictionary* dictionary = element_dictionary(); 2817 NumberDictionary* dictionary = element_dictionary();
2760 int entry = dictionary->FindEntry(index); 2818 int entry = dictionary->FindEntry(index);
2761 if (entry != NumberDictionary::kNotFound) { 2819 if (entry != NumberDictionary::kNotFound) {
2762 Object* result = dictionary->ValueAt(entry); 2820 Object* result = dictionary->ValueAt(entry);
2763 PropertyDetails details = dictionary->DetailsAt(entry); 2821 PropertyDetails details = dictionary->DetailsAt(entry);
2764 if (details.IsReadOnly()) return Heap::undefined_value(); 2822 if (details.IsReadOnly()) return Heap::undefined_value();
2765 if (details.type() == CALLBACKS) { 2823 if (details.type() == CALLBACKS) {
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
3080 if (element->IsString() && 3138 if (element->IsString() &&
3081 key->IsString() && String::cast(element)->Equals(String::cast(key))) { 3139 key->IsString() && String::cast(element)->Equals(String::cast(key))) {
3082 return true; 3140 return true;
3083 } 3141 }
3084 } 3142 }
3085 return false; 3143 return false;
3086 } 3144 }
3087 3145
3088 3146
3089 Object* FixedArray::AddKeysFromJSArray(JSArray* array) { 3147 Object* FixedArray::AddKeysFromJSArray(JSArray* array) {
3090 ASSERT(!array->HasPixelElements()); 3148 ASSERT(!array->HasPixelElements() && !array->HasExternalArrayElements());
3091 switch (array->GetElementsKind()) { 3149 switch (array->GetElementsKind()) {
3092 case JSObject::FAST_ELEMENTS: 3150 case JSObject::FAST_ELEMENTS:
3093 return UnionOfKeys(FixedArray::cast(array->elements())); 3151 return UnionOfKeys(FixedArray::cast(array->elements()));
3094 case JSObject::DICTIONARY_ELEMENTS: { 3152 case JSObject::DICTIONARY_ELEMENTS: {
3095 NumberDictionary* dict = array->element_dictionary(); 3153 NumberDictionary* dict = array->element_dictionary();
3096 int size = dict->NumberOfElements(); 3154 int size = dict->NumberOfElements();
3097 3155
3098 // Allocate a temporary fixed array. 3156 // Allocate a temporary fixed array.
3099 Object* object = Heap::AllocateFixedArray(size); 3157 Object* object = Heap::AllocateFixedArray(size);
3100 if (object->IsFailure()) return object; 3158 if (object->IsFailure()) return object;
(...skipping 2093 matching lines...) Expand 10 before | Expand all | Expand 10 after
5194 5252
5195 PrintF("RelocInfo (size = %d)\n", relocation_size()); 5253 PrintF("RelocInfo (size = %d)\n", relocation_size());
5196 for (RelocIterator it(this); !it.done(); it.next()) 5254 for (RelocIterator it(this); !it.done(); it.next())
5197 it.rinfo()->Print(); 5255 it.rinfo()->Print();
5198 PrintF("\n"); 5256 PrintF("\n");
5199 } 5257 }
5200 #endif // ENABLE_DISASSEMBLER 5258 #endif // ENABLE_DISASSEMBLER
5201 5259
5202 5260
5203 void JSObject::SetFastElements(FixedArray* elems) { 5261 void JSObject::SetFastElements(FixedArray* elems) {
5204 // We should never end in here with a pixel array. 5262 // We should never end in here with a pixel or external array.
5205 ASSERT(!HasPixelElements()); 5263 ASSERT(!HasPixelElements() && !HasExternalArrayElements());
5206 #ifdef DEBUG 5264 #ifdef DEBUG
5207 // Check the provided array is filled with the_hole. 5265 // Check the provided array is filled with the_hole.
5208 uint32_t len = static_cast<uint32_t>(elems->length()); 5266 uint32_t len = static_cast<uint32_t>(elems->length());
5209 for (uint32_t i = 0; i < len; i++) ASSERT(elems->get(i)->IsTheHole()); 5267 for (uint32_t i = 0; i < len; i++) ASSERT(elems->get(i)->IsTheHole());
5210 #endif 5268 #endif
5211 WriteBarrierMode mode = elems->GetWriteBarrierMode(); 5269 WriteBarrierMode mode = elems->GetWriteBarrierMode();
5212 switch (GetElementsKind()) { 5270 switch (GetElementsKind()) {
5213 case FAST_ELEMENTS: { 5271 case FAST_ELEMENTS: {
5214 FixedArray* old_elements = FixedArray::cast(elements()); 5272 FixedArray* old_elements = FixedArray::cast(elements());
5215 uint32_t old_length = static_cast<uint32_t>(old_elements->length()); 5273 uint32_t old_length = static_cast<uint32_t>(old_elements->length());
(...skipping 16 matching lines...) Expand all
5232 } 5290 }
5233 default: 5291 default:
5234 UNREACHABLE(); 5292 UNREACHABLE();
5235 break; 5293 break;
5236 } 5294 }
5237 set_elements(elems); 5295 set_elements(elems);
5238 } 5296 }
5239 5297
5240 5298
5241 Object* JSObject::SetSlowElements(Object* len) { 5299 Object* JSObject::SetSlowElements(Object* len) {
5242 // We should never end in here with a pixel array. 5300 // We should never end in here with a pixel or external array.
5243 ASSERT(!HasPixelElements()); 5301 ASSERT(!HasPixelElements() && !HasExternalArrayElements());
5244 5302
5245 uint32_t new_length = static_cast<uint32_t>(len->Number()); 5303 uint32_t new_length = static_cast<uint32_t>(len->Number());
5246 5304
5247 switch (GetElementsKind()) { 5305 switch (GetElementsKind()) {
5248 case FAST_ELEMENTS: { 5306 case FAST_ELEMENTS: {
5249 // Make sure we never try to shrink dense arrays into sparse arrays. 5307 // Make sure we never try to shrink dense arrays into sparse arrays.
5250 ASSERT(static_cast<uint32_t>(FixedArray::cast(elements())->length()) <= 5308 ASSERT(static_cast<uint32_t>(FixedArray::cast(elements())->length()) <=
5251 new_length); 5309 new_length);
5252 Object* obj = NormalizeElements(); 5310 Object* obj = NormalizeElements();
5253 if (obj->IsFailure()) return obj; 5311 if (obj->IsFailure()) return obj;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
5311 5369
5312 5370
5313 static Object* ArrayLengthRangeError() { 5371 static Object* ArrayLengthRangeError() {
5314 HandleScope scope; 5372 HandleScope scope;
5315 return Top::Throw(*Factory::NewRangeError("invalid_array_length", 5373 return Top::Throw(*Factory::NewRangeError("invalid_array_length",
5316 HandleVector<Object>(NULL, 0))); 5374 HandleVector<Object>(NULL, 0)));
5317 } 5375 }
5318 5376
5319 5377
5320 Object* JSObject::SetElementsLength(Object* len) { 5378 Object* JSObject::SetElementsLength(Object* len) {
5321 // We should never end in here with a pixel array. 5379 // We should never end in here with a pixel or external array.
5322 ASSERT(!HasPixelElements()); 5380 ASSERT(!HasPixelElements() && !HasExternalArrayElements());
5323 5381
5324 Object* smi_length = len->ToSmi(); 5382 Object* smi_length = len->ToSmi();
5325 if (smi_length->IsSmi()) { 5383 if (smi_length->IsSmi()) {
5326 int value = Smi::cast(smi_length)->value(); 5384 int value = Smi::cast(smi_length)->value();
5327 if (value < 0) return ArrayLengthRangeError(); 5385 if (value < 0) return ArrayLengthRangeError();
5328 switch (GetElementsKind()) { 5386 switch (GetElementsKind()) {
5329 case FAST_ELEMENTS: { 5387 case FAST_ELEMENTS: {
5330 int old_capacity = FixedArray::cast(elements())->length(); 5388 int old_capacity = FixedArray::cast(elements())->length();
5331 if (value <= old_capacity) { 5389 if (value <= old_capacity) {
5332 if (IsJSArray()) { 5390 if (IsJSArray()) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
5413 break; 5471 break;
5414 } 5472 }
5415 case PIXEL_ELEMENTS: { 5473 case PIXEL_ELEMENTS: {
5416 // TODO(iposva): Add testcase. 5474 // TODO(iposva): Add testcase.
5417 PixelArray* pixels = PixelArray::cast(elements()); 5475 PixelArray* pixels = PixelArray::cast(elements());
5418 if (index < static_cast<uint32_t>(pixels->length())) { 5476 if (index < static_cast<uint32_t>(pixels->length())) {
5419 return true; 5477 return true;
5420 } 5478 }
5421 break; 5479 break;
5422 } 5480 }
5481 case EXTERNAL_BYTE_ELEMENTS:
5482 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
5483 case EXTERNAL_SHORT_ELEMENTS:
5484 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
5485 case EXTERNAL_INT_ELEMENTS:
5486 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
5487 case EXTERNAL_FLOAT_ELEMENTS: {
5488 // TODO(kbr): Add testcase.
5489 ExternalArray* array = ExternalArray::cast(elements());
5490 if (index < static_cast<uint32_t>(array->length())) {
5491 return true;
5492 }
5493 break;
5494 }
5423 case DICTIONARY_ELEMENTS: { 5495 case DICTIONARY_ELEMENTS: {
5424 if (element_dictionary()->FindEntry(index) 5496 if (element_dictionary()->FindEntry(index)
5425 != NumberDictionary::kNotFound) { 5497 != NumberDictionary::kNotFound) {
5426 return true; 5498 return true;
5427 } 5499 }
5428 break; 5500 break;
5429 } 5501 }
5430 default: 5502 default:
5431 UNREACHABLE(); 5503 UNREACHABLE();
5432 break; 5504 break;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
5500 static_cast<uint32_t> 5572 static_cast<uint32_t>
5501 (Smi::cast(JSArray::cast(this)->length())->value()) : 5573 (Smi::cast(JSArray::cast(this)->length())->value()) :
5502 static_cast<uint32_t>(FixedArray::cast(elements())->length()); 5574 static_cast<uint32_t>(FixedArray::cast(elements())->length());
5503 return (index < length) && 5575 return (index < length) &&
5504 !FixedArray::cast(elements())->get(index)->IsTheHole(); 5576 !FixedArray::cast(elements())->get(index)->IsTheHole();
5505 } 5577 }
5506 case PIXEL_ELEMENTS: { 5578 case PIXEL_ELEMENTS: {
5507 PixelArray* pixels = PixelArray::cast(elements()); 5579 PixelArray* pixels = PixelArray::cast(elements());
5508 return (index < static_cast<uint32_t>(pixels->length())); 5580 return (index < static_cast<uint32_t>(pixels->length()));
5509 } 5581 }
5582 case EXTERNAL_BYTE_ELEMENTS:
5583 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
5584 case EXTERNAL_SHORT_ELEMENTS:
5585 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
5586 case EXTERNAL_INT_ELEMENTS:
5587 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
5588 case EXTERNAL_FLOAT_ELEMENTS: {
5589 ExternalArray* array = ExternalArray::cast(elements());
5590 return (index < static_cast<uint32_t>(array->length()));
5591 }
5510 case DICTIONARY_ELEMENTS: { 5592 case DICTIONARY_ELEMENTS: {
5511 return element_dictionary()->FindEntry(index) 5593 return element_dictionary()->FindEntry(index)
5512 != NumberDictionary::kNotFound; 5594 != NumberDictionary::kNotFound;
5513 } 5595 }
5514 default: 5596 default:
5515 UNREACHABLE(); 5597 UNREACHABLE();
5516 break; 5598 break;
5517 } 5599 }
5518 UNREACHABLE(); 5600 UNREACHABLE();
5519 return Heap::null_value(); 5601 return Heap::null_value();
(...skipping 23 matching lines...) Expand all
5543 !FixedArray::cast(elements())->get(index)->IsTheHole()) return true; 5625 !FixedArray::cast(elements())->get(index)->IsTheHole()) return true;
5544 break; 5626 break;
5545 } 5627 }
5546 case PIXEL_ELEMENTS: { 5628 case PIXEL_ELEMENTS: {
5547 PixelArray* pixels = PixelArray::cast(elements()); 5629 PixelArray* pixels = PixelArray::cast(elements());
5548 if (index < static_cast<uint32_t>(pixels->length())) { 5630 if (index < static_cast<uint32_t>(pixels->length())) {
5549 return true; 5631 return true;
5550 } 5632 }
5551 break; 5633 break;
5552 } 5634 }
5635 case EXTERNAL_BYTE_ELEMENTS:
5636 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
5637 case EXTERNAL_SHORT_ELEMENTS:
5638 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
5639 case EXTERNAL_INT_ELEMENTS:
5640 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
5641 case EXTERNAL_FLOAT_ELEMENTS: {
5642 ExternalArray* array = ExternalArray::cast(elements());
5643 if (index < static_cast<uint32_t>(array->length())) {
5644 return true;
5645 }
5646 break;
5647 }
5553 case DICTIONARY_ELEMENTS: { 5648 case DICTIONARY_ELEMENTS: {
5554 if (element_dictionary()->FindEntry(index) 5649 if (element_dictionary()->FindEntry(index)
5555 != NumberDictionary::kNotFound) { 5650 != NumberDictionary::kNotFound) {
5556 return true; 5651 return true;
5557 } 5652 }
5558 break; 5653 break;
5559 } 5654 }
5560 default: 5655 default:
5561 UNREACHABLE(); 5656 UNREACHABLE();
5562 break; 5657 break;
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
5683 5778
5684 Object* JSObject::SetElementWithoutInterceptor(uint32_t index, Object* value) { 5779 Object* JSObject::SetElementWithoutInterceptor(uint32_t index, Object* value) {
5685 switch (GetElementsKind()) { 5780 switch (GetElementsKind()) {
5686 case FAST_ELEMENTS: 5781 case FAST_ELEMENTS:
5687 // Fast case. 5782 // Fast case.
5688 return SetFastElement(index, value); 5783 return SetFastElement(index, value);
5689 case PIXEL_ELEMENTS: { 5784 case PIXEL_ELEMENTS: {
5690 PixelArray* pixels = PixelArray::cast(elements()); 5785 PixelArray* pixels = PixelArray::cast(elements());
5691 return pixels->SetValue(index, value); 5786 return pixels->SetValue(index, value);
5692 } 5787 }
5788 case EXTERNAL_BYTE_ELEMENTS: {
5789 ExternalByteArray* array = ExternalByteArray::cast(elements());
5790 return array->SetValue(index, value);
5791 }
5792 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: {
5793 ExternalUnsignedByteArray* array =
5794 ExternalUnsignedByteArray::cast(elements());
5795 return array->SetValue(index, value);
5796 }
5797 case EXTERNAL_SHORT_ELEMENTS: {
5798 ExternalShortArray* array = ExternalShortArray::cast(elements());
5799 return array->SetValue(index, value);
5800 }
5801 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: {
5802 ExternalUnsignedShortArray* array =
5803 ExternalUnsignedShortArray::cast(elements());
5804 return array->SetValue(index, value);
5805 }
5806 case EXTERNAL_INT_ELEMENTS: {
5807 ExternalIntArray* array = ExternalIntArray::cast(elements());
5808 return array->SetValue(index, value);
5809 }
5810 case EXTERNAL_UNSIGNED_INT_ELEMENTS: {
5811 ExternalUnsignedIntArray* array =
5812 ExternalUnsignedIntArray::cast(elements());
5813 return array->SetValue(index, value);
5814 }
5815 case EXTERNAL_FLOAT_ELEMENTS: {
5816 ExternalFloatArray* array = ExternalFloatArray::cast(elements());
5817 return array->SetValue(index, value);
5818 }
5693 case DICTIONARY_ELEMENTS: { 5819 case DICTIONARY_ELEMENTS: {
5694 // Insert element in the dictionary. 5820 // Insert element in the dictionary.
5695 FixedArray* elms = FixedArray::cast(elements()); 5821 FixedArray* elms = FixedArray::cast(elements());
5696 NumberDictionary* dictionary = NumberDictionary::cast(elms); 5822 NumberDictionary* dictionary = NumberDictionary::cast(elms);
5697 5823
5698 int entry = dictionary->FindEntry(index); 5824 int entry = dictionary->FindEntry(index);
5699 if (entry != NumberDictionary::kNotFound) { 5825 if (entry != NumberDictionary::kNotFound) {
5700 Object* element = dictionary->ValueAt(entry); 5826 Object* element = dictionary->ValueAt(entry);
5701 PropertyDetails details = dictionary->DetailsAt(entry); 5827 PropertyDetails details = dictionary->DetailsAt(entry);
5702 if (details.type() == CALLBACKS) { 5828 if (details.type() == CALLBACKS) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
5800 Object* value = elms->get(index); 5926 Object* value = elms->get(index);
5801 if (!value->IsTheHole()) return value; 5927 if (!value->IsTheHole()) return value;
5802 } 5928 }
5803 break; 5929 break;
5804 } 5930 }
5805 case PIXEL_ELEMENTS: { 5931 case PIXEL_ELEMENTS: {
5806 // TODO(iposva): Add testcase and implement. 5932 // TODO(iposva): Add testcase and implement.
5807 UNIMPLEMENTED(); 5933 UNIMPLEMENTED();
5808 break; 5934 break;
5809 } 5935 }
5936 case EXTERNAL_BYTE_ELEMENTS:
5937 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
5938 case EXTERNAL_SHORT_ELEMENTS:
5939 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
5940 case EXTERNAL_INT_ELEMENTS:
5941 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
5942 case EXTERNAL_FLOAT_ELEMENTS: {
5943 // TODO(kbr): Add testcase and implement.
5944 UNIMPLEMENTED();
5945 break;
5946 }
5810 case DICTIONARY_ELEMENTS: { 5947 case DICTIONARY_ELEMENTS: {
5811 NumberDictionary* dictionary = element_dictionary(); 5948 NumberDictionary* dictionary = element_dictionary();
5812 int entry = dictionary->FindEntry(index); 5949 int entry = dictionary->FindEntry(index);
5813 if (entry != NumberDictionary::kNotFound) { 5950 if (entry != NumberDictionary::kNotFound) {
5814 Object* element = dictionary->ValueAt(entry); 5951 Object* element = dictionary->ValueAt(entry);
5815 PropertyDetails details = dictionary->DetailsAt(entry); 5952 PropertyDetails details = dictionary->DetailsAt(entry);
5816 if (details.type() == CALLBACKS) { 5953 if (details.type() == CALLBACKS) {
5817 // Only accessors allowed as elements. 5954 // Only accessors allowed as elements.
5818 FixedArray* structure = FixedArray::cast(element); 5955 FixedArray* structure = FixedArray::cast(element);
5819 Object* getter = structure->get(kGetterIndex); 5956 Object* getter = structure->get(kGetterIndex);
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
5898 break; 6035 break;
5899 } 6036 }
5900 case PIXEL_ELEMENTS: { 6037 case PIXEL_ELEMENTS: {
5901 PixelArray* pixels = PixelArray::cast(elements()); 6038 PixelArray* pixels = PixelArray::cast(elements());
5902 if (index < static_cast<uint32_t>(pixels->length())) { 6039 if (index < static_cast<uint32_t>(pixels->length())) {
5903 uint8_t value = pixels->get(index); 6040 uint8_t value = pixels->get(index);
5904 return Smi::FromInt(value); 6041 return Smi::FromInt(value);
5905 } 6042 }
5906 break; 6043 break;
5907 } 6044 }
6045 case EXTERNAL_BYTE_ELEMENTS: {
6046 ExternalByteArray* array = ExternalByteArray::cast(elements());
6047 if (index < static_cast<uint32_t>(array->length())) {
6048 int8_t value = array->get(index);
6049 return Smi::FromInt(value);
6050 }
6051 return Top::Throw(*Factory::NewIndexError(index));
6052 }
6053 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: {
6054 ExternalUnsignedByteArray* array =
6055 ExternalUnsignedByteArray::cast(elements());
6056 if (index < static_cast<uint32_t>(array->length())) {
6057 uint8_t value = array->get(index);
6058 return Smi::FromInt(value);
6059 }
6060 return Top::Throw(*Factory::NewIndexError(index));
6061 }
6062 case EXTERNAL_SHORT_ELEMENTS: {
6063 ExternalShortArray* array = ExternalShortArray::cast(elements());
6064 if (index < static_cast<uint32_t>(array->length())) {
6065 int16_t value = array->get(index);
6066 return Smi::FromInt(value);
6067 }
6068 return Top::Throw(*Factory::NewIndexError(index));
6069 }
6070 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: {
6071 ExternalUnsignedShortArray* array =
6072 ExternalUnsignedShortArray::cast(elements());
6073 if (index < static_cast<uint32_t>(array->length())) {
6074 uint16_t value = array->get(index);
6075 return Smi::FromInt(value);
6076 }
6077 return Top::Throw(*Factory::NewIndexError(index));
6078 }
6079 case EXTERNAL_INT_ELEMENTS: {
6080 ExternalIntArray* array = ExternalIntArray::cast(elements());
6081 if (index < static_cast<uint32_t>(array->length())) {
6082 int32_t value = array->get(index);
6083 return Heap::NumberFromInt32(value);
6084 }
6085 return Top::Throw(*Factory::NewIndexError(index));
6086 }
6087 case EXTERNAL_UNSIGNED_INT_ELEMENTS: {
6088 ExternalUnsignedIntArray* array =
6089 ExternalUnsignedIntArray::cast(elements());
6090 if (index < static_cast<uint32_t>(array->length())) {
6091 uint32_t value = array->get(index);
6092 return Heap::NumberFromUint32(value);
6093 }
6094 return Top::Throw(*Factory::NewIndexError(index));
6095 }
6096 case EXTERNAL_FLOAT_ELEMENTS: {
6097 ExternalFloatArray* array = ExternalFloatArray::cast(elements());
6098 if (index < static_cast<uint32_t>(array->length())) {
6099 float value = array->get(index);
6100 return Heap::AllocateHeapNumber(value);
6101 }
6102 return Top::Throw(*Factory::NewIndexError(index));
6103 }
5908 case DICTIONARY_ELEMENTS: { 6104 case DICTIONARY_ELEMENTS: {
5909 NumberDictionary* dictionary = element_dictionary(); 6105 NumberDictionary* dictionary = element_dictionary();
5910 int entry = dictionary->FindEntry(index); 6106 int entry = dictionary->FindEntry(index);
5911 if (entry != NumberDictionary::kNotFound) { 6107 if (entry != NumberDictionary::kNotFound) {
5912 Object* element = dictionary->ValueAt(entry); 6108 Object* element = dictionary->ValueAt(entry);
5913 PropertyDetails details = dictionary->DetailsAt(entry); 6109 PropertyDetails details = dictionary->DetailsAt(entry);
5914 if (details.type() == CALLBACKS) { 6110 if (details.type() == CALLBACKS) {
5915 // Only accessors allowed as elements. 6111 // Only accessors allowed as elements.
5916 FixedArray* structure = FixedArray::cast(element); 6112 FixedArray* structure = FixedArray::cast(element);
5917 Object* getter = structure->get(kGetterIndex); 6113 Object* getter = structure->get(kGetterIndex);
(...skipping 23 matching lines...) Expand all
5941 6137
5942 switch (GetElementsKind()) { 6138 switch (GetElementsKind()) {
5943 case FAST_ELEMENTS: { 6139 case FAST_ELEMENTS: {
5944 FixedArray* elms = FixedArray::cast(elements()); 6140 FixedArray* elms = FixedArray::cast(elements());
5945 capacity = elms->length(); 6141 capacity = elms->length();
5946 for (int i = 0; i < capacity; i++) { 6142 for (int i = 0; i < capacity; i++) {
5947 if (!elms->get(i)->IsTheHole()) number_of_elements++; 6143 if (!elms->get(i)->IsTheHole()) number_of_elements++;
5948 } 6144 }
5949 break; 6145 break;
5950 } 6146 }
5951 case PIXEL_ELEMENTS: { 6147 case PIXEL_ELEMENTS:
6148 case EXTERNAL_BYTE_ELEMENTS:
6149 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
6150 case EXTERNAL_SHORT_ELEMENTS:
6151 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
6152 case EXTERNAL_INT_ELEMENTS:
6153 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
6154 case EXTERNAL_FLOAT_ELEMENTS: {
5952 return true; 6155 return true;
5953 } 6156 }
5954 case DICTIONARY_ELEMENTS: { 6157 case DICTIONARY_ELEMENTS: {
5955 NumberDictionary* dictionary = NumberDictionary::cast(elements()); 6158 NumberDictionary* dictionary = NumberDictionary::cast(elements());
5956 capacity = dictionary->Capacity(); 6159 capacity = dictionary->Capacity();
5957 number_of_elements = dictionary->NumberOfElements(); 6160 number_of_elements = dictionary->NumberOfElements();
5958 break; 6161 break;
5959 } 6162 }
5960 default: 6163 default:
5961 UNREACHABLE(); 6164 UNREACHABLE();
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
6165 static_cast<uint32_t>( 6368 static_cast<uint32_t>(
6166 Smi::cast(JSArray::cast(this)->length())->value()) : 6369 Smi::cast(JSArray::cast(this)->length())->value()) :
6167 static_cast<uint32_t>(FixedArray::cast(elements())->length()); 6370 static_cast<uint32_t>(FixedArray::cast(elements())->length());
6168 return (index < length) && 6371 return (index < length) &&
6169 !FixedArray::cast(elements())->get(index)->IsTheHole(); 6372 !FixedArray::cast(elements())->get(index)->IsTheHole();
6170 } 6373 }
6171 case PIXEL_ELEMENTS: { 6374 case PIXEL_ELEMENTS: {
6172 PixelArray* pixels = PixelArray::cast(elements()); 6375 PixelArray* pixels = PixelArray::cast(elements());
6173 return index < static_cast<uint32_t>(pixels->length()); 6376 return index < static_cast<uint32_t>(pixels->length());
6174 } 6377 }
6378 case EXTERNAL_BYTE_ELEMENTS:
6379 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
6380 case EXTERNAL_SHORT_ELEMENTS:
6381 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
6382 case EXTERNAL_INT_ELEMENTS:
6383 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
6384 case EXTERNAL_FLOAT_ELEMENTS: {
6385 ExternalArray* array = ExternalArray::cast(elements());
6386 return index < static_cast<uint32_t>(array->length());
6387 }
6175 case DICTIONARY_ELEMENTS: { 6388 case DICTIONARY_ELEMENTS: {
6176 return element_dictionary()->FindEntry(index) 6389 return element_dictionary()->FindEntry(index)
6177 != NumberDictionary::kNotFound; 6390 != NumberDictionary::kNotFound;
6178 } 6391 }
6179 default: 6392 default:
6180 UNREACHABLE(); 6393 UNREACHABLE();
6181 break; 6394 break;
6182 } 6395 }
6183 // All possibilities have been handled above already. 6396 // All possibilities have been handled above already.
6184 UNREACHABLE(); 6397 UNREACHABLE();
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
6385 int length = PixelArray::cast(elements())->length(); 6598 int length = PixelArray::cast(elements())->length();
6386 while (counter < length) { 6599 while (counter < length) {
6387 if (storage != NULL) { 6600 if (storage != NULL) {
6388 storage->set(counter, Smi::FromInt(counter), SKIP_WRITE_BARRIER); 6601 storage->set(counter, Smi::FromInt(counter), SKIP_WRITE_BARRIER);
6389 } 6602 }
6390 counter++; 6603 counter++;
6391 } 6604 }
6392 ASSERT(!storage || storage->length() >= counter); 6605 ASSERT(!storage || storage->length() >= counter);
6393 break; 6606 break;
6394 } 6607 }
6608 case EXTERNAL_BYTE_ELEMENTS:
6609 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
6610 case EXTERNAL_SHORT_ELEMENTS:
6611 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
6612 case EXTERNAL_INT_ELEMENTS:
6613 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
6614 case EXTERNAL_FLOAT_ELEMENTS: {
6615 int length = ExternalArray::cast(elements())->length();
6616 while (counter < length) {
6617 if (storage != NULL) {
6618 storage->set(counter, Smi::FromInt(counter), SKIP_WRITE_BARRIER);
6619 }
6620 counter++;
6621 }
6622 ASSERT(!storage || storage->length() >= counter);
6623 break;
6624 }
6395 case DICTIONARY_ELEMENTS: { 6625 case DICTIONARY_ELEMENTS: {
6396 if (storage != NULL) { 6626 if (storage != NULL) {
6397 element_dictionary()->CopyKeysTo(storage, filter); 6627 element_dictionary()->CopyKeysTo(storage, filter);
6398 } 6628 }
6399 counter = element_dictionary()->NumberOfElementsFilterAttributes(filter); 6629 counter = element_dictionary()->NumberOfElementsFilterAttributes(filter);
6400 break; 6630 break;
6401 } 6631 }
6402 default: 6632 default:
6403 UNREACHABLE(); 6633 UNREACHABLE();
6404 break; 6634 break;
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
6931 result_double->set_value(static_cast<double>(result)); 7161 result_double->set_value(static_cast<double>(result));
6932 return result_double; 7162 return result_double;
6933 } 7163 }
6934 7164
6935 7165
6936 // Collects all defined (non-hole) and non-undefined (array) elements at 7166 // Collects all defined (non-hole) and non-undefined (array) elements at
6937 // the start of the elements array. 7167 // the start of the elements array.
6938 // If the object is in dictionary mode, it is converted to fast elements 7168 // If the object is in dictionary mode, it is converted to fast elements
6939 // mode. 7169 // mode.
6940 Object* JSObject::PrepareElementsForSort(uint32_t limit) { 7170 Object* JSObject::PrepareElementsForSort(uint32_t limit) {
6941 ASSERT(!HasPixelElements()); 7171 ASSERT(!HasPixelElements() && !HasExternalArrayElements());
6942 7172
6943 if (HasDictionaryElements()) { 7173 if (HasDictionaryElements()) {
6944 // Convert to fast elements containing only the existing properties. 7174 // Convert to fast elements containing only the existing properties.
6945 // Ordering is irrelevant, since we are going to sort anyway. 7175 // Ordering is irrelevant, since we are going to sort anyway.
6946 NumberDictionary* dict = element_dictionary(); 7176 NumberDictionary* dict = element_dictionary();
6947 if (IsJSArray() || dict->requires_slow_elements() || 7177 if (IsJSArray() || dict->requires_slow_elements() ||
6948 dict->max_number_key() >= limit) { 7178 dict->max_number_key() >= limit) {
6949 return PrepareSlowElementsForSort(limit); 7179 return PrepareSlowElementsForSort(limit);
6950 } 7180 }
6951 // Convert to fast elements. 7181 // Convert to fast elements.
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
7063 // Clamp undefined to zero (default). All other types have been 7293 // Clamp undefined to zero (default). All other types have been
7064 // converted to a number type further up in the call chain. 7294 // converted to a number type further up in the call chain.
7065 ASSERT(value->IsUndefined()); 7295 ASSERT(value->IsUndefined());
7066 } 7296 }
7067 set(index, clamped_value); 7297 set(index, clamped_value);
7068 } 7298 }
7069 return Smi::FromInt(clamped_value); 7299 return Smi::FromInt(clamped_value);
7070 } 7300 }
7071 7301
7072 7302
7303 template<typename ExternalArrayClass, typename ValueType>
7304 static Object* ExternalArrayIntSetter(ExternalArrayClass* receiver,
7305 uint32_t index,
7306 Object* value) {
7307 ValueType cast_value = 0;
7308 if (index < static_cast<uint32_t>(receiver->length())) {
7309 if (value->IsSmi()) {
7310 int int_value = Smi::cast(value)->value();
7311 cast_value = static_cast<ValueType>(int_value);
7312 } else if (value->IsHeapNumber()) {
7313 double double_value = HeapNumber::cast(value)->value();
7314 cast_value = static_cast<ValueType>(double_value);
7315 } else {
7316 // Clamp undefined to zero (default). All other types have been
7317 // converted to a number type further up in the call chain.
7318 ASSERT(value->IsUndefined());
7319 }
7320 receiver->set(index, cast_value);
7321 } else {
7322 return Top::Throw(*Factory::NewIndexError(index));
7323 }
7324 return Heap::NumberFromInt32(cast_value);
7325 }
7326
7327
7328 Object* ExternalByteArray::SetValue(uint32_t index, Object* value) {
7329 return ExternalArrayIntSetter<ExternalByteArray, int8_t>
7330 (this, index, value);
7331 }
7332
7333
7334 Object* ExternalUnsignedByteArray::SetValue(uint32_t index, Object* value) {
7335 return ExternalArrayIntSetter<ExternalUnsignedByteArray, uint8_t>
7336 (this, index, value);
7337 }
7338
7339
7340 Object* ExternalShortArray::SetValue(uint32_t index, Object* value) {
7341 return ExternalArrayIntSetter<ExternalShortArray, int16_t>
7342 (this, index, value);
7343 }
7344
7345
7346 Object* ExternalUnsignedShortArray::SetValue(uint32_t index, Object* value) {
7347 return ExternalArrayIntSetter<ExternalUnsignedShortArray, uint16_t>
7348 (this, index, value);
7349 }
7350
7351
7352 Object* ExternalIntArray::SetValue(uint32_t index, Object* value) {
7353 return ExternalArrayIntSetter<ExternalIntArray, int32_t>
7354 (this, index, value);
7355 }
7356
7357
7358 Object* ExternalUnsignedIntArray::SetValue(uint32_t index, Object* value) {
7359 uint32_t cast_value = 0;
7360 if (index < static_cast<uint32_t>(length())) {
7361 if (value->IsSmi()) {
7362 int int_value = Smi::cast(value)->value();
7363 cast_value = static_cast<uint32_t>(int_value);
7364 } else if (value->IsHeapNumber()) {
7365 double double_value = HeapNumber::cast(value)->value();
7366 cast_value = static_cast<uint32_t>(double_value);
7367 } else {
7368 // Clamp undefined to zero (default). All other types have been
7369 // converted to a number type further up in the call chain.
7370 ASSERT(value->IsUndefined());
7371 }
7372 set(index, cast_value);
7373 } else {
7374 return Top::Throw(*Factory::NewIndexError(index));
7375 }
7376 return Heap::NumberFromUint32(cast_value);
7377 }
7378
7379
7380 Object* ExternalFloatArray::SetValue(uint32_t index, Object* value) {
7381 float cast_value = 0;
7382 if (index < static_cast<uint32_t>(length())) {
7383 if (value->IsSmi()) {
7384 int int_value = Smi::cast(value)->value();
7385 cast_value = static_cast<float>(int_value);
7386 } else if (value->IsHeapNumber()) {
7387 double double_value = HeapNumber::cast(value)->value();
7388 cast_value = static_cast<float>(double_value);
7389 } else {
7390 // Clamp undefined to zero (default). All other types have been
7391 // converted to a number type further up in the call chain.
7392 ASSERT(value->IsUndefined());
7393 }
7394 set(index, cast_value);
7395 } else {
7396 return Top::Throw(*Factory::NewIndexError(index));
7397 }
7398 return Heap::AllocateHeapNumber(cast_value);
7399 }
7400
7401
7073 Object* GlobalObject::GetPropertyCell(LookupResult* result) { 7402 Object* GlobalObject::GetPropertyCell(LookupResult* result) {
7074 ASSERT(!HasFastProperties()); 7403 ASSERT(!HasFastProperties());
7075 Object* value = property_dictionary()->ValueAt(result->GetDictionaryEntry()); 7404 Object* value = property_dictionary()->ValueAt(result->GetDictionaryEntry());
7076 ASSERT(value->IsJSGlobalPropertyCell()); 7405 ASSERT(value->IsJSGlobalPropertyCell());
7077 return value; 7406 return value;
7078 } 7407 }
7079 7408
7080 7409
7081 Object* GlobalObject::EnsurePropertyCell(String* name) { 7410 Object* GlobalObject::EnsurePropertyCell(String* name) {
7082 ASSERT(!HasFastProperties()); 7411 ASSERT(!HasFastProperties());
(...skipping 898 matching lines...) Expand 10 before | Expand all | Expand 10 after
7981 if (break_point_objects()->IsUndefined()) return 0; 8310 if (break_point_objects()->IsUndefined()) return 0;
7982 // Single beak point. 8311 // Single beak point.
7983 if (!break_point_objects()->IsFixedArray()) return 1; 8312 if (!break_point_objects()->IsFixedArray()) return 1;
7984 // Multiple break points. 8313 // Multiple break points.
7985 return FixedArray::cast(break_point_objects())->length(); 8314 return FixedArray::cast(break_point_objects())->length();
7986 } 8315 }
7987 #endif 8316 #endif
7988 8317
7989 8318
7990 } } // namespace v8::internal 8319 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698