summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2009-10-09 06:42:14 (GMT)
committerAaron Kennedy <aaron.kennedy@nokia.com>2009-10-09 06:42:14 (GMT)
commite20dabec726b44cbe4e3078699932c59979cb977 (patch)
tree00c0ef06355ce1cd230854fc7019c1a9208fa164 /src/declarative/qml
parent48b48fba165683bf8f1a24eb7cf53cb1d6ab0795 (diff)
downloadQt-e20dabec726b44cbe4e3078699932c59979cb977.zip
Qt-e20dabec726b44cbe4e3078699932c59979cb977.tar.gz
Qt-e20dabec726b44cbe4e3078699932c59979cb977.tar.bz2
Tweak scope ordering (again)
ids and methods shadow properties. The reasoning is that the user explicitly declared these names, whereas they might not even know a property by that name exists.
Diffstat (limited to 'src/declarative/qml')
-rw-r--r--src/declarative/qml/qmlcontext.cpp11
-rw-r--r--src/declarative/qml/qmlcontext_p.h2
-rw-r--r--src/declarative/qml/qmlcontextscriptclass.cpp57
-rw-r--r--src/declarative/qml/qmlcontextscriptclass_p.h6
-rw-r--r--src/declarative/qml/qmlexpression.cpp10
5 files changed, 49 insertions, 37 deletions
diff --git a/src/declarative/qml/qmlcontext.cpp b/src/declarative/qml/qmlcontext.cpp
index 3f61867..43a4741 100644
--- a/src/declarative/qml/qmlcontext.cpp
+++ b/src/declarative/qml/qmlcontext.cpp
@@ -64,6 +64,8 @@ QmlContextPrivate::QmlContextPrivate()
void QmlContextPrivate::addScript(const QString &script, QObject *scopeObject,
const QString &fileName, int lineNumber)
{
+ Q_Q(QmlContext);
+
if (!engine)
return;
@@ -71,11 +73,8 @@ void QmlContextPrivate::addScript(const QString &script, QObject *scopeObject,
QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
QScriptContext *scriptContext = scriptEngine->pushCleanContext();
- scriptContext->pushScope(scriptValue);
+ scriptContext->pushScope(enginePriv->contextClass->newContext(q, scopeObject));
- if (scopeObject)
- scriptContext->pushScope(enginePriv->objectClass->newQObject(scopeObject));
-
QScriptValue scope = scriptEngine->newObject();
scriptContext->setActivationObject(scope);
@@ -129,10 +128,6 @@ void QmlContextPrivate::init()
if (parent)
parent->d_func()->childContexts.insert(q);
-
- //set scope chain
- QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
- scriptValue = QmlEnginePrivate::get(engine)->contextClass->newContext(q);
}
void QmlContextPrivate::addDefaultObject(QObject *object, Priority priority)
diff --git a/src/declarative/qml/qmlcontext_p.h b/src/declarative/qml/qmlcontext_p.h
index fe74e28..9a77e94 100644
--- a/src/declarative/qml/qmlcontext_p.h
+++ b/src/declarative/qml/qmlcontext_p.h
@@ -91,8 +91,6 @@ public:
QObjectList defaultObjects;
int highPriorityCount;
- QScriptValue scriptValue;
-
QList<QScriptValue> scripts;
void addScript(const QString &script, QObject *scope,
const QString &fileName = QString(), int lineNumber = 1);
diff --git a/src/declarative/qml/qmlcontextscriptclass.cpp b/src/declarative/qml/qmlcontextscriptclass.cpp
index 6d2c58c..939d008 100644
--- a/src/declarative/qml/qmlcontextscriptclass.cpp
+++ b/src/declarative/qml/qmlcontextscriptclass.cpp
@@ -47,8 +47,9 @@
QT_BEGIN_NAMESPACE
struct ContextData : public QScriptDeclarativeClass::Object {
- ContextData(QmlContext *c) : context(c) {}
+ ContextData(QmlContext *c, QObject *o) : context(c), scopeObject(o) {}
QGuard<QmlContext> context;
+ QGuard<QObject> scopeObject;
};
/*
@@ -57,7 +58,7 @@ struct ContextData : public QScriptDeclarativeClass::Object {
*/
QmlContextScriptClass::QmlContextScriptClass(QmlEngine *bindEngine)
: QScriptDeclarativeClass(QmlEnginePrivate::getScriptEngine(bindEngine)), engine(bindEngine),
- lastData(0), lastPropertyIndex(-1), lastDefaultObject(-1)
+ lastScopeObject(0), lastContext(0), lastData(0), lastPropertyIndex(-1), lastDefaultObject(-1)
{
}
@@ -65,11 +66,11 @@ QmlContextScriptClass::~QmlContextScriptClass()
{
}
-QScriptValue QmlContextScriptClass::newContext(QmlContext *context)
+QScriptValue QmlContextScriptClass::newContext(QmlContext *context, QObject *scopeObject)
{
QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
- return newObject(scriptEngine, this, new ContextData(context));
+ return newObject(scriptEngine, this, new ContextData(context, scopeObject));
}
QmlContext *QmlContextScriptClass::contextFromValue(const QScriptValue &v)
@@ -81,24 +82,27 @@ QmlContext *QmlContextScriptClass::contextFromValue(const QScriptValue &v)
return data->context;
}
-#include <QDebug>
QScriptClass::QueryFlags
QmlContextScriptClass::queryProperty(Object *object, const Identifier &name,
QScriptClass::QueryFlags flags)
{
Q_UNUSED(flags);
+ lastScopeObject = 0;
lastContext = 0;
lastData = 0;
lastPropertyIndex = -1;
lastDefaultObject = -1;
QmlContext *bindContext = ((ContextData *)object)->context.data();
+ QObject *scopeObject = ((ContextData *)object)->scopeObject.data();
if (!bindContext)
return 0;
while (bindContext) {
- QScriptClass::QueryFlags rv = queryProperty(bindContext, name, flags);
+ QScriptClass::QueryFlags rv =
+ queryProperty(bindContext, scopeObject, name, flags);
+ scopeObject = 0; // Only applies to the first context
if (rv) return rv;
bindContext = bindContext->parentContext();
}
@@ -107,7 +111,8 @@ QmlContextScriptClass::queryProperty(Object *object, const Identifier &name,
}
QScriptClass::QueryFlags
-QmlContextScriptClass::queryProperty(QmlContext *bindContext, const Identifier &name,
+QmlContextScriptClass::queryProperty(QmlContext *bindContext, QObject *scopeObject,
+ const Identifier &name,
QScriptClass::QueryFlags flags)
{
QmlEnginePrivate *ep = QmlEnginePrivate::get(engine);
@@ -129,6 +134,24 @@ QmlContextScriptClass::queryProperty(QmlContext *bindContext, const Identifier &
}
}
+ for (int ii = 0; ii < cp->scripts.count(); ++ii) {
+ lastFunction = QScriptDeclarativeClass::function(cp->scripts.at(ii), name);
+ if (lastFunction.isValid()) {
+ lastContext = bindContext;
+ return QScriptClass::HandlesReadAccess;
+ }
+ }
+
+ if (scopeObject) {
+ QScriptClass::QueryFlags rv =
+ ep->objectClass->queryProperty(scopeObject, name, flags, 0);
+ if (rv) {
+ lastScopeObject = scopeObject;
+ lastContext = bindContext;
+ return rv;
+ }
+ }
+
for (int ii = 0; ii < cp->defaultObjects.count(); ++ii) {
QScriptClass::QueryFlags rv =
ep->objectClass->queryProperty(cp->defaultObjects.at(ii), name, flags, 0);
@@ -140,13 +163,6 @@ QmlContextScriptClass::queryProperty(QmlContext *bindContext, const Identifier &
}
}
- for (int ii = 0; ii < cp->scripts.count(); ++ii) {
- lastFunction = QScriptDeclarativeClass::function(cp->scripts.at(ii), name);
- if (lastFunction.isValid()) {
- lastContext = bindContext;
- return QScriptClass::HandlesReadAccess;
- }
- }
return 0;
}
@@ -160,8 +176,11 @@ QScriptValue QmlContextScriptClass::property(Object *object, const Identifier &n
QmlEnginePrivate *ep = QmlEnginePrivate::get(engine);
QmlContextPrivate *cp = QmlContextPrivate::get(bindContext);
+ if (lastScopeObject) {
- if (lastData) {
+ return ep->objectClass->property(lastScopeObject, name);
+
+ } else if (lastData) {
if (lastData->type)
return ep->typeNameClass->newObject(cp->defaultObjects.at(0), lastData->type);
@@ -197,7 +216,7 @@ QScriptValue QmlContextScriptClass::property(Object *object, const Identifier &n
void QmlContextScriptClass::setProperty(Object *object, const Identifier &name,
const QScriptValue &value)
{
- Q_ASSERT(lastDefaultObject != -1);
+ Q_ASSERT(lastScopeObject || lastDefaultObject != -1);
QmlContext *bindContext = lastContext;
Q_ASSERT(bindContext);
@@ -205,7 +224,11 @@ void QmlContextScriptClass::setProperty(Object *object, const Identifier &name,
QmlEnginePrivate *ep = QmlEnginePrivate::get(engine);
QmlContextPrivate *cp = QmlContextPrivate::get(bindContext);
- ep->objectClass->setProperty(cp->defaultObjects.at(lastDefaultObject), name, value);
+ if (lastScopeObject) {
+ ep->objectClass->setProperty(lastScopeObject, name, value);
+ } else {
+ ep->objectClass->setProperty(cp->defaultObjects.at(lastDefaultObject), name, value);
+ }
}
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qmlcontextscriptclass_p.h b/src/declarative/qml/qmlcontextscriptclass_p.h
index 761a115..126c8fe 100644
--- a/src/declarative/qml/qmlcontextscriptclass_p.h
+++ b/src/declarative/qml/qmlcontextscriptclass_p.h
@@ -67,7 +67,7 @@ public:
QmlContextScriptClass(QmlEngine *);
~QmlContextScriptClass();
- QScriptValue newContext(QmlContext *);
+ QScriptValue newContext(QmlContext *, QObject * = 0);
QmlContext *contextFromValue(const QScriptValue &);
@@ -78,11 +78,13 @@ protected:
virtual void setProperty(Object *, const Identifier &name, const QScriptValue &);
private:
- QScriptClass::QueryFlags queryProperty(QmlContext *, const Identifier &,
+ QScriptClass::QueryFlags queryProperty(QmlContext *, QObject *scopeObject,
+ const Identifier &,
QScriptClass::QueryFlags flags);
QmlEngine *engine;
+ QObject *lastScopeObject;
QmlContext *lastContext;
QmlTypeNameCache::Data *lastData;
int lastPropertyIndex;
diff --git a/src/declarative/qml/qmlexpression.cpp b/src/declarative/qml/qmlexpression.cpp
index 6a6ef5d..0de64d9 100644
--- a/src/declarative/qml/qmlexpression.cpp
+++ b/src/declarative/qml/qmlexpression.cpp
@@ -114,11 +114,8 @@ void QmlExpressionPrivate::init(QmlContext *ctxt, void *expr, QmlRefCount *rc,
new QScriptProgram(scriptEngine->compile(data->expression, data->fileName, data->line));
}
- QmlContextPrivate *ctxtPriv = ctxt->d_func();
QScriptContext *scriptContext = scriptEngine->pushCleanContext();
- scriptContext->pushScope(ctxtPriv->scriptValue);
- if (me)
- scriptContext->pushScope(ep->objectClass->newQObject(me));
+ scriptContext->pushScope(ep->contextClass->newContext(ctxt, me));
data->expressionFunction = scriptEngine->evaluate(*dd->programs[progIdx]);
@@ -297,10 +294,7 @@ QVariant QmlExpressionPrivate::evalQtScript(QObject *secondaryScope)
if (!data->expressionFunctionValid) {
QScriptContext *scriptContext = scriptEngine->pushCleanContext();
- scriptContext->pushScope(ctxtPriv->scriptValue);
-
- if (data->me)
- scriptContext->pushScope(ep->objectClass->newQObject(data->me));
+ scriptContext->pushScope(ep->contextClass->newContext(data->context(), data->me));
if (data->expressionRewritten) {
data->expressionFunction = scriptEngine->evaluate(data->expression,