Home | History | Annotate | Download | only in canvas
      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 "ArrayBuffer.h"
     28 
     29 #include <wtf/RefPtr.h>
     30 
     31 namespace WebCore {
     32 
     33 PassRefPtr<ArrayBuffer> ArrayBuffer::create(unsigned numElements, unsigned elementByteSize)
     34 {
     35     void* data = tryAllocate(numElements, elementByteSize);
     36     if (!data)
     37         return 0;
     38     return adoptRef(new ArrayBuffer(data, numElements * elementByteSize));
     39 }
     40 
     41 PassRefPtr<ArrayBuffer> ArrayBuffer::create(ArrayBuffer* other)
     42 {
     43     return ArrayBuffer::create(other->data(), other->byteLength());
     44 }
     45 
     46 PassRefPtr<ArrayBuffer> ArrayBuffer::create(void* source, unsigned byteLength)
     47 {
     48     void* data = tryAllocate(byteLength, 1);
     49     if (!data)
     50         return 0;
     51     RefPtr<ArrayBuffer> buffer = adoptRef(new ArrayBuffer(data, byteLength));
     52     memcpy(buffer->data(), source, byteLength);
     53     return buffer.release();
     54 }
     55 
     56 ArrayBuffer::ArrayBuffer(void* data, unsigned sizeInBytes)
     57     : m_sizeInBytes(sizeInBytes)
     58     , m_data(data)
     59 {
     60 }
     61 
     62 void* ArrayBuffer::data()
     63 {
     64     return m_data;
     65 }
     66 
     67 const void* ArrayBuffer::data() const
     68 {
     69     return m_data;
     70 }
     71 
     72 unsigned ArrayBuffer::byteLength() const
     73 {
     74     return m_sizeInBytes;
     75 }
     76 
     77 ArrayBuffer::~ArrayBuffer()
     78 {
     79     WTF::fastFree(m_data);
     80 }
     81 
     82 void* ArrayBuffer::tryAllocate(unsigned numElements, unsigned elementByteSize)
     83 {
     84     void* result;
     85     // Do not allow 32-bit overflow of the total size.
     86     // FIXME: Why not? The tryFastCalloc function already checks its arguments,
     87     // and will fail if there is any overflow, so why should we include a
     88     // redudant unnecessarily restrictive check here?
     89     if (numElements) {
     90         unsigned totalSize = numElements * elementByteSize;
     91         if (totalSize / numElements != elementByteSize)
     92             return 0;
     93     }
     94     if (WTF::tryFastCalloc(numElements, elementByteSize).getValue(result))
     95         return result;
     96     return 0;
     97 }
     98 
     99 }
    100