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

Unified Diff: third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.h

Issue 2494823002: V8ScriptValueSerializer: Use PartitionAlloc for the buffer, and avoid copying it into a String. (Closed)
Patch Set: mild streamlining Created 4 years, 1 month 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: third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.h
diff --git a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.h b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.h
index c5195878da23933cccdf4aef4282d0eb69b8c315..f4a4e18cd33061aab9d7f768e708b41753b58085 100644
--- a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.h
+++ b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.h
@@ -36,6 +36,7 @@
#include "core/CoreExport.h"
#include "wtf/HashMap.h"
#include "wtf/ThreadSafeRefCounted.h"
+#include "wtf/allocator/Partitions.h"
#include "wtf/typed_arrays/ArrayBufferContents.h"
#include <memory>
#include <v8.h>
@@ -92,7 +93,7 @@ class CORE_EXPORT SerializedScriptValue
static PassRefPtr<SerializedScriptValue> nullValue();
- String toWireString() const { return m_data; }
+ String toWireString() const;
void toWireBytes(Vector<char>&) const;
// Deserializes the value (in the current context). Returns a null value in
@@ -129,7 +130,27 @@ class CORE_EXPORT SerializedScriptValue
// The memory registration is revoked automatically in destructor.
void registerMemoryAllocatedWithCurrentScriptContext();
- String& data() { return m_data; }
+ // Provides access to the data and its attributes, regardless of whether the
+ // data was created as a string or as a vector.
+ // TODO(jbroman): Remove the 16-bit string representation, and simplify.
+ const uint8_t* data() {
+ if (!m_data.isNull()) {
+ m_data.ensure16Bit();
haraken 2016/11/11 03:50:01 Shall we rename m_data to m_dataString?
jbroman 2016/11/11 16:14:58 Done.
+ return reinterpret_cast<const uint8_t*>(m_data.characters16());
+ }
+ return m_dataBuffer.get();
+ }
+ size_t dataLengthInBytes() const {
+ if (!m_data.isNull())
+ return m_data.length() * 2;
+ return m_dataBufferSize;
+ }
+ bool dataHasOneRef() const {
+ if (!m_data.isNull())
+ return m_data.impl()->hasOneRef();
+ return true;
+ }
+
BlobDataHandleMap& blobDataHandles() { return m_blobDataHandles; }
ArrayBufferContentsArray* getArrayBufferContentsArray() {
return m_arrayBufferContentsArray.get();
@@ -142,12 +163,25 @@ class CORE_EXPORT SerializedScriptValue
friend class ScriptValueSerializer;
friend class V8ScriptValueSerializer;
- enum StringDataMode { StringValue, WireData };
+ struct BufferDeleter {
+ void operator()(uint8_t* buffer) { WTF::Partitions::bufferFree(buffer); }
+ };
+ using DataBufferPtr = std::unique_ptr<uint8_t[], BufferDeleter>;
SerializedScriptValue();
explicit SerializedScriptValue(const String& wireData);
- void setData(const String& data) { m_data = data; }
+ void setData(const String& data) {
+ m_data = data;
+ m_dataBuffer.reset();
+ m_dataBufferSize = 0;
+ }
+ void setData(DataBufferPtr data, size_t size) {
+ m_data = String();
+ m_dataBuffer = std::move(data);
+ m_dataBufferSize = size;
+ }
+
void transferArrayBuffers(v8::Isolate*,
const ArrayBufferArray&,
ExceptionState&);
@@ -158,7 +192,14 @@ class CORE_EXPORT SerializedScriptValue
const OffscreenCanvasArray&,
ExceptionState&);
+ // Either |m_data| is set (if the serialized data is stored in a WTF::String),
+ // or |m_dataBuffer| is (if it is stored in a raw buffer allocation). In the
haraken 2016/11/11 03:50:01 Can we add a DCHECK to verify that |m_data| and |m
jbroman 2016/11/11 16:14:58 I've added one to the data() getter; I'm not sure
+ // latter case, the size is stored separately, and will not necessarily be
+ // even in length.
haraken 2016/11/11 03:50:01 What do you mean by "will not necessarily be even
jbroman 2016/11/11 16:14:58 I mean that while the string version will always b
String m_data;
+ DataBufferPtr m_dataBuffer;
+ size_t m_dataBufferSize;
+
std::unique_ptr<ArrayBufferContentsArray> m_arrayBufferContentsArray;
std::unique_ptr<ImageBitmapContentsArray> m_imageBitmapContentsArray;
BlobDataHandleMap m_blobDataHandles;

Powered by Google App Engine
This is Rietveld 408576698