Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |