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 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 private: | 220 private: |
221 DISALLOW_COPY_AND_ASSIGN(ElementsAccessorBase); | 221 DISALLOW_COPY_AND_ASSIGN(ElementsAccessorBase); |
222 }; | 222 }; |
223 | 223 |
224 | 224 |
225 class FastElementsAccessor | 225 class FastElementsAccessor |
226 : public ElementsAccessorBase<FastElementsAccessor, FixedArray> { | 226 : public ElementsAccessorBase<FastElementsAccessor, FixedArray> { |
227 public: | 227 public: |
228 static MaybeObject* DeleteCommon(JSObject* obj, | 228 static MaybeObject* DeleteCommon(JSObject* obj, |
229 uint32_t key) { | 229 uint32_t key) { |
230 ASSERT(obj->HasFastElements() || obj->HasFastArgumentsElements()); | 230 ASSERT(obj->HasFastElements() || |
| 231 obj->HasFastSmiOnlyElements() || |
| 232 obj->HasFastArgumentsElements()); |
231 Heap* heap = obj->GetHeap(); | 233 Heap* heap = obj->GetHeap(); |
232 FixedArray* backing_store = FixedArray::cast(obj->elements()); | 234 FixedArray* backing_store = FixedArray::cast(obj->elements()); |
233 if (backing_store->map() == heap->non_strict_arguments_elements_map()) { | 235 if (backing_store->map() == heap->non_strict_arguments_elements_map()) { |
234 backing_store = FixedArray::cast(backing_store->get(1)); | 236 backing_store = FixedArray::cast(backing_store->get(1)); |
235 } else { | 237 } else { |
236 Object* writable; | 238 Object* writable; |
237 MaybeObject* maybe = obj->EnsureWritableFastElements(); | 239 MaybeObject* maybe = obj->EnsureWritableFastElements(); |
238 if (!maybe->ToObject(&writable)) return maybe; | 240 if (!maybe->ToObject(&writable)) return maybe; |
239 backing_store = FixedArray::cast(writable); | 241 backing_store = FixedArray::cast(writable); |
240 } | 242 } |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 return elements_accessors_[EXTERNAL_PIXEL_ELEMENTS]; | 591 return elements_accessors_[EXTERNAL_PIXEL_ELEMENTS]; |
590 default: | 592 default: |
591 UNREACHABLE(); | 593 UNREACHABLE(); |
592 return NULL; | 594 return NULL; |
593 } | 595 } |
594 } | 596 } |
595 | 597 |
596 | 598 |
597 void ElementsAccessor::InitializeOncePerProcess() { | 599 void ElementsAccessor::InitializeOncePerProcess() { |
598 static struct ConcreteElementsAccessors { | 600 static struct ConcreteElementsAccessors { |
| 601 // Use the fast element handler for smi-only arrays. The implementation is |
| 602 // currently identical. |
| 603 FastElementsAccessor fast_smi_elements_handler; |
599 FastElementsAccessor fast_elements_handler; | 604 FastElementsAccessor fast_elements_handler; |
600 FastDoubleElementsAccessor fast_double_elements_handler; | 605 FastDoubleElementsAccessor fast_double_elements_handler; |
601 DictionaryElementsAccessor dictionary_elements_handler; | 606 DictionaryElementsAccessor dictionary_elements_handler; |
602 NonStrictArgumentsElementsAccessor non_strict_arguments_elements_handler; | 607 NonStrictArgumentsElementsAccessor non_strict_arguments_elements_handler; |
603 ExternalByteElementsAccessor byte_elements_handler; | 608 ExternalByteElementsAccessor byte_elements_handler; |
604 ExternalUnsignedByteElementsAccessor unsigned_byte_elements_handler; | 609 ExternalUnsignedByteElementsAccessor unsigned_byte_elements_handler; |
605 ExternalShortElementsAccessor short_elements_handler; | 610 ExternalShortElementsAccessor short_elements_handler; |
606 ExternalUnsignedShortElementsAccessor unsigned_short_elements_handler; | 611 ExternalUnsignedShortElementsAccessor unsigned_short_elements_handler; |
607 ExternalIntElementsAccessor int_elements_handler; | 612 ExternalIntElementsAccessor int_elements_handler; |
608 ExternalUnsignedIntElementsAccessor unsigned_int_elements_handler; | 613 ExternalUnsignedIntElementsAccessor unsigned_int_elements_handler; |
609 ExternalFloatElementsAccessor float_elements_handler; | 614 ExternalFloatElementsAccessor float_elements_handler; |
610 ExternalDoubleElementsAccessor double_elements_handler; | 615 ExternalDoubleElementsAccessor double_elements_handler; |
611 PixelElementsAccessor pixel_elements_handler; | 616 PixelElementsAccessor pixel_elements_handler; |
612 } element_accessors; | 617 } element_accessors; |
613 | 618 |
614 static ElementsAccessor* accessor_array[] = { | 619 static ElementsAccessor* accessor_array[] = { |
| 620 &element_accessors.fast_smi_elements_handler, |
615 &element_accessors.fast_elements_handler, | 621 &element_accessors.fast_elements_handler, |
616 &element_accessors.fast_double_elements_handler, | 622 &element_accessors.fast_double_elements_handler, |
617 &element_accessors.dictionary_elements_handler, | 623 &element_accessors.dictionary_elements_handler, |
618 &element_accessors.non_strict_arguments_elements_handler, | 624 &element_accessors.non_strict_arguments_elements_handler, |
619 &element_accessors.byte_elements_handler, | 625 &element_accessors.byte_elements_handler, |
620 &element_accessors.unsigned_byte_elements_handler, | 626 &element_accessors.unsigned_byte_elements_handler, |
621 &element_accessors.short_elements_handler, | 627 &element_accessors.short_elements_handler, |
622 &element_accessors.unsigned_short_elements_handler, | 628 &element_accessors.unsigned_short_elements_handler, |
623 &element_accessors.int_elements_handler, | 629 &element_accessors.int_elements_handler, |
624 &element_accessors.unsigned_int_elements_handler, | 630 &element_accessors.unsigned_int_elements_handler, |
625 &element_accessors.float_elements_handler, | 631 &element_accessors.float_elements_handler, |
626 &element_accessors.double_elements_handler, | 632 &element_accessors.double_elements_handler, |
627 &element_accessors.pixel_elements_handler | 633 &element_accessors.pixel_elements_handler |
628 }; | 634 }; |
629 | 635 |
| 636 STATIC_ASSERT((sizeof(accessor_array) / sizeof(*accessor_array)) == |
| 637 kElementsKindCount); |
| 638 |
630 elements_accessors_ = accessor_array; | 639 elements_accessors_ = accessor_array; |
631 } | 640 } |
632 | 641 |
633 | 642 |
634 } } // namespace v8::internal | 643 } } // namespace v8::internal |
OLD | NEW |