summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qmlvme.cpp
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2009-09-23 12:29:56 (GMT)
committerAaron Kennedy <aaron.kennedy@nokia.com>2009-09-23 12:29:56 (GMT)
commitb0bc605e2ede4466aabf5b5da040e5801dbf9156 (patch)
tree4db2a40ca239bbde9df52580064a9a6c2db921e6 /src/declarative/qml/qmlvme.cpp
parent3baf0c6d7d8098c6226c0ffade2b6740b0bc96cc (diff)
downloadQt-b0bc605e2ede4466aabf5b5da040e5801dbf9156.zip
Qt-b0bc605e2ede4466aabf5b5da040e5801dbf9156.tar.gz
Qt-b0bc605e2ede4466aabf5b5da040e5801dbf9156.tar.bz2
Make more qmlecmascript tests pass
Test cases constantsOverrideBindings, outerBindingOverridesInnerBinding and aliasPropertyAndBinding now pass.
Diffstat (limited to 'src/declarative/qml/qmlvme.cpp')
-rw-r--r--src/declarative/qml/qmlvme.cpp39
1 files changed, 34 insertions, 5 deletions
diff --git a/src/declarative/qml/qmlvme.cpp b/src/declarative/qml/qmlvme.cpp
index 606a732..e266a91 100644
--- a/src/declarative/qml/qmlvme.cpp
+++ b/src/declarative/qml/qmlvme.cpp
@@ -100,14 +100,16 @@ struct ListInstance
QmlPrivate::ListInterface *qmlListInterface;
};
-QObject *QmlVME::run(QmlContext *ctxt, QmlCompiledData *comp, int start, int count)
+QObject *QmlVME::run(QmlContext *ctxt, QmlCompiledData *comp,
+ int start, int count,
+ const QBitField &bindingSkipList)
{
QStack<QObject *> stack;
if (start == -1) start = 0;
if (count == -1) count = comp->bytecode.count();
- return run(stack, ctxt, comp, start, count);
+ return run(stack, ctxt, comp, start, count, bindingSkipList);
}
void QmlVME::runDeferred(QObject *object)
@@ -124,10 +126,14 @@ void QmlVME::runDeferred(QObject *object)
QStack<QObject *> stack;
stack.push(object);
- run(stack, ctxt, comp, start, count);
+ run(stack, ctxt, comp, start, count, QBitField());
}
-QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt, QmlCompiledData *comp, int start, int count)
+QBitField bindingSkipList;
+QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt,
+ QmlCompiledData *comp,
+ int start, int count,
+ const QBitField &bindingSkipList)
{
Q_ASSERT(comp);
Q_ASSERT(ctxt);
@@ -166,7 +172,17 @@ QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt, QmlCompiledData
case QmlInstruction::CreateObject:
{
- QObject *o = types.at(instr.create.type).createInstance(ctxt);
+ QBitField bindings;
+ if (instr.create.bindingBits != -1) {
+ const QByteArray &bits = datas.at(instr.create.bindingBits);
+ bindings = QBitField((const quint32*)bits.constData(),
+ bits.size() * 8);
+ }
+ if (stack.isEmpty())
+ bindings = bindings.united(bindingSkipList);
+
+ QObject *o =
+ types.at(instr.create.type).createInstance(ctxt, bindings);
if (!o) {
if(types.at(instr.create.type).component)
vmeErrors << types.at(instr.create.type).component->errors();
@@ -562,6 +578,11 @@ QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt, QmlCompiledData
QmlMetaProperty mp;
mp.restore(instr.assignBinding.property, target, ctxt);
+ int coreIndex = mp.coreIndex();
+
+ if (stack.count() == 1 && bindingSkipList.testBit(coreIndex))
+ break;
+
QmlBinding *bind = new QmlBinding((void *)datas.at(instr.assignBinding.value).constData(), comp, context, ctxt, 0);
bindValues.append(bind);
bind->m_mePtr = &bindValues.values[bindValues.count - 1];
@@ -572,6 +593,10 @@ QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt, QmlCompiledData
case QmlInstruction::StoreIdOptBinding:
{
+ int coreIndex = instr.assignIdOptBinding.property;
+ if (stack.count() == 1 && bindingSkipList.testBit(coreIndex))
+ break;
+
QObject *target = stack.top();
QmlBinding_Id *bind =
@@ -585,6 +610,10 @@ QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt, QmlCompiledData
case QmlInstruction::StoreObjPropBinding:
{
+ int coreIndex = instr.assignObjPropBinding.property;
+ if (stack.count() == 1 && bindingSkipList.testBit(coreIndex))
+ break;
+
QObject *target = stack.top();
QObject *context =
stack.at(stack.count() - 1 - instr.assignObjPropBinding.context);