Index: Source/wtf/ArrayBuffer.cpp |
diff --git a/Source/wtf/ArrayBuffer.cpp b/Source/wtf/ArrayBuffer.cpp |
index cfbdc9de1418bca9204a2a7a94e37116d28251ac..a0b89d0a2abbf358cada1f847262a00e1016f48d 100644 |
--- a/Source/wtf/ArrayBuffer.cpp |
+++ b/Source/wtf/ArrayBuffer.cpp |
@@ -36,10 +36,17 @@ bool ArrayBuffer::transfer(ArrayBufferContents& result) |
RefPtr<ArrayBuffer> keepAlive(this); |
if (!m_contents.data()) { |
- result.clear(); |
+ result.neuter(); |
return false; |
} |
+ if (isShared()) { |
+ m_contents.transfer(result); |
+ // Return early to prevent neutering views when transferring |
+ // SharedArrayBuffers. |
+ return true; |
+ } |
+ |
bool allViewsAreNeuterable = true; |
for (ArrayBufferView* i = m_firstView; i; i = i->m_nextView) { |
if (!i->isNeuterable()) |
@@ -48,6 +55,7 @@ bool ArrayBuffer::transfer(ArrayBufferContents& result) |
if (allViewsAreNeuterable) { |
m_contents.transfer(result); |
+ m_contents.neuter(); |
} else { |
m_contents.copyTo(result); |
if (!result.data()) |