aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qdeclarativevme_p.h
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-09-05 17:31:41 +1000
committerQt by Nokia <qt-info@nokia.com>2011-09-29 06:12:49 +0200
commit703c808a5649169dd6b9605af273374cd62951d1 (patch)
tree7248cc72bfa632a51c814d6622f0b12a7f2bd443 /src/declarative/qml/qdeclarativevme_p.h
parent600e56ad053362dd5d4150f5dec6b93c2fee575b (diff)
Asynchronous component instantiation
This introduces two main: * the QML compiler executes in a separate thread * item instantiation can be interrupted and resumed to allow it to be split across multiple frames. Task-number: QTBUG-21151 Change-Id: I9631c62bb77da3a2e0c37f0da3719533fdce4fef Reviewed-on: http://codereview.qt-project.org/5676 Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src/declarative/qml/qdeclarativevme_p.h')
-rw-r--r--src/declarative/qml/qdeclarativevme_p.h128
1 files changed, 110 insertions, 18 deletions
diff --git a/src/declarative/qml/qdeclarativevme_p.h b/src/declarative/qml/qdeclarativevme_p.h
index a0dae77501..3d79f9d340 100644
--- a/src/declarative/qml/qdeclarativevme_p.h
+++ b/src/declarative/qml/qdeclarativevme_p.h
@@ -57,10 +57,14 @@
#include "private/qbitfield_p.h"
#include "private/qdeclarativeinstruction_p.h"
-#include <QtCore/QString>
#include <QtCore/QStack>
+#include <QtCore/QString>
+#include <QtCore/qelapsedtimer.h>
+#include <QtCore/qcoreapplication.h>
#include <private/qv8_p.h>
+#include <private/qdeclarativeengine_p.h>
+#include <private/qfinitestack_p.h>
QT_BEGIN_NAMESPACE
@@ -70,39 +74,127 @@ class QDeclarativeScriptData;
class QDeclarativeCompiledData;
class QDeclarativeCompiledData;
class QDeclarativeContextData;
-class QDeclarativeVMEObjectStack;
+
+namespace QDeclarativeVMETypes {
+ struct List
+ {
+ List() : type(0) {}
+ List(int t) : type(t) {}
+
+ int type;
+ QDeclarativeListProperty<void> qListProperty;
+ };
+}
+Q_DECLARE_TYPEINFO(QDeclarativeVMETypes::List, Q_PRIMITIVE_TYPE | Q_MOVABLE_TYPE);
class QDeclarativeVME
{
+ Q_DECLARE_TR_FUNCTIONS(QDeclarativeVME)
public:
- QDeclarativeVME();
-
- QObject *run(QDeclarativeContextData *, QDeclarativeCompiledData *,
- int start = -1, const QBitField & = QBitField());
-
- void runDeferred(QObject *);
-
- bool isError() const;
- QList<QDeclarativeError> errors() const;
+ class Interrupt {
+ public:
+ inline Interrupt();
+ inline Interrupt(bool *runWhile);
+ inline Interrupt(int nsecs);
+
+ inline void reset();
+ inline bool shouldInterrupt() const;
+ private:
+ enum Mode { None, Time, Flag };
+ Mode mode;
+ union {
+ struct {
+ QElapsedTimer timer;
+ int nsecs;
+ };
+ bool *runWhile;
+ };
+ };
+
+ QDeclarativeVME() : data(0), componentAttached(0) {}
+ QDeclarativeVME(void *data) : data(data), componentAttached(0) {}
+
+ void *data;
+ QDeclarativeComponentAttached *componentAttached;
+ QList<QDeclarativeEnginePrivate::FinalizeCallback> finalizeCallbacks;
+
+ void init(QDeclarativeContextData *, QDeclarativeCompiledData *, int start);
+ bool initDeferred(QObject *);
+
+ QObject *execute(QList<QDeclarativeError> *errors, const Interrupt & = Interrupt());
+ bool complete(const Interrupt & = Interrupt());
private:
- v8::Persistent<v8::Object> run(QDeclarativeContextData *, QDeclarativeScriptData *);
-
- QObject *run(QDeclarativeVMEObjectStack &,
- QDeclarativeContextData *, QDeclarativeCompiledData *,
- int start, const QBitField &
+ QObject *run(QList<QDeclarativeError> *errors, const Interrupt &
#ifdef QML_THREADED_VME_INTERPRETER
, void ***storeJumpTable = 0
#endif
- );
- QList<QDeclarativeError> vmeErrors;
+ );
+ v8::Persistent<v8::Object> run(QDeclarativeContextData *, QDeclarativeScriptData *);
#ifdef QML_THREADED_VME_INTERPRETER
static void **instructionJumpTable();
friend class QDeclarativeCompiledData;
#endif
+
+ QDeclarativeEngine *engine;
+ QFiniteStack<QObject *> objects;
+ QFiniteStack<QDeclarativeVMETypes::List> lists;
+
+ int bindValuesCount;
+ int parserStatusCount;
+ QFiniteStack<QDeclarativeAbstractBinding *> bindValues;
+ QFiniteStack<QDeclarativeParserStatus *> parserStatus;
+ QDeclarativeContextData *rootContext;
+
+ struct State {
+ State() : context(0), compiledData(0), instructionStream(0) {}
+ QDeclarativeContextData *context;
+ QDeclarativeCompiledData *compiledData;
+ const char *instructionStream;
+ QBitField bindingSkipList;
+ };
+
+ QStack<State> states;
+
+ static void blank(QFiniteStack<QDeclarativeParserStatus *> &);
+ static void blank(QFiniteStack<QDeclarativeAbstractBinding *> &);
};
+QDeclarativeVME::Interrupt::Interrupt()
+: mode(None)
+{
+}
+
+QDeclarativeVME::Interrupt::Interrupt(bool *runWhile)
+: mode(Flag), runWhile(runWhile)
+{
+}
+
+QDeclarativeVME::Interrupt::Interrupt(int nsecs)
+: mode(Time), nsecs(nsecs)
+{
+}
+
+void QDeclarativeVME::Interrupt::reset()
+{
+ if (mode == Time)
+ timer.start();
+}
+
+bool QDeclarativeVME::Interrupt::shouldInterrupt() const
+{
+ if (mode == None) {
+ return false;
+ } else if (mode == Time) {
+ return timer.nsecsElapsed() > nsecs;
+ } else if (mode == Flag) {
+ return !*runWhile;
+ } else {
+ return false;
+ }
+}
+
QT_END_NAMESPACE
#endif // QDECLARATIVEVME_P_H