Index: Source/bindings/core/dart/V8Converter.cpp |
diff --git a/Source/bindings/core/dart/V8Converter.cpp b/Source/bindings/core/dart/V8Converter.cpp |
index 2200818f5c2df1a4bcfa81b3279b17e9d4bfa88c..d51ac57880bfc01be1a7712469bfcc821b746b16 100644 |
--- a/Source/bindings/core/dart/V8Converter.cpp |
+++ b/Source/bindings/core/dart/V8Converter.cpp |
@@ -513,7 +513,10 @@ Dart_Handle V8Converter::mapToDart(v8::Handle<v8::Object> object, V8ToDartMap& m |
v8::Handle<v8::Value> V8Converter::arrayBufferToV8(Dart_Handle value, Dart_Handle& exception) |
{ |
ScriptState* state = DartUtilities::v8ScriptStateForCurrentIsolate(); |
- return blink::toV8(DartUtilities::dartToExternalizedArrayBuffer(value, exception).get(), state->context()->Global(), state->isolate()); |
+ RefPtr<DOMArrayBuffer> arrayBuffer = DOMArrayBuffer::create(DartUtilities::dartToExternalizedArrayBuffer(value, exception)); |
+ v8::Handle<v8::Object> global = state->context()->Global(); |
+ v8::Isolate* v8Isolate = state->isolate(); |
+ return blink::toV8(arrayBuffer.get(), global, v8Isolate); |
} |
Dart_Handle V8Converter::arrayBufferToDart(v8::Handle<v8::Object> object, Dart_Handle& exception) |
@@ -525,31 +528,71 @@ v8::Handle<v8::Value> V8Converter::arrayBufferViewToV8(Dart_Handle value, Dart_H |
{ |
RefPtr<ArrayBufferView> view = DartUtilities::dartToExternalizedArrayBufferView(value, exception); |
ScriptState* state = DartUtilities::v8ScriptStateForCurrentIsolate(); |
+ unsigned byteOffset = view->byteOffset(); |
+ // this is copied from ScriptValueSerializer. |
+ int elementByteSize = 1; |
+ ArrayBuffer* data = view->buffer().get(); |
switch (view->type()) { |
case ArrayBufferView::TypeInt8: |
- return blink::toV8(static_cast<Int8Array*>(view.get()), state->context()->Global(), state->isolate()); |
+ elementByteSize = sizeof(DOMInt8Array::ValueType); |
+ break; |
case ArrayBufferView::TypeUint8: |
- return blink::toV8(static_cast<Uint8Array*>(view.get()), state->context()->Global(), state->isolate()); |
+ elementByteSize = sizeof(DOMUint8Array::ValueType); |
+ break; |
case ArrayBufferView::TypeUint8Clamped: |
- return blink::toV8(static_cast<Uint8ClampedArray*>(view.get()), state->context()->Global(), state->isolate()); |
+ elementByteSize = sizeof(DOMUint8ClampedArray::ValueType); |
+ break; |
case ArrayBufferView::TypeInt16: |
- return blink::toV8(static_cast<Int16Array*>(view.get()), state->context()->Global(), state->isolate()); |
+ elementByteSize = sizeof(DOMInt16Array::ValueType); |
+ break; |
case ArrayBufferView::TypeUint16: |
- return blink::toV8(static_cast<Uint16Array*>(view.get()), state->context()->Global(), state->isolate()); |
+ elementByteSize = sizeof(DOMUint16Array::ValueType); |
+ break; |
case ArrayBufferView::TypeInt32: |
- return blink::toV8(static_cast<Int32Array*>(view.get()), state->context()->Global(), state->isolate()); |
+ elementByteSize = sizeof(DOMInt32Array::ValueType); |
+ break; |
case ArrayBufferView::TypeUint32: |
- return blink::toV8(static_cast<Uint32Array*>(view.get()), state->context()->Global(), state->isolate()); |
+ elementByteSize = sizeof(DOMUint32Array::ValueType); |
+ break; |
case ArrayBufferView::TypeFloat32: |
- return blink::toV8(static_cast<Float32Array*>(view.get()), state->context()->Global(), state->isolate()); |
+ elementByteSize = sizeof(DOMFloat32Array::ValueType); |
+ break; |
case ArrayBufferView::TypeFloat64: |
- return blink::toV8(static_cast<Float64Array*>(view.get()), state->context()->Global(), state->isolate()); |
+ elementByteSize = sizeof(DOMFloat64Array::ValueType); |
+ break; |
+ case ArrayBufferView::TypeDataView: |
+ elementByteSize = sizeof(DOMDataView::ValueType); |
+ break; |
+ default: |
+ ASSERT_NOT_REACHED(); |
+ } |
+ unsigned numElements = view->byteLength() / elementByteSize; |
+ |
+ switch (view->type()) { |
+ case ArrayBufferView::TypeInt8: |
+ return blink::toV8(DOMInt8Array::create(data, byteOffset, numElements), state->context()->Global(), state->isolate()); |
+ case ArrayBufferView::TypeUint8: |
+ return blink::toV8(DOMUint8Array::create(data, byteOffset, numElements), state->context()->Global(), state->isolate()); |
+ case ArrayBufferView::TypeUint8Clamped: |
+ return blink::toV8(DOMUint8ClampedArray::create(data, byteOffset, numElements), state->context()->Global(), state->isolate()); |
+ case ArrayBufferView::TypeInt16: |
+ return blink::toV8(DOMInt16Array::create(data, byteOffset, numElements), state->context()->Global(), state->isolate()); |
+ case ArrayBufferView::TypeUint16: |
+ return blink::toV8(DOMUint16Array::create(data, byteOffset, numElements), state->context()->Global(), state->isolate()); |
+ case ArrayBufferView::TypeInt32: |
+ return blink::toV8(DOMInt32Array::create(data, byteOffset, numElements), state->context()->Global(), state->isolate()); |
+ case ArrayBufferView::TypeUint32: |
+ return blink::toV8(DOMUint32Array::create(data, byteOffset, numElements), state->context()->Global(), state->isolate()); |
+ case ArrayBufferView::TypeFloat32: |
+ return blink::toV8(DOMFloat32Array::create(data, byteOffset, numElements), state->context()->Global(), state->isolate()); |
+ case ArrayBufferView::TypeFloat64: |
+ return blink::toV8(DOMFloat64Array::create(data, byteOffset, numElements), state->context()->Global(), state->isolate()); |
case ArrayBufferView::TypeDataView: |
{ |
+ RefPtr<DOMArrayBufferView> domArrayBuffView = adoptRef(new DOMArrayBufferView(view.get())); |
// TODO(terry): Had to move protected constructor to public in |
// core/dom/DOMArrayBufferView.h |
- RefPtr<DOMArrayBufferView> domArrayBuffView = new DOMArrayBufferView(view.get()); |
return blink::toV8(DOMDataView::create(domArrayBuffView->bufferBase(), |
domArrayBuffView->byteOffset(), |
domArrayBuffView->byteLength()), |