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

Unified Diff: src/runtime.cc

Issue 15943002: v8 typed arrays: add DataView type (Closed)
Patch Set: v8 typed arrays: add DataView type, v2 Created 7 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index 7e45753eba89e02bbe5006d92a0e4fc6a9f116f5..afcb586b2796dc7610726c76dbd2c00c2680e0e9 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -777,6 +777,242 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferSliceImpl) {
}
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewInitialize) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 4);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 1);
+ CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset_object, 2);
+ CONVERT_ARG_HANDLE_CHECKED(Object, byte_length_object, 3);
+
+ holder->set_buffer(*buffer);
+ holder->set_byte_offset(*byte_offset_object);
+ holder->set_byte_length(*byte_length_object);
+
+ Handle<Map> map =
+ isolate->factory()->GetElementsTransitionMap(
+ holder, EXTERNAL_UNSIGNED_BYTE_ELEMENTS);
+ holder->set_map(*map);
Dmitry Lomov (no reviews) 2013/06/03 13:09:04 This is completely unneeded. DataViews are not ext
+ return isolate->heap()->undefined_value();
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetBuffer) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 1);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ return (*holder)->buffer();
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetByteLength) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 1);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ return (*holder)->byte_length();
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetByteOffset) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 1);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ return (*holder)->byte_offset();
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetInt8) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 2);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
Dmitry Lomov (no reviews) 2013/06/03 13:09:04 This is wrong. Even if byte_offset is a result of
+ ASSERT(byte_offset >= 0);
+ return Smi::FromInt((*holder)->Get<int8_t>(byte_offset));
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetUint8) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 2);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ return Smi::FromInt((*holder)->Get<uint8_t>(byte_offset));
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetInt16) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 3);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_BOOLEAN_ARG_CHECKED(little_endian, 2);
+ return Smi::FromInt((*holder)->Get<int16_t>(byte_offset, little_endian));
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetUint16) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 3);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_BOOLEAN_ARG_CHECKED(little_endian, 2);
+ return Smi::FromInt((*holder)->Get<uint16_t>(byte_offset, little_endian));
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetInt32) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 3);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_BOOLEAN_ARG_CHECKED(little_endian, 2);
+ return isolate->heap()->NumberFromInt32(
+ (*holder)->Get<int32_t>(byte_offset, little_endian));
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetUint32) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 3);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_BOOLEAN_ARG_CHECKED(little_endian, 2);
+ return isolate->heap()->NumberFromUint32(
+ (*holder)->Get<uint32_t>(byte_offset, little_endian));
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetFloat32) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 3);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_BOOLEAN_ARG_CHECKED(little_endian, 2);
+ return isolate->heap()->NumberFromDouble(
+ (*holder)->Get<float>(byte_offset, little_endian));
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGetFloat64) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 3);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_BOOLEAN_ARG_CHECKED(little_endian, 2);
+ return isolate->heap()->NumberFromDouble(
+ (*holder)->Get<double>(byte_offset, little_endian));
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewSetInt8) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 3);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_NUMBER_CHECKED(int8_t, value, Int32, args[2]);
+ (*holder)->Set(byte_offset, value);
+ return isolate->heap()->undefined_value();
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewSetUint8) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 3);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_NUMBER_CHECKED(uint8_t, value, Uint32, args[2]);
+ (*holder)->Set(byte_offset, value);
+ return isolate->heap()->undefined_value();
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewSetInt16) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 4);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_NUMBER_CHECKED(int16_t, value, Int32, args[2]);
+ CONVERT_BOOLEAN_ARG_CHECKED(little_endian, 3);
+ (*holder)->Set(byte_offset, value, little_endian);
+ return isolate->heap()->undefined_value();
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewSetUint16) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 4);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_NUMBER_CHECKED(uint16_t, value, Uint32, args[2]);
+ CONVERT_BOOLEAN_ARG_CHECKED(little_endian, 3);
+ (*holder)->Set(byte_offset, value, little_endian);
+ return isolate->heap()->undefined_value();
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewSetInt32) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 4);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_NUMBER_CHECKED(int32_t, value, Int32, args[2]);
+ CONVERT_BOOLEAN_ARG_CHECKED(little_endian, 3);
+ (*holder)->Set(byte_offset, value, little_endian);
+ return isolate->heap()->undefined_value();
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewSetUint32) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 4);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_NUMBER_CHECKED(uint32_t, value, Uint32, args[2]);
+ CONVERT_BOOLEAN_ARG_CHECKED(little_endian, 3);
+ (*holder)->Set(byte_offset, value, little_endian);
+ return isolate->heap()->undefined_value();
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewSetFloat32) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 4);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_DOUBLE_ARG_CHECKED(value, 2);
+ CONVERT_BOOLEAN_ARG_CHECKED(little_endian, 3);
+ (*holder)->Set(byte_offset, static_cast<float>(value), little_endian);
+ return isolate->heap()->undefined_value();
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewSetFloat64) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 4);
+ CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
+ CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
+ ASSERT(byte_offset >= 0);
+ CONVERT_DOUBLE_ARG_CHECKED(value, 2);
+ CONVERT_BOOLEAN_ARG_CHECKED(little_endian, 3);
+ (*holder)->Set(byte_offset, value, little_endian);
+ return isolate->heap()->undefined_value();
+}
+
+
enum TypedArrayId {
// arrayIds below should be synchromized with typedarray.js natives.
ARRAY_ID_UINT8 = 1,

Powered by Google App Engine
This is Rietveld 408576698