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 3013 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3024 Heap* heap = GetHeap(); | 3024 Heap* heap = GetHeap(); |
| 3025 FixedArray* backing_store = FixedArray::cast(elements()); | 3025 FixedArray* backing_store = FixedArray::cast(elements()); |
| 3026 if (backing_store->map() == heap->non_strict_arguments_elements_map()) { | 3026 if (backing_store->map() == heap->non_strict_arguments_elements_map()) { |
| 3027 backing_store = FixedArray::cast(backing_store->get(1)); | 3027 backing_store = FixedArray::cast(backing_store->get(1)); |
| 3028 } else { | 3028 } else { |
| 3029 Object* writable; | 3029 Object* writable; |
| 3030 MaybeObject* maybe = EnsureWritableFastElements(); | 3030 MaybeObject* maybe = EnsureWritableFastElements(); |
| 3031 if (!maybe->ToObject(&writable)) return maybe; | 3031 if (!maybe->ToObject(&writable)) return maybe; |
| 3032 backing_store = FixedArray::cast(writable); | 3032 backing_store = FixedArray::cast(writable); |
| 3033 } | 3033 } |
| 3034 int length = IsJSArray() | 3034 uint32_t length = static_cast<uint32_t>( |
| 3035 IsJSArray() | |
| 3035 ? Smi::cast(JSArray::cast(this)->length())->value() | 3036 ? Smi::cast(JSArray::cast(this)->length())->value() |
| 3036 : backing_store->length(); | 3037 : backing_store->length()); |
| 3037 if (index < static_cast<uint32_t>(length)) { | 3038 if (index < length) { |
| 3038 backing_store->set_the_hole(index); | 3039 backing_store->set_the_hole(index); |
| 3040 // If an old space backing store is larger than a certain size and | |
| 3041 // has too few used values, normalize it. | |
| 3042 // To avoid doing the check on every delete we require at least | |
| 3043 // one adjacent hole to the value being deleted. | |
| 3044 Object* hole = heap->the_hole_value(); | |
| 3045 const int kMinLengthForSparsenessCheck = 64; | |
| 3046 if (backing_store->length() >= kMinLengthForSparsenessCheck && | |
| 3047 !heap->InNewSpace(backing_store) && | |
| 3048 ((index > 0 && backing_store->get(index - 1) == hole) || | |
| 3049 (index + 1 < length && backing_store->get(index + 1) == hole))) { | |
| 3050 int num_used = 0; | |
| 3051 for (int i = 0; i < backing_store->length(); ++i) { | |
| 3052 if (backing_store->get(i) != hole) ++num_used; | |
|
Vyacheslav Egorov (Chromium)
2011/07/01 12:25:58
You can have an early exit from the loop if num_us
Vitaly Repeshko
2011/07/01 13:05:02
Good idea. Done.
| |
| 3053 } | |
| 3054 if (4 * num_used <= backing_store->length()) { | |
| 3055 MaybeObject* result = NormalizeElements(); | |
| 3056 if (result->IsFailure()) return result; | |
| 3057 } | |
| 3058 } | |
| 3039 } | 3059 } |
| 3040 return heap->true_value(); | 3060 return heap->true_value(); |
| 3041 } | 3061 } |
| 3042 | 3062 |
| 3043 | 3063 |
| 3044 MaybeObject* JSObject::DeleteDictionaryElement(uint32_t index, | 3064 MaybeObject* JSObject::DeleteDictionaryElement(uint32_t index, |
| 3045 DeleteMode mode) { | 3065 DeleteMode mode) { |
| 3046 Isolate* isolate = GetIsolate(); | 3066 Isolate* isolate = GetIsolate(); |
| 3047 Heap* heap = isolate->heap(); | 3067 Heap* heap = isolate->heap(); |
| 3048 FixedArray* backing_store = FixedArray::cast(elements()); | 3068 FixedArray* backing_store = FixedArray::cast(elements()); |
| (...skipping 8587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11636 if (break_point_objects()->IsUndefined()) return 0; | 11656 if (break_point_objects()->IsUndefined()) return 0; |
| 11637 // Single beak point. | 11657 // Single beak point. |
| 11638 if (!break_point_objects()->IsFixedArray()) return 1; | 11658 if (!break_point_objects()->IsFixedArray()) return 1; |
| 11639 // Multiple break points. | 11659 // Multiple break points. |
| 11640 return FixedArray::cast(break_point_objects())->length(); | 11660 return FixedArray::cast(break_point_objects())->length(); |
| 11641 } | 11661 } |
| 11642 #endif | 11662 #endif |
| 11643 | 11663 |
| 11644 | 11664 |
| 11645 } } // namespace v8::internal | 11665 } } // namespace v8::internal |
| OLD | NEW |