We should support CreateThis in the FTL
[WebKit-https.git] / Source / JavaScriptCore / runtime / DataView.h
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
31 namespace JSC {
32
33 class DataView : public ArrayBufferView {
34 protected:
35     DataView(RefPtr<ArrayBuffer>&&, unsigned byteOffset, unsigned byteLength);
36     
37 public:
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
93 private:
94     unsigned m_byteLength;
95 };
96
97 } // namespace JSC