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

Side by Side Diff: src/objects.cc

Issue 235923013: Handlify TypedArray setters. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: fixed comment Created 6 years, 8 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 | « src/objects.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 14773 matching lines...) Expand 10 before | Expand all | Expand 10 after
14784 TYPED_ARRAYS(INSTANCE_TYPE_TO_ELEMENT_SIZE) 14784 TYPED_ARRAYS(INSTANCE_TYPE_TO_ELEMENT_SIZE)
14785 #undef INSTANCE_TYPE_TO_ELEMENT_SIZE 14785 #undef INSTANCE_TYPE_TO_ELEMENT_SIZE
14786 14786
14787 default: 14787 default:
14788 UNREACHABLE(); 14788 UNREACHABLE();
14789 return 0; 14789 return 0;
14790 } 14790 }
14791 } 14791 }
14792 14792
14793 14793
14794 Object* ExternalUint8ClampedArray::SetValue(uint32_t index, Object* value) { 14794 Handle<Object> ExternalUint8ClampedArray::SetValue(
14795 Handle<ExternalUint8ClampedArray> array,
14796 uint32_t index,
14797 Handle<Object> value) {
14795 uint8_t clamped_value = 0; 14798 uint8_t clamped_value = 0;
14796 if (index < static_cast<uint32_t>(length())) { 14799 if (index < static_cast<uint32_t>(array->length())) {
14797 if (value->IsSmi()) { 14800 if (value->IsSmi()) {
14798 int int_value = Smi::cast(value)->value(); 14801 int int_value = Handle<Smi>::cast(value)->value();
14799 if (int_value < 0) { 14802 if (int_value < 0) {
14800 clamped_value = 0; 14803 clamped_value = 0;
14801 } else if (int_value > 255) { 14804 } else if (int_value > 255) {
14802 clamped_value = 255; 14805 clamped_value = 255;
14803 } else { 14806 } else {
14804 clamped_value = static_cast<uint8_t>(int_value); 14807 clamped_value = static_cast<uint8_t>(int_value);
14805 } 14808 }
14806 } else if (value->IsHeapNumber()) { 14809 } else if (value->IsHeapNumber()) {
14807 double double_value = HeapNumber::cast(value)->value(); 14810 double double_value = Handle<HeapNumber>::cast(value)->value();
14808 if (!(double_value > 0)) { 14811 if (!(double_value > 0)) {
14809 // NaN and less than zero clamp to zero. 14812 // NaN and less than zero clamp to zero.
14810 clamped_value = 0; 14813 clamped_value = 0;
14811 } else if (double_value > 255) { 14814 } else if (double_value > 255) {
14812 // Greater than 255 clamp to 255. 14815 // Greater than 255 clamp to 255.
14813 clamped_value = 255; 14816 clamped_value = 255;
14814 } else { 14817 } else {
14815 // Other doubles are rounded to the nearest integer. 14818 // Other doubles are rounded to the nearest integer.
14816 clamped_value = static_cast<uint8_t>(lrint(double_value)); 14819 clamped_value = static_cast<uint8_t>(lrint(double_value));
14817 } 14820 }
14818 } else { 14821 } else {
14819 // Clamp undefined to zero (default). All other types have been 14822 // Clamp undefined to zero (default). All other types have been
14820 // converted to a number type further up in the call chain. 14823 // converted to a number type further up in the call chain.
14821 ASSERT(value->IsUndefined()); 14824 ASSERT(value->IsUndefined());
14822 } 14825 }
14823 set(index, clamped_value); 14826 array->set(index, clamped_value);
14824 } 14827 }
14825 return Smi::FromInt(clamped_value); 14828 return handle(Smi::FromInt(clamped_value), array->GetIsolate());
14826 }
14827
14828
14829 Handle<Object> ExternalUint8ClampedArray::SetValue(
14830 Handle<ExternalUint8ClampedArray> array,
14831 uint32_t index,
14832 Handle<Object> value) {
14833 return Handle<Object>(array->SetValue(index, *value), array->GetIsolate());
14834 } 14829 }
14835 14830
14836 14831
14837 template<typename ExternalArrayClass, typename ValueType> 14832 template<typename ExternalArrayClass, typename ValueType>
14838 static MaybeObject* ExternalArrayIntSetter(Heap* heap, 14833 static Handle<Object> ExternalArrayIntSetter(
14839 ExternalArrayClass* receiver, 14834 Isolate* isolate,
14840 uint32_t index, 14835 Handle<ExternalArrayClass> receiver,
14841 Object* value) { 14836 uint32_t index,
14837 Handle<Object> value) {
14842 ValueType cast_value = 0; 14838 ValueType cast_value = 0;
14843 if (index < static_cast<uint32_t>(receiver->length())) { 14839 if (index < static_cast<uint32_t>(receiver->length())) {
14844 if (value->IsSmi()) { 14840 if (value->IsSmi()) {
14845 int int_value = Smi::cast(value)->value(); 14841 int int_value = Handle<Smi>::cast(value)->value();
14846 cast_value = static_cast<ValueType>(int_value); 14842 cast_value = static_cast<ValueType>(int_value);
14847 } else if (value->IsHeapNumber()) { 14843 } else if (value->IsHeapNumber()) {
14848 double double_value = HeapNumber::cast(value)->value(); 14844 double double_value = Handle<HeapNumber>::cast(value)->value();
14849 cast_value = static_cast<ValueType>(DoubleToInt32(double_value)); 14845 cast_value = static_cast<ValueType>(DoubleToInt32(double_value));
14850 } else { 14846 } else {
14851 // Clamp undefined to zero (default). All other types have been 14847 // Clamp undefined to zero (default). All other types have been
14852 // converted to a number type further up in the call chain. 14848 // converted to a number type further up in the call chain.
14853 ASSERT(value->IsUndefined()); 14849 ASSERT(value->IsUndefined());
14854 } 14850 }
14855 receiver->set(index, cast_value); 14851 receiver->set(index, cast_value);
14856 } 14852 }
14857 return heap->NumberFromInt32(cast_value); 14853 return isolate->factory()->NewNumberFromInt(cast_value);
14858 } 14854 }
14859 14855
14860 14856
14861 Handle<Object> ExternalInt8Array::SetValue(Handle<ExternalInt8Array> array, 14857 Handle<Object> ExternalInt8Array::SetValue(Handle<ExternalInt8Array> array,
14862 uint32_t index, 14858 uint32_t index,
14863 Handle<Object> value) { 14859 Handle<Object> value) {
14864 CALL_HEAP_FUNCTION(array->GetIsolate(), 14860 return ExternalArrayIntSetter<ExternalInt8Array, int8_t>(
14865 array->SetValue(index, *value), 14861 array->GetIsolate(), array, index, value);
14866 Object);
14867 } 14862 }
14868 14863
14869 14864
14870 MaybeObject* ExternalInt8Array::SetValue(uint32_t index, Object* value) { 14865 Handle<Object> ExternalUint8Array::SetValue(Handle<ExternalUint8Array> array,
14871 return ExternalArrayIntSetter<ExternalInt8Array, int8_t> 14866 uint32_t index,
14872 (GetHeap(), this, index, value); 14867 Handle<Object> value) {
14868 return ExternalArrayIntSetter<ExternalUint8Array, uint8_t>(
14869 array->GetIsolate(), array, index, value);
14873 } 14870 }
14874 14871
14875 14872
14876 Handle<Object> ExternalUint8Array::SetValue( 14873 Handle<Object> ExternalInt16Array::SetValue(Handle<ExternalInt16Array> array,
14877 Handle<ExternalUint8Array> array, 14874 uint32_t index,
14878 uint32_t index, 14875 Handle<Object> value) {
14879 Handle<Object> value) { 14876 return ExternalArrayIntSetter<ExternalInt16Array, int16_t>(
14880 CALL_HEAP_FUNCTION(array->GetIsolate(), 14877 array->GetIsolate(), array, index, value);
14881 array->SetValue(index, *value),
14882 Object);
14883 } 14878 }
14884 14879
14885 14880
14886 MaybeObject* ExternalUint8Array::SetValue(uint32_t index, 14881 Handle<Object> ExternalUint16Array::SetValue(Handle<ExternalUint16Array> array,
14887 Object* value) { 14882 uint32_t index,
14888 return ExternalArrayIntSetter<ExternalUint8Array, uint8_t> 14883 Handle<Object> value) {
14889 (GetHeap(), this, index, value); 14884 return ExternalArrayIntSetter<ExternalUint16Array, uint16_t>(
14890 } 14885 array->GetIsolate(), array, index, value);
14891
14892
14893 Handle<Object> ExternalInt16Array::SetValue(
14894 Handle<ExternalInt16Array> array,
14895 uint32_t index,
14896 Handle<Object> value) {
14897 CALL_HEAP_FUNCTION(array->GetIsolate(),
14898 array->SetValue(index, *value),
14899 Object);
14900 }
14901
14902
14903 MaybeObject* ExternalInt16Array::SetValue(uint32_t index,
14904 Object* value) {
14905 return ExternalArrayIntSetter<ExternalInt16Array, int16_t>
14906 (GetHeap(), this, index, value);
14907 }
14908
14909
14910 Handle<Object> ExternalUint16Array::SetValue(
14911 Handle<ExternalUint16Array> array,
14912 uint32_t index,
14913 Handle<Object> value) {
14914 CALL_HEAP_FUNCTION(array->GetIsolate(),
14915 array->SetValue(index, *value),
14916 Object);
14917 }
14918
14919
14920 MaybeObject* ExternalUint16Array::SetValue(uint32_t index,
14921 Object* value) {
14922 return ExternalArrayIntSetter<ExternalUint16Array, uint16_t>
14923 (GetHeap(), this, index, value);
14924 } 14886 }
14925 14887
14926 14888
14927 Handle<Object> ExternalInt32Array::SetValue(Handle<ExternalInt32Array> array, 14889 Handle<Object> ExternalInt32Array::SetValue(Handle<ExternalInt32Array> array,
14928 uint32_t index, 14890 uint32_t index,
14929 Handle<Object> value) { 14891 Handle<Object> value) {
14930 CALL_HEAP_FUNCTION(array->GetIsolate(), 14892 return ExternalArrayIntSetter<ExternalInt32Array, int32_t>(
14931 array->SetValue(index, *value), 14893 array->GetIsolate(), array, index, value);
14932 Object);
14933 } 14894 }
14934 14895
14935 14896
14936 MaybeObject* ExternalInt32Array::SetValue(uint32_t index, Object* value) {
14937 return ExternalArrayIntSetter<ExternalInt32Array, int32_t>
14938 (GetHeap(), this, index, value);
14939 }
14940
14941
14942 Handle<Object> ExternalUint32Array::SetValue( 14897 Handle<Object> ExternalUint32Array::SetValue(
14943 Handle<ExternalUint32Array> array, 14898 Handle<ExternalUint32Array> array,
14944 uint32_t index, 14899 uint32_t index,
14945 Handle<Object> value) { 14900 Handle<Object> value) {
14946 CALL_HEAP_FUNCTION(array->GetIsolate(),
14947 array->SetValue(index, *value),
14948 Object);
14949 }
14950
14951
14952 MaybeObject* ExternalUint32Array::SetValue(uint32_t index, Object* value) {
14953 uint32_t cast_value = 0; 14901 uint32_t cast_value = 0;
14954 Heap* heap = GetHeap(); 14902 if (index < static_cast<uint32_t>(array->length())) {
14955 if (index < static_cast<uint32_t>(length())) {
14956 if (value->IsSmi()) { 14903 if (value->IsSmi()) {
14957 int int_value = Smi::cast(value)->value(); 14904 int int_value = Handle<Smi>::cast(value)->value();
14958 cast_value = static_cast<uint32_t>(int_value); 14905 cast_value = static_cast<uint32_t>(int_value);
14959 } else if (value->IsHeapNumber()) { 14906 } else if (value->IsHeapNumber()) {
14960 double double_value = HeapNumber::cast(value)->value(); 14907 double double_value = Handle<HeapNumber>::cast(value)->value();
14961 cast_value = static_cast<uint32_t>(DoubleToUint32(double_value)); 14908 cast_value = static_cast<uint32_t>(DoubleToUint32(double_value));
14962 } else { 14909 } else {
14963 // Clamp undefined to zero (default). All other types have been 14910 // Clamp undefined to zero (default). All other types have been
14964 // converted to a number type further up in the call chain. 14911 // converted to a number type further up in the call chain.
14965 ASSERT(value->IsUndefined()); 14912 ASSERT(value->IsUndefined());
14966 } 14913 }
14967 set(index, cast_value); 14914 array->set(index, cast_value);
14968 } 14915 }
14969 return heap->NumberFromUint32(cast_value); 14916 return array->GetIsolate()->factory()->NewNumberFromUint(cast_value);
14970 } 14917 }
14971 14918
14972 14919
14973 Handle<Object> ExternalFloat32Array::SetValue( 14920 Handle<Object> ExternalFloat32Array::SetValue(
14974 Handle<ExternalFloat32Array> array, 14921 Handle<ExternalFloat32Array> array,
14975 uint32_t index, 14922 uint32_t index,
14976 Handle<Object> value) { 14923 Handle<Object> value) {
14977 CALL_HEAP_FUNCTION(array->GetIsolate(),
14978 array->SetValue(index, *value),
14979 Object);
14980 }
14981
14982
14983 MaybeObject* ExternalFloat32Array::SetValue(uint32_t index, Object* value) {
14984 float cast_value = static_cast<float>(OS::nan_value()); 14924 float cast_value = static_cast<float>(OS::nan_value());
14985 Heap* heap = GetHeap(); 14925 if (index < static_cast<uint32_t>(array->length())) {
14986 if (index < static_cast<uint32_t>(length())) {
14987 if (value->IsSmi()) { 14926 if (value->IsSmi()) {
14988 int int_value = Smi::cast(value)->value(); 14927 int int_value = Handle<Smi>::cast(value)->value();
14989 cast_value = static_cast<float>(int_value); 14928 cast_value = static_cast<float>(int_value);
14990 } else if (value->IsHeapNumber()) { 14929 } else if (value->IsHeapNumber()) {
14991 double double_value = HeapNumber::cast(value)->value(); 14930 double double_value = Handle<HeapNumber>::cast(value)->value();
14992 cast_value = static_cast<float>(double_value); 14931 cast_value = static_cast<float>(double_value);
14993 } else { 14932 } else {
14994 // Clamp undefined to NaN (default). All other types have been 14933 // Clamp undefined to NaN (default). All other types have been
14995 // converted to a number type further up in the call chain. 14934 // converted to a number type further up in the call chain.
14996 ASSERT(value->IsUndefined()); 14935 ASSERT(value->IsUndefined());
14997 } 14936 }
14998 set(index, cast_value); 14937 array->set(index, cast_value);
14999 } 14938 }
15000 return heap->AllocateHeapNumber(cast_value); 14939 return array->GetIsolate()->factory()->NewNumber(cast_value);
15001 } 14940 }
15002 14941
15003 14942
15004 Handle<Object> ExternalFloat64Array::SetValue( 14943 Handle<Object> ExternalFloat64Array::SetValue(
15005 Handle<ExternalFloat64Array> array, 14944 Handle<ExternalFloat64Array> array,
15006 uint32_t index, 14945 uint32_t index,
15007 Handle<Object> value) { 14946 Handle<Object> value) {
15008 CALL_HEAP_FUNCTION(array->GetIsolate(),
15009 array->SetValue(index, *value),
15010 Object);
15011 }
15012
15013
15014 MaybeObject* ExternalFloat64Array::SetValue(uint32_t index, Object* value) {
15015 double double_value = OS::nan_value(); 14947 double double_value = OS::nan_value();
15016 Heap* heap = GetHeap(); 14948 if (index < static_cast<uint32_t>(array->length())) {
15017 if (index < static_cast<uint32_t>(length())) { 14949 if (value->IsNumber()) {
15018 if (value->IsSmi()) { 14950 double_value = value->Number();
15019 int int_value = Smi::cast(value)->value();
15020 double_value = static_cast<double>(int_value);
15021 } else if (value->IsHeapNumber()) {
15022 double_value = HeapNumber::cast(value)->value();
15023 } else { 14951 } else {
15024 // Clamp undefined to NaN (default). All other types have been 14952 // Clamp undefined to NaN (default). All other types have been
15025 // converted to a number type further up in the call chain. 14953 // converted to a number type further up in the call chain.
15026 ASSERT(value->IsUndefined()); 14954 ASSERT(value->IsUndefined());
15027 } 14955 }
15028 set(index, double_value); 14956 array->set(index, double_value);
15029 } 14957 }
15030 return heap->AllocateHeapNumber(double_value); 14958 return array->GetIsolate()->factory()->NewNumber(double_value);
15031 } 14959 }
15032 14960
15033 14961
15034 PropertyCell* GlobalObject::GetPropertyCell(LookupResult* result) { 14962 PropertyCell* GlobalObject::GetPropertyCell(LookupResult* result) {
15035 ASSERT(!HasFastProperties()); 14963 ASSERT(!HasFastProperties());
15036 Object* value = property_dictionary()->ValueAt(result->GetDictionaryEntry()); 14964 Object* value = property_dictionary()->ValueAt(result->GetDictionaryEntry());
15037 return PropertyCell::cast(value); 14965 return PropertyCell::cast(value);
15038 } 14966 }
15039 14967
15040 14968
(...skipping 1651 matching lines...) Expand 10 before | Expand all | Expand 10 after
16692 #define ERROR_MESSAGES_TEXTS(C, T) T, 16620 #define ERROR_MESSAGES_TEXTS(C, T) T,
16693 static const char* error_messages_[] = { 16621 static const char* error_messages_[] = {
16694 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16622 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16695 }; 16623 };
16696 #undef ERROR_MESSAGES_TEXTS 16624 #undef ERROR_MESSAGES_TEXTS
16697 return error_messages_[reason]; 16625 return error_messages_[reason];
16698 } 16626 }
16699 16627
16700 16628
16701 } } // namespace v8::internal 16629 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698