diff options
author | Valery Kotov <[email protected]> | 2015-07-16 19:35:55 +0300 |
---|---|---|
committer | Simon Hausmann <[email protected]> | 2018-10-11 08:27:48 +0000 |
commit | f47c87e75fb94f1b322157fa663ac8b87a4dbd22 (patch) | |
tree | ccd08e635759641095544f3a9ce3d41a516f5b84 /src/qml/jsruntime/qv4promiseobject_p.h | |
parent | 54fdc4de7963437642704c2bcf339979aa4f8734 (diff) |
QML Engine: Support for JavaScript Promises
Support for JavaScript Promises.
Change-Id: I90ce328b35f3bdf3fd666a8829f22b5d56b6f861
Reviewed-by: Simon Hausmann <[email protected]>
Diffstat (limited to 'src/qml/jsruntime/qv4promiseobject_p.h')
-rw-r--r-- | src/qml/jsruntime/qv4promiseobject_p.h | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/src/qml/jsruntime/qv4promiseobject_p.h b/src/qml/jsruntime/qv4promiseobject_p.h new file mode 100644 index 0000000000..80f7183074 --- /dev/null +++ b/src/qml/jsruntime/qv4promiseobject_p.h @@ -0,0 +1,263 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ +#ifndef QV4PROMISEOBJECT_H +#define QV4PROMISEOBJECT_H + +#include "qv4object_p.h" +#include "qv4functionobject_p.h" + +QT_BEGIN_NAMESPACE + +namespace QV4 { + +struct PromiseCapability; + +namespace Promise { + +struct ReactionEvent; + +class ReactionHandler : public QObject +{ + Q_OBJECT + +public: + ReactionHandler(QObject *parent = nullptr); + virtual ~ReactionHandler(); + + void addReaction(ExecutionEngine *e, const Value *reaction, const Value *value); + +protected: + void customEvent(QEvent *event); + void executeReaction(ReactionEvent *event); +}; + +} // Promise + +namespace Heap { + +struct PromiseCtor : FunctionObject { + void init(QV4::ExecutionContext *scope); +}; + +#define PromiseObjectMembers(class, Member) \ + Member(class, HeapValue, HeapValue, resolution) \ + Member(class, HeapValue, HeapValue, fulfillReactions) \ + Member(class, HeapValue, HeapValue, rejectReactions) + +DECLARE_HEAP_OBJECT(PromiseObject, Object) { + DECLARE_MARKOBJECTS(PromiseObject) + void init(ExecutionEngine *e); + + enum State { + Pending, + Fulfilled, + Rejected + }; + + void setState(State); + bool isSettled() const; + bool isPending() const; + bool isFulfilled() const; + bool isRejected() const; + + State state; + + void triggerFullfillReactions(ExecutionEngine *e); + void triggerRejectReactions(ExecutionEngine *e); +}; + +#define PromiseCapabilityMembers(class, Member) \ + Member(class, HeapValue, HeapValue, promise) \ + Member(class, HeapValue, HeapValue, resolve) \ + Member(class, HeapValue, HeapValue, reject) + +DECLARE_HEAP_OBJECT(PromiseCapability, Object) { + DECLARE_MARKOBJECTS(PromiseCapability) +}; + +#define PromiseReactionMembers(class, Member) \ + Member(class, HeapValue, HeapValue, handler) \ + Member(class, Pointer, PromiseCapability*, capability) + +DECLARE_HEAP_OBJECT(PromiseReaction, Object) { + DECLARE_MARKOBJECTS(PromiseReaction) + + static Heap::PromiseReaction *createFulfillReaction(ExecutionEngine* e, const QV4::PromiseCapability *capability, const QV4::FunctionObject *onFulfilled); + static Heap::PromiseReaction *createRejectReaction(ExecutionEngine* e, const QV4::PromiseCapability *capability, const QV4::FunctionObject *onRejected); + + void triggerWithValue(ExecutionEngine *e, const Value *value); + + enum Type { + Function, + Identity, + Thrower + }; + + Type type; + + friend class ReactionHandler; +}; + +#define CapabilitiesExecutorWrapperMembers(class, Member) \ + Member(class, Pointer, PromiseCapability*, capabilities) + +DECLARE_HEAP_OBJECT(CapabilitiesExecutorWrapper, FunctionObject) { + DECLARE_MARKOBJECTS(CapabilitiesExecutorWrapper) + void init(); + void destroy(); +}; + +#define PromiseExecutionStateMembers(class, Member) \ + Member(class, HeapValue, HeapValue, values) \ + Member(class, HeapValue, HeapValue, capability) + +DECLARE_HEAP_OBJECT(PromiseExecutionState, FunctionObject) { + DECLARE_MARKOBJECTS(PromiseExecutionState) + void init(); + + uint index; + uint remainingElementCount; +}; + +#define ResolveElementWrapperMembers(class, Member) \ + Member(class, HeapValue, HeapValue, state) + +DECLARE_HEAP_OBJECT(ResolveElementWrapper, FunctionObject) { + DECLARE_MARKOBJECTS(ResolveElementWrapper) + void init(); + + uint index; + bool alreadyResolved; +}; + +#define ResolveWrapperMembers(class, Member) \ + Member(class, Pointer, PromiseObject*, promise) + +DECLARE_HEAP_OBJECT(ResolveWrapper, FunctionObject) { + DECLARE_MARKOBJECTS(ResolveWrapper) + void init(); + + bool alreadyResolved; +}; + +#define RejectWrapperMembers(class, Member) \ + Member(class, Pointer, PromiseObject*, promise) + +DECLARE_HEAP_OBJECT(RejectWrapper, FunctionObject) { + DECLARE_MARKOBJECTS(RejectWrapper) + void init(); + + bool alreadyResolved; +}; + +} // Heap + +struct PromiseReaction : Object +{ + V4_OBJECT2(PromiseReaction, Object) +}; + +struct PromiseCapability : Object +{ + V4_OBJECT2(PromiseCapability, Object) +}; + +struct PromiseExecutionState : Object +{ + V4_OBJECT2(PromiseExecutionState, Object) +}; + +struct Q_QML_PRIVATE_EXPORT PromiseObject : Object +{ + V4_OBJECT2(PromiseObject, Object) + V4_NEEDS_DESTROY + V4_PROTOTYPE(promisePrototype) +}; + +struct PromiseCtor: FunctionObject +{ + V4_OBJECT2(PromiseCtor, 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); + + static ReturnedValue method_resolve(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_reject(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); + + static ReturnedValue method_all(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_race(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); +}; + +struct PromisePrototype : Object +{ + void init(ExecutionEngine *engine, Object *ctor); + + static ReturnedValue method_then(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_catch(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); +}; + +struct CapabilitiesExecutorWrapper: FunctionObject { + V4_OBJECT2(CapabilitiesExecutorWrapper, FunctionObject) + + static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); +}; + +struct ResolveElementWrapper : FunctionObject { + V4_OBJECT2(ResolveElementWrapper, FunctionObject) + + static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); +}; + +struct ResolveWrapper : FunctionObject { + V4_OBJECT2(ResolveWrapper, FunctionObject) + + static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); +}; + +struct RejectWrapper : FunctionObject { + V4_OBJECT2(RejectWrapper, FunctionObject) + + static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); +}; + +} // QV4 + +QT_END_NAMESPACE + +#endif // QV4PROMISEOBJECT_H |