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

Side by Side Diff: src/objects.cc

Issue 7400020: Implement setting the length of FixedDoubleArrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: fix nits Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/objects-inl.h » ('j') | test/mjsunit/unbox-double-arrays.js » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 3114 matching lines...) Expand 10 before | Expand all | Expand 10 after
3125 switch (GetElementsKind()) { 3125 switch (GetElementsKind()) {
3126 case FAST_ELEMENTS: 3126 case FAST_ELEMENTS:
3127 return DeleteFastElement(index); 3127 return DeleteFastElement(index);
3128 3128
3129 case DICTIONARY_ELEMENTS: 3129 case DICTIONARY_ELEMENTS:
3130 return DeleteDictionaryElement(index, mode); 3130 return DeleteDictionaryElement(index, mode);
3131 3131
3132 case FAST_DOUBLE_ELEMENTS: { 3132 case FAST_DOUBLE_ELEMENTS: {
3133 int length = IsJSArray() 3133 int length = IsJSArray()
3134 ? Smi::cast(JSArray::cast(this)->length())->value() 3134 ? Smi::cast(JSArray::cast(this)->length())->value()
3135 : FixedArray::cast(elements())->length(); 3135 : FixedDoubleArray::cast(elements())->length();
3136 if (index < static_cast<uint32_t>(length)) { 3136 if (index < static_cast<uint32_t>(length)) {
3137 FixedDoubleArray::cast(elements())->set_the_hole(index); 3137 FixedDoubleArray::cast(elements())->set_the_hole(index);
3138 } 3138 }
3139 break; 3139 break;
3140 } 3140 }
3141 case EXTERNAL_PIXEL_ELEMENTS: 3141 case EXTERNAL_PIXEL_ELEMENTS:
3142 case EXTERNAL_BYTE_ELEMENTS: 3142 case EXTERNAL_BYTE_ELEMENTS:
3143 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 3143 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3144 case EXTERNAL_SHORT_ELEMENTS: 3144 case EXTERNAL_SHORT_ELEMENTS:
3145 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 3145 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
(...skipping 4391 matching lines...) Expand 10 before | Expand all | Expand 10 after
7537 MaybeObject* JSObject::SetElementsLength(Object* len) { 7537 MaybeObject* JSObject::SetElementsLength(Object* len) {
7538 // We should never end in here with a pixel or external array. 7538 // We should never end in here with a pixel or external array.
7539 ASSERT(AllowsSetElementsLength()); 7539 ASSERT(AllowsSetElementsLength());
7540 7540
7541 MaybeObject* maybe_smi_length = len->ToSmi(); 7541 MaybeObject* maybe_smi_length = len->ToSmi();
7542 Object* smi_length = Smi::FromInt(0); 7542 Object* smi_length = Smi::FromInt(0);
7543 if (maybe_smi_length->ToObject(&smi_length) && smi_length->IsSmi()) { 7543 if (maybe_smi_length->ToObject(&smi_length) && smi_length->IsSmi()) {
7544 const int value = Smi::cast(smi_length)->value(); 7544 const int value = Smi::cast(smi_length)->value();
7545 if (value < 0) return ArrayLengthRangeError(GetHeap()); 7545 if (value < 0) return ArrayLengthRangeError(GetHeap());
7546 switch (GetElementsKind()) { 7546 switch (GetElementsKind()) {
7547 case FAST_ELEMENTS: { 7547 case FAST_ELEMENTS:
7548 int old_capacity = FixedArray::cast(elements())->length(); 7548 case FAST_DOUBLE_ELEMENTS: {
7549 int old_capacity = FixedArrayBase::cast(elements())->length();
7549 if (value <= old_capacity) { 7550 if (value <= old_capacity) {
7550 if (IsJSArray()) { 7551 if (IsJSArray()) {
7551 Object* obj;
7552 { MaybeObject* maybe_obj = EnsureWritableFastElements();
7553 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
7554 }
7555 FixedArray* fast_elements = FixedArray::cast(elements());
7556 if (2 * value <= old_capacity) { 7552 if (2 * value <= old_capacity) {
7557 // If more than half the elements won't be used, trim the array. 7553 // If more than half the elements won't be used, trim the array.
7558 if (value == 0) { 7554 if (value == 0) {
7559 initialize_elements(); 7555 initialize_elements();
7560 } else { 7556 } else {
7561 fast_elements->set_length(value); 7557 Address filler_start;
7562 Address filler_start = fast_elements->address() + 7558 int filler_size;
7563 FixedArray::OffsetOfElementAt(value); 7559 if (GetElementsKind() == FAST_ELEMENTS) {
7564 int filler_size = (old_capacity - value) * kPointerSize; 7560 Object* obj;
7561 { MaybeObject* maybe_obj = EnsureWritableFastElements();
7562 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
7563 }
7564 FixedArray* fast_elements = FixedArray::cast(elements());
7565 fast_elements->set_length(value);
7566 filler_start = fast_elements->address() +
7567 FixedArray::OffsetOfElementAt(value);
7568 filler_size = (old_capacity - value) * kPointerSize;
7569 } else {
7570 ASSERT(GetElementsKind() == FAST_DOUBLE_ELEMENTS);
7571 FixedDoubleArray* fast_double_elements =
7572 FixedDoubleArray::cast(elements());
7573 fast_double_elements->set_length(value);
7574 filler_start = fast_double_elements->address() +
7575 FixedArray::OffsetOfElementAt(value);
Mads Ager (chromium) 2011/07/19 09:23:06 Shouldn't this be FixedDoubleArray::OffsetOfElemen
danno 2011/07/19 15:47:19 Oh, heavens. Good catch. Done. On 2011/07/19 09:23
7576 filler_size = (old_capacity - value) * kDoubleSize;
7577 }
7565 GetHeap()->CreateFillerObjectAt(filler_start, filler_size); 7578 GetHeap()->CreateFillerObjectAt(filler_start, filler_size);
7566 } 7579 }
7567 } else { 7580 } else {
7568 // Otherwise, fill the unused tail with holes. 7581 // Otherwise, fill the unused tail with holes.
7569 int old_length = FastD2I(JSArray::cast(this)->length()->Number()); 7582 int old_length = FastD2I(JSArray::cast(this)->length()->Number());
7570 for (int i = value; i < old_length; i++) { 7583 if (GetElementsKind() == FAST_ELEMENTS) {
7571 fast_elements->set_the_hole(i); 7584 FixedArray* fast_elements = FixedArray::cast(elements());
7585 for (int i = value; i < old_length; i++) {
7586 fast_elements->set_the_hole(i);
7587 }
7588 } else {
7589 ASSERT(GetElementsKind() == FAST_DOUBLE_ELEMENTS);
7590 FixedDoubleArray* fast_double_elements =
7591 FixedDoubleArray::cast(elements());
7592 for (int i = value; i < old_length; i++) {
7593 fast_double_elements->set_the_hole(i);
7594 }
7572 } 7595 }
7573 } 7596 }
7574 JSArray::cast(this)->set_length(Smi::cast(smi_length)); 7597 JSArray::cast(this)->set_length(Smi::cast(smi_length));
7575 } 7598 }
7576 return this; 7599 return this;
7577 } 7600 }
7578 int min = NewElementsCapacity(old_capacity); 7601 int min = NewElementsCapacity(old_capacity);
7579 int new_capacity = value > min ? value : min; 7602 int new_capacity = value > min ? value : min;
7580 if (new_capacity <= kMaxFastElementsLength || 7603 if (new_capacity <= kMaxFastElementsLength ||
7581 !ShouldConvertToSlowElements(new_capacity)) { 7604 !ShouldConvertToSlowElements(new_capacity)) {
7582 MaybeObject* result = 7605 MaybeObject* result;
7583 SetFastElementsCapacityAndLength(new_capacity, value); 7606 if (GetElementsKind() == FAST_ELEMENTS) {
7607 Object* obj;
7608 { MaybeObject* maybe_obj = EnsureWritableFastElements();
7609 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
7610 }
7611 result = SetFastElementsCapacityAndLength(new_capacity, value);
7612 } else {
7613 ASSERT(GetElementsKind() == FAST_DOUBLE_ELEMENTS);
7614 result = SetFastDoubleElementsCapacityAndLength(new_capacity,
7615 value);
7616 }
7584 if (result->IsFailure()) return result; 7617 if (result->IsFailure()) return result;
7585 return this; 7618 return this;
7586 } 7619 }
7587 break; 7620 break;
7588 } 7621 }
7589 case DICTIONARY_ELEMENTS: { 7622 case DICTIONARY_ELEMENTS: {
7590 if (IsJSArray()) { 7623 if (IsJSArray()) {
7591 if (value == 0) { 7624 if (value == 0) {
7592 // If the length of a slow array is reset to zero, we clear 7625 // If the length of a slow array is reset to zero, we clear
7593 // the array and flush backing storage. This has the added 7626 // the array and flush backing storage. This has the added
(...skipping 15 matching lines...) Expand all
7609 case NON_STRICT_ARGUMENTS_ELEMENTS: 7642 case NON_STRICT_ARGUMENTS_ELEMENTS:
7610 case EXTERNAL_BYTE_ELEMENTS: 7643 case EXTERNAL_BYTE_ELEMENTS:
7611 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 7644 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
7612 case EXTERNAL_SHORT_ELEMENTS: 7645 case EXTERNAL_SHORT_ELEMENTS:
7613 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 7646 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
7614 case EXTERNAL_INT_ELEMENTS: 7647 case EXTERNAL_INT_ELEMENTS:
7615 case EXTERNAL_UNSIGNED_INT_ELEMENTS: 7648 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
7616 case EXTERNAL_FLOAT_ELEMENTS: 7649 case EXTERNAL_FLOAT_ELEMENTS:
7617 case EXTERNAL_DOUBLE_ELEMENTS: 7650 case EXTERNAL_DOUBLE_ELEMENTS:
7618 case EXTERNAL_PIXEL_ELEMENTS: 7651 case EXTERNAL_PIXEL_ELEMENTS:
7619 case FAST_DOUBLE_ELEMENTS:
7620 UNREACHABLE(); 7652 UNREACHABLE();
7621 break; 7653 break;
7622 } 7654 }
7623 } 7655 }
7624 7656
7625 // General slow case. 7657 // General slow case.
7626 if (len->IsNumber()) { 7658 if (len->IsNumber()) {
7627 uint32_t length; 7659 uint32_t length;
7628 if (len->ToArrayIndex(&length)) { 7660 if (len->ToArrayIndex(&length)) {
7629 return SetSlowElements(len); 7661 return SetSlowElements(len);
(...skipping 4075 matching lines...) Expand 10 before | Expand all | Expand 10 after
11705 if (break_point_objects()->IsUndefined()) return 0; 11737 if (break_point_objects()->IsUndefined()) return 0;
11706 // Single beak point. 11738 // Single beak point.
11707 if (!break_point_objects()->IsFixedArray()) return 1; 11739 if (!break_point_objects()->IsFixedArray()) return 1;
11708 // Multiple break points. 11740 // Multiple break points.
11709 return FixedArray::cast(break_point_objects())->length(); 11741 return FixedArray::cast(break_point_objects())->length();
11710 } 11742 }
11711 #endif 11743 #endif
11712 11744
11713 11745
11714 } } // namespace v8::internal 11746 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/objects-inl.h » ('j') | test/mjsunit/unbox-double-arrays.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698