diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2018-02-13 20:21:34 +0100 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2018-02-13 20:21:35 +0100 |
commit | 268931e742908368a7eab7c16021601bb0a95dc5 (patch) | |
tree | 3ba9f4fdde1a618c2724878973392b1fe619c7c9 /src/qml | |
parent | cad65e4eb34110a48545bf1fdb2e83d848c5184c (diff) | |
parent | b733c37522abeb33f2e14f7a8fdefaf15acf42b5 (diff) |
Merge remote-tracking branch 'origin/5.11' into dev
Change-Id: Ib297817e2fd9b6790d9bc8ee522c32f5b3422574
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/compiler/qv4compileddata.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsapi/qjsengine.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsapi/qjsvalue.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 3 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine_p.h | 11 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4regexp.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4regexp_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmlcontext.cpp | 1 | ||||
-rw-r--r-- | src/qml/qml/qqmlimport.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/qqmllist.cpp | 10 | ||||
-rw-r--r-- | src/qml/types/qqmllistmodel.cpp | 10 | ||||
-rw-r--r-- | src/qml/util/qqmlpropertymap.cpp | 2 |
13 files changed, 42 insertions, 25 deletions
diff --git a/src/qml/compiler/qv4compileddata.cpp b/src/qml/compiler/qv4compileddata.cpp index 86cdb3eade..86200d7df7 100644 --- a/src/qml/compiler/qv4compileddata.cpp +++ b/src/qml/compiler/qv4compileddata.cpp @@ -84,8 +84,10 @@ static QString cacheFilePath(const QUrl &url) { const QString localSourcePath = QQmlFile::urlToLocalFileOrQrc(url); const QString localCachePath = localSourcePath + QLatin1Char('c'); +#ifndef Q_OS_ANDROID if (QFile::exists(localCachePath) || QFileInfo(QFileInfo(localSourcePath).dir().absolutePath()).isWritable()) return localCachePath; +#endif QCryptographicHash fileNameHash(QCryptographicHash::Sha1); fileNameHash.addData(localSourcePath.toUtf8()); QString directory = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + QLatin1String("/qmlcache/"); diff --git a/src/qml/jsapi/qjsengine.cpp b/src/qml/jsapi/qjsengine.cpp index d03882f233..048c5856ce 100644 --- a/src/qml/jsapi/qjsengine.cpp +++ b/src/qml/jsapi/qjsengine.cpp @@ -552,7 +552,7 @@ QJSValue QJSEngine::newQMetaObject(const QMetaObject* metaObject) { return QJSValue(v4, v->asReturnedValue()); } -/*! \fn QJSValue QJSEngine::newQMetaObject<T>() +/*! \fn template <typename T> QJSValue QJSEngine::newQMetaObject() \since 5.8 Creates a JavaScript object that wraps the static QMetaObject associated @@ -710,14 +710,14 @@ bool QJSEngine::convertV2(const QJSValue &value, int type, void *ptr) } } -/*! \fn QJSValue QJSEngine::toScriptValue(const T &value) +/*! \fn template <typename T> QJSValue QJSEngine::toScriptValue(const T &value) Creates a QJSValue with the given \a value. \sa fromScriptValue() */ -/*! \fn T QJSEngine::fromScriptValue(const QJSValue &value) +/*! \fn template <typename T> T QJSEngine::fromScriptValue(const QJSValue &value) Returns the given \a value converted to the template type \c{T}. diff --git a/src/qml/jsapi/qjsvalue.cpp b/src/qml/jsapi/qjsvalue.cpp index c1a135c835..adfa98bd46 100644 --- a/src/qml/jsapi/qjsvalue.cpp +++ b/src/qml/jsapi/qjsvalue.cpp @@ -232,7 +232,7 @@ QJSValue::QJSValue(const QJSValue& other) */ /*! - \fn QJSValue &operator=(QJSValue && other) + \fn QJSValue &QJSValue::operator=(QJSValue && other) Move-assigns \a other to this QJSValue object. */ diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 15c6e98ea7..c033a7d805 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -124,6 +124,9 @@ QQmlEngine *ExecutionEngine::qmlEngine() const #endif // V4_BOOTSTRAP qint32 ExecutionEngine::maxCallDepth = -1; +#if defined(V4_ENABLE_JIT) && !defined(V4_BOOTSTRAP) +const bool ExecutionEngine::canAllocateExecutableMemory = OSAllocator::canAllocateExecutableMemory(); +#endif ExecutionEngine::ExecutionEngine(QJSEngine *jsEngine) : executableAllocator(new QV4::ExecutableAllocator) diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index 61154d89a3..c955d1ab9e 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -488,10 +488,14 @@ public: bool checkStackLimits(); - bool canJIT(Function *f) + bool canJIT(Function *f = nullptr) { #if defined(V4_ENABLE_JIT) && !defined(V4_BOOTSTRAP) - return f->interpreterCallCount >= jitCallCountThreshold; + if (!canAllocateExecutableMemory) + return false; + if (f) + return f->interpreterCallCount >= jitCallCountThreshold; + return true; #else Q_UNUSED(f); return false; @@ -506,6 +510,9 @@ private: QScopedPointer<QV4::Profiling::Profiler> m_profiler; #endif int jitCallCountThreshold; +#if defined(V4_ENABLE_JIT) && !defined(V4_BOOTSTRAP) + static const bool canAllocateExecutableMemory; +#endif }; // This is a trick to tell the code generators that functions taking a NoThrowContext won't diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index 4e72539c1d..33298f5d98 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -1194,7 +1194,7 @@ static QV4::ReturnedValue CallMethod(const QQmlObjectOrGadget &object, int index } } -/*! +/* Returns the match score for converting \a actual to be of type \a conversionType. A zero score means "perfect match" whereas a higher score is worse. @@ -1351,7 +1351,7 @@ static inline int QMetaObject_methods(const QMetaObject *metaObject) return reinterpret_cast<const Private *>(metaObject->d.data)->methodCount; } -/*! +/* Returns the next related method, if one, or 0. */ static const QQmlPropertyData * RelatedMethod(const QQmlObjectOrGadget &object, @@ -1441,7 +1441,7 @@ static QV4::ReturnedValue CallPrecise(const QQmlObjectOrGadget &object, const QQ } } -/*! +/* Resolve the overloaded method to call. The algorithm works conceptually like this: 1. Resolve the set of overloads it is *possible* to call. Impossible overloads include those that have too many parameters or have parameters diff --git a/src/qml/jsruntime/qv4regexp.cpp b/src/qml/jsruntime/qv4regexp.cpp index fb49def317..36616bc024 100644 --- a/src/qml/jsruntime/qv4regexp.cpp +++ b/src/qml/jsruntime/qv4regexp.cpp @@ -82,7 +82,7 @@ Heap::RegExp *RegExp::create(ExecutionEngine* engine, const QString& pattern, bo return result->d(); Scope scope(engine); - Scoped<RegExp> result(scope, engine->memoryManager->alloc<RegExp>(pattern, ignoreCase, multiline, global)); + Scoped<RegExp> result(scope, engine->memoryManager->alloc<RegExp>(engine, pattern, ignoreCase, multiline, global)); result->d()->cache = cache; cachedValue.set(engine, result); @@ -90,7 +90,7 @@ Heap::RegExp *RegExp::create(ExecutionEngine* engine, const QString& pattern, bo return result->d(); } -void Heap::RegExp::init(const QString &pattern, bool ignoreCase, bool multiline, bool global) +void Heap::RegExp::init(ExecutionEngine *engine, const QString &pattern, bool ignoreCase, bool multiline, bool global) { Base::init(); this->pattern = new QString(pattern); @@ -106,7 +106,7 @@ void Heap::RegExp::init(const QString &pattern, bool ignoreCase, bool multiline, return; subPatternCount = yarrPattern.m_numSubpatterns; #if ENABLE(YARR_JIT) - if (!yarrPattern.m_containsBackreferences) { + if (!yarrPattern.m_containsBackreferences && engine->canJIT()) { jitCode = new JSC::Yarr::YarrCodeBlock; JSC::JSGlobalData dummy(internalClass->engine->regExpAllocator); JSC::Yarr::jitCompile(yarrPattern, JSC::Yarr::Char16, &dummy, *jitCode); diff --git a/src/qml/jsruntime/qv4regexp_p.h b/src/qml/jsruntime/qv4regexp_p.h index 94bebbd931..56454f73d3 100644 --- a/src/qml/jsruntime/qv4regexp_p.h +++ b/src/qml/jsruntime/qv4regexp_p.h @@ -76,7 +76,7 @@ struct RegExpCacheKey; namespace Heap { struct RegExp : Base { - void init(const QString& pattern, bool ignoreCase, bool multiline, bool global); + void init(ExecutionEngine *engine, const QString& pattern, bool ignoreCase, bool multiline, bool global); void destroy(); QString *pattern; diff --git a/src/qml/qml/qqmlcontext.cpp b/src/qml/qml/qqmlcontext.cpp index e6e2be91f6..de43108312 100644 --- a/src/qml/qml/qqmlcontext.cpp +++ b/src/qml/qml/qqmlcontext.cpp @@ -365,6 +365,7 @@ void QQmlContext::setContextProperties(const QVector<PropertyPair> &properties) \since 5.11 \class QQmlContext::PropertyPair + \inmodule QtQml This struct contains a property name and a property value. It is used as a parameter for the \c setContextProperties function. diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp index 8b0bd9d6ec..f2757c34be 100644 --- a/src/qml/qml/qqmlimport.cpp +++ b/src/qml/qml/qqmlimport.cpp @@ -981,7 +981,7 @@ QQmlImportNamespace *QQmlImportsPrivate::findQualifiedNamespace(const QHashedStr return 0; } -/*! +/* Returns the list of possible versioned URI combinations. For example, if \a uri is QtQml.Models, \a vmaj is 2, and \a vmin is 0, this method returns the following: [QtQml.Models.2.0, QtQml.2.0.Models, QtQml.Models.2, QtQml.2.Models, QtQml.Models] @@ -1017,7 +1017,7 @@ static QVector<QStaticPlugin> makePlugins() return plugins; } -/*! +/* Get all static plugins that are QML plugins and has a meta data URI that matches with one of \a versionUris, which is a list of all possible versioned URI combinations - see versionUriList() above. @@ -1059,7 +1059,7 @@ static inline QString msgCannotLoadPlugin(const QString &uri, const QString &why } #endif -/*! +/* Import an extension defined by a qmldir file. \a qmldirFilePath is a raw file path. diff --git a/src/qml/qml/qqmllist.cpp b/src/qml/qml/qqmllist.cpp index 71be2e82a3..9bfdd3da35 100644 --- a/src/qml/qml/qqmllist.cpp +++ b/src/qml/qml/qqmllist.cpp @@ -374,12 +374,12 @@ The \l {Qt Quick 1} version of this class is named QDeclarativeListProperty. */ /*! -\fn QQmlListProperty::QQmlListProperty() +\fn template<typename T> QQmlListProperty<T>::QQmlListProperty() \internal */ /*! -\fn QQmlListProperty::QQmlListProperty(QObject *object, QList<T *> &list) +\fn template<typename T> QQmlListProperty<T>::QQmlListProperty(QObject *object, QList<T *> &list) Convenience constructor for making a QQmlListProperty value from an existing QList \a list. The \a list reference must remain valid for as long as \a object @@ -391,7 +391,7 @@ can be very useful while prototyping. */ /*! -\fn QQmlListProperty::QQmlListProperty(QObject *object, void *data, +\fn template<typename T> QQmlListProperty<T>::QQmlListProperty(QObject *object, void *data, CountFunction count, AtFunction at) Construct a readonly QQmlListProperty from a set of operation functions @@ -401,7 +401,7 @@ remains valid while \a object exists. */ /*! -\fn QQmlListProperty::QQmlListProperty(QObject *object, void *data, AppendFunction append, +\fn template<typename T> QQmlListProperty<T>::QQmlListProperty(QObject *object, void *data, AppendFunction append, CountFunction count, AtFunction at, ClearFunction clear) @@ -432,7 +432,7 @@ Return the number of elements in the list \a property. */ /*! -\fn bool QQmlListProperty::operator==(const QQmlListProperty &other) const +\fn template<typename T> bool QQmlListProperty<T>::operator==(const QQmlListProperty &other) const Returns true if this QQmlListProperty is equal to \a other, otherwise false. */ diff --git a/src/qml/types/qqmllistmodel.cpp b/src/qml/types/qqmllistmodel.cpp index 299de8de70..b5c45d3aa4 100644 --- a/src/qml/types/qqmllistmodel.cpp +++ b/src/qml/types/qqmllistmodel.cpp @@ -265,7 +265,12 @@ QObject *ListModel::getOrCreateModelObject(QQmlListModel *model, int elementInde { ListElement *e = elements[elementIndex]; if (e->m_objectCache == 0) { - e->m_objectCache = new QObject; + void *memory = operator new(sizeof(QObject) + sizeof(QQmlData)); + void *ddataMemory = ((char *)memory) + sizeof(QObject); + e->m_objectCache = new (memory) QObject; + QQmlData *ddata = new (ddataMemory) QQmlData; + ddata->ownMemory = false; + QObjectPrivate::get(e->m_objectCache)->declarativeData = ddata; (void)new ModelNodeMetaObject(e->m_objectCache, model, elementIndex); } return e->m_objectCache; @@ -2428,8 +2433,7 @@ QQmlV4Handle QQmlListModel::get(int index) const QObject *object = m_listModel->getOrCreateModelObject(const_cast<QQmlListModel *>(this), index); result = scope.engine->memoryManager->allocObject<QV4::ModelObject>(object, const_cast<QQmlListModel *>(this), index); // Keep track of the QObjectWrapper in persistent value storage - QV4::Value *val = scope.engine->memoryManager->m_weakValues->allocate(); - *val = result; + QQmlData::get(object)->jsWrapper.set(scope.engine, result); } } diff --git a/src/qml/util/qqmlpropertymap.cpp b/src/qml/util/qqmlpropertymap.cpp index b54e8d901a..578c05086f 100644 --- a/src/qml/util/qqmlpropertymap.cpp +++ b/src/qml/util/qqmlpropertymap.cpp @@ -355,7 +355,7 @@ QQmlPropertyMap::QQmlPropertyMap(const QMetaObject *staticMetaObject, QObject *p */ /*! - \fn QQmlPropertyMap::QQmlPropertyMap(DerivedType *derived, QObject *parent) + \fn template<class DerivedType> QQmlPropertyMap::QQmlPropertyMap(DerivedType *derived, QObject *parent) Constructs a bindable map with parent object \a parent. Use this constructor in classes derived from QQmlPropertyMap. |