| 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 7489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7500 if (value < 0) return ArrayLengthRangeError(GetHeap()); | 7500 if (value < 0) return ArrayLengthRangeError(GetHeap()); |
| 7501 switch (GetElementsKind()) { | 7501 switch (GetElementsKind()) { |
| 7502 case FAST_ELEMENTS: { | 7502 case FAST_ELEMENTS: { |
| 7503 int old_capacity = FixedArray::cast(elements())->length(); | 7503 int old_capacity = FixedArray::cast(elements())->length(); |
| 7504 if (value <= old_capacity) { | 7504 if (value <= old_capacity) { |
| 7505 if (IsJSArray()) { | 7505 if (IsJSArray()) { |
| 7506 Object* obj; | 7506 Object* obj; |
| 7507 { MaybeObject* maybe_obj = EnsureWritableFastElements(); | 7507 { MaybeObject* maybe_obj = EnsureWritableFastElements(); |
| 7508 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 7508 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 7509 } | 7509 } |
| 7510 int old_length = FastD2I(JSArray::cast(this)->length()->Number()); | 7510 FixedArray* fast_elements = FixedArray::cast(elements()); |
| 7511 // NOTE: We may be able to optimize this by removing the | 7511 if (2 * value <= old_capacity) { |
| 7512 // last part of the elements backing storage array and | 7512 // If more than half the elements won't be used, trim the array. |
| 7513 // setting the capacity to the new size. | 7513 if (value == 0) { |
| 7514 for (int i = value; i < old_length; i++) { | 7514 initialize_elements(); |
| 7515 FixedArray::cast(elements())->set_the_hole(i); | 7515 } else { |
| 7516 fast_elements->set_length(value); |
| 7517 Address filler_start = fast_elements->address() + |
| 7518 FixedArray::OffsetOfElementAt(value); |
| 7519 int filler_size = (old_capacity - value) * kPointerSize; |
| 7520 GetHeap()->CreateFillerObjectAt(filler_start, filler_size); |
| 7521 } |
| 7522 } else { |
| 7523 // Otherwise, fill the unused tail with holes. |
| 7524 int old_length = FastD2I(JSArray::cast(this)->length()->Number()); |
| 7525 for (int i = value; i < old_length; i++) { |
| 7526 fast_elements->set_the_hole(i); |
| 7527 } |
| 7516 } | 7528 } |
| 7517 JSArray::cast(this)->set_length(Smi::cast(smi_length)); | 7529 JSArray::cast(this)->set_length(Smi::cast(smi_length)); |
| 7518 } | 7530 } |
| 7519 return this; | 7531 return this; |
| 7520 } | 7532 } |
| 7521 int min = NewElementsCapacity(old_capacity); | 7533 int min = NewElementsCapacity(old_capacity); |
| 7522 int new_capacity = value > min ? value : min; | 7534 int new_capacity = value > min ? value : min; |
| 7523 if (new_capacity <= kMaxFastElementsLength || | 7535 if (new_capacity <= kMaxFastElementsLength || |
| 7524 !ShouldConvertToSlowElements(new_capacity)) { | 7536 !ShouldConvertToSlowElements(new_capacity)) { |
| 7525 MaybeObject* result = | 7537 MaybeObject* result = |
| (...skipping 4035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11561 if (break_point_objects()->IsUndefined()) return 0; | 11573 if (break_point_objects()->IsUndefined()) return 0; |
| 11562 // Single beak point. | 11574 // Single beak point. |
| 11563 if (!break_point_objects()->IsFixedArray()) return 1; | 11575 if (!break_point_objects()->IsFixedArray()) return 1; |
| 11564 // Multiple break points. | 11576 // Multiple break points. |
| 11565 return FixedArray::cast(break_point_objects())->length(); | 11577 return FixedArray::cast(break_point_objects())->length(); |
| 11566 } | 11578 } |
| 11567 #endif | 11579 #endif |
| 11568 | 11580 |
| 11569 | 11581 |
| 11570 } } // namespace v8::internal | 11582 } } // namespace v8::internal |
| OLD | NEW |