| Index: src/runtime/runtime-typedarray.cc
|
| diff --git a/src/runtime/runtime-typedarray.cc b/src/runtime/runtime-typedarray.cc
|
| index 04bf3689746001dfdf104f3d720c7ee8edffd820..80d57bc3f2d11c5cb64573db9852b31e4d549e9e 100644
|
| --- a/src/runtime/runtime-typedarray.cc
|
| +++ b/src/runtime/runtime-typedarray.cc
|
| @@ -419,217 +419,5 @@ RUNTIME_FUNCTION(Runtime_IsSharedInteger32TypedArray) {
|
| obj->type() == kExternalInt32Array);
|
| }
|
|
|
| -
|
| -inline static bool NeedToFlipBytes(bool is_little_endian) {
|
| -#ifdef V8_TARGET_LITTLE_ENDIAN
|
| - return !is_little_endian;
|
| -#else
|
| - return is_little_endian;
|
| -#endif
|
| -}
|
| -
|
| -
|
| -template <int n>
|
| -inline void CopyBytes(uint8_t* target, uint8_t* source) {
|
| - for (int i = 0; i < n; i++) {
|
| - *(target++) = *(source++);
|
| - }
|
| -}
|
| -
|
| -
|
| -template <int n>
|
| -inline void FlipBytes(uint8_t* target, uint8_t* source) {
|
| - source = source + (n - 1);
|
| - for (int i = 0; i < n; i++) {
|
| - *(target++) = *(source--);
|
| - }
|
| -}
|
| -
|
| -
|
| -template <typename T>
|
| -inline static bool DataViewGetValue(Isolate* isolate,
|
| - Handle<JSDataView> data_view,
|
| - Handle<Object> byte_offset_obj,
|
| - bool is_little_endian, T* result) {
|
| - size_t byte_offset = 0;
|
| - if (!TryNumberToSize(*byte_offset_obj, &byte_offset)) {
|
| - return false;
|
| - }
|
| - Handle<JSArrayBuffer> buffer(JSArrayBuffer::cast(data_view->buffer()));
|
| -
|
| - size_t data_view_byte_offset = NumberToSize(data_view->byte_offset());
|
| - size_t data_view_byte_length = NumberToSize(data_view->byte_length());
|
| - if (byte_offset + sizeof(T) > data_view_byte_length ||
|
| - byte_offset + sizeof(T) < byte_offset) { // overflow
|
| - return false;
|
| - }
|
| -
|
| - union Value {
|
| - T data;
|
| - uint8_t bytes[sizeof(T)];
|
| - };
|
| -
|
| - Value value;
|
| - size_t buffer_offset = data_view_byte_offset + byte_offset;
|
| - DCHECK(NumberToSize(buffer->byte_length()) >= buffer_offset + sizeof(T));
|
| - uint8_t* source =
|
| - static_cast<uint8_t*>(buffer->backing_store()) + buffer_offset;
|
| - if (NeedToFlipBytes(is_little_endian)) {
|
| - FlipBytes<sizeof(T)>(value.bytes, source);
|
| - } else {
|
| - CopyBytes<sizeof(T)>(value.bytes, source);
|
| - }
|
| - *result = value.data;
|
| - return true;
|
| -}
|
| -
|
| -
|
| -template <typename T>
|
| -static bool DataViewSetValue(Isolate* isolate, Handle<JSDataView> data_view,
|
| - Handle<Object> byte_offset_obj,
|
| - bool is_little_endian, T data) {
|
| - size_t byte_offset = 0;
|
| - if (!TryNumberToSize(*byte_offset_obj, &byte_offset)) {
|
| - return false;
|
| - }
|
| - Handle<JSArrayBuffer> buffer(JSArrayBuffer::cast(data_view->buffer()));
|
| -
|
| - size_t data_view_byte_offset = NumberToSize(data_view->byte_offset());
|
| - size_t data_view_byte_length = NumberToSize(data_view->byte_length());
|
| - if (byte_offset + sizeof(T) > data_view_byte_length ||
|
| - byte_offset + sizeof(T) < byte_offset) { // overflow
|
| - return false;
|
| - }
|
| -
|
| - union Value {
|
| - T data;
|
| - uint8_t bytes[sizeof(T)];
|
| - };
|
| -
|
| - Value value;
|
| - value.data = data;
|
| - size_t buffer_offset = data_view_byte_offset + byte_offset;
|
| - DCHECK(NumberToSize(buffer->byte_length()) >= buffer_offset + sizeof(T));
|
| - uint8_t* target =
|
| - static_cast<uint8_t*>(buffer->backing_store()) + buffer_offset;
|
| - if (NeedToFlipBytes(is_little_endian)) {
|
| - FlipBytes<sizeof(T)>(target, value.bytes);
|
| - } else {
|
| - CopyBytes<sizeof(T)>(target, value.bytes);
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -
|
| -#define DATA_VIEW_GETTER(TypeName, Type, Converter) \
|
| - RUNTIME_FUNCTION(Runtime_DataViewGet##TypeName) { \
|
| - HandleScope scope(isolate); \
|
| - DCHECK(args.length() == 3); \
|
| - CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0); \
|
| - CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset, 1); \
|
| - CONVERT_BOOLEAN_ARG_CHECKED(is_little_endian, 2); \
|
| - Type result; \
|
| - if (DataViewGetValue(isolate, holder, offset, is_little_endian, \
|
| - &result)) { \
|
| - return *isolate->factory()->Converter(result); \
|
| - } else { \
|
| - THROW_NEW_ERROR_RETURN_FAILURE( \
|
| - isolate, \
|
| - NewRangeError(MessageTemplate::kInvalidDataViewAccessorOffset)); \
|
| - } \
|
| - }
|
| -
|
| -DATA_VIEW_GETTER(Uint8, uint8_t, NewNumberFromUint)
|
| -DATA_VIEW_GETTER(Int8, int8_t, NewNumberFromInt)
|
| -DATA_VIEW_GETTER(Uint16, uint16_t, NewNumberFromUint)
|
| -DATA_VIEW_GETTER(Int16, int16_t, NewNumberFromInt)
|
| -DATA_VIEW_GETTER(Uint32, uint32_t, NewNumberFromUint)
|
| -DATA_VIEW_GETTER(Int32, int32_t, NewNumberFromInt)
|
| -DATA_VIEW_GETTER(Float32, float, NewNumber)
|
| -DATA_VIEW_GETTER(Float64, double, NewNumber)
|
| -
|
| -#undef DATA_VIEW_GETTER
|
| -
|
| -
|
| -template <typename T>
|
| -static T DataViewConvertValue(double value);
|
| -
|
| -
|
| -template <>
|
| -int8_t DataViewConvertValue<int8_t>(double value) {
|
| - return static_cast<int8_t>(DoubleToInt32(value));
|
| -}
|
| -
|
| -
|
| -template <>
|
| -int16_t DataViewConvertValue<int16_t>(double value) {
|
| - return static_cast<int16_t>(DoubleToInt32(value));
|
| -}
|
| -
|
| -
|
| -template <>
|
| -int32_t DataViewConvertValue<int32_t>(double value) {
|
| - return DoubleToInt32(value);
|
| -}
|
| -
|
| -
|
| -template <>
|
| -uint8_t DataViewConvertValue<uint8_t>(double value) {
|
| - return static_cast<uint8_t>(DoubleToUint32(value));
|
| -}
|
| -
|
| -
|
| -template <>
|
| -uint16_t DataViewConvertValue<uint16_t>(double value) {
|
| - return static_cast<uint16_t>(DoubleToUint32(value));
|
| -}
|
| -
|
| -
|
| -template <>
|
| -uint32_t DataViewConvertValue<uint32_t>(double value) {
|
| - return DoubleToUint32(value);
|
| -}
|
| -
|
| -
|
| -template <>
|
| -float DataViewConvertValue<float>(double value) {
|
| - return static_cast<float>(value);
|
| -}
|
| -
|
| -
|
| -template <>
|
| -double DataViewConvertValue<double>(double value) {
|
| - return value;
|
| -}
|
| -
|
| -
|
| -#define DATA_VIEW_SETTER(TypeName, Type) \
|
| - RUNTIME_FUNCTION(Runtime_DataViewSet##TypeName) { \
|
| - HandleScope scope(isolate); \
|
| - DCHECK(args.length() == 4); \
|
| - CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0); \
|
| - CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset, 1); \
|
| - CONVERT_NUMBER_ARG_HANDLE_CHECKED(value, 2); \
|
| - CONVERT_BOOLEAN_ARG_CHECKED(is_little_endian, 3); \
|
| - Type v = DataViewConvertValue<Type>(value->Number()); \
|
| - if (DataViewSetValue(isolate, holder, offset, is_little_endian, v)) { \
|
| - return isolate->heap()->undefined_value(); \
|
| - } else { \
|
| - THROW_NEW_ERROR_RETURN_FAILURE( \
|
| - isolate, \
|
| - NewRangeError(MessageTemplate::kInvalidDataViewAccessorOffset)); \
|
| - } \
|
| - }
|
| -
|
| -DATA_VIEW_SETTER(Uint8, uint8_t)
|
| -DATA_VIEW_SETTER(Int8, int8_t)
|
| -DATA_VIEW_SETTER(Uint16, uint16_t)
|
| -DATA_VIEW_SETTER(Int16, int16_t)
|
| -DATA_VIEW_SETTER(Uint32, uint32_t)
|
| -DATA_VIEW_SETTER(Int32, int32_t)
|
| -DATA_VIEW_SETTER(Float32, float)
|
| -DATA_VIEW_SETTER(Float64, double)
|
| -
|
| -#undef DATA_VIEW_SETTER
|
| } // namespace internal
|
| } // namespace v8
|
|
|