1/* 2 * Copyright (C) 2013 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#ifndef GenericTypedArrayView_h 27#define GenericTypedArrayView_h 28 29#include "ArrayBuffer.h" 30#include "ArrayBufferView.h" 31 32namespace JSC { 33 34template<typename Adaptor> 35class GenericTypedArrayView : public ArrayBufferView { 36protected: 37 GenericTypedArrayView(PassRefPtr<ArrayBuffer>, unsigned byteOffset, unsigned length); 38 39public: 40 static PassRefPtr<GenericTypedArrayView> create(unsigned length); 41 static PassRefPtr<GenericTypedArrayView> create(const typename Adaptor::Type* array, unsigned length); 42 static PassRefPtr<GenericTypedArrayView> create(PassRefPtr<ArrayBuffer>, unsigned byteOffset, unsigned length); 43 44 static PassRefPtr<GenericTypedArrayView> createUninitialized(unsigned length); 45 46 typename Adaptor::Type* data() const { return static_cast<typename Adaptor::Type*>(baseAddress()); } 47 48 bool set(GenericTypedArrayView<Adaptor>* array, unsigned offset) 49 { 50 return setImpl(array, offset * sizeof(typename Adaptor::Type)); 51 } 52 53 bool setRange(const typename Adaptor::Type* data, size_t dataLength, unsigned offset) 54 { 55 return setRangeImpl( 56 reinterpret_cast<const char*>(data), 57 dataLength * sizeof(typename Adaptor::Type), 58 offset * sizeof(typename Adaptor::Type)); 59 } 60 61 bool zeroRange(unsigned offset, size_t length) 62 { 63 return zeroRangeImpl(offset * sizeof(typename Adaptor::Type), length * sizeof(typename Adaptor::Type)); 64 } 65 66 void zeroFill() { zeroRange(0, length()); } 67 68 unsigned length() const 69 { 70 if (isNeutered()) 71 return 0; 72 return m_length; 73 } 74 75 virtual unsigned byteLength() const override 76 { 77 return length() * sizeof(typename Adaptor::Type); 78 } 79 80 typename Adaptor::Type item(unsigned index) const 81 { 82 ASSERT_WITH_SECURITY_IMPLICATION(index < this->length()); 83 return data()[index]; 84 } 85 86 void set(unsigned index, double value) const 87 { 88 ASSERT_WITH_SECURITY_IMPLICATION(index < this->length()); 89 data()[index] = Adaptor::toNativeFromDouble(value); 90 } 91 92 bool checkInboundData(unsigned offset, unsigned pos) const 93 { 94 unsigned length = this->length(); 95 return (offset <= length 96 && offset + pos <= length 97 // check overflow 98 && offset + pos >= offset); 99 } 100 101 PassRefPtr<GenericTypedArrayView> subarray(int start) const; 102 PassRefPtr<GenericTypedArrayView> subarray(int start, int end) const; 103 104 virtual TypedArrayType getType() const override 105 { 106 return Adaptor::typeValue; 107 } 108 109 virtual JSArrayBufferView* wrap(ExecState*, JSGlobalObject*) override; 110 111private: 112 unsigned m_length; 113}; 114 115} // namespace JSC 116 117#endif // GenericTypedArrayView_h 118 119