aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qdeclarativevme_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/qml/qdeclarativevme_p.h')
-rw-r--r--src/declarative/qml/qdeclarativevme_p.h32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/declarative/qml/qdeclarativevme_p.h b/src/declarative/qml/qdeclarativevme_p.h
index 80c02b1b89..771a2b4c21 100644
--- a/src/declarative/qml/qdeclarativevme_p.h
+++ b/src/declarative/qml/qdeclarativevme_p.h
@@ -120,11 +120,14 @@ public:
void init(QDeclarativeContextData *, QDeclarativeCompiledData *, int start);
bool initDeferred(QObject *);
+ void reset();
QObject *execute(QList<QDeclarativeError> *errors, const Interrupt & = Interrupt());
bool complete(const Interrupt & = Interrupt());
private:
+ friend class QDeclarativeVMEGuard;
+
QObject *run(QList<QDeclarativeError> *errors, const Interrupt &
#ifdef QML_THREADED_VME_INTERPRETER
, void ***storeJumpTable = 0
@@ -138,15 +141,19 @@ private:
#endif
QDeclarativeEngine *engine;
+
QFiniteStack<QObject *> objects;
QFiniteStack<QDeclarativeVMETypes::List> lists;
QFiniteStack<QDeclarativeAbstractBinding *> bindValues;
QFiniteStack<QDeclarativeParserStatus *> parserStatus;
- QDeclarativeContextData *rootContext;
+ QDeclarativeGuardedContextData rootContext;
struct State {
- State() : context(0), compiledData(0), instructionStream(0) {}
+ enum Flag { Deferred = 0x00000001 };
+
+ State() : flags(0), context(0), compiledData(0), instructionStream(0) {}
+ quint32 flags;
QDeclarativeContextData *context;
QDeclarativeCompiledData *compiledData;
const char *instructionStream;
@@ -159,6 +166,27 @@ private:
static void blank(QFiniteStack<QDeclarativeAbstractBinding *> &);
};
+// Used to check that a QDeclarativeVME that is interrupted mid-execution
+// is still valid. Checks all the objects and contexts have not been
+// deleted.
+class QDeclarativeVMEGuard
+{
+public:
+ QDeclarativeVMEGuard();
+ ~QDeclarativeVMEGuard();
+
+ void guard(QDeclarativeVME *);
+ void clear();
+
+ bool isOK() const;
+
+private:
+ int m_objectCount;
+ QDeclarativeGuard<QObject> *m_objects;
+ int m_contextCount;
+ QDeclarativeGuardedContextData *m_contexts;
+};
+
QDeclarativeVME::Interrupt::Interrupt()
: mode(None)
{