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 |