1/*
2 * Copyright (C) 2013-2017 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#pragma once
27
28#include "ArrayBufferView.h"
29#include <wtf/FlipBytes.h>
30
31namespace JSC {
32
33class DataView : public ArrayBufferView {
34protected:
35 DataView(RefPtr<ArrayBuffer>&&, unsigned byteOffset, unsigned byteLength);
36
37public:
38 JS_EXPORT_PRIVATE static Ref<DataView> create(RefPtr<ArrayBuffer>&&, unsigned byteOffset, unsigned length);
39 static Ref<DataView> create(RefPtr<ArrayBuffer>&&);
40
41 unsigned byteLength() const override
42 {
43 return m_byteLength;
44 }
45
46 TypedArrayType getType() const override
47 {
48 return TypeDataView;
49 }
50
51 JSArrayBufferView* wrap(ExecState*, JSGlobalObject*) override;
52
53 template<typename T>
54 T get(unsigned offset, bool littleEndian, bool* status = 0)
55 {
56 if (status) {
57 if (offset + sizeof(T) > byteLength()) {
58 *status = false;
59 return T();
60 }
61 *status = true;
62 } else
63 RELEASE_ASSERT(offset + sizeof(T) <= byteLength());
64 return flipBytesIfLittleEndian(
65 *reinterpret_cast<T*>(static_cast<uint8_t*>(m_baseAddress.get()) + offset),
66 littleEndian);
67 }
68
69 template<typename T>
70 T read(unsigned& offset, bool littleEndian, bool* status = 0)
71 {
72 T result = this->template get<T>(offset, littleEndian, status);
73 if (!status || *status)
74 offset += sizeof(T);
75 return result;
76 }
77
78 template<typename T>
79 void set(unsigned offset, T value, bool littleEndian, bool* status = 0)
80 {
81 if (status) {
82 if (offset + sizeof(T) > byteLength()) {
83 *status = false;
84 return;
85 }
86 *status = true;
87 } else
88 RELEASE_ASSERT(offset + sizeof(T) <= byteLength());
89 *reinterpret_cast<T*>(static_cast<uint8_t*>(m_baseAddress.get()) + offset) =
90 flipBytesIfLittleEndian(value, littleEndian);
91 }
92
93private:
94 unsigned m_byteLength;
95};
96
97} // namespace JSC
98