aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/language
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2014-09-25 15:22:35 +0200
committerJoerg Bornemann <joerg.bornemann@digia.com>2014-09-25 16:21:15 +0200
commitdcc4f9723e9e1daebc4ca634d57cd57ac4fbcc4f (patch)
treeea1d6ba3f02cabc30802504bbdc965f17341183f /src/lib/corelib/language
parent3e15d28d2883132f60e63bac915e6a7d0c4a0e37 (diff)
fix evaluation scope of module properties
Consider module A that depends on module B. Module properties of B were evaluated in the wrong scope. The comment in evaluatorscriptclass.cpp states correctly "Own properties of module instances must not have the instance itself in the scope.", but the corresponding check was slightly wrong. We must check whether the item that the property belongs to is a module instance or not. Task-number: QBS-515 Change-Id: Ic96b83fbca8b9ea783165a15b7c8398640a4dd84 Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'src/lib/corelib/language')
-rw-r--r--src/lib/corelib/language/evaluatorscriptclass.cpp19
-rw-r--r--src/lib/corelib/language/evaluatorscriptclass.h4
-rw-r--r--src/lib/corelib/language/testdata/modules/dummy/dummy.qbs2
-rw-r--r--src/lib/corelib/language/testdata/modules/dummyqt/core/dummycore.qbs1
-rw-r--r--src/lib/corelib/language/testdata/modules/dummyqt/gui/dummygui.qbs3
5 files changed, 17 insertions, 12 deletions
diff --git a/src/lib/corelib/language/evaluatorscriptclass.cpp b/src/lib/corelib/language/evaluatorscriptclass.cpp
index 8fcd785eb..788d75c7c 100644
--- a/src/lib/corelib/language/evaluatorscriptclass.cpp
+++ b/src/lib/corelib/language/evaluatorscriptclass.cpp
@@ -55,7 +55,7 @@ class SVConverter : ValueHandler
QScriptContext *const scriptContext;
const QScriptValue *object;
const ValuePtr &valuePtr;
- const bool inPrototype;
+ const Item * const itemOfProperty;
char pushedScopesCount;
public:
@@ -64,13 +64,13 @@ public:
QScriptValue *result;
SVConverter(EvaluatorScriptClass *esc, const QScriptValue *obj, const ValuePtr &v,
- bool _inPrototype)
+ const Item *_itemOfProperty)
: scriptClass(esc)
, engine(static_cast<ScriptEngine *>(esc->engine()))
, scriptContext(esc->engine()->currentContext())
, object(obj)
, valuePtr(v)
- , inPrototype(_inPrototype)
+ , itemOfProperty(_itemOfProperty)
, pushedScopesCount(0)
{
}
@@ -194,7 +194,7 @@ private:
if (value->sourceUsesBase()) {
QScriptValue baseValue;
if (value->baseValue()) {
- SVConverter converter(scriptClass, object, value->baseValue(), inPrototype);
+ SVConverter converter(scriptClass, object, value->baseValue(), itemOfProperty);
converter.propertyName = propertyName;
converter.data = data;
converter.result = &baseValue;
@@ -208,7 +208,7 @@ private:
pushScope(data->evaluator->fileScope(value->file()));
pushItemScopes(data->item);
- if (inPrototype || !data->item->isModuleInstance()) {
+ if (itemOfProperty && !itemOfProperty->isModuleInstance()) {
// Own properties of module instances must not have the instance itself in the scope.
pushScope(*object);
}
@@ -297,8 +297,7 @@ QScriptClass::QueryFlags EvaluatorScriptClass::queryItemProperty(const Evaluatio
m_queryResult.value = item->properties().value(name);
if (!m_queryResult.value.isNull()) {
m_queryResult.data = data;
- if (data->item != item)
- m_queryResult.inPrototype = true;
+ m_queryResult.itemOfProperty = item;
return HandlesReadAccess;
}
}
@@ -374,9 +373,9 @@ QScriptValue EvaluatorScriptClass::property(const QScriptValue &object, const QS
uint id)
{
const EvaluationData *data = m_queryResult.data;
- const bool inPrototype = m_queryResult.inPrototype;
+ const Item * const itemOfProperty = m_queryResult.itemOfProperty;
m_queryResult.data = 0;
- m_queryResult.inPrototype = false;
+ m_queryResult.itemOfProperty = 0;
QBS_ASSERT(data, return QScriptValue());
const QueryPropertyType qpt = static_cast<QueryPropertyType>(id);
@@ -401,7 +400,7 @@ QScriptValue EvaluatorScriptClass::property(const QScriptValue &object, const QS
return result;
}
- SVConverter converter(this, &object, value, inPrototype);
+ SVConverter converter(this, &object, value, itemOfProperty);
converter.propertyName = &name;
converter.data = data;
converter.result = &result;
diff --git a/src/lib/corelib/language/evaluatorscriptclass.h b/src/lib/corelib/language/evaluatorscriptclass.h
index 4803a21b9..5bc079ed0 100644
--- a/src/lib/corelib/language/evaluatorscriptclass.h
+++ b/src/lib/corelib/language/evaluatorscriptclass.h
@@ -72,7 +72,7 @@ private:
struct QueryResult
{
QueryResult()
- : data(0), inPrototype(false)
+ : data(0), itemOfProperty(0)
{}
bool isNull() const
@@ -81,7 +81,7 @@ private:
}
const EvaluationData *data;
- bool inPrototype;
+ const Item *itemOfProperty; // The item that owns the property.
ValuePtr value;
};
QueryResult m_queryResult;
diff --git a/src/lib/corelib/language/testdata/modules/dummy/dummy.qbs b/src/lib/corelib/language/testdata/modules/dummy/dummy.qbs
index 9484a70b8..d8f66018f 100644
--- a/src/lib/corelib/language/testdata/modules/dummy/dummy.qbs
+++ b/src/lib/corelib/language/testdata/modules/dummy/dummy.qbs
@@ -5,4 +5,6 @@ DummyBase {
property stringList defines
property stringList cFlags
property stringList cxxFlags
+ property string someString
+ property string zort: "zort in dummy"
}
diff --git a/src/lib/corelib/language/testdata/modules/dummyqt/core/dummycore.qbs b/src/lib/corelib/language/testdata/modules/dummyqt/core/dummycore.qbs
index 13f5e6fc1..9dfa95912 100644
--- a/src/lib/corelib/language/testdata/modules/dummyqt/core/dummycore.qbs
+++ b/src/lib/corelib/language/testdata/modules/dummyqt/core/dummycore.qbs
@@ -8,6 +8,7 @@ Module {
property string version: versionMajor.toString() + "." + versionMinor.toString() + "." + versionPatch.toString()
property string coreProperty: "coreProperty"
property string coreVersion: qtcore.version
+ property string zort: "zort in dummyqt.core"
Depends { name: "dummy" }
dummy.defines: ["QT_CORE"]
diff --git a/src/lib/corelib/language/testdata/modules/dummyqt/gui/dummygui.qbs b/src/lib/corelib/language/testdata/modules/dummyqt/gui/dummygui.qbs
index a42003c34..52dc82d23 100644
--- a/src/lib/corelib/language/testdata/modules/dummyqt/gui/dummygui.qbs
+++ b/src/lib/corelib/language/testdata/modules/dummyqt/gui/dummygui.qbs
@@ -3,7 +3,10 @@ import qbs 1.0
Module {
Depends { name: "dummyqt.core" }
property string guiProperty: "guiProperty"
+ property string someString: "ene mene muh"
Depends { name: "dummy" }
dummy.defines: ["QT_GUI"]
+ dummy.someString: someString
+ dummy.zort: dummyqt.core.zort
}