aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSebastian Sauer <sebastian.sauer.ford@kdab.com>2014-08-12 18:52:50 +0700
committerSebastian Sauer <sebastian.sauer@kdab.com>2014-08-22 20:46:08 +0200
commit595340f1622783e97c53b035b78691572537f00a (patch)
treeb3c5d037fd6feaeb5cc63bf6c24545a83c861e4b /src
parent29efdf1981a60a796e611f3bc8763afdcb6c2497 (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.cpp2
-rw-r--r--src/qml/compiler/qv4compileddata_p.h2
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp14
-rw-r--r--src/qml/qml/qqmlscriptstring.h4
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