aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qdeclarativevme.cpp
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-06-17 11:37:17 +1000
committerAaron Kennedy <aaron.kennedy@nokia.com>2011-06-17 11:37:17 +1000
commit69a17a912a41458a2b4a20bdbda1717920275250 (patch)
treef0eb0cdb210765ddb954539a0fbe520640eae2a1 /src/declarative/qml/qdeclarativevme.cpp
parent9c5e112e12f09ad5c8356d6815f9b23102e99bfd (diff)
Evaluate all shared bindings together using a shared context
The vast majority of bindings are capable of being shared (that is, don't introduce closures themselves) and consequently this improves the performance of almost every app.
Diffstat (limited to 'src/declarative/qml/qdeclarativevme.cpp')
-rw-r--r--src/declarative/qml/qdeclarativevme.cpp44
1 files changed, 37 insertions, 7 deletions
diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp
index 4d5fa3607c..377ef9db16 100644
--- a/src/declarative/qml/qdeclarativevme.cpp
+++ b/src/declarative/qml/qdeclarativevme.cpp
@@ -58,6 +58,7 @@
#include "private/qdeclarativebinding_p_p.h"
#include "private/qdeclarativecontext_p.h"
#include "private/qdeclarativev4bindings_p.h"
+#include "private/qv8bindings_p.h"
#include "private/qdeclarativeglobal_p.h"
#include "qdeclarativescriptstring.h"
#include "qdeclarativescriptstring_p.h"
@@ -191,8 +192,10 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
parserStatus = QDeclarativeEnginePrivate::SimpleList<QDeclarativeParserStatus>(instr.parserStatusSize);
if (instr.contextCache != -1)
ctxt->setIdPropertyData(comp->contextCaches.at(instr.contextCache));
- if (instr.compiledBinding != -1)
- ctxt->optimizedBindings = new QDeclarativeV4Bindings(datas.at(instr.compiledBinding).constData(), ctxt);
+ if (instr.compiledBinding != -1) {
+ const char *v4data = datas.at(instr.compiledBinding).constData();
+ ctxt->v4bindings = new QDeclarativeV4Bindings(v4data, ctxt);
+ }
QML_END_INSTR(Init)
QML_BEGIN_INSTR(Done)
@@ -657,6 +660,10 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
status->classBegin();
QML_END_INSTR(BeginObject)
+ QML_BEGIN_INSTR(InitV8Bindings)
+ ctxt->v8bindings = new QV8Bindings(primitives.at(instr.program), instr.line, comp, ctxt);
+ QML_END_INSTR(InitV8Bindings)
+
QML_BEGIN_INSTR(StoreBinding)
QObject *target =
stack.at(stack.count() - 1 - instr.owner);
@@ -671,7 +678,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
if ((stack.count() - instr.owner) == 1 && bindingSkipList.testBit(coreIndex))
break;
- QDeclarativeBinding *bind = new QDeclarativeBinding((void *)datas.at(instr.value).constData(), comp, context, ctxt, comp->name, instr.line, 0);
+ QDeclarativeBinding *bind = new QDeclarativeBinding(primitives.at(instr.value), true,
+ context, ctxt, comp->name, instr.line);
bindValues.append(bind);
bind->m_mePtr = &bindValues.values[bindValues.count - 1];
bind->setTarget(mp);
@@ -693,7 +701,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
if ((stack.count() - instr.owner) == 1 && bindingSkipList.testBit(coreIndex))
break;
- QDeclarativeBinding *bind = new QDeclarativeBinding((void *)datas.at(instr.value).constData(), comp, context, ctxt, comp->name, instr.line, 0);
+ QDeclarativeBinding *bind = new QDeclarativeBinding(primitives.at(instr.value), true,
+ context, ctxt, comp->name, instr.line);
bindValues.append(bind);
bind->m_mePtr = &bindValues.values[bindValues.count - 1];
bind->setTarget(mp);
@@ -702,7 +711,7 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
if (old) { old->destroy(); }
QML_END_INSTR(StoreBindingOnAlias)
- QML_BEGIN_INSTR(StoreCompiledBinding)
+ QML_BEGIN_INSTR(StoreV4Binding)
QObject *target =
stack.at(stack.count() - 1 - instr.owner);
QObject *scope =
@@ -713,11 +722,32 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
break;
QDeclarativeAbstractBinding *binding =
- ctxt->optimizedBindings->configBinding(instr.value, target, scope, property);
+ ctxt->v4bindings->configBinding(instr.value, target, scope, property);
bindValues.append(binding);
binding->m_mePtr = &bindValues.values[bindValues.count - 1];
binding->addToObject(target, property);
- QML_END_INSTR(StoreCompiledBinding)
+ QML_END_INSTR(StoreV4Binding)
+
+ QML_BEGIN_INSTR(StoreV8Binding)
+ QObject *target =
+ stack.at(stack.count() - 1 - instr.owner);
+ QObject *scope =
+ stack.at(stack.count() - 1 - instr.context);
+
+ QDeclarativeProperty mp =
+ QDeclarativePropertyPrivate::restore(datas.at(instr.property), target, ctxt);
+
+ int coreIndex = mp.index();
+
+ if ((stack.count() - instr.owner) == 1 && bindingSkipList.testBit(coreIndex))
+ break;
+
+ QDeclarativeAbstractBinding *binding =
+ ctxt->v8bindings->configBinding(instr.value, target, scope, mp, instr.line);
+ bindValues.append(binding);
+ binding->m_mePtr = &bindValues.values[bindValues.count - 1];
+ binding->addToObject(target, QDeclarativePropertyPrivate::bindingIndex(mp));
+ QML_END_INSTR(StoreV8Binding)
QML_BEGIN_INSTR(StoreValueSource)
QObject *obj = stack.pop();