/ runtime / GenericTypedArrayViewInlines.h
GenericTypedArrayViewInlines.h
  1  /*
  2   * Copyright (C) 2013, 2016 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  #pragma once
 27  
 28  #include "GenericTypedArrayView.h"
 29  #include "JSGlobalObjectInlines.h"
 30  
 31  namespace JSC {
 32  
 33  template<typename Adaptor>
 34  GenericTypedArrayView<Adaptor>::GenericTypedArrayView(
 35  RefPtr<ArrayBuffer>&& buffer, unsigned byteOffset, unsigned length)
 36      : ArrayBufferView(WTFMove(buffer), byteOffset, length * sizeof(typename Adaptor::Type))
 37  {
 38  }
 39  
 40  template<typename Adaptor>
 41  Ref<GenericTypedArrayView<Adaptor>> GenericTypedArrayView<Adaptor>::create(unsigned length)
 42  {
 43      auto result = tryCreate(length);
 44      RELEASE_ASSERT(result);
 45      return result.releaseNonNull();
 46  }
 47  
 48  template<typename Adaptor>
 49  Ref<GenericTypedArrayView<Adaptor>> GenericTypedArrayView<Adaptor>::create(
 50      const typename Adaptor::Type* array, unsigned length)
 51  {
 52      auto result = tryCreate(array, length);
 53      RELEASE_ASSERT(result);
 54      return result.releaseNonNull();
 55  }
 56  
 57  template<typename Adaptor>
 58  Ref<GenericTypedArrayView<Adaptor>> GenericTypedArrayView<Adaptor>::create(
 59      RefPtr<ArrayBuffer>&& buffer, unsigned byteOffset, unsigned length)
 60  {
 61      auto result = tryCreate(WTFMove(buffer), byteOffset, length);
 62      RELEASE_ASSERT(result);
 63      return result.releaseNonNull();
 64  }
 65  
 66  template<typename Adaptor>
 67  RefPtr<GenericTypedArrayView<Adaptor>> GenericTypedArrayView<Adaptor>::tryCreate(unsigned length)
 68  {
 69      auto buffer = ArrayBuffer::tryCreate(length, sizeof(typename Adaptor::Type));
 70      if (!buffer)
 71          return nullptr;
 72      return tryCreate(WTFMove(buffer), 0, length);
 73  }
 74  
 75  template<typename Adaptor>
 76  RefPtr<GenericTypedArrayView<Adaptor>> GenericTypedArrayView<Adaptor>::tryCreate(
 77      const typename Adaptor::Type* array, unsigned length)
 78  {
 79      RefPtr<GenericTypedArrayView> result = tryCreate(length);
 80      if (!result)
 81          return nullptr;
 82      memcpy(result->data(), array, length * sizeof(typename Adaptor::Type));
 83      return result;
 84  }
 85  
 86  template<typename Adaptor>
 87  RefPtr<GenericTypedArrayView<Adaptor>> GenericTypedArrayView<Adaptor>::tryCreate(
 88      RefPtr<ArrayBuffer>&& buffer, unsigned byteOffset, unsigned length)
 89  {
 90      if (!buffer)
 91          return nullptr;
 92      
 93      if (!ArrayBufferView::verifySubRangeLength(*buffer, byteOffset, length, sizeof(typename Adaptor::Type))
 94          || !verifyByteOffsetAlignment(byteOffset, sizeof(typename Adaptor::Type))) {
 95          return nullptr;
 96      }
 97      
 98      return adoptRef(new GenericTypedArrayView(WTFMove(buffer), byteOffset, length));
 99  }
100  
101  template<typename Adaptor>
102  Ref<GenericTypedArrayView<Adaptor>>
103  GenericTypedArrayView<Adaptor>::createUninitialized(unsigned length)
104  {
105      auto result = tryCreateUninitialized(length);
106      RELEASE_ASSERT(result);
107      return result.releaseNonNull();
108  }
109  
110  template<typename Adaptor>
111  RefPtr<GenericTypedArrayView<Adaptor>>
112  GenericTypedArrayView<Adaptor>::tryCreateUninitialized(unsigned length)
113  {
114      RefPtr<ArrayBuffer> buffer =
115          ArrayBuffer::tryCreateUninitialized(length, sizeof(typename Adaptor::Type));
116      if (!buffer)
117          return nullptr;
118      return tryCreate(WTFMove(buffer), 0, length);
119  }
120  
121  template<typename Adaptor>
122  RefPtr<GenericTypedArrayView<Adaptor>>
123  GenericTypedArrayView<Adaptor>::subarray(int start) const
124  {
125      return subarray(start, length());
126  }
127  
128  template<typename Adaptor>
129  RefPtr<GenericTypedArrayView<Adaptor>>
130  GenericTypedArrayView<Adaptor>::subarray(int start, int end) const
131  {
132      unsigned offset, length;
133      calculateOffsetAndLength(start, end, this->length(), &offset, &length);
134      ArrayBuffer* buffer = possiblySharedBuffer();
135      ASSERT(buffer);
136      clampOffsetAndNumElements<Adaptor::Type>(*buffer, byteOffset(), &offset, &length);
137      return tryCreate(buffer, offset, length);
138  }
139  
140  template<typename Adaptor>
141  JSArrayBufferView* GenericTypedArrayView<Adaptor>::wrap(JSGlobalObject* lexicalGlobalObject, JSGlobalObject* globalObject)
142  {
143      UNUSED_PARAM(lexicalGlobalObject);
144      return Adaptor::JSViewType::create(globalObject->vm(), globalObject->typedArrayStructure(Adaptor::typeValue), this);
145  }
146  
147  } // namespace JSC