diff options
author | Sebastian Sauer <sebastian.sauer.ford@kdab.com> | 2014-08-12 18:52:50 +0700 |
---|---|---|
committer | Sebastian Sauer <sebastian.sauer@kdab.com> | 2014-08-22 20:46:08 +0200 |
commit | 595340f1622783e97c53b035b78691572537f00a (patch) | |
tree | b3c5d037fd6feaeb5cc63bf6c24545a83c861e4b /src | |
parent | 29efdf1981a60a796e611f3bc8763afdcb6c2497 (diff) |
v4: Enable primitive conversation to QQmlScriptString in javascript
This makes following QML-code proper working:
ParentChange {
x: 0
Component.onCompleted: x = 10
}
where x is a QQmlScriptString.
Before this patch an error-message would be thrown that the
bool/int/string/etc cannot be converted to a QQmlScriptString.
With the patch primitive types including null and undefined are
proper converted to a QQmlScriptString. The patch ignores (as
in not implements) function/binding assignment.
Unfortunately since commit aa25ad8d5f4 its not possible any
longer to instanciate QQmlScriptString what means there is
otherwise no (easy) way to inject a QQmlScriptString from
within Javascript.
Change-Id: I18aac6a6e9a57f3b7d0a2d66cdab2be6c3c153c5
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/compiler/qv4compileddata.cpp | 2 | ||||
-rw-r--r-- | src/qml/compiler/qv4compileddata_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 14 | ||||
-rw-r--r-- | src/qml/qml/qqmlscriptstring.h | 4 |
4 files changed, 20 insertions, 2 deletions
diff --git a/src/qml/compiler/qv4compileddata.cpp b/src/qml/compiler/qv4compileddata.cpp index cd9d8fe8a9..01561eb566 100644 --- a/src/qml/compiler/qv4compileddata.cpp +++ b/src/qml/compiler/qv4compileddata.cpp @@ -233,7 +233,7 @@ QString Binding::valueAsString(const Unit *unit) const } //reverse of Lexer::singleEscape() -static QString escapedString(const QString &string) +QString Binding::escapedString(const QString &string) { QString tmp = QLatin1String("\""); for (int i = 0; i < string.length(); ++i) { diff --git a/src/qml/compiler/qv4compileddata_p.h b/src/qml/compiler/qv4compileddata_p.h index 869caad8bd..78b7b4692d 100644 --- a/src/qml/compiler/qv4compileddata_p.h +++ b/src/qml/compiler/qv4compileddata_p.h @@ -284,6 +284,8 @@ struct Q_QML_PRIVATE_EXPORT Binding return false; } + static QString escapedString(const QString &string); + bool evaluatesToString() const { return type == Type_String || type == Type_Translation || type == Type_TranslationById; } QString valueAsString(const Unit *unit) const; diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index e12b8f1756..c5c04c0a56 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -65,6 +65,8 @@ #include <private/qv4regexpobject_p.h> #include <private/qv4scopedvalue_p.h> #include <private/qv4mm_p.h> +#include <private/qqmlscriptstring_p.h> +#include <private/qv4compileddata_p.h> #include <QtQml/qjsvalue.h> #include <QtCore/qjsonarray.h> @@ -511,7 +513,7 @@ void QObjectWrapper::setProperty(QObject *object, ExecutionContext *ctx, QQmlPro PROPERTY_STORE(QJsonValue, QJsonValue(QJsonValue::Undefined)); } else if (!newBinding && property->propType == qMetaTypeId<QJSValue>()) { PROPERTY_STORE(QJSValue, new QJSValuePrivate(ctx->d()->engine, value)); - } else if (value->isUndefined()) { + } else if (value->isUndefined() && property->propType != qMetaTypeId<QQmlScriptString>()) { QString error = QLatin1String("Cannot assign [undefined] to "); if (!QMetaType::typeName(property->propType)) error += QLatin1String("[unknown property type]"); @@ -535,6 +537,16 @@ void QObjectWrapper::setProperty(QObject *object, ExecutionContext *ctx, QQmlPro QQmlVMEMetaObject *vmemo = QQmlVMEMetaObject::get(object); Q_ASSERT(vmemo); vmemo->setVMEProperty(property->coreIndex, value); + } else if (property->propType == qMetaTypeId<QQmlScriptString>() && (value->isUndefined() || value->isPrimitive())) { + QQmlScriptString ss(value->toQStringNoThrow(), 0 /* context */, object); + if (value->isNumber()) { + ss.d->numberValue = value->toNumber(); + ss.d->isNumberLiteral = true; + } else if (value->isString()) { + ss.d->script = QV4::CompiledData::Binding::escapedString(ss.d->script); + ss.d->isStringLiteral = true; + } + PROPERTY_STORE(QQmlScriptString, ss); } else { QVariant v; if (property->isQList()) diff --git a/src/qml/qml/qqmlscriptstring.h b/src/qml/qml/qqmlscriptstring.h index 2c10df6efc..d85df0e867 100644 --- a/src/qml/qml/qqmlscriptstring.h +++ b/src/qml/qml/qqmlscriptstring.h @@ -54,6 +54,9 @@ class QObject; class QQmlContext; class QQmlScriptStringPrivate; class QQmlObjectCreator; +namespace QV4 { + struct QObjectWrapper; +} class Q_QML_EXPORT QQmlScriptString { public: @@ -79,6 +82,7 @@ private: friend class QQmlScriptStringPrivate; friend class QQmlExpression; friend class QQmlBinding; + friend struct QV4::QObjectWrapper; }; QT_END_NAMESPACE |