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

Side by Side Diff: src/objects.cc

Issue 7459009: Implement support for getters/setter on FixedDoubleArrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: correct patch 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 | test/mjsunit/unbox-double-arrays.js » ('j') | no next file with comments »
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 3638 matching lines...) Expand 10 before | Expand all | Expand 10 after
3649 if (!CanSetCallback(name)) { 3649 if (!CanSetCallback(name)) {
3650 return heap->undefined_value(); 3650 return heap->undefined_value();
3651 } 3651 }
3652 3652
3653 uint32_t index = 0; 3653 uint32_t index = 0;
3654 bool is_element = name->AsArrayIndex(&index); 3654 bool is_element = name->AsArrayIndex(&index);
3655 3655
3656 if (is_element) { 3656 if (is_element) {
3657 switch (GetElementsKind()) { 3657 switch (GetElementsKind()) {
3658 case FAST_ELEMENTS: 3658 case FAST_ELEMENTS:
3659 case FAST_DOUBLE_ELEMENTS:
3659 break; 3660 break;
3660 case EXTERNAL_PIXEL_ELEMENTS: 3661 case EXTERNAL_PIXEL_ELEMENTS:
3661 case EXTERNAL_BYTE_ELEMENTS: 3662 case EXTERNAL_BYTE_ELEMENTS:
3662 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 3663 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3663 case EXTERNAL_SHORT_ELEMENTS: 3664 case EXTERNAL_SHORT_ELEMENTS:
3664 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 3665 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
3665 case EXTERNAL_INT_ELEMENTS: 3666 case EXTERNAL_INT_ELEMENTS:
3666 case EXTERNAL_UNSIGNED_INT_ELEMENTS: 3667 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
3667 case EXTERNAL_FLOAT_ELEMENTS: 3668 case EXTERNAL_FLOAT_ELEMENTS:
3668 case EXTERNAL_DOUBLE_ELEMENTS: 3669 case EXTERNAL_DOUBLE_ELEMENTS:
3669 case FAST_DOUBLE_ELEMENTS:
3670 // Ignore getters and setters on pixel and external array 3670 // Ignore getters and setters on pixel and external array
3671 // elements. 3671 // elements.
3672 return heap->undefined_value(); 3672 return heap->undefined_value();
3673 case DICTIONARY_ELEMENTS: { 3673 case DICTIONARY_ELEMENTS: {
3674 Object* probe = 3674 Object* probe =
3675 FindGetterSetterInDictionary(element_dictionary(), index, heap); 3675 FindGetterSetterInDictionary(element_dictionary(), index, heap);
3676 if (!probe->IsTheHole()) return probe; 3676 if (!probe->IsTheHole()) return probe;
3677 // Otherwise allow to override it. 3677 // Otherwise allow to override it.
3678 break; 3678 break;
3679 } 3679 }
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
3898 3898
3899 uint32_t index = 0; 3899 uint32_t index = 0;
3900 bool is_element = name->AsArrayIndex(&index); 3900 bool is_element = name->AsArrayIndex(&index);
3901 3901
3902 if (is_element) { 3902 if (is_element) {
3903 if (IsJSArray()) return isolate->heap()->undefined_value(); 3903 if (IsJSArray()) return isolate->heap()->undefined_value();
3904 3904
3905 // Accessors overwrite previous callbacks (cf. with getters/setters). 3905 // Accessors overwrite previous callbacks (cf. with getters/setters).
3906 switch (GetElementsKind()) { 3906 switch (GetElementsKind()) {
3907 case FAST_ELEMENTS: 3907 case FAST_ELEMENTS:
3908 case FAST_DOUBLE_ELEMENTS:
3908 break; 3909 break;
3909 case EXTERNAL_PIXEL_ELEMENTS: 3910 case EXTERNAL_PIXEL_ELEMENTS:
3910 case EXTERNAL_BYTE_ELEMENTS: 3911 case EXTERNAL_BYTE_ELEMENTS:
3911 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 3912 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3912 case EXTERNAL_SHORT_ELEMENTS: 3913 case EXTERNAL_SHORT_ELEMENTS:
3913 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 3914 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
3914 case EXTERNAL_INT_ELEMENTS: 3915 case EXTERNAL_INT_ELEMENTS:
3915 case EXTERNAL_UNSIGNED_INT_ELEMENTS: 3916 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
3916 case EXTERNAL_FLOAT_ELEMENTS: 3917 case EXTERNAL_FLOAT_ELEMENTS:
3917 case EXTERNAL_DOUBLE_ELEMENTS: 3918 case EXTERNAL_DOUBLE_ELEMENTS:
3918 case FAST_DOUBLE_ELEMENTS:
3919 // Ignore getters and setters on pixel and external array 3919 // Ignore getters and setters on pixel and external array
3920 // elements. 3920 // elements.
3921 return isolate->heap()->undefined_value(); 3921 return isolate->heap()->undefined_value();
3922 case DICTIONARY_ELEMENTS: 3922 case DICTIONARY_ELEMENTS:
3923 break; 3923 break;
3924 case NON_STRICT_ARGUMENTS_ELEMENTS: 3924 case NON_STRICT_ARGUMENTS_ELEMENTS:
3925 UNIMPLEMENTED(); 3925 UNIMPLEMENTED();
3926 break; 3926 break;
3927 } 3927 }
3928 3928
(...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after
4681 cache->ElementAdded(); 4681 cache->ElementAdded();
4682 return cache; 4682 return cache;
4683 } 4683 }
4684 4684
4685 4685
4686 MaybeObject* FixedArray::AddKeysFromJSArray(JSArray* array) { 4686 MaybeObject* FixedArray::AddKeysFromJSArray(JSArray* array) {
4687 ASSERT(!array->HasExternalArrayElements()); 4687 ASSERT(!array->HasExternalArrayElements());
4688 switch (array->GetElementsKind()) { 4688 switch (array->GetElementsKind()) {
4689 case JSObject::FAST_ELEMENTS: 4689 case JSObject::FAST_ELEMENTS:
4690 return UnionOfKeys(FixedArray::cast(array->elements())); 4690 return UnionOfKeys(FixedArray::cast(array->elements()));
4691 case JSObject::FAST_DOUBLE_ELEMENTS:
4692 UNIMPLEMENTED();
4693 break;
4691 case JSObject::DICTIONARY_ELEMENTS: { 4694 case JSObject::DICTIONARY_ELEMENTS: {
4692 NumberDictionary* dict = array->element_dictionary(); 4695 NumberDictionary* dict = array->element_dictionary();
4693 int size = dict->NumberOfElements(); 4696 int size = dict->NumberOfElements();
4694 4697
4695 // Allocate a temporary fixed array. 4698 // Allocate a temporary fixed array.
4696 Object* object; 4699 Object* object;
4697 { MaybeObject* maybe_object = GetHeap()->AllocateFixedArray(size); 4700 { MaybeObject* maybe_object = GetHeap()->AllocateFixedArray(size);
4698 if (!maybe_object->ToObject(&object)) return maybe_object; 4701 if (!maybe_object->ToObject(&object)) return maybe_object;
4699 } 4702 }
4700 FixedArray* key_array = FixedArray::cast(object); 4703 FixedArray* key_array = FixedArray::cast(object);
(...skipping 14 matching lines...) Expand all
4715 break; 4718 break;
4716 case JSObject::EXTERNAL_BYTE_ELEMENTS: 4719 case JSObject::EXTERNAL_BYTE_ELEMENTS:
4717 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 4720 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
4718 case JSObject::EXTERNAL_SHORT_ELEMENTS: 4721 case JSObject::EXTERNAL_SHORT_ELEMENTS:
4719 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 4722 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
4720 case JSObject::EXTERNAL_INT_ELEMENTS: 4723 case JSObject::EXTERNAL_INT_ELEMENTS:
4721 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: 4724 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
4722 case JSObject::EXTERNAL_FLOAT_ELEMENTS: 4725 case JSObject::EXTERNAL_FLOAT_ELEMENTS:
4723 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: 4726 case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
4724 case JSObject::EXTERNAL_PIXEL_ELEMENTS: 4727 case JSObject::EXTERNAL_PIXEL_ELEMENTS:
4725 case JSObject::FAST_DOUBLE_ELEMENTS:
4726 break; 4728 break;
4727 } 4729 }
4728 UNREACHABLE(); 4730 UNREACHABLE();
4729 return GetHeap()->null_value(); // Failure case needs to "return" a value. 4731 return GetHeap()->null_value(); // Failure case needs to "return" a value.
4730 } 4732 }
4731 4733
4732 4734
4733 MaybeObject* FixedArray::UnionOfKeys(FixedArray* other) { 4735 MaybeObject* FixedArray::UnionOfKeys(FixedArray* other) {
4734 int len0 = length(); 4736 int len0 = length();
4735 #ifdef DEBUG 4737 #ifdef DEBUG
(...skipping 3295 matching lines...) Expand 10 before | Expand all | Expand 10 after
8031 uint32_t length = IsJSArray() ? 8033 uint32_t length = IsJSArray() ?
8032 static_cast<uint32_t> 8034 static_cast<uint32_t>
8033 (Smi::cast(JSArray::cast(this)->length())->value()) : 8035 (Smi::cast(JSArray::cast(this)->length())->value()) :
8034 static_cast<uint32_t>(FixedArray::cast(elements())->length()); 8036 static_cast<uint32_t>(FixedArray::cast(elements())->length());
8035 if ((index < length) && 8037 if ((index < length) &&
8036 !FixedArray::cast(elements())->get(index)->IsTheHole()) { 8038 !FixedArray::cast(elements())->get(index)->IsTheHole()) {
8037 return FAST_ELEMENT; 8039 return FAST_ELEMENT;
8038 } 8040 }
8039 break; 8041 break;
8040 } 8042 }
8043 case FAST_DOUBLE_ELEMENTS: {
8044 uint32_t length = IsJSArray() ?
8045 static_cast<uint32_t>
8046 (Smi::cast(JSArray::cast(this)->length())->value()) :
8047 static_cast<uint32_t>(FixedDoubleArray::cast(elements())->length());
8048 if ((index < length) &&
8049 !FixedDoubleArray::cast(elements())->is_the_hole(index)) {
8050 return FAST_ELEMENT;
8051 }
8052 break;
8053 }
8041 case EXTERNAL_PIXEL_ELEMENTS: { 8054 case EXTERNAL_PIXEL_ELEMENTS: {
8042 ExternalPixelArray* pixels = ExternalPixelArray::cast(elements()); 8055 ExternalPixelArray* pixels = ExternalPixelArray::cast(elements());
8043 if (index < static_cast<uint32_t>(pixels->length())) return FAST_ELEMENT; 8056 if (index < static_cast<uint32_t>(pixels->length())) return FAST_ELEMENT;
8044 break; 8057 break;
8045 } 8058 }
8046 case EXTERNAL_BYTE_ELEMENTS: 8059 case EXTERNAL_BYTE_ELEMENTS:
8047 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 8060 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
8048 case EXTERNAL_SHORT_ELEMENTS: 8061 case EXTERNAL_SHORT_ELEMENTS:
8049 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 8062 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
8050 case EXTERNAL_INT_ELEMENTS: 8063 case EXTERNAL_INT_ELEMENTS:
8051 case EXTERNAL_UNSIGNED_INT_ELEMENTS: 8064 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
8052 case EXTERNAL_FLOAT_ELEMENTS: 8065 case EXTERNAL_FLOAT_ELEMENTS:
8053 case EXTERNAL_DOUBLE_ELEMENTS: { 8066 case EXTERNAL_DOUBLE_ELEMENTS: {
8054 ExternalArray* array = ExternalArray::cast(elements()); 8067 ExternalArray* array = ExternalArray::cast(elements());
8055 if (index < static_cast<uint32_t>(array->length())) return FAST_ELEMENT; 8068 if (index < static_cast<uint32_t>(array->length())) return FAST_ELEMENT;
8056 break; 8069 break;
8057 } 8070 }
8058 case FAST_DOUBLE_ELEMENTS:
8059 UNREACHABLE();
8060 break;
8061 case DICTIONARY_ELEMENTS: { 8071 case DICTIONARY_ELEMENTS: {
8062 if (element_dictionary()->FindEntry(index) != 8072 if (element_dictionary()->FindEntry(index) !=
8063 NumberDictionary::kNotFound) { 8073 NumberDictionary::kNotFound) {
8064 return DICTIONARY_ELEMENT; 8074 return DICTIONARY_ELEMENT;
8065 } 8075 }
8066 break; 8076 break;
8067 } 8077 }
8068 case NON_STRICT_ARGUMENTS_ELEMENTS: { 8078 case NON_STRICT_ARGUMENTS_ELEMENTS: {
8069 // Aliased parameters and non-aliased elements in a fast backing store 8079 // Aliased parameters and non-aliased elements in a fast backing store
8070 // behave as FAST_ELEMENT. Non-aliased elements in a dictionary 8080 // behave as FAST_ELEMENT. Non-aliased elements in a dictionary
(...skipping 3765 matching lines...) Expand 10 before | Expand all | Expand 10 after
11836 if (break_point_objects()->IsUndefined()) return 0; 11846 if (break_point_objects()->IsUndefined()) return 0;
11837 // Single beak point. 11847 // Single beak point.
11838 if (!break_point_objects()->IsFixedArray()) return 1; 11848 if (!break_point_objects()->IsFixedArray()) return 1;
11839 // Multiple break points. 11849 // Multiple break points.
11840 return FixedArray::cast(break_point_objects())->length(); 11850 return FixedArray::cast(break_point_objects())->length();
11841 } 11851 }
11842 #endif 11852 #endif
11843 11853
11844 11854
11845 } } // namespace v8::internal 11855 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/unbox-double-arrays.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698