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

Unified Diff: src/objects-inl.h

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/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index d0958eef29a0faa736980f8b8bd23887da101375..e425302a7a10031a1f4249c0d481a85f1efa738d 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -682,6 +682,7 @@ bool Object::IsBoolean() {
TYPE_CHECKER(JSArray, JS_ARRAY_TYPE)
TYPE_CHECKER(JSArrayBuffer, JS_ARRAY_BUFFER_TYPE)
+TYPE_CHECKER(JSDataView, JS_DATA_VIEW_TYPE)
TYPE_CHECKER(JSTypedArray, JS_TYPED_ARRAY_TYPE)
TYPE_CHECKER(JSRegExp, JS_REGEXP_TYPE)
@@ -1644,6 +1645,8 @@ int JSObject::GetHeaderSize() {
return JSArray::kSize;
case JS_ARRAY_BUFFER_TYPE:
return JSArrayBuffer::kSize;
+ case JS_DATA_VIEW_TYPE:
+ return JSDataView::kSize;
case JS_TYPED_ARRAY_TYPE:
return JSTypedArray::kSize;
case JS_SET_TYPE:
@@ -2548,6 +2551,7 @@ CAST_ACCESSOR(JSBuiltinsObject)
CAST_ACCESSOR(Code)
CAST_ACCESSOR(JSArray)
CAST_ACCESSOR(JSArrayBuffer)
+CAST_ACCESSOR(JSDataView)
CAST_ACCESSOR(JSTypedArray)
CAST_ACCESSOR(JSRegExp)
CAST_ACCESSOR(JSProxy)
@@ -5321,6 +5325,45 @@ void JSArrayBuffer::set_is_external(bool value) {
}
+ACCESSORS(JSDataView, buffer, Object, kBufferOffset)
+ACCESSORS(JSDataView, byte_offset, Object, kByteOffsetOffset)
+ACCESSORS(JSDataView, byte_length, Object, kByteLengthOffset)
+
+
+template <typename TypeName>
+TypeName JSDataView::Get(size_t byte_offset, bool little_endian) {
+ size_t byte_length = static_cast<size_t>(this->byte_length()->Number());
Dmitry Lomov (no reviews) 2013/06/03 13:09:04 Use NumberToSize
bnoordhuis 2013/06/03 13:48:12 I copied that from ArrayBuffer actually, to keep f
Dmitry Lomov (no reviews) 2013/06/03 14:42:49 Use NumberToSize here, do not update usages in cod
+ if (byte_offset + sizeof(TypeName) > byte_length) return 0;
+ if (byte_offset + sizeof(TypeName) < byte_offset) return 0; // Overflow.
+ Handle<JSArrayBuffer> buffer(JSArrayBuffer::cast(this->buffer()));
+ const char* data = static_cast<const char*>(buffer->backing_store()) +
+ static_cast<size_t>(this->byte_offset()->Number()) +
+ byte_offset;
+ TypeName value;
+ OS::MemCopy(&value, data, sizeof(value));
+ if (sizeof(TypeName) > 1 && little_endian ^ IsLittleEndian()) {
+ Swizzle(&value);
+ }
+ return value;
+}
+
+
+template <typename TypeName>
+void JSDataView::Set(size_t byte_offset, TypeName value, bool little_endian) {
+ size_t byte_length = static_cast<size_t>(this->byte_length()->Number());
Dmitry Lomov (no reviews) 2013/06/03 13:09:04 Use NumberToSize.
+ if (byte_offset + sizeof(TypeName) > byte_length) return;
+ if (byte_offset + sizeof(TypeName) < byte_offset) return; // Overflow.
+ Handle<JSArrayBuffer> buffer(JSArrayBuffer::cast(this->buffer()));
+ char* data = static_cast<char*>(buffer->backing_store()) +
+ static_cast<size_t>(this->byte_offset()->Number()) +
+ byte_offset;
+ if (sizeof(TypeName) > 1 && little_endian ^ IsLittleEndian()) {
+ Swizzle(&value);
+ }
+ OS::MemCopy(data, &value, sizeof(value));
+}
+
+
ACCESSORS(JSTypedArray, buffer, Object, kBufferOffset)
ACCESSORS(JSTypedArray, byte_offset, Object, kByteOffsetOffset)
ACCESSORS(JSTypedArray, byte_length, Object, kByteLengthOffset)

Powered by Google App Engine
This is Rietveld 408576698