aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-06-20 14:47:44 +1000
committerAaron Kennedy <aaron.kennedy@nokia.com>2011-06-20 14:47:44 +1000
commit4266185d161be64926f43ed70b6ed2090fca17f1 (patch)
treea36f2b55c1669467e77c977c5c507bf678801b3e
parent1ccfc5a5760bc85712e61546b772cede54ca21cb (diff)
Reenable shared bindings
Now with extra "supports nested components" goodness.
-rw-r--r--src/declarative/qml/qdeclarativecompileddata.cpp3
-rw-r--r--src/declarative/qml/qdeclarativecompiler.cpp6
-rw-r--r--src/declarative/qml/qdeclarativecompiler_p.h3
-rw-r--r--src/declarative/qml/qdeclarativeinstruction.cpp2
-rw-r--r--src/declarative/qml/qdeclarativeinstruction_p.h3
-rw-r--r--src/declarative/qml/qdeclarativevme.cpp3
-rw-r--r--src/declarative/qml/v8/qv8bindings.cpp8
-rw-r--r--src/declarative/qml/v8/qv8bindings_p.h2
-rw-r--r--tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp2
9 files changed, 20 insertions, 12 deletions
diff --git a/src/declarative/qml/qdeclarativecompileddata.cpp b/src/declarative/qml/qdeclarativecompileddata.cpp
index fc4b28b666..d08a808d77 100644
--- a/src/declarative/qml/qdeclarativecompileddata.cpp
+++ b/src/declarative/qml/qdeclarativecompileddata.cpp
@@ -129,7 +129,8 @@ QDeclarativeCompiledData::~QDeclarativeCompiledData()
qDeleteAll(cachedPrograms);
qDeleteAll(cachedClosures);
- qPersistentDispose(v8bindings);
+ for (int ii = 0; ii < v8bindings.count(); ++ii)
+ qPersistentDispose(v8bindings[ii]);
}
void QDeclarativeCompiledData::clear()
diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index b653d108cf..bca9c65fcc 100644
--- a/src/declarative/qml/qdeclarativecompiler.cpp
+++ b/src/declarative/qml/qdeclarativecompiler.cpp
@@ -712,6 +712,7 @@ void QDeclarativeCompiler::compileTree(QDeclarativeParser::Object *tree)
QDeclarativeInstruction bindings;
bindings.setType(QDeclarativeInstruction::InitV8Bindings);
bindings.initV8Bindings.program = output->indexForString(compileState.v8BindingProgram);
+ bindings.initV8Bindings.programIndex = compileState.v8BindingProgramIndex;
bindings.initV8Bindings.line = compileState.v8BindingProgramLine;
output->addInstruction(bindings);
}
@@ -1220,6 +1221,7 @@ void QDeclarativeCompiler::genComponent(QDeclarativeParser::Object *obj)
QDeclarativeInstruction bindings;
bindings.setType(QDeclarativeInstruction::InitV8Bindings);
bindings.initV8Bindings.program = output->indexForString(compileState.v8BindingProgram);
+ bindings.initV8Bindings.programIndex = compileState.v8BindingProgramIndex;
bindings.initV8Bindings.line = compileState.v8BindingProgramLine;
output->addInstruction(bindings);
}
@@ -2973,7 +2975,7 @@ bool QDeclarativeCompiler::completeComponentBuild()
bool isSharable = false;
binding.rewrittenExpression = rewriteBinding(binding.expression.asAST(), expression, &isSharable);
- if (0 && isSharable && !binding.property->isAlias /* See above re alias */ &&
+ if (isSharable && !binding.property->isAlias /* See above re alias */ &&
binding.property->type != qMetaTypeId<QDeclarativeBinding*>()) {
binding.dataType = BindingReference::V8;
sharedBindings.append(&iter.value());
@@ -3017,6 +3019,8 @@ bool QDeclarativeCompiler::completeComponentBuild()
compileState.v8BindingProgram = functionArray;
compileState.v8BindingProgramLine = startLineNumber;
+ compileState.v8BindingProgramIndex = output->v8bindings.count();
+ output->v8bindings.append(v8::Persistent<v8::Array>());
}
if (bindingCompiler.isValid())
diff --git a/src/declarative/qml/qdeclarativecompiler_p.h b/src/declarative/qml/qdeclarativecompiler_p.h
index 2756c3fefb..a1dfabbd46 100644
--- a/src/declarative/qml/qdeclarativecompiler_p.h
+++ b/src/declarative/qml/qdeclarativecompiler_p.h
@@ -104,7 +104,7 @@ public:
};
QList<TypeReference> types;
- v8::Persistent<v8::Array> v8bindings;
+ QList<v8::Persistent<v8::Array> > v8bindings;
const QMetaObject *root;
QAbstractDynamicMetaObject rootData;
@@ -309,6 +309,7 @@ private:
QByteArray compiledBindingData;
QString v8BindingProgram;
int v8BindingProgramLine;
+ int v8BindingProgramIndex;
QHash<QDeclarativeParser::Value *, BindingReference> bindings;
QHash<QDeclarativeParser::Value *, BindingContext> signalExpressions;
diff --git a/src/declarative/qml/qdeclarativeinstruction.cpp b/src/declarative/qml/qdeclarativeinstruction.cpp
index 4f64e4e2ba..f99351bde5 100644
--- a/src/declarative/qml/qdeclarativeinstruction.cpp
+++ b/src/declarative/qml/qdeclarativeinstruction.cpp
@@ -169,7 +169,7 @@ void QDeclarativeCompiledData::dump(QDeclarativeInstruction *instr, int idx)
qWarning().nospace() << idx << "\t\t" << "ASSIGN_CUSTOMTYPE\t" << instr->assignCustomType.propertyIndex << "\t" << instr->assignCustomType.primitive << "\t" << instr->assignCustomType.type;
break;
case QDeclarativeInstruction::InitV8Bindings:
- qWarning().nospace() << idx << "\t\t" << "INIT_V8_BINDING\t" << instr->initV8Bindings.program << "\t" << instr->initV8Bindings.line;
+ qWarning().nospace() << idx << "\t\t" << "INIT_V8_BINDING\t" << instr->initV8Bindings.program << "\t" << instr->initV8Bindings.programIndex << "\t" << instr->initV8Bindings.line;
break;
case QDeclarativeInstruction::StoreBinding:
qWarning().nospace() << idx << "\t\t" << "STORE_BINDING\t" << instr->assignBinding.property << "\t" << instr->assignBinding.value << "\t" << instr->assignBinding.context;
diff --git a/src/declarative/qml/qdeclarativeinstruction_p.h b/src/declarative/qml/qdeclarativeinstruction_p.h
index 5c51ea8d5f..107d774b21 100644
--- a/src/declarative/qml/qdeclarativeinstruction_p.h
+++ b/src/declarative/qml/qdeclarativeinstruction_p.h
@@ -187,7 +187,8 @@ union QDeclarativeInstruction
struct instr_initV8Bindings {
QML_INSTR_HEADER
int program;
- int line;
+ ushort programIndex;
+ ushort line;
};
struct instr_assignBinding {
QML_INSTR_HEADER
diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp
index 377ef9db16..95a8ca0cb9 100644
--- a/src/declarative/qml/qdeclarativevme.cpp
+++ b/src/declarative/qml/qdeclarativevme.cpp
@@ -661,7 +661,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QML_END_INSTR(BeginObject)
QML_BEGIN_INSTR(InitV8Bindings)
- ctxt->v8bindings = new QV8Bindings(primitives.at(instr.program), instr.line, comp, ctxt);
+ ctxt->v8bindings = new QV8Bindings(primitives.at(instr.program), instr.programIndex,
+ instr.line, comp, ctxt);
QML_END_INSTR(InitV8Bindings)
QML_BEGIN_INSTR(StoreBinding)
diff --git a/src/declarative/qml/v8/qv8bindings.cpp b/src/declarative/qml/v8/qv8bindings.cpp
index 424d06f083..49cc00ca68 100644
--- a/src/declarative/qml/v8/qv8bindings.cpp
+++ b/src/declarative/qml/v8/qv8bindings.cpp
@@ -162,7 +162,7 @@ void QV8BindingsPrivate::Binding::destroy()
parent->q_func()->release();
}
-QV8Bindings::QV8Bindings(const QString &program, int line,
+QV8Bindings::QV8Bindings(const QString &program, int index, int line,
QDeclarativeCompiledData *compiled,
QDeclarativeContextData *context)
: QObject(*(new QV8BindingsPrivate))
@@ -171,7 +171,7 @@ QV8Bindings::QV8Bindings(const QString &program, int line,
QV8Engine *engine = QDeclarativeEnginePrivate::getV8Engine(context->engine);
- if (compiled->v8bindings.IsEmpty()) {
+ if (compiled->v8bindings[index].IsEmpty()) {
v8::HandleScope handle_scope;
v8::Context::Scope scope(engine->context());
@@ -179,11 +179,11 @@ QV8Bindings::QV8Bindings(const QString &program, int line,
v8::Local<v8::Value> result = script->Run(engine->contextWrapper()->sharedContext());
if (result->IsArray())
- compiled->v8bindings = qPersistentNew(v8::Local<v8::Array>::Cast(result));
+ compiled->v8bindings[index] = qPersistentNew(v8::Local<v8::Array>::Cast(result));
}
d->url = compiled->url;
- d->functions = qPersistentNew(compiled->v8bindings);
+ d->functions = qPersistentNew(compiled->v8bindings[index]);
d->bindingsCount = d->functions->Length();
d->bindings = new QV8BindingsPrivate::Binding[d->bindingsCount];
diff --git a/src/declarative/qml/v8/qv8bindings_p.h b/src/declarative/qml/v8/qv8bindings_p.h
index e99e3c834d..f8a9407ed8 100644
--- a/src/declarative/qml/v8/qv8bindings_p.h
+++ b/src/declarative/qml/v8/qv8bindings_p.h
@@ -69,7 +69,7 @@ class QV8Bindings : public QObject,
public QDeclarativeRefCount
{
public:
- QV8Bindings(const QString &program, int line,
+ QV8Bindings(const QString &program, int index, int line,
QDeclarativeCompiledData *compiled,
QDeclarativeContextData *context);
virtual ~QV8Bindings();
diff --git a/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp b/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp
index 3712db4852..e6e87d1bbd 100644
--- a/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp
+++ b/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp
@@ -366,7 +366,7 @@ void tst_qdeclarativeinstruction::dump()
{
QDeclarativeInstruction i;
- i.setType(QDeclarativeInstruction::StoreCompiledBinding);
+ i.setType(QDeclarativeInstruction::StoreV4Binding);
i.assignBinding.property = 27;
i.assignBinding.value = 2;
i.assignBinding.context = 4;