diff options
Diffstat (limited to 'src/qml/jsruntime/qv4qobjectwrapper.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 81 |
1 files changed, 37 insertions, 44 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index 2edeb54b11..eaee078a5f 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -3,61 +3,53 @@ #include "qv4qobjectwrapper_p.h" -#include <private/qqmlobjectorgadget_p.h> -#include <private/qqmlengine_p.h> -#include <private/qqmlvmemetaobject_p.h> -#include <private/qqmlbinding_p.h> #include <private/qjsvalue_p.h> -#include <private/qqmlexpression_p.h> -#include <private/qqmlglobal_p.h> + +#include <private/qqmlbinding_p.h> +#include <private/qqmlbuiltinfunctions_p.h> +#include <private/qqmlengine_p.h> +#include <private/qqmlobjectorgadget_p.h> +#include <private/qqmlpropertybinding_p.h> +#include <private/qqmlscriptstring_p.h> +#include <private/qqmlsignalnames_p.h> #include <private/qqmltypewrapper_p.h> #include <private/qqmlvaluetypewrapper_p.h> -#include <private/qqmllistwrapper_p.h> -#include <private/qqmlbuiltinfunctions_p.h> -#if QT_CONFIG(qml_locale) -#include <private/qqmllocale_p.h> -#endif +#include <private/qqmlvmemetaobject_p.h> #include <private/qv4arraybuffer_p.h> +#include <private/qv4compileddata_p.h> +#include <private/qv4dateobject_p.h> #include <private/qv4functionobject_p.h> -#include <private/qv4runtime_p.h> -#include <private/qv4variantobject_p.h> #include <private/qv4identifiertable_p.h> -#include <private/qv4lookup_p.h> -#include <private/qv4qmlcontext_p.h> -#include <private/qv4sequenceobject_p.h> -#include <private/qv4objectproto_p.h> +#include <private/qv4jscall_p.h> #include <private/qv4jsonobject_p.h> +#include <private/qv4lookup_p.h> +#include <private/qv4mm_p.h> #include <private/qv4regexpobject_p.h> -#include <private/qv4dateobject_p.h> +#include <private/qv4runtime_p.h> #include <private/qv4scopedvalue_p.h> -#include <private/qv4jscall_p.h> -#include <private/qv4mm_p.h> -#include <private/qqmlscriptstring_p.h> -#include <private/qv4compileddata_p.h> -#include <private/qqmlpropertybinding_p.h> -#include <private/qqmlpropertycachemethodarguments_p.h> -#include <private/qqmlsignalnames_p.h> +#include <private/qv4sequenceobject_p.h> +#include <private/qv4variantobject_p.h> -#include <QtQml/qjsvalue.h> #include <QtCore/qjsonarray.h> #include <QtCore/qjsonobject.h> #include <QtCore/qjsonvalue.h> -#include <QtCore/qvarlengtharray.h> -#include <QtCore/qtimer.h> -#include <QtCore/qatomic.h> -#include <QtCore/qmetaobject.h> -#if QT_CONFIG(qml_itemmodel) -#include <QtCore/qabstractitemmodel.h> -#endif #include <QtCore/qloggingcategory.h> +#include <QtCore/qmetaobject.h> #include <QtCore/qqueue.h> +#include <QtCore/qtimer.h> #include <QtCore/qtypes.h> +#include <QtCore/qvarlengtharray.h> #include <vector> + +#if QT_CONFIG(qml_itemmodel) +#include <QtCore/qabstractitemmodel.h> +#endif + QT_BEGIN_NAMESPACE -Q_LOGGING_CATEGORY(lcBindingRemoval, "qt.qml.binding.removal", QtWarningMsg) +Q_LOGGING_CATEGORY(lcBuiltinsBindingRemoval, "qt.qml.binding.removal", QtWarningMsg) Q_LOGGING_CATEGORY(lcObjectConnect, "qt.qml.object.connect", QtWarningMsg) Q_LOGGING_CATEGORY(lcOverloadResolution, "qt.qml.overloadresolution", QtWarningMsg) Q_LOGGING_CATEGORY(lcMethodBehavior, "qt.qml.method.behavior") @@ -246,11 +238,8 @@ static ReturnedValue loadProperty( property.readProperty(object, &v); return QV4::JsonObject::fromJsonObject(v4, v); } - case QMetaType::QJsonArray: { - QJsonArray v; - property.readProperty(object, &v); - return QV4::JsonObject::fromJsonArray(v4, v); - } + case QMetaType::QJsonArray: + return encodeSequence(QMetaSequence::fromContainer<QJsonArray>()); case QMetaType::QStringList: return encodeSequence(QMetaSequence::fromContainer<QStringList>()); case QMetaType::QVariantList: @@ -602,7 +591,9 @@ void QObjectWrapper::setProperty( Scope scope(engine); if (ScopedFunctionObject f(scope, value); f) { - if (!f->isBinding()) { + if (f->as<QQmlTypeWrapper>()) { + // Ignore. It's probably a singleton or an attached type. + } else if (!f->isBinding()) { const bool isAliasToAllowed = [&]() { if (property->isAlias()) { const QQmlPropertyIndex originalIndex(property->coreIndex(), -1); @@ -673,13 +664,13 @@ void QObjectWrapper::setProperty( } } - if (Q_UNLIKELY(lcBindingRemoval().isInfoEnabled())) { + if (Q_UNLIKELY(lcBuiltinsBindingRemoval().isInfoEnabled())) { if (auto binding = QQmlPropertyPrivate::binding(object, QQmlPropertyIndex(property->coreIndex()))) { const auto stackFrame = engine->currentStackFrame; switch (binding->kind()) { case QQmlAbstractBinding::QmlBinding: { const auto qmlBinding = static_cast<const QQmlBinding*>(binding); - qCInfo(lcBindingRemoval, + qCInfo(lcBuiltinsBindingRemoval, "Overwriting binding on %s::%s at %s:%d that was initially bound at %s", object->metaObject()->className(), qPrintable(property->name(object)), qPrintable(stackFrame->source()), stackFrame->lineNumber(), @@ -688,7 +679,7 @@ void QObjectWrapper::setProperty( } case QQmlAbstractBinding::ValueTypeProxy: case QQmlAbstractBinding::PropertyToPropertyBinding: { - qCInfo(lcBindingRemoval, + qCInfo(lcBuiltinsBindingRemoval, "Overwriting binding on %s::%s at %s:%d", object->metaObject()->className(), qPrintable(property->name(object)), qPrintable(stackFrame->source()), stackFrame->lineNumber()); @@ -716,7 +707,9 @@ void QObjectWrapper::setProperty( const QMetaType propType = property->propType(); // functions are already handled, except for the QJSValue case - Q_ASSERT(!value.as<FunctionObject>() || propType == QMetaType::fromType<QJSValue>()); + Q_ASSERT(!value.as<FunctionObject>() + || value.as<QV4::QQmlTypeWrapper>() + || propType == QMetaType::fromType<QJSValue>()); if (value.isNull() && property->isQObject()) { PROPERTY_STORE(QObject*, nullptr); |