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

Side by Side Diff: src/objects-inl.h

Issue 150813004: In-heap small typed arrays (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: CR feedback Created 6 years, 9 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
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 1750 matching lines...) Expand 10 before | Expand all | Expand 10 after
1761 1761
1762 void JSObject::initialize_elements() { 1762 void JSObject::initialize_elements() {
1763 if (map()->has_fast_smi_or_object_elements() || 1763 if (map()->has_fast_smi_or_object_elements() ||
1764 map()->has_fast_double_elements()) { 1764 map()->has_fast_double_elements()) {
1765 ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array())); 1765 ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
1766 WRITE_FIELD(this, kElementsOffset, GetHeap()->empty_fixed_array()); 1766 WRITE_FIELD(this, kElementsOffset, GetHeap()->empty_fixed_array());
1767 } else if (map()->has_external_array_elements()) { 1767 } else if (map()->has_external_array_elements()) {
1768 ExternalArray* empty_array = GetHeap()->EmptyExternalArrayForMap(map()); 1768 ExternalArray* empty_array = GetHeap()->EmptyExternalArrayForMap(map());
1769 ASSERT(!GetHeap()->InNewSpace(empty_array)); 1769 ASSERT(!GetHeap()->InNewSpace(empty_array));
1770 WRITE_FIELD(this, kElementsOffset, empty_array); 1770 WRITE_FIELD(this, kElementsOffset, empty_array);
1771 } else if (map()->has_fixed_typed_array_elements()) {
1772 FixedTypedArrayBase* empty_array =
1773 GetHeap()->EmptyFixedTypedArrayForMap(map());
1774 ASSERT(!GetHeap()->InNewSpace(empty_array));
1775 WRITE_FIELD(this, kElementsOffset, empty_array);
1771 } else { 1776 } else {
1772 UNREACHABLE(); 1777 UNREACHABLE();
1773 } 1778 }
1774 } 1779 }
1775 1780
1776 1781
1777 MaybeObject* JSObject::ResetElements() { 1782 MaybeObject* JSObject::ResetElements() {
1778 if (map()->is_observed()) { 1783 if (map()->is_observed()) {
1779 // Maintain invariant that observed elements are always in dictionary mode. 1784 // Maintain invariant that observed elements are always in dictionary mode.
1780 SeededNumberDictionary* dictionary; 1785 SeededNumberDictionary* dictionary;
(...skipping 1920 matching lines...) Expand 10 before | Expand all | Expand 10 after
3701 } 3706 }
3702 3707
3703 3708
3704 void ExternalFloat64Array::set(int index, double value) { 3709 void ExternalFloat64Array::set(int index, double value) {
3705 ASSERT((index >= 0) && (index < this->length())); 3710 ASSERT((index >= 0) && (index < this->length()));
3706 double* ptr = static_cast<double*>(external_pointer()); 3711 double* ptr = static_cast<double*>(external_pointer());
3707 ptr[index] = value; 3712 ptr[index] = value;
3708 } 3713 }
3709 3714
3710 3715
3716 void* FixedTypedArrayBase::DataPtr() {
3717 return FIELD_ADDR(this, kDataOffset);
3718 }
3719
3720
3721 int FixedTypedArrayBase::DataSize() {
3722 InstanceType instance_type = map()->instance_type();
3723 int element_size;
3724 switch (instance_type) {
3725 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
3726 case FIXED_##TYPE##_ARRAY_TYPE: \
3727 element_size = size; \
3728 break;
3729
3730 TYPED_ARRAYS(TYPED_ARRAY_CASE)
3731 #undef TYPED_ARRAY_CASE
3732 default:
3733 UNREACHABLE();
3734 return 0;
3735 }
3736 return length() * element_size;
3737 }
3738
3739
3711 int FixedTypedArrayBase::size() { 3740 int FixedTypedArrayBase::size() {
3712 InstanceType instance_type = map()->instance_type(); 3741 return OBJECT_POINTER_ALIGN(kDataOffset + DataSize());
3713 int element_size;
3714 switch (instance_type) {
3715 case FIXED_UINT8_ARRAY_TYPE:
3716 case FIXED_INT8_ARRAY_TYPE:
3717 case FIXED_UINT8_CLAMPED_ARRAY_TYPE:
3718 element_size = 1;
3719 break;
3720 case FIXED_UINT16_ARRAY_TYPE:
3721 case FIXED_INT16_ARRAY_TYPE:
3722 element_size = 2;
3723 break;
3724 case FIXED_UINT32_ARRAY_TYPE:
3725 case FIXED_INT32_ARRAY_TYPE:
3726 case FIXED_FLOAT32_ARRAY_TYPE:
3727 element_size = 4;
3728 break;
3729 case FIXED_FLOAT64_ARRAY_TYPE:
3730 element_size = 8;
3731 break;
3732 default:
3733 UNREACHABLE();
3734 return 0;
3735 }
3736 return OBJECT_POINTER_ALIGN(kDataOffset + length() * element_size);
3737 } 3742 }
3738 3743
3739 3744
3745 uint8_t Uint8ArrayTraits::defaultValue() { return 0; }
3746
3747
3748 uint8_t Uint8ClampedArrayTraits::defaultValue() { return 0; }
3749
3750
3751 int8_t Int8ArrayTraits::defaultValue() { return 0; }
3752
3753
3754 uint16_t Uint16ArrayTraits::defaultValue() { return 0; }
3755
3756
3757 int16_t Int16ArrayTraits::defaultValue() { return 0; }
3758
3759
3760 uint32_t Uint32ArrayTraits::defaultValue() { return 0; }
3761
3762
3763 int32_t Int32ArrayTraits::defaultValue() { return 0; }
3764
3765
3766 float Float32ArrayTraits::defaultValue() {
3767 return static_cast<double>(OS::nan_value());
3768 }
3769
3770
3771 double Float64ArrayTraits::defaultValue() { return OS::nan_value(); }
3772
3773
3740 template <class Traits> 3774 template <class Traits>
3741 typename Traits::ElementType FixedTypedArray<Traits>::get_scalar(int index) { 3775 typename Traits::ElementType FixedTypedArray<Traits>::get_scalar(int index) {
3742 ASSERT((index >= 0) && (index < this->length())); 3776 ASSERT((index >= 0) && (index < this->length()));
3743 ElementType* ptr = reinterpret_cast<ElementType*>( 3777 ElementType* ptr = reinterpret_cast<ElementType*>(
3744 FIELD_ADDR(this, kDataOffset)); 3778 FIELD_ADDR(this, kDataOffset));
3745 return ptr[index]; 3779 return ptr[index];
3746 } 3780 }
3747 3781
3748 3782
3749 template<> inline 3783 template<> inline
(...skipping 15 matching lines...) Expand all
3765 3799
3766 template<> inline 3800 template<> inline
3767 void FixedTypedArray<Float64ArrayTraits>::set( 3801 void FixedTypedArray<Float64ArrayTraits>::set(
3768 int index, Float64ArrayTraits::ElementType value) { 3802 int index, Float64ArrayTraits::ElementType value) {
3769 ASSERT((index >= 0) && (index < this->length())); 3803 ASSERT((index >= 0) && (index < this->length()));
3770 WRITE_DOUBLE_FIELD(this, ElementOffset(index), value); 3804 WRITE_DOUBLE_FIELD(this, ElementOffset(index), value);
3771 } 3805 }
3772 3806
3773 3807
3774 template <class Traits> 3808 template <class Traits>
3809 typename Traits::ElementType FixedTypedArray<Traits>::from_int(int value) {
3810 return static_cast<ElementType>(value);
3811 }
3812
3813
3814 template <> inline
3815 uint8_t FixedTypedArray<Uint8ClampedArrayTraits>::from_int(int value) {
3816 if (value < 0) return 0;
3817 if (value > 0xFF) return 0xFF;
3818 return static_cast<uint8_t>(value);
3819 }
3820
3821
3822 template <class Traits>
3823 typename Traits::ElementType FixedTypedArray<Traits>::from_double(
3824 double value) {
3825 return static_cast<ElementType>(DoubleToInt32(value));
3826 }
3827
3828
3829 template<> inline
3830 uint8_t FixedTypedArray<Uint8ClampedArrayTraits>::from_double(double value) {
3831 if (value < 0) return 0;
3832 if (value > 0xFF) return 0xFF;
3833 return static_cast<uint8_t>(lrint(value));
3834 }
3835
3836
3837 template<> inline
3838 float FixedTypedArray<Float32ArrayTraits>::from_double(double value) {
3839 return static_cast<float>(value);
3840 }
3841
3842
3843 template<> inline
3844 double FixedTypedArray<Float64ArrayTraits>::from_double(double value) {
3845 return value;
3846 }
3847
3848
3849 template <class Traits>
3775 MaybeObject* FixedTypedArray<Traits>::get(int index) { 3850 MaybeObject* FixedTypedArray<Traits>::get(int index) {
3776 return Traits::ToObject(GetHeap(), get_scalar(index)); 3851 return Traits::ToObject(GetHeap(), get_scalar(index));
3777 } 3852 }
3778 3853
3779 template <class Traits> 3854 template <class Traits>
3780 MaybeObject* FixedTypedArray<Traits>::SetValue(uint32_t index, Object* value) { 3855 MaybeObject* FixedTypedArray<Traits>::SetValue(uint32_t index, Object* value) {
3781 ElementType cast_value = Traits::defaultValue(); 3856 ElementType cast_value = Traits::defaultValue();
3782 if (index < static_cast<uint32_t>(length())) { 3857 if (index < static_cast<uint32_t>(length())) {
3783 if (value->IsSmi()) { 3858 if (value->IsSmi()) {
3784 int int_value = Smi::cast(value)->value(); 3859 int int_value = Smi::cast(value)->value();
3785 cast_value = static_cast<ElementType>(int_value); 3860 cast_value = from_int(int_value);
3786 } else if (value->IsHeapNumber()) { 3861 } else if (value->IsHeapNumber()) {
3787 double double_value = HeapNumber::cast(value)->value(); 3862 double double_value = HeapNumber::cast(value)->value();
3788 cast_value = static_cast<ElementType>(DoubleToInt32(double_value)); 3863 cast_value = from_double(double_value);
3789 } else { 3864 } else {
3790 // Clamp undefined to the default value. All other types have been 3865 // Clamp undefined to the default value. All other types have been
3791 // converted to a number type further up in the call chain. 3866 // converted to a number type further up in the call chain.
3792 ASSERT(value->IsUndefined()); 3867 ASSERT(value->IsUndefined());
3793 } 3868 }
3794 set(index, cast_value); 3869 set(index, cast_value);
3795 } 3870 }
3796 return Traits::ToObject(GetHeap(), cast_value); 3871 return Traits::ToObject(GetHeap(), cast_value);
3797 } 3872 }
3798 3873
(...skipping 2247 matching lines...) Expand 10 before | Expand all | Expand 10 after
6046 #undef EXTERNAL_ELEMENTS_CHECK 6121 #undef EXTERNAL_ELEMENTS_CHECK
6047 6122
6048 6123
6049 bool JSObject::HasFixedTypedArrayElements() { 6124 bool JSObject::HasFixedTypedArrayElements() {
6050 HeapObject* array = elements(); 6125 HeapObject* array = elements();
6051 ASSERT(array != NULL); 6126 ASSERT(array != NULL);
6052 return array->IsFixedTypedArrayBase(); 6127 return array->IsFixedTypedArrayBase();
6053 } 6128 }
6054 6129
6055 6130
6131 #define FIXED_TYPED_ELEMENTS_CHECK(Type, type, TYPE, ctype, size) \
6132 bool JSObject::HasFixed##Type##Elements() { \
6133 HeapObject* array = elements(); \
6134 ASSERT(array != NULL); \
6135 if (!array->IsHeapObject()) \
6136 return false; \
6137 return array->map()->instance_type() == FIXED_##TYPE##_ARRAY_TYPE; \
6138 }
6139
6140 TYPED_ARRAYS(FIXED_TYPED_ELEMENTS_CHECK)
6141
6142 #undef FIXED_TYPED_ELEMENTS_CHECK
6143
6144
6056 bool JSObject::HasNamedInterceptor() { 6145 bool JSObject::HasNamedInterceptor() {
6057 return map()->has_named_interceptor(); 6146 return map()->has_named_interceptor();
6058 } 6147 }
6059 6148
6060 6149
6061 bool JSObject::HasIndexedInterceptor() { 6150 bool JSObject::HasIndexedInterceptor() {
6062 return map()->has_indexed_interceptor(); 6151 return map()->has_indexed_interceptor();
6063 } 6152 }
6064 6153
6065 6154
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after
6821 #undef READ_UINT32_FIELD 6910 #undef READ_UINT32_FIELD
6822 #undef WRITE_UINT32_FIELD 6911 #undef WRITE_UINT32_FIELD
6823 #undef READ_SHORT_FIELD 6912 #undef READ_SHORT_FIELD
6824 #undef WRITE_SHORT_FIELD 6913 #undef WRITE_SHORT_FIELD
6825 #undef READ_BYTE_FIELD 6914 #undef READ_BYTE_FIELD
6826 #undef WRITE_BYTE_FIELD 6915 #undef WRITE_BYTE_FIELD
6827 6916
6828 } } // namespace v8::internal 6917 } } // namespace v8::internal
6829 6918
6830 #endif // V8_OBJECTS_INL_H_ 6919 #endif // V8_OBJECTS_INL_H_
OLDNEW
« src/hydrogen.cc ('K') | « src/objects-debug.cc ('k') | src/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698