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; |