bool ArrayBuffer::transfer(ArrayBufferContents& result, Vector<RefPtr<ArrayBufferView> >& neuteredViews) { RefPtr<ArrayBuffer> keepAlive(this); if (!m_contents.m_data) { result.m_data = 0; return false; } bool allViewsAreNeuterable = true; for (ArrayBufferView* i = m_firstView; i; i = i->m_nextView) { if (!i->isNeuterable()) allViewsAreNeuterable = false; } if (allViewsAreNeuterable) m_contents.transfer(result); else { m_contents.copyTo(result); if (!result.m_data) return false; } while (m_firstView) { ArrayBufferView* current = m_firstView; removeView(current); if (allViewsAreNeuterable || current->isNeuterable()) current->neuter(); neuteredViews.append(current); } return true; }
bool ArrayBuffer::transfer(ArrayBufferContents& result) { ASSERT(!isShared()); RefPtr<ArrayBuffer> keepAlive(this); if (!m_contents.data()) { result.neuter(); return false; } bool allViewsAreNeuterable = true; for (ArrayBufferView* i = m_firstView; i; i = i->m_nextView) { if (!i->isNeuterable()) allViewsAreNeuterable = false; } if (allViewsAreNeuterable) { m_contents.transfer(result); } else { m_contents.copyTo(result); if (!result.data()) return false; } while (m_firstView) { ArrayBufferView* current = m_firstView; removeView(current); if (allViewsAreNeuterable || current->isNeuterable()) current->neuter(); } m_isNeutered = true; return true; }