diff options
Diffstat (limited to 'src/qml/jsruntime/qv4arraybuffer_p.h')
-rw-r--r-- | src/qml/jsruntime/qv4arraybuffer_p.h | 114 |
1 files changed, 48 insertions, 66 deletions
diff --git a/src/qml/jsruntime/qv4arraybuffer_p.h b/src/qml/jsruntime/qv4arraybuffer_p.h index 1873c41261..aafa3c6335 100644 --- a/src/qml/jsruntime/qv4arraybuffer_p.h +++ b/src/qml/jsruntime/qv4arraybuffer_p.h @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2018 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QV4ARRAYBUFFER_H #define QV4ARRAYBUFFER_H @@ -68,36 +32,53 @@ struct ArrayBufferCtor : SharedArrayBufferCtor { void init(QV4::ExecutionContext *scope); }; -struct Q_QML_PRIVATE_EXPORT SharedArrayBuffer : Object { +struct Q_QML_EXPORT SharedArrayBuffer : Object { void init(size_t length); void init(const QByteArray& array); void destroy(); - std::aligned_storage_t<sizeof(QArrayDataPointer<char>), alignof(QArrayDataPointer<char>)> d; - const QArrayDataPointer<char> &data() const { return *reinterpret_cast<const QArrayDataPointer<char> *>(&d); } - QArrayDataPointer<char> &data() { return *reinterpret_cast<QArrayDataPointer<char> *>(&d); } - bool isShared; - uint byteLength() const { return data().size; } + void setSharedArrayBuffer(bool shared) noexcept { isShared = shared; } + bool isSharedArrayBuffer() const noexcept { return isShared; } + + char *arrayData() noexcept { return arrayDataPointer()->data(); } + const char *constArrayData() const noexcept { return constArrayDataPointer()->data(); } + uint arrayDataLength() const noexcept { return constArrayDataPointer().size; } + + bool hasSharedArrayData() const noexcept { return constArrayDataPointer().isShared(); } + bool hasDetachedArrayData() const noexcept { return constArrayDataPointer().isNull(); } + void detachArrayData() noexcept { arrayDataPointer().clear(); } + + bool arrayDataNeedsDetach() const noexcept { return constArrayDataPointer().needsDetach(); } + +private: + const QArrayDataPointer<const char> &constArrayDataPointer() const noexcept + { + return *reinterpret_cast<const QArrayDataPointer<const char> *>(&arrayDataPointerStorage); + } + QArrayDataPointer<char> &arrayDataPointer() noexcept + { + return *reinterpret_cast<QArrayDataPointer<char> *>(&arrayDataPointerStorage); + } + + template <typename T> + struct storage_t { alignas(T) unsigned char data[sizeof(T)]; }; - bool isDetachedBuffer() const { return data().isNull(); } - bool isSharedArrayBuffer() const { return isShared; } + storage_t<QArrayDataPointer<char>> + arrayDataPointerStorage; + bool isShared; }; -struct Q_QML_PRIVATE_EXPORT ArrayBuffer : SharedArrayBuffer { +struct Q_QML_EXPORT ArrayBuffer : SharedArrayBuffer { void init(size_t length) { SharedArrayBuffer::init(length); - isShared = false; + setSharedArrayBuffer(false); } void init(const QByteArray& array) { SharedArrayBuffer::init(array); - isShared = false; - } - void detachArrayBuffer() { - data().clear(); + setSharedArrayBuffer(false); } }; - } struct SharedArrayBufferCtor : FunctionObject @@ -117,37 +98,38 @@ struct ArrayBufferCtor : SharedArrayBufferCtor static ReturnedValue method_isView(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); }; -struct Q_QML_PRIVATE_EXPORT SharedArrayBuffer : Object +struct Q_QML_EXPORT SharedArrayBuffer : Object { V4_OBJECT2(SharedArrayBuffer, Object) V4_NEEDS_DESTROY V4_PROTOTYPE(sharedArrayBufferPrototype) QByteArray asByteArray() const; - uint byteLength() const { return d()->byteLength(); } - char *data() { return d()->data()->data(); } - const char *constData() { return d()->data()->data(); } - bool isShared() { return d()->data()->isShared(); } - bool isDetachedBuffer() const { return d()->data().isNull(); } - bool isSharedArrayBuffer() const { return d()->isShared; } + uint arrayDataLength() const { return d()->arrayDataLength(); } + char *arrayData() { return d()->arrayData(); } + const char *constArrayData() const { return d()->constArrayData(); } + + bool hasSharedArrayData() { return d()->hasSharedArrayData(); } + bool hasDetachedArrayData() const { return d()->hasDetachedArrayData(); } + bool isSharedArrayBuffer() const { return d()->isSharedArrayBuffer(); } }; -struct Q_QML_PRIVATE_EXPORT ArrayBuffer : SharedArrayBuffer +struct Q_QML_EXPORT ArrayBuffer : SharedArrayBuffer { V4_OBJECT2(ArrayBuffer, SharedArrayBuffer) V4_NEEDS_DESTROY V4_PROTOTYPE(arrayBufferPrototype) QByteArray asByteArray() const; - uint byteLength() const { return d()->byteLength(); } - char *data() { if (d()->data().needsDetach()) detach(); return d()->data().data(); } + uint arrayDataLength() const { return d()->arrayDataLength(); } + char *dataData() { if (d()->arrayDataNeedsDetach()) detach(); return d()->arrayData(); } // ### is that detach needed? - const char *constData() const { return d()->data().data(); } + const char *constArrayData() const { return d()->constArrayData(); } + bool hasSharedArrayData() { return d()->hasSharedArrayData(); } + void detachArrayData() { d()->detachArrayData(); } - bool isShared() { return d()->data()->isShared(); } void detach(); - void detachArrayBuffer() { d()->detachArrayBuffer(); } }; struct SharedArrayBufferPrototype : Object |