/ runtime / ArrayBufferView.cpp
ArrayBufferView.cpp
 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 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 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 "ArrayBufferView.h"
28  #include <wtf/CheckedArithmetic.h>
29  
30  namespace JSC {
31  
32  ArrayBufferView::ArrayBufferView(
33      RefPtr<ArrayBuffer>&& buffer, unsigned byteOffset, unsigned byteLength)
34          : m_byteOffset(byteOffset)
35          , m_isDetachable(true)
36          , m_byteLength(byteLength)
37          , m_buffer(WTFMove(buffer))
38  {
39      Checked<unsigned, CrashOnOverflow> length(byteOffset);
40      length += byteLength;
41      RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(length <= m_buffer->byteLength());
42      if (m_buffer)
43          m_baseAddress = BaseAddress(static_cast<char*>(m_buffer->data()) + m_byteOffset, byteLength);
44  }
45  
46  ArrayBufferView::~ArrayBufferView()
47  {
48      if (!m_isDetachable)
49          m_buffer->unpin();
50  }
51  
52  void ArrayBufferView::setDetachable(bool flag)
53  {
54      if (flag == m_isDetachable)
55          return;
56      
57      m_isDetachable = flag;
58      
59      if (!m_buffer)
60          return;
61      
62      if (flag)
63          m_buffer->unpin();
64      else
65          m_buffer->pin();
66  }
67  
68  } // namespace JSC