Chromium Code Reviews| Index: src/api.cc |
| diff --git a/src/api.cc b/src/api.cc |
| index 4b5c5a9949779ee17770adbb8c8998ffcae13b8d..770e377b285c3b6efebb455d4ff86c77bc58ab84 100644 |
| --- a/src/api.cc |
| +++ b/src/api.cc |
| @@ -2594,6 +2594,11 @@ bool Value::IsArrayBuffer() const { |
| } |
| +bool Value::IsArrayBufferView() const { |
| + return Utils::OpenHandle(this)->IsJSArrayBufferView(); |
| +} |
| + |
| + |
| bool Value::IsTypedArray() const { |
| if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsArrayBuffer()")) |
| return false; |
| @@ -2627,6 +2632,11 @@ TYPED_ARRAY_LIST(VALUE_IS_TYPED_ARRAY) |
| #undef VALUE_IS_TYPED_ARRAY |
| +bool Value::IsDataView() const { |
| + return Utils::OpenHandle(this)->IsJSDataView(); |
| +} |
| + |
| + |
| bool Value::IsObject() const { |
| if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsObject()")) return false; |
| return Utils::OpenHandle(this)->IsJSObject(); |
| @@ -2973,6 +2983,14 @@ void v8::ArrayBuffer::CheckCast(Value* that) { |
| } |
| +void v8::ArrayBufferView::CheckCast(Value* that) { |
| + i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| + ApiCheck(obj->IsJSArrayBufferView(), |
| + "v8::ArrayBufferView::Cast()", |
| + "Could not convert to ArrayBufferView"); |
| +} |
| + |
| + |
| void v8::TypedArray::CheckCast(Value* that) { |
| if (IsDeadCheck(i::Isolate::Current(), "v8::TypedArray::Cast()")) return; |
| i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| @@ -2999,6 +3017,14 @@ TYPED_ARRAY_LIST(CHECK_TYPED_ARRAY_CAST) |
| #undef CHECK_TYPED_ARRAY_CAST |
| +void v8::DataView::CheckCast(Value* that) { |
| + i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| + ApiCheck(obj->IsJSDataView(), |
| + "v8::DataView::Cast()", |
| + "Could not convert to DataView"); |
| +} |
| + |
| + |
| void v8::Date::CheckCast(v8::Value* that) { |
| i::Isolate* isolate = i::Isolate::Current(); |
| if (IsDeadCheck(isolate, "v8::Date::Cast()")) return; |
| @@ -6230,33 +6256,35 @@ Local<ArrayBuffer> v8::ArrayBuffer::New(void* data, size_t byte_length) { |
| } |
| -Local<ArrayBuffer> v8::TypedArray::Buffer() { |
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| - if (IsDeadCheck(isolate, "v8::TypedArray::Buffer()")) |
| - return Local<ArrayBuffer>(); |
| - i::Handle<i::JSTypedArray> obj = Utils::OpenHandle(this); |
| +Local<ArrayBuffer> v8::ArrayBufferView::Buffer() { |
| + i::Handle<i::JSArrayBufferView> 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::TypedArray::ByteOffset() { |
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| - if (IsDeadCheck(isolate, "v8::TypedArray::ByteOffset()")) return 0; |
| - i::Handle<i::JSTypedArray> obj = Utils::OpenHandle(this); |
| +size_t v8::ArrayBufferView::ByteOffset() { |
| + i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); |
| return static_cast<size_t>(obj->byte_offset()->Number()); |
| } |
| -size_t v8::TypedArray::ByteLength() { |
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| - if (IsDeadCheck(isolate, "v8::TypedArray::ByteLength()")) return 0; |
| - i::Handle<i::JSTypedArray> obj = Utils::OpenHandle(this); |
| +size_t v8::ArrayBufferView::ByteLength() { |
| + i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); |
| return static_cast<size_t>(obj->byte_length()->Number()); |
| } |
| +void* v8::ArrayBufferView::BaseAddress() { |
| + i::Handle<i::JSArrayBufferView> 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; |
| +} |
| + |
| + |
| size_t v8::TypedArray::Length() { |
| i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| if (IsDeadCheck(isolate, "v8::TypedArray::Length()")) return 0; |
| @@ -6265,16 +6293,28 @@ size_t v8::TypedArray::Length() { |
| } |
| -void* v8::TypedArray::BaseAddress() { |
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| - if (IsDeadCheck(isolate, "v8::TypedArray::BaseAddress()")) return NULL; |
| - i::Handle<i::JSTypedArray> 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; |
| -} |
| +static inline void SetupArrayBufferView( |
| + i::Isolate* isolate, |
| + i::Handle<i::JSArrayBufferView> obj, |
| + i::Handle<i::JSArrayBuffer> buffer, |
| + size_t byte_offset, |
| + size_t byte_length) { |
| + ASSERT(byte_offset + byte_length <= |
| + static_cast<size_t>(buffer->byte_length()->Number())); |
| + |
| + obj->set_buffer(*buffer); |
| + obj->set_weak_next(buffer->weak_first_view()); |
| + buffer->set_weak_first_view(*obj); |
| + |
| + i::Handle<i::Object> byte_offset_object = |
| + isolate->factory()->NewNumberFromSize(byte_offset); |
| + obj->set_byte_offset(*byte_offset_object); |
| + |
| + i::Handle<i::Object> byte_length_object = |
| + isolate->factory()->NewNumberFromSize(byte_length); |
| + obj->set_byte_length(*byte_length_object); |
| +} |
| template<typename ElementType, |
| ExternalArrayType array_type, |
| @@ -6287,24 +6327,12 @@ i::Handle<i::JSTypedArray> NewTypedArray( |
| i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); |
| ASSERT(byte_offset % sizeof(ElementType) == 0); |
| - ASSERT(byte_offset + length * sizeof(ElementType) <= |
| - static_cast<size_t>(buffer->byte_length()->Number())); |
| - |
| - obj->set_buffer(*buffer); |
| - |
| - obj->set_weak_next(buffer->weak_first_view()); |
| - buffer->set_weak_first_view(*obj); |
| - i::Handle<i::Object> byte_offset_object = isolate->factory()->NewNumber( |
| - static_cast<double>(byte_offset)); |
| - obj->set_byte_offset(*byte_offset_object); |
| + SetupArrayBufferView( |
| + isolate, obj, buffer, byte_offset, length * sizeof(ElementType)); |
| - i::Handle<i::Object> byte_length_object = isolate->factory()->NewNumber( |
| - static_cast<double>(length * sizeof(ElementType))); |
| - obj->set_byte_length(*byte_length_object); |
| - |
| - i::Handle<i::Object> length_object = isolate->factory()->NewNumber( |
| - static_cast<double>(length)); |
| + i::Handle<i::Object> length_object = |
| + isolate->factory()->NewNumberFromSize(length); |
| obj->set_length(*length_object); |
| i::Handle<i::ExternalArray> elements = |
| @@ -6353,6 +6381,20 @@ TYPED_ARRAY_NEW(Float64Array, double, kExternalDoubleArray, |
| #undef TYPED_ARRAY_NEW |
| +Local<DataView> DataView::New(Handle<ArrayBuffer> array_buffer, |
| + size_t byte_offset, size_t byte_length) { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + EnsureInitializedForIsolate( |
| + isolate, "v8::DataView::New(void*, size_t, size_t)"); |
| + LOG_API(isolate, "v8::DataView::New(void*, size_t. size_t)"); |
|
Sven Panne
2013/06/24 08:17:54
Nit: comma instead of dot in the message?
|
| + ENTER_V8(isolate); |
| + i::Handle<i::JSDataView> obj = isolate->factory()->NewJSDataView(); |
| + i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); |
| + SetupArrayBufferView( |
| + isolate, obj, buffer, byte_offset, byte_length); |
| + return Utils::ToLocal(obj); |
| +} |
| + |
| Local<Symbol> v8::Symbol::New(Isolate* isolate) { |
| i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |