| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 849de3cb1e204befd6ec0fb807cdb8dd7c07be1d..503f367758a7e6eadb3dd98f185465d92966c348 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -1132,26 +1132,33 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitializeFromArrayLike) {
|
| }
|
|
|
|
|
| -#define BUFFER_VIEW_GETTER(Type, getter, accessor) \
|
| - RUNTIME_FUNCTION(MaybeObject*, Runtime_##Type##Get##getter) { \
|
| +#define TYPED_ARRAY_GETTER(getter, accessor) \
|
| + RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayGet##getter) { \
|
| HandleScope scope(isolate); \
|
| ASSERT(args.length() == 1); \
|
| - CONVERT_ARG_HANDLE_CHECKED(JS##Type, holder, 0); \
|
| - return holder->accessor(); \
|
| + CONVERT_ARG_HANDLE_CHECKED(Object, holder, 0); \
|
| + if (!holder->IsJSTypedArray()) \
|
| + return isolate->Throw(*isolate->factory()->NewTypeError( \
|
| + "not_typed_array", HandleVector<Object>(NULL, 0))); \
|
| + Handle<JSTypedArray> typed_array(JSTypedArray::cast(*holder)); \
|
| + return typed_array->accessor(); \
|
| }
|
|
|
| -BUFFER_VIEW_GETTER(ArrayBufferView, ByteLength, byte_length)
|
| -BUFFER_VIEW_GETTER(ArrayBufferView, ByteOffset, byte_offset)
|
| -BUFFER_VIEW_GETTER(TypedArray, Length, length)
|
| -BUFFER_VIEW_GETTER(DataView, Buffer, buffer)
|
| +TYPED_ARRAY_GETTER(ByteLength, byte_length)
|
| +TYPED_ARRAY_GETTER(ByteOffset, byte_offset)
|
| +TYPED_ARRAY_GETTER(Length, length)
|
|
|
| -#undef BUFFER_VIEW_GETTER
|
| +#undef TYPED_ARRAY_GETTER
|
|
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayGetBuffer) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 1);
|
| - CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0);
|
| - return *holder->GetBuffer();
|
| + CONVERT_ARG_HANDLE_CHECKED(Object, holder, 0);
|
| + if (!holder->IsJSTypedArray())
|
| + return isolate->Throw(*isolate->factory()->NewTypeError(
|
| + "not_typed_array", HandleVector<Object>(NULL, 0)));
|
| + Handle<JSTypedArray> typed_array(JSTypedArray::cast(*holder));
|
| + return *typed_array->GetBuffer();
|
| }
|
|
|
|
|
| @@ -1266,6 +1273,30 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewInitialize) {
|
| }
|
|
|
|
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetBuffer) {
|
| + HandleScope scope(isolate);
|
| + ASSERT(args.length() == 1);
|
| + CONVERT_ARG_HANDLE_CHECKED(JSDataView, data_view, 0);
|
| + return data_view->buffer();
|
| +}
|
| +
|
| +
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetByteOffset) {
|
| + HandleScope scope(isolate);
|
| + ASSERT(args.length() == 1);
|
| + CONVERT_ARG_HANDLE_CHECKED(JSDataView, data_view, 0);
|
| + return data_view->byte_offset();
|
| +}
|
| +
|
| +
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetByteLength) {
|
| + HandleScope scope(isolate);
|
| + ASSERT(args.length() == 1);
|
| + CONVERT_ARG_HANDLE_CHECKED(JSDataView, data_view, 0);
|
| + return data_view->byte_length();
|
| +}
|
| +
|
| +
|
| inline static bool NeedToFlipBytes(bool is_little_endian) {
|
| #ifdef V8_TARGET_LITTLE_ENDIAN
|
| return !is_little_endian;
|
|
|