aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4promiseobject_p.h
diff options
context:
space:
mode:
authorValery Kotov <kotov.valery@gmail.com>2015-07-16 19:35:55 +0300
committerSimon Hausmann <simon.hausmann@qt.io>2018-10-11 08:27:48 +0000
commitf47c87e75fb94f1b322157fa663ac8b87a4dbd22 (patch)
treeccd08e635759641095544f3a9ce3d41a516f5b84 /src/qml/jsruntime/qv4promiseobject_p.h
parent54fdc4de7963437642704c2bcf339979aa4f8734 (diff)
QML Engine: Support for JavaScript Promises
Support for JavaScript Promises. Change-Id: I90ce328b35f3bdf3fd666a8829f22b5d56b6f861 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4promiseobject_p.h')
-rw-r--r--src/qml/jsruntime/qv4promiseobject_p.h263
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