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