Index: third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
diff --git a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
index 06c7575aa6c00319bba040d5281568a38eba5b7a..c4722603c0ad7fbdd5077dab72dddd4f61193eee 100644 |
--- a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
+++ b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
@@ -114,7 +114,7 @@ SerializedScriptValue::SerializedScriptValue() |
: m_externallyAllocatedMemory(0) {} |
SerializedScriptValue::SerializedScriptValue(const String& wireData) |
- : m_data(wireData.isolatedCopy()), m_externallyAllocatedMemory(0) {} |
+ : m_dataString(wireData.isolatedCopy()), m_externallyAllocatedMemory(0) {} |
SerializedScriptValue::~SerializedScriptValue() { |
// If the allocated memory was not registered before, then this class is |
@@ -131,19 +131,53 @@ PassRefPtr<SerializedScriptValue> SerializedScriptValue::nullValue() { |
return create(ScriptValueSerializer::serializeNullValue()); |
} |
+String SerializedScriptValue::toWireString() const { |
+ if (!m_dataString.isNull()) |
+ return m_dataString; |
+ |
+ // Add the padding '\0', but don't put it in |m_dataBuffer|. |
+ // This requires direct use of uninitialized strings, though. |
+ UChar* destination; |
+ size_t stringSizeBytes = (m_dataBufferSize + 1) & ~1; |
+ String wireString = |
+ String::createUninitialized(stringSizeBytes / 2, destination); |
+ memcpy(destination, m_dataBuffer.get(), m_dataBufferSize); |
+ if (stringSizeBytes > m_dataBufferSize) |
+ reinterpret_cast<char*>(destination)[stringSizeBytes - 1] = '\0'; |
+ return wireString; |
+} |
+ |
// Convert serialized string to big endian wire data. |
void SerializedScriptValue::toWireBytes(Vector<char>& result) const { |
- ASSERT(result.isEmpty()); |
- size_t length = m_data.length(); |
+ DCHECK(result.isEmpty()); |
+ |
+ if (m_dataString.isNull()) { |
+ size_t wireSizeBytes = (m_dataBufferSize + 1) & ~1; |
+ result.resize(wireSizeBytes); |
+ |
+ const UChar* src = reinterpret_cast<UChar*>(m_dataBuffer.get()); |
+ UChar* dst = reinterpret_cast<UChar*>(result.data()); |
+ for (size_t i = 0; i < m_dataBufferSize / 2; i++) |
+ dst[i] = htons(src[i]); |
+ |
+ // This is equivalent to swapping the byte order of the two bytes (x, 0), |
+ // depending on endianness. |
+ if (m_dataBufferSize % 1) |
+ dst[wireSizeBytes / 2 - 1] = m_dataBuffer[m_dataBufferSize - 1] << 8; |
+ |
+ return; |
+ } |
+ |
+ size_t length = m_dataString.length(); |
result.resize(length * sizeof(UChar)); |
UChar* dst = reinterpret_cast<UChar*>(result.data()); |
- if (m_data.is8Bit()) { |
- const LChar* src = m_data.characters8(); |
+ if (m_dataString.is8Bit()) { |
+ const LChar* src = m_dataString.characters8(); |
for (size_t i = 0; i < length; i++) |
dst[i] = htons(static_cast<UChar>(src[i])); |
} else { |
- const UChar* src = m_data.characters16(); |
+ const UChar* src = m_dataString.characters16(); |
for (size_t i = 0; i < length; i++) |
dst[i] = htons(src[i]); |
} |
@@ -417,7 +451,8 @@ SerializedScriptValue::transferArrayBufferContents( |
void SerializedScriptValue::registerMemoryAllocatedWithCurrentScriptContext() { |
if (m_externallyAllocatedMemory) |
return; |
- m_externallyAllocatedMemory = static_cast<intptr_t>(m_data.length()); |
+ |
+ m_externallyAllocatedMemory = static_cast<intptr_t>(dataLengthInBytes()); |
v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory( |
m_externallyAllocatedMemory); |
} |