Home | History | Annotate | Download | only in wtf
      1 /*
      2  * Copyright (C) 2009 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "wtf/ArrayBuffer.h"
     28 
     29 #include "wtf/ArrayBufferView.h"
     30 #include "wtf/RefPtr.h"
     31 
     32 namespace WTF {
     33 
     34 bool ArrayBuffer::transfer(ArrayBufferContents& result, Vector<RefPtr<ArrayBufferView> >& neuteredViews)
     35 {
     36     RefPtr<ArrayBuffer> keepAlive(this);
     37 
     38     if (!m_contents.data()) {
     39         result.clear();
     40         return false;
     41     }
     42 
     43     bool allViewsAreNeuterable = true;
     44     for (ArrayBufferView* i = m_firstView; i; i = i->m_nextView) {
     45         if (!i->isNeuterable())
     46             allViewsAreNeuterable = false;
     47     }
     48 
     49     if (allViewsAreNeuterable) {
     50         m_contents.transfer(result);
     51     } else {
     52         m_contents.copyTo(result);
     53         if (!result.data())
     54             return false;
     55     }
     56 
     57     while (m_firstView) {
     58         ArrayBufferView* current = m_firstView;
     59         removeView(current);
     60         if (allViewsAreNeuterable || current->isNeuterable())
     61             current->neuter();
     62         neuteredViews.append(current);
     63     }
     64 
     65     m_isNeutered = true;
     66 
     67     return true;
     68 }
     69 
     70 void ArrayBuffer::addView(ArrayBufferView* view)
     71 {
     72     view->m_buffer = this;
     73     view->m_prevView = 0;
     74     view->m_nextView = m_firstView;
     75     if (m_firstView)
     76         m_firstView->m_prevView = view;
     77     m_firstView = view;
     78 }
     79 
     80 void ArrayBuffer::removeView(ArrayBufferView* view)
     81 {
     82     ASSERT(this == view->m_buffer);
     83     if (view->m_nextView)
     84         view->m_nextView->m_prevView = view->m_prevView;
     85     if (view->m_prevView)
     86         view->m_prevView->m_nextView = view->m_nextView;
     87     if (m_firstView == view)
     88         m_firstView = view->m_nextView;
     89     view->m_prevView = view->m_nextView = 0;
     90 }
     91 
     92 }
     93