summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/declarative/qml/qmlvme.cpp12
-rw-r--r--src/declarative/qml/qmlvme_p.h30
2 files changed, 36 insertions, 6 deletions
diff --git a/src/declarative/qml/qmlvme.cpp b/src/declarative/qml/qmlvme.cpp
index f2fb217..88c4b60 100644
--- a/src/declarative/qml/qmlvme.cpp
+++ b/src/declarative/qml/qmlvme.cpp
@@ -67,6 +67,7 @@
#include <private/qmlbinding_p.h>
#include <private/qmlcontext_p.h>
#include <private/qmlbindingoptimizations_p.h>
+#include <private/qmlglobal_p.h>
#include <qmlscriptstring.h>
QT_BEGIN_NAMESPACE
@@ -102,7 +103,7 @@ QObject *QmlVME::run(QmlContext *ctxt, QmlCompiledData *comp,
int start, int count,
const QBitField &bindingSkipList)
{
- QStack<QObject *> stack;
+ QmlVMEStack<QObject *> stack;
if (start == -1) start = 0;
if (count == -1) count = comp->bytecode.count();
@@ -121,14 +122,14 @@ void QmlVME::runDeferred(QObject *object)
QmlCompiledData *comp = data->deferredComponent;
int start = data->deferredIdx + 1;
int count = data->deferredComponent->bytecode.at(data->deferredIdx).defer.deferCount;
- QStack<QObject *> stack;
+ QmlVMEStack<QObject *> stack;
stack.push(object);
run(stack, ctxt, comp, start, count, QBitField());
}
QBitField bindingSkipList;
-QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt,
+QObject *QmlVME::run(QmlVMEStack<QObject *> &stack, QmlContext *ctxt,
QmlCompiledData *comp,
int start, int count,
const QBitField &bindingSkipList)
@@ -147,7 +148,7 @@ QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt,
QmlEnginePrivate::SimpleList<QmlAbstractBinding> bindValues;
QmlEnginePrivate::SimpleList<QmlParserStatus> parserStatus;
- QStack<ListInstance> qliststack;
+ QmlVMEStack<ListInstance> qliststack;
vmeErrors.clear();
QmlEnginePrivate *ep = QmlEnginePrivate::get(ctxt->engine());
@@ -214,7 +215,8 @@ QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt,
// TODO: parent might be a layout
}
} else {
- o->setParent(parent);
+ QmlGraphics_setParent_noEvent(o, parent);
+ // o->setParent(parent);
}
}
stack.push(o);
diff --git a/src/declarative/qml/qmlvme_p.h b/src/declarative/qml/qmlvme_p.h
index a15bd08..f7b0180 100644
--- a/src/declarative/qml/qmlvme_p.h
+++ b/src/declarative/qml/qmlvme_p.h
@@ -66,6 +66,34 @@ class QmlCompiledData;
class QmlCompiledData;
class QmlContext;
+template<typename T, int N = 128>
+class QmlVMEStack {
+public:
+ QmlVMEStack() : index(-1), maxSize(N), data(fixedData) {}
+ ~QmlVMEStack() { if (data != fixedData) qFree(fixedData); }
+
+ bool isEmpty() const { return index == -1; }
+ const T &top() const { return data[index]; }
+ void push(const T &i) { ++index; if (index == maxSize) realloc(); data[index] = i; }
+ const T &pop() { --index; return data[index + 1]; }
+ int count() const { return index + 1; }
+ const T &at(int idx) { return data[idx]; }
+
+private:
+ void realloc() {
+ maxSize += N;
+ if (data != fixedData) {
+ data = (T*)qRealloc(data, maxSize * sizeof(T));
+ } else {
+ data = (T*)qMalloc(maxSize * sizeof(T));
+ }
+ }
+ int index;
+ int maxSize;
+ T *data;
+ T fixedData[N];
+};
+
class QmlVME
{
public:
@@ -80,7 +108,7 @@ public:
QList<QmlError> errors() const;
private:
- QObject *run(QStack<QObject *> &, QmlContext *, QmlCompiledData *,
+ QObject *run(QmlVMEStack<QObject *> &, QmlContext *, QmlCompiledData *,
int start, int count, const QBitField &);
QList<QmlError> vmeErrors;
};