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

Unified Diff: src/api.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
« no previous file with comments | « src/api.h ('k') | src/bootstrapper.cc » ('j') | src/dataview.js » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index c2c7930f48ca5b3ee49696481f8c402fef43287e..2d25762720f59cb441dc0b474f00479a119512ba 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -2571,6 +2571,13 @@ bool Value::IsArrayBuffer() const {
}
+bool Value::IsDataView() const {
+ if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsDataView()"))
+ return false;
+ return Utils::OpenHandle(this)->IsJSDataView();
+}
+
+
bool Value::IsTypedArray() const {
if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsArrayBuffer()"))
return false;
@@ -2950,6 +2957,15 @@ void v8::ArrayBuffer::CheckCast(Value* that) {
}
+void v8::DataView::CheckCast(Value* that) {
+ if (IsDeadCheck(i::Isolate::Current(), "v8::DataView::Cast()")) return;
+ i::Handle<i::Object> obj = Utils::OpenHandle(that);
+ ApiCheck(obj->IsJSDataView(),
+ "v8::DataView::Cast()",
+ "Could not convert to DataView");
+}
+
+
void v8::TypedArray::CheckCast(Value* that) {
if (IsDeadCheck(i::Isolate::Current(), "v8::TypedArray::Cast()")) return;
i::Handle<i::Object> obj = Utils::OpenHandle(that);
@@ -6064,6 +6080,214 @@ Local<ArrayBuffer> v8::ArrayBuffer::New(void* data, size_t byte_length) {
}
+Local<DataView> v8::DataView::New(Handle<ArrayBuffer> array_buffer,
+ size_t byte_offset,
+ size_t byte_length) {
+ i::Isolate* isolate = i::Isolate::Current();
+ i::Handle<i::JSDataView> obj =
+ isolate->factory()->NewJSDataView();
+ i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer);
+ ASSERT(byte_offset + byte_length <=
+ static_cast<size_t>(buffer->byte_length()->Number()));
+ obj->set_buffer(*buffer);
+ i::Handle<i::Object> byte_offset_object = isolate->factory()->NewNumber(
+ static_cast<double>(byte_offset));
+ obj->set_byte_offset(*byte_offset_object);
+ i::Handle<i::Object> byte_length_object = isolate->factory()->NewNumber(
+ static_cast<double>(byte_length));
+ obj->set_byte_length(*byte_length_object);
+ i::Handle<i::ExternalArray> elements =
Dmitry Lomov (no reviews) 2013/06/03 13:09:04 DataView is not a external array, so everything he
bnoordhuis 2013/06/03 13:48:12 Sorry, that's a left-over from my initial attempt.
+ isolate->factory()->NewExternalArray(
+ static_cast<int>(byte_length),
+ kExternalUnsignedByteArray,
+ static_cast<uint8_t*>(buffer->backing_store()) + byte_offset);
+ i::Handle<i::Map> map =
+ isolate->factory()->GetElementsTransitionMap(
+ obj, i::EXTERNAL_UNSIGNED_BYTE_ELEMENTS);
+ obj->set_map(*map);
+ obj->set_elements(*elements);
+ return Utils::ToLocal(obj);
+}
+
+
+Local<ArrayBuffer> v8::DataView::Buffer() {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::Buffer()"))
+ return Local<ArrayBuffer>();
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ ASSERT(obj->buffer()->IsJSArrayBuffer());
+ i::Handle<i::JSArrayBuffer> buffer(i::JSArrayBuffer::cast(obj->buffer()));
+ return Utils::ToLocal(buffer);
+}
+
+
+size_t v8::DataView::ByteOffset() const {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::ByteOffset()")) return 0;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ return static_cast<size_t>(obj->byte_offset()->Number());
+}
+
+
+size_t v8::DataView::ByteLength() const {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::ByteLength()")) return 0;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ return static_cast<size_t>(obj->byte_length()->Number());
+}
+
+
+void* v8::DataView::Data() const {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::BaseAddress()")) return NULL;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ i::Handle<i::JSArrayBuffer> buffer(i::JSArrayBuffer::cast(obj->buffer()));
+ void* buffer_data = buffer->backing_store();
+ size_t byte_offset = static_cast<size_t>(obj->byte_offset()->Number());
+ return static_cast<uint8_t*>(buffer_data) + byte_offset;
+}
+
+
+int8_t v8::DataView::GetInt8(size_t byte_offset) const {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::GetInt8")) return 0;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ return obj->Get<int8_t>(byte_offset);
+}
+
+
+uint8_t v8::DataView::GetUint8(size_t byte_offset) const {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::GetUint8")) return 0;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ return obj->Get<uint8_t>(byte_offset);
+}
+
+
+int16_t v8::DataView::GetInt16(size_t byte_offset, bool little_endian) const {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::GetInt16")) return 0;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ return obj->Get<int16_t>(byte_offset, little_endian);
+}
+
+
+uint16_t v8::DataView::GetUint16(size_t byte_offset, bool little_endian) const {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::GetUint16")) return 0;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ return obj->Get<uint16_t>(byte_offset, little_endian);
+}
+
+
+int32_t v8::DataView::GetInt32(size_t byte_offset, bool little_endian) const {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::GetInt32")) return 0;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ return obj->Get<int32_t>(byte_offset, little_endian);
+}
+
+
+uint32_t v8::DataView::GetUint32(size_t byte_offset, bool little_endian) const {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::GetUint32")) return 0;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ return obj->Get<uint32_t>(byte_offset, little_endian);
+}
+
+
+float v8::DataView::GetFloat32(size_t byte_offset, bool little_endian) const {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::GetFloat32")) return 0;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ return obj->Get<float>(byte_offset, little_endian);
+}
+
+
+double v8::DataView::GetFloat64(size_t byte_offset, bool little_endian) const {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::GetFloat64")) return 0;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ return obj->Get<double>(byte_offset, little_endian);
+}
+
+
+void v8::DataView::SetInt8(size_t byte_offset, int8_t value) {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::SetInt8")) return;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ obj->Set(byte_offset, value);
+}
+
+
+void v8::DataView::SetUint8(size_t byte_offset, uint8_t value) {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::SetUint8")) return;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ obj->Set(byte_offset, value);
+}
+
+
+void v8::DataView::SetInt16(size_t byte_offset,
+ int16_t value,
+ bool little_endian) {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::SetInt16")) return;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ obj->Set(byte_offset, value, little_endian);
+}
+
+
+void v8::DataView::SetUint16(size_t byte_offset,
+ uint16_t value,
+ bool little_endian) {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::SetUint16")) return;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ obj->Set(byte_offset, value, little_endian);
+}
+
+
+void v8::DataView::SetInt32(size_t byte_offset,
+ int32_t value,
+ bool little_endian) {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::SetInt32")) return;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ obj->Set(byte_offset, value, little_endian);
+}
+
+
+void v8::DataView::SetUint32(size_t byte_offset,
+ uint32_t value,
+ bool little_endian) {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::SetUint32")) return;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ obj->Set(byte_offset, value, little_endian);
+}
+
+
+void v8::DataView::SetFloat32(size_t byte_offset,
+ float value,
+ bool little_endian) {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::SetFloat32")) return;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ obj->Set(byte_offset, value, little_endian);
+}
+
+
+void v8::DataView::SetFloat64(size_t byte_offset,
+ double value,
+ bool little_endian) {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ if (IsDeadCheck(isolate, "v8::DataView::SetFloat64")) return;
+ i::Handle<i::JSDataView> obj = Utils::OpenHandle(this);
+ obj->Set(byte_offset, value, little_endian);
+}
+
+
Local<ArrayBuffer> v8::TypedArray::Buffer() {
i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
if (IsDeadCheck(isolate, "v8::TypedArray::Buffer()"))
« no previous file with comments | « src/api.h ('k') | src/bootstrapper.cc » ('j') | src/dataview.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698