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

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp

Issue 1878463002: Move DOMArrayBuffer, DOMArrayBufferViews and DataView to the heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tidy Created 4 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "bindings/core/v8/ScriptValueSerializer.h" 5 #include "bindings/core/v8/ScriptValueSerializer.h"
6 6
7 #include "bindings/core/v8/V8ArrayBuffer.h" 7 #include "bindings/core/v8/V8ArrayBuffer.h"
8 #include "bindings/core/v8/V8ArrayBufferView.h" 8 #include "bindings/core/v8/V8ArrayBufferView.h"
9 #include "bindings/core/v8/V8Blob.h" 9 #include "bindings/core/v8/V8Blob.h"
10 #include "bindings/core/v8/V8CompositorProxy.h" 10 #include "bindings/core/v8/V8CompositorProxy.h"
(...skipping 1639 matching lines...) Expand 10 before | Expand all | Expand 10 after
1650 if (!doReadUint64(&element)) 1650 if (!doReadUint64(&element))
1651 return false; 1651 return false;
1652 if (!doReadUint32(&attributes)) 1652 if (!doReadUint32(&attributes))
1653 return false; 1653 return false;
1654 1654
1655 CompositorProxy* compositorProxy = CompositorProxy::create(element, attribut es); 1655 CompositorProxy* compositorProxy = CompositorProxy::create(element, attribut es);
1656 *value = toV8(compositorProxy, m_scriptState->context()->Global(), isolate() ); 1656 *value = toV8(compositorProxy, m_scriptState->context()->Global(), isolate() );
1657 return !value->IsEmpty(); 1657 return !value->IsEmpty();
1658 } 1658 }
1659 1659
1660 PassRefPtr<DOMArrayBuffer> SerializedScriptValueReader::doReadArrayBuffer() 1660 DOMArrayBuffer* SerializedScriptValueReader::doReadArrayBuffer()
1661 { 1661 {
1662 uint32_t byteLength; 1662 uint32_t byteLength;
1663 if (!doReadUint32(&byteLength)) 1663 if (!doReadUint32(&byteLength))
1664 return nullptr; 1664 return nullptr;
1665 if (m_position + byteLength > m_length) 1665 if (m_position + byteLength > m_length)
1666 return nullptr; 1666 return nullptr;
1667 const void* bufferStart = m_buffer + m_position; 1667 const void* bufferStart = m_buffer + m_position;
1668 m_position += byteLength; 1668 m_position += byteLength;
1669 return DOMArrayBuffer::create(bufferStart, byteLength); 1669 return DOMArrayBuffer::create(bufferStart, byteLength);
1670 } 1670 }
1671 1671
1672 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) 1672 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value)
1673 { 1673 {
1674 RefPtr<DOMArrayBuffer> arrayBuffer = doReadArrayBuffer(); 1674 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer();
1675 if (!arrayBuffer) 1675 if (!arrayBuffer)
1676 return false; 1676 return false;
1677 *value = toV8(arrayBuffer.release(), m_scriptState->context()->Global(), iso late()); 1677 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate());
1678 return !value->IsEmpty(); 1678 return !value->IsEmpty();
1679 } 1679 }
1680 1680
1681 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu e, ScriptValueCompositeCreator& creator) 1681 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu e, ScriptValueCompositeCreator& creator)
1682 { 1682 {
1683 ArrayBufferViewSubTag subTag; 1683 ArrayBufferViewSubTag subTag;
1684 uint32_t byteOffset; 1684 uint32_t byteOffset;
1685 uint32_t byteLength; 1685 uint32_t byteLength;
1686 RefPtr<DOMArrayBufferBase> arrayBuffer; 1686 DOMArrayBufferBase* arrayBuffer = nullptr;
1687 v8::Local<v8::Value> arrayBufferV8Value; 1687 v8::Local<v8::Value> arrayBufferV8Value;
1688 if (!readArrayBufferViewSubTag(&subTag)) 1688 if (!readArrayBufferViewSubTag(&subTag))
1689 return false; 1689 return false;
1690 if (!doReadUint32(&byteOffset)) 1690 if (!doReadUint32(&byteOffset))
1691 return false; 1691 return false;
1692 if (!doReadUint32(&byteLength)) 1692 if (!doReadUint32(&byteLength))
1693 return false; 1693 return false;
1694 if (!creator.consumeTopOfStack(&arrayBufferV8Value)) 1694 if (!creator.consumeTopOfStack(&arrayBufferV8Value))
1695 return false; 1695 return false;
1696 if (arrayBufferV8Value.IsEmpty()) 1696 if (arrayBufferV8Value.IsEmpty())
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1746 const unsigned numElements = byteLength / elementByteSize; 1746 const unsigned numElements = byteLength / elementByteSize;
1747 const unsigned remainingElements = (arrayBuffer->byteLength() - byteOffset) / elementByteSize; 1747 const unsigned remainingElements = (arrayBuffer->byteLength() - byteOffset) / elementByteSize;
1748 if (byteOffset % elementByteSize 1748 if (byteOffset % elementByteSize
1749 || byteOffset > arrayBuffer->byteLength() 1749 || byteOffset > arrayBuffer->byteLength()
1750 || numElements > remainingElements) 1750 || numElements > remainingElements)
1751 return false; 1751 return false;
1752 1752
1753 v8::Local<v8::Object> creationContext = m_scriptState->context()->Global(); 1753 v8::Local<v8::Object> creationContext = m_scriptState->context()->Global();
1754 switch (subTag) { 1754 switch (subTag) {
1755 case ByteArrayTag: 1755 case ByteArrayTag:
1756 *value = toV8(DOMInt8Array::create(arrayBuffer.release(), byteOffset, nu mElements), creationContext, isolate()); 1756 *value = toV8(DOMInt8Array::create(arrayBuffer, byteOffset, numElements) , creationContext, isolate());
1757 break; 1757 break;
1758 case UnsignedByteArrayTag: 1758 case UnsignedByteArrayTag:
1759 *value = toV8(DOMUint8Array::create(arrayBuffer.release(), byteOffset, n umElements), creationContext, isolate()); 1759 *value = toV8(DOMUint8Array::create(arrayBuffer, byteOffset, numElements ), creationContext, isolate());
1760 break; 1760 break;
1761 case UnsignedByteClampedArrayTag: 1761 case UnsignedByteClampedArrayTag:
1762 *value = toV8(DOMUint8ClampedArray::create(arrayBuffer.release(), byteOf fset, numElements), creationContext, isolate()); 1762 *value = toV8(DOMUint8ClampedArray::create(arrayBuffer, byteOffset, numE lements), creationContext, isolate());
1763 break; 1763 break;
1764 case ShortArrayTag: 1764 case ShortArrayTag:
1765 *value = toV8(DOMInt16Array::create(arrayBuffer.release(), byteOffset, n umElements), creationContext, isolate()); 1765 *value = toV8(DOMInt16Array::create(arrayBuffer, byteOffset, numElements ), creationContext, isolate());
1766 break; 1766 break;
1767 case UnsignedShortArrayTag: 1767 case UnsignedShortArrayTag:
1768 *value = toV8(DOMUint16Array::create(arrayBuffer.release(), byteOffset, numElements), creationContext, isolate()); 1768 *value = toV8(DOMUint16Array::create(arrayBuffer, byteOffset, numElement s), creationContext, isolate());
1769 break; 1769 break;
1770 case IntArrayTag: 1770 case IntArrayTag:
1771 *value = toV8(DOMInt32Array::create(arrayBuffer.release(), byteOffset, n umElements), creationContext, isolate()); 1771 *value = toV8(DOMInt32Array::create(arrayBuffer, byteOffset, numElements ), creationContext, isolate());
1772 break; 1772 break;
1773 case UnsignedIntArrayTag: 1773 case UnsignedIntArrayTag:
1774 *value = toV8(DOMUint32Array::create(arrayBuffer.release(), byteOffset, numElements), creationContext, isolate()); 1774 *value = toV8(DOMUint32Array::create(arrayBuffer, byteOffset, numElement s), creationContext, isolate());
1775 break; 1775 break;
1776 case FloatArrayTag: 1776 case FloatArrayTag:
1777 *value = toV8(DOMFloat32Array::create(arrayBuffer.release(), byteOffset, numElements), creationContext, isolate()); 1777 *value = toV8(DOMFloat32Array::create(arrayBuffer, byteOffset, numElemen ts), creationContext, isolate());
1778 break; 1778 break;
1779 case DoubleArrayTag: 1779 case DoubleArrayTag:
1780 *value = toV8(DOMFloat64Array::create(arrayBuffer.release(), byteOffset, numElements), creationContext, isolate()); 1780 *value = toV8(DOMFloat64Array::create(arrayBuffer, byteOffset, numElemen ts), creationContext, isolate());
1781 break; 1781 break;
1782 case DataViewTag: 1782 case DataViewTag:
1783 *value = toV8(DOMDataView::create(arrayBuffer.release(), byteOffset, byt eLength), creationContext, isolate()); 1783 *value = toV8(DOMDataView::create(arrayBuffer, byteOffset, byteLength), creationContext, isolate());
1784 break; 1784 break;
1785 } 1785 }
1786 return !value->IsEmpty(); 1786 return !value->IsEmpty();
1787 } 1787 }
1788 1788
1789 bool SerializedScriptValueReader::readRegExp(v8::Local<v8::Value>* value) 1789 bool SerializedScriptValueReader::readRegExp(v8::Local<v8::Value>* value)
1790 { 1790 {
1791 v8::Local<v8::Value> pattern; 1791 v8::Local<v8::Value> pattern;
1792 if (!readString(&pattern)) 1792 if (!readString(&pattern))
1793 return false; 1793 return false;
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
2147 } 2147 }
2148 2148
2149 bool ScriptValueDeserializer::tryGetTransferredArrayBuffer(uint32_t index, v8::L ocal<v8::Value>* object) 2149 bool ScriptValueDeserializer::tryGetTransferredArrayBuffer(uint32_t index, v8::L ocal<v8::Value>* object)
2150 { 2150 {
2151 if (!m_arrayBufferContents) 2151 if (!m_arrayBufferContents)
2152 return false; 2152 return false;
2153 if (index >= m_arrayBuffers.size()) 2153 if (index >= m_arrayBuffers.size())
2154 return false; 2154 return false;
2155 v8::Local<v8::Value> result = m_arrayBuffers.at(index); 2155 v8::Local<v8::Value> result = m_arrayBuffers.at(index);
2156 if (result.IsEmpty()) { 2156 if (result.IsEmpty()) {
2157 RefPtr<DOMArrayBuffer> buffer = DOMArrayBuffer::create(m_arrayBufferCont ents->at(index)); 2157 DOMArrayBuffer* buffer = DOMArrayBuffer::create(m_arrayBufferContents->a t(index));
2158 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); 2158 v8::Isolate* isolate = m_reader.getScriptState()->isolate();
2159 v8::Local<v8::Object> creationContext = m_reader.getScriptState()->conte xt()->Global(); 2159 v8::Local<v8::Object> creationContext = m_reader.getScriptState()->conte xt()->Global();
2160 result = toV8(buffer.get(), creationContext, isolate); 2160 result = toV8(buffer, creationContext, isolate);
2161 if (result.IsEmpty()) 2161 if (result.IsEmpty())
2162 return false; 2162 return false;
2163 m_arrayBuffers[index] = result; 2163 m_arrayBuffers[index] = result;
2164 } 2164 }
2165 *object = result; 2165 *object = result;
2166 return true; 2166 return true;
2167 } 2167 }
2168 2168
2169 bool ScriptValueDeserializer::tryGetTransferredImageBitmap(uint32_t index, v8::L ocal<v8::Value>* object) 2169 bool ScriptValueDeserializer::tryGetTransferredImageBitmap(uint32_t index, v8::L ocal<v8::Value>* object)
2170 { 2170 {
(...skipping 17 matching lines...) Expand all
2188 2188
2189 bool ScriptValueDeserializer::tryGetTransferredSharedArrayBuffer(uint32_t index, v8::Local<v8::Value>* object) 2189 bool ScriptValueDeserializer::tryGetTransferredSharedArrayBuffer(uint32_t index, v8::Local<v8::Value>* object)
2190 { 2190 {
2191 ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled()); 2191 ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled());
2192 if (!m_arrayBufferContents) 2192 if (!m_arrayBufferContents)
2193 return false; 2193 return false;
2194 if (index >= m_arrayBuffers.size()) 2194 if (index >= m_arrayBuffers.size())
2195 return false; 2195 return false;
2196 v8::Local<v8::Value> result = m_arrayBuffers.at(index); 2196 v8::Local<v8::Value> result = m_arrayBuffers.at(index);
2197 if (result.IsEmpty()) { 2197 if (result.IsEmpty()) {
2198 RefPtr<DOMSharedArrayBuffer> buffer = DOMSharedArrayBuffer::create(m_arr ayBufferContents->at(index)); 2198 DOMSharedArrayBuffer* buffer = DOMSharedArrayBuffer::create(m_arrayBuffe rContents->at(index));
2199 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); 2199 v8::Isolate* isolate = m_reader.getScriptState()->isolate();
2200 v8::Local<v8::Object> creationContext = m_reader.getScriptState()->conte xt()->Global(); 2200 v8::Local<v8::Object> creationContext = m_reader.getScriptState()->conte xt()->Global();
2201 result = toV8(buffer.get(), creationContext, isolate); 2201 result = toV8(buffer, creationContext, isolate);
2202 if (result.IsEmpty()) 2202 if (result.IsEmpty())
2203 return false; 2203 return false;
2204 m_arrayBuffers[index] = result; 2204 m_arrayBuffers[index] = result;
2205 } 2205 }
2206 *object = result; 2206 *object = result;
2207 return true; 2207 return true;
2208 } 2208 }
2209 2209
2210 bool ScriptValueDeserializer::tryGetObjectFromObjectReference(uint32_t reference , v8::Local<v8::Value>* object) 2210 bool ScriptValueDeserializer::tryGetObjectFromObjectReference(uint32_t reference , v8::Local<v8::Value>* object)
2211 { 2211 {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2278 return false; 2278 return false;
2279 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe renceStack.size() - 1]; 2279 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe renceStack.size() - 1];
2280 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() - 1); 2280 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() - 1);
2281 if (objectReference >= m_objectPool.size()) 2281 if (objectReference >= m_objectPool.size())
2282 return false; 2282 return false;
2283 *object = m_objectPool[objectReference]; 2283 *object = m_objectPool[objectReference];
2284 return true; 2284 return true;
2285 } 2285 }
2286 2286
2287 } // namespace blink 2287 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698