SharedArrayBuffer plus WebGL should not equal CRASH
[WebKit-https.git] / Source / JavaScriptCore / runtime / JSArrayBufferViewInlines.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 "ArrayBufferView.h"
29 #include "JSArrayBufferView.h"
30 #include "JSDataView.h"
31
32 namespace JSC {
33
34 inline bool JSArrayBufferView::isShared()
35 {
36     switch (m_mode) {
37     case WastefulTypedArray:
38         return existingBufferInButterfly()->isShared();
39     case DataViewMode:
40         return jsCast<JSDataView*>(this)->possiblySharedBuffer()->isShared();
41     default:
42         return false;
43     }
44 }
45
46 inline ArrayBuffer* JSArrayBufferView::possiblySharedBuffer()
47 {
48     switch (m_mode) {
49     case WastefulTypedArray:
50         return existingBufferInButterfly();
51     case DataViewMode:
52         return jsCast<JSDataView*>(this)->possiblySharedBuffer();
53     default:
54         return methodTable()->slowDownAndWasteMemory(this);
55     }
56 }
57
58 inline ArrayBuffer* JSArrayBufferView::existingBufferInButterfly()
59 {
60     ASSERT(m_mode == WastefulTypedArray);
61     return butterfly()->indexingHeader()->arrayBuffer();
62 }
63
64 inline PassRefPtr<ArrayBufferView> JSArrayBufferView::possiblySharedImpl()
65 {
66     return methodTable()->getTypedArrayImpl(this);
67 }
68
69 inline PassRefPtr<ArrayBufferView> JSArrayBufferView::unsharedImpl()
70 {
71     PassRefPtr<ArrayBufferView> result = possiblySharedImpl();
72     RELEASE_ASSERT(!result->isShared());
73     return result;
74 }
75
76 inline unsigned JSArrayBufferView::byteOffset()
77 {
78     if (!hasArrayBuffer())
79         return 0;
80     
81     ArrayBuffer* buffer = possiblySharedBuffer();
82     ASSERT(!vector() == !buffer->data());
83     
84     ptrdiff_t delta =
85         bitwise_cast<uint8_t*>(vector()) - static_cast<uint8_t*>(buffer->data());
86     
87     unsigned result = static_cast<unsigned>(delta);
88     ASSERT(static_cast<ptrdiff_t>(result) == delta);
89     return result;
90 }
91
92 inline RefPtr<ArrayBufferView> JSArrayBufferView::toWrapped(JSValue value)
93 {
94     if (JSArrayBufferView* view = jsDynamicCast<JSArrayBufferView*>(value)) {
95         if (!view->isShared())
96             return view->unsharedImpl();
97     }
98     return nullptr;
99 }
100
101 } // namespace JSC