diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-08-24 12:03:12 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-08-25 08:30:00 +0000 |
commit | 860807b22ab4f7d1c55ce69bb7711dcc777ceefa (patch) | |
tree | 5fbec31ef6ec7bc87353dc51fae0124ef3838753 /src/qml/jsruntime/qv4arraybuffer_p.h | |
parent | dd9a6999b674a9197eabbea96b1e5a34c22a8aab (diff) |
Implement support for SharedArrayBuffer
We'll still need to hook this up with Worker threads to become
useful.
Change-Id: Iedae7307edd76368aeba163731856ebe9b32c6b6
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4arraybuffer_p.h')
-rw-r--r-- | src/qml/jsruntime/qv4arraybuffer_p.h | 72 |
1 files changed, 60 insertions, 12 deletions
diff --git a/src/qml/jsruntime/qv4arraybuffer_p.h b/src/qml/jsruntime/qv4arraybuffer_p.h index 036d141c2f..8344fa2554 100644 --- a/src/qml/jsruntime/qv4arraybuffer_p.h +++ b/src/qml/jsruntime/qv4arraybuffer_p.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** 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. @@ -59,59 +59,107 @@ namespace QV4 { namespace Heap { -struct ArrayBufferCtor : FunctionObject { +struct SharedArrayBufferCtor : FunctionObject { void init(QV4::ExecutionContext *scope); }; -struct Q_QML_PRIVATE_EXPORT ArrayBuffer : Object { +struct ArrayBufferCtor : SharedArrayBufferCtor { + void init(QV4::ExecutionContext *scope); +}; + +struct Q_QML_PRIVATE_EXPORT SharedArrayBuffer : Object { void init(size_t length); void init(const QByteArray& array); void destroy(); QTypedArrayData<char> *data; + bool isShared; uint byteLength() const { return data ? data->size : 0; } + bool isDetachedBuffer() const { return !data; } + bool isSharedArrayBuffer() const { return isShared; } +}; + +struct Q_QML_PRIVATE_EXPORT ArrayBuffer : SharedArrayBuffer { + void init(size_t length) { + SharedArrayBuffer::init(length); + isShared = false; + } + void init(const QByteArray& array) { + SharedArrayBuffer::init(array); + isShared = false; + } void detachArrayBuffer() { if (data && !data->ref.deref()) QTypedArrayData<char>::deallocate(data); data = nullptr; } - bool isDetachedBuffer() const { return !data; } - bool isSharedArrayBuffer() const { return false; } }; + } -struct ArrayBufferCtor: FunctionObject +struct SharedArrayBufferCtor : FunctionObject { - V4_OBJECT2(ArrayBufferCtor, FunctionObject) + V4_OBJECT2(SharedArrayBufferCtor, FunctionObject) static ReturnedValue virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *); static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); +}; + +struct ArrayBufferCtor : SharedArrayBufferCtor +{ + V4_OBJECT2(ArrayBufferCtor, SharedArrayBufferCtor) + + static ReturnedValue virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *); static ReturnedValue method_isView(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); +}; +struct Q_QML_PRIVATE_EXPORT SharedArrayBuffer : Object +{ + V4_OBJECT2(SharedArrayBuffer, Object) + V4_NEEDS_DESTROY + V4_PROTOTYPE(sharedArrayBufferPrototype) + + QByteArray asByteArray() const; + uint byteLength() const { return d()->byteLength(); } + char *data() { Q_ASSERT(d()->data); return d()->data->data(); } + const char *constData() { Q_ASSERT(d()->data); return d()->data->data(); } + + bool isShared() { return d()->data->ref.isShared(); } + bool isDetachedBuffer() const { return !d()->data; } + bool isSharedArrayBuffer() const { return d()->isShared; } }; -struct Q_QML_PRIVATE_EXPORT ArrayBuffer : Object +struct Q_QML_PRIVATE_EXPORT ArrayBuffer : SharedArrayBuffer { - V4_OBJECT2(ArrayBuffer, Object) + V4_OBJECT2(ArrayBuffer, SharedArrayBuffer) V4_NEEDS_DESTROY V4_PROTOTYPE(arrayBufferPrototype) QByteArray asByteArray() const; uint byteLength() const { return d()->byteLength(); } char *data() { detach(); return d()->data ? d()->data->data() : nullptr; } + // ### is that detach needed? const char *constData() { detach(); return d()->data ? d()->data->data() : nullptr; } bool isShared() { return d()->data && d()->data->ref.isShared(); } - bool isDetachedBuffer() const { return !d()->data; } - bool isSharedArrayBuffer() const { return false; } void detach(); void detachArrayBuffer() { d()->detachArrayBuffer(); } }; -struct ArrayBufferPrototype: Object +struct SharedArrayBufferPrototype : Object +{ + void init(ExecutionEngine *engine, Object *ctor); + + static ReturnedValue method_get_byteLength(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_slice(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + + static ReturnedValue slice(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc, bool shared); +}; + +struct ArrayBufferPrototype : SharedArrayBufferPrototype { void init(ExecutionEngine *engine, Object *ctor); |