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 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef DataView_h 27#define DataView_h 28 29#include "ArrayBufferView.h" 30#include <wtf/FlipBytes.h> 31#include <wtf/PassRefPtr.h> 32 33namespace JSC { 34 35class DataView : public ArrayBufferView { 36protected: 37 DataView(PassRefPtr<ArrayBuffer>, unsigned byteOffset, unsigned byteLength); 38 39public: 40 JS_EXPORT_PRIVATE static PassRefPtr<DataView> create(PassRefPtr<ArrayBuffer>, unsigned byteOffset, unsigned length); 41 static PassRefPtr<DataView> create(PassRefPtr<ArrayBuffer>); 42 43 virtual unsigned byteLength() const override 44 { 45 return m_byteLength; 46 } 47 48 virtual TypedArrayType getType() const override 49 { 50 return TypeDataView; 51 } 52 53 virtual JSArrayBufferView* wrap(ExecState*, JSGlobalObject*) override; 54 55 template<typename T> 56 T get(unsigned offset, bool littleEndian, bool* status = 0) 57 { 58 if (status) { 59 if (offset + sizeof(T) > byteLength()) { 60 *status = false; 61 return T(); 62 } 63 *status = true; 64 } else 65 ASSERT_WITH_SECURITY_IMPLICATION(offset + sizeof(T) <= byteLength()); 66 return flipBytesIfLittleEndian( 67 *reinterpret_cast<T*>(static_cast<uint8_t*>(m_baseAddress) + offset), 68 littleEndian); 69 } 70 71 template<typename T> 72 T read(unsigned& offset, bool littleEndian, bool* status = 0) 73 { 74 T result = this->template get<T>(offset, littleEndian, status); 75 if (!status || *status) 76 offset += sizeof(T); 77 return result; 78 } 79 80 template<typename T> 81 void set(unsigned offset, T value, bool littleEndian, bool* status = 0) 82 { 83 if (status) { 84 if (offset + sizeof(T) > byteLength()) { 85 *status = false; 86 return; 87 } 88 *status = true; 89 } else 90 ASSERT_WITH_SECURITY_IMPLICATION(offset + sizeof(T) <= byteLength()); 91 *reinterpret_cast<T*>(static_cast<uint8_t*>(m_baseAddress) + offset) = 92 flipBytesIfLittleEndian(value, littleEndian); 93 } 94 95private: 96 unsigned m_byteLength; 97}; 98 99} // namespace JSC 100 101#endif // DataView_h 102 103