diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-09-25 15:22:35 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-09-25 16:21:15 +0200 |
commit | dcc4f9723e9e1daebc4ca634d57cd57ac4fbcc4f (patch) | |
tree | ea1d6ba3f02cabc30802504bbdc965f17341183f /src/lib/corelib/language | |
parent | 3e15d28d2883132f60e63bac915e6a7d0c4a0e37 (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')
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 } |