OLD | NEW |
---|---|
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 11421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11432 | 11432 |
11433 bool threw; | 11433 bool threw; |
11434 Execution::Call(isolate, | 11434 Execution::Call(isolate, |
11435 Handle<JSFunction>(isolate->observers_end_perform_splice()), | 11435 Handle<JSFunction>(isolate->observers_end_perform_splice()), |
11436 isolate->factory()->undefined_value(), ARRAY_SIZE(args), args, | 11436 isolate->factory()->undefined_value(), ARRAY_SIZE(args), args, |
11437 &threw); | 11437 &threw); |
11438 ASSERT(!threw); | 11438 ASSERT(!threw); |
11439 } | 11439 } |
11440 | 11440 |
11441 | 11441 |
11442 // TODO(ishell): Temporary wrapper until handlified. | |
11443 // static | 11442 // static |
Yang
2014/03/19 13:54:20
I think you can remove that comment too.
Igor Sheludko
2014/03/19 14:14:23
Done.
| |
11444 Handle<Object> JSArray::SetElementsLength(Handle<JSArray> array, | 11443 Handle<Object> JSArray::SetElementsLength(Handle<JSArray> array, |
11445 Handle<Object> length) { | 11444 Handle<Object> length) { |
11446 CALL_HEAP_FUNCTION(array->GetIsolate(), | 11445 // We should never end in here with a pixel or external array. |
11447 array->SetElementsLength(*length), | 11446 ASSERT(array->AllowsSetElementsLength()); |
11448 Object); | 11447 if (!array->map()->is_observed()) { |
11449 } | 11448 return array->GetElementsAccessor()->SetLength(array, length); |
11449 } | |
11450 | 11450 |
11451 | 11451 Isolate* isolate = array->GetIsolate(); |
11452 MaybeObject* JSArray::SetElementsLength(Object* len) { | |
11453 // We should never end in here with a pixel or external array. | |
11454 ASSERT(AllowsSetElementsLength()); | |
11455 if (!map()->is_observed()) | |
11456 return GetElementsAccessor()->SetLength(this, len); | |
11457 | |
11458 Isolate* isolate = GetIsolate(); | |
11459 HandleScope scope(isolate); | |
11460 Handle<JSArray> self(this); | |
11461 List<uint32_t> indices; | 11452 List<uint32_t> indices; |
11462 List<Handle<Object> > old_values; | 11453 List<Handle<Object> > old_values; |
11463 Handle<Object> old_length_handle(self->length(), isolate); | 11454 Handle<Object> old_length_handle(array->length(), isolate); |
11464 Handle<Object> new_length_handle(len, isolate); | 11455 Handle<Object> new_length_handle = length; |
Yang
2014/03/19 13:54:20
Can we either rename the argument or rename the us
Igor Sheludko
2014/03/19 14:14:23
Done.
| |
11465 uint32_t old_length = 0; | 11456 uint32_t old_length = 0; |
11466 CHECK(old_length_handle->ToArrayIndex(&old_length)); | 11457 CHECK(old_length_handle->ToArrayIndex(&old_length)); |
11467 uint32_t new_length = 0; | 11458 uint32_t new_length = 0; |
11468 if (!new_length_handle->ToArrayIndex(&new_length)) | 11459 CHECK(new_length_handle->ToArrayIndex(&new_length)); |
11469 return Failure::InternalError(); | |
11470 | 11460 |
11471 static const PropertyAttributes kNoAttrFilter = NONE; | 11461 static const PropertyAttributes kNoAttrFilter = NONE; |
11472 int num_elements = self->NumberOfLocalElements(kNoAttrFilter); | 11462 int num_elements = array->NumberOfLocalElements(kNoAttrFilter); |
11473 if (num_elements > 0) { | 11463 if (num_elements > 0) { |
11474 if (old_length == static_cast<uint32_t>(num_elements)) { | 11464 if (old_length == static_cast<uint32_t>(num_elements)) { |
11475 // Simple case for arrays without holes. | 11465 // Simple case for arrays without holes. |
11476 for (uint32_t i = old_length - 1; i + 1 > new_length; --i) { | 11466 for (uint32_t i = old_length - 1; i + 1 > new_length; --i) { |
11477 if (!GetOldValue(isolate, self, i, &old_values, &indices)) break; | 11467 if (!GetOldValue(isolate, array, i, &old_values, &indices)) break; |
11478 } | 11468 } |
11479 } else { | 11469 } else { |
11480 // For sparse arrays, only iterate over existing elements. | 11470 // For sparse arrays, only iterate over existing elements. |
11481 // TODO(rafaelw): For fast, sparse arrays, we can avoid iterating over | 11471 // TODO(rafaelw): For fast, sparse arrays, we can avoid iterating over |
11482 // the to-be-removed indices twice. | 11472 // the to-be-removed indices twice. |
11483 Handle<FixedArray> keys = isolate->factory()->NewFixedArray(num_elements); | 11473 Handle<FixedArray> keys = isolate->factory()->NewFixedArray(num_elements); |
11484 self->GetLocalElementKeys(*keys, kNoAttrFilter); | 11474 array->GetLocalElementKeys(*keys, kNoAttrFilter); |
11485 while (num_elements-- > 0) { | 11475 while (num_elements-- > 0) { |
11486 uint32_t index = NumberToUint32(keys->get(num_elements)); | 11476 uint32_t index = NumberToUint32(keys->get(num_elements)); |
11487 if (index < new_length) break; | 11477 if (index < new_length) break; |
11488 if (!GetOldValue(isolate, self, index, &old_values, &indices)) break; | 11478 if (!GetOldValue(isolate, array, index, &old_values, &indices)) break; |
11489 } | 11479 } |
11490 } | 11480 } |
11491 } | 11481 } |
11492 | 11482 |
11493 MaybeObject* result = | 11483 Handle<Object> hresult = |
11494 self->GetElementsAccessor()->SetLength(*self, *new_length_handle); | 11484 array->GetElementsAccessor()->SetLength(array, new_length_handle); |
11495 Handle<Object> hresult; | 11485 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, hresult, hresult); |
11496 if (!result->ToHandle(&hresult, isolate)) return result; | |
11497 | 11486 |
11498 CHECK(self->length()->ToArrayIndex(&new_length)); | 11487 CHECK(array->length()->ToArrayIndex(&new_length)); |
11499 if (old_length == new_length) return *hresult; | 11488 if (old_length == new_length) return hresult; |
11500 | 11489 |
11501 BeginPerformSplice(self); | 11490 BeginPerformSplice(array); |
11502 | 11491 |
11503 for (int i = 0; i < indices.length(); ++i) { | 11492 for (int i = 0; i < indices.length(); ++i) { |
11504 JSObject::EnqueueChangeRecord( | 11493 JSObject::EnqueueChangeRecord( |
11505 self, "delete", isolate->factory()->Uint32ToString(indices[i]), | 11494 array, "delete", isolate->factory()->Uint32ToString(indices[i]), |
11506 old_values[i]); | 11495 old_values[i]); |
11507 } | 11496 } |
11508 JSObject::EnqueueChangeRecord( | 11497 JSObject::EnqueueChangeRecord( |
11509 self, "update", isolate->factory()->length_string(), | 11498 array, "update", isolate->factory()->length_string(), |
11510 old_length_handle); | 11499 old_length_handle); |
11511 | 11500 |
11512 EndPerformSplice(self); | 11501 EndPerformSplice(array); |
11513 | 11502 |
11514 uint32_t index = Min(old_length, new_length); | 11503 uint32_t index = Min(old_length, new_length); |
11515 uint32_t add_count = new_length > old_length ? new_length - old_length : 0; | 11504 uint32_t add_count = new_length > old_length ? new_length - old_length : 0; |
11516 uint32_t delete_count = new_length < old_length ? old_length - new_length : 0; | 11505 uint32_t delete_count = new_length < old_length ? old_length - new_length : 0; |
11517 Handle<JSArray> deleted = isolate->factory()->NewJSArray(0); | 11506 Handle<JSArray> deleted = isolate->factory()->NewJSArray(0); |
11518 if (delete_count > 0) { | 11507 if (delete_count > 0) { |
11519 for (int i = indices.length() - 1; i >= 0; i--) { | 11508 for (int i = indices.length() - 1; i >= 0; i--) { |
11520 JSObject::SetElement(deleted, indices[i] - index, old_values[i], NONE, | 11509 JSObject::SetElement(deleted, indices[i] - index, old_values[i], NONE, |
11521 SLOPPY); | 11510 SLOPPY); |
11522 } | 11511 } |
11523 | 11512 |
11524 SetProperty(deleted, isolate->factory()->length_string(), | 11513 SetProperty(deleted, isolate->factory()->length_string(), |
11525 isolate->factory()->NewNumberFromUint(delete_count), | 11514 isolate->factory()->NewNumberFromUint(delete_count), |
11526 NONE, SLOPPY); | 11515 NONE, SLOPPY); |
11527 } | 11516 } |
11528 | 11517 |
11529 EnqueueSpliceRecord(self, index, deleted, add_count); | 11518 EnqueueSpliceRecord(array, index, deleted, add_count); |
11530 | 11519 |
11531 return *hresult; | 11520 return hresult; |
11532 } | 11521 } |
11533 | 11522 |
11534 | 11523 |
11535 Handle<Map> Map::GetPrototypeTransition(Handle<Map> map, | 11524 Handle<Map> Map::GetPrototypeTransition(Handle<Map> map, |
11536 Handle<Object> prototype) { | 11525 Handle<Object> prototype) { |
11537 FixedArray* cache = map->GetPrototypeTransitions(); | 11526 FixedArray* cache = map->GetPrototypeTransitions(); |
11538 int number_of_transitions = map->NumberOfProtoTransitions(); | 11527 int number_of_transitions = map->NumberOfProtoTransitions(); |
11539 const int proto_offset = | 11528 const int proto_offset = |
11540 kProtoTransitionHeaderSize + kProtoTransitionPrototypeOffset; | 11529 kProtoTransitionHeaderSize + kProtoTransitionPrototypeOffset; |
11541 const int map_offset = kProtoTransitionHeaderSize + kProtoTransitionMapOffset; | 11530 const int map_offset = kProtoTransitionHeaderSize + kProtoTransitionMapOffset; |
(...skipping 4987 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
16529 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16518 #define ERROR_MESSAGES_TEXTS(C, T) T, |
16530 static const char* error_messages_[] = { | 16519 static const char* error_messages_[] = { |
16531 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16520 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
16532 }; | 16521 }; |
16533 #undef ERROR_MESSAGES_TEXTS | 16522 #undef ERROR_MESSAGES_TEXTS |
16534 return error_messages_[reason]; | 16523 return error_messages_[reason]; |
16535 } | 16524 } |
16536 | 16525 |
16537 | 16526 |
16538 } } // namespace v8::internal | 16527 } } // namespace v8::internal |
OLD | NEW |