Merge remote-tracking branch 'origin/dev' into HEAD
Change-Id: If91e0e28d004f1db978dcab393f189743bb69cd5
This commit is contained in:
commit
0837453ef9
|
@ -0,0 +1,53 @@
|
|||
Qt 5.6.1 is a bug-fix release. It maintains both forward and backward
|
||||
compatibility (source and binary) with Qt 5.6.0.
|
||||
|
||||
For more details, refer to the online documentation included in this
|
||||
distribution. The documentation is also available online:
|
||||
|
||||
http://qt-project.org/doc/qt-5.6
|
||||
|
||||
The Qt version 5.6 series is binary compatible with the 5.5.x series.
|
||||
Applications compiled for 5.5 will continue to run with 5.6.
|
||||
|
||||
Some of the changes listed in this file include issue tracking numbers
|
||||
corresponding to tasks in the Qt Bug Tracker:
|
||||
|
||||
http://bugreports.qt-project.org/
|
||||
|
||||
Each of these identifiers can be entered in the bug tracker to obtain more
|
||||
information about a particular change.
|
||||
|
||||
****************************************************************************
|
||||
* Important Behavior Changes *
|
||||
****************************************************************************
|
||||
|
||||
* [QTBUG-51746] When matching the method signature of a invokable method to
|
||||
the slot in the metaobject, the matching function now assigns the best
|
||||
match to a QJSValue if the parameter actually is a QJSValue. This corrects
|
||||
the previous behavior, where QJSValue and int were given the same match
|
||||
score even though QJSValue would have been the best match.
|
||||
* [QTBUG-50604] Assigning NaN to an Item's x or y previously had the side effect
|
||||
of making the item invisible (as well as warning about a bad
|
||||
QTransform::translate call). Setting NaN will now be ignored (as it already
|
||||
was for width and height), and no longer have any visual effect.
|
||||
* [QTBUG-51231] TextInput with a non-Normal echoMode can now no longer cut or
|
||||
copy text.
|
||||
|
||||
****************************************************************************
|
||||
* Library *
|
||||
****************************************************************************
|
||||
|
||||
QtQuick
|
||||
-----------------
|
||||
|
||||
- QQuickPaintedItem: When the device pixel ratio is changed for the screen the item is rendered
|
||||
on then the item will be updated.
|
||||
- [QTBUG-50085] Canvas: Fix crash when item has a negative width or height.
|
||||
- [QTBUG-48870] GridView: Don't get "holes" in the grid if model updates occur
|
||||
frequently.
|
||||
|
||||
QtQml
|
||||
-----
|
||||
|
||||
- [QTBUG-52065] Fix crash with Array.unshift()
|
||||
|
|
@ -11,6 +11,7 @@ qtHaveModule(quick) {
|
|||
|
||||
SUBDIRS += \
|
||||
referenceexamples \
|
||||
tutorials \
|
||||
shell
|
||||
|
||||
EXAMPLE_FILES = \
|
||||
|
|
|
@ -21,3 +21,5 @@ target.path += $$[QT_INSTALL_EXAMPLES]/qml/qmlextensionplugins/imports/TimeExamp
|
|||
pluginfiles.path += $$[QT_INSTALL_EXAMPLES]/qml/qmlextensionplugins/imports/TimeExample
|
||||
|
||||
INSTALLS += target qml pluginfiles
|
||||
|
||||
CONFIG += install_ok # Do not cargo-cult this!
|
||||
|
|
|
@ -4,9 +4,9 @@ HEADERS += piechart.h
|
|||
SOURCES += piechart.cpp \
|
||||
main.cpp
|
||||
|
||||
RESOURCES += chapter3-binding.qrc
|
||||
RESOURCES += chapter3-bindings.qrc
|
||||
|
||||
DESTPATH = $$[QT_INSTALL_EXAMPLES]/qml/tutorials/extending-qml/chapter3-binding
|
||||
DESTPATH = $$[QT_INSTALL_EXAMPLES]/qml/tutorials/extending-qml/chapter3-bindings
|
||||
target.path = $$DESTPATH
|
||||
|
||||
qml.files = *.qml
|
||||
|
|
|
@ -13,3 +13,6 @@ osx {
|
|||
|
||||
SOURCES += main.cpp
|
||||
RESOURCES += app.qrc
|
||||
|
||||
target.path = $$[QT_INSTALL_EXAMPLES]/qml/tutorials/extending-qml/chapter6-plugins
|
||||
INSTALLS += target
|
||||
|
|
|
@ -20,7 +20,11 @@ qmldir.files=$$PWD/qmldir
|
|||
qmldir.path=$$DESTPATH
|
||||
INSTALLS += target qmldir
|
||||
|
||||
CONFIG += install_ok # Do not cargo-cult this!
|
||||
|
||||
OTHER_FILES += qmldir
|
||||
|
||||
# Copy the qmldir file to the same folder as the plugin binary
|
||||
QMAKE_POST_LINK += $$QMAKE_COPY $$replace($$list($$quote($$PWD/qmldir) $$DESTDIR), /, $$QMAKE_DIR_SEP)
|
||||
cpqmldir.files = qmldir
|
||||
cpqmldir.path = $$DESTDIR
|
||||
COPIES += cpqmldir
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
TEMPLATE = subdirs
|
||||
qtHaveModule(quick): SUBDIRS += \
|
||||
extending-qml
|
|
@ -19,5 +19,7 @@ qmldir.path = $$[QT_INSTALL_EXAMPLES]/quick/customitems/painteditem/TextBalloonP
|
|||
|
||||
INSTALLS += qmldir target
|
||||
|
||||
CONFIG += install_ok # Do not cargo-cult this!
|
||||
|
||||
OTHER_FILES += \
|
||||
textballoons.qml
|
||||
|
|
|
@ -13,3 +13,5 @@ target.path = $$[QT_INSTALL_EXAMPLES]/quick/imageprovider/ImageProviderCore
|
|||
qml.files = ImageProviderCore/qmldir
|
||||
qml.path = $$[QT_INSTALL_EXAMPLES]/quick/imageprovider/ImageProviderCore
|
||||
INSTALLS = target qml
|
||||
|
||||
CONFIG += install_ok # Do not cargo-cult this!
|
||||
|
|
|
@ -13,3 +13,5 @@ target.path = $$[QT_INSTALL_EXAMPLES]/quick/imageresponseprovider/ImageResponseP
|
|||
qml.files = ImageResponseProviderCore/qmldir
|
||||
qml.path = $$[QT_INSTALL_EXAMPLES]/quick/imageresponseprovider/ImageResponseProviderCore
|
||||
INSTALLS = target qml
|
||||
|
||||
CONFIG += install_ok # Do not cargo-cult this!
|
||||
|
|
|
@ -6,3 +6,6 @@ RESOURCES += accessibility.qrc
|
|||
|
||||
target.path = $$[QT_INSTALL_EXAMPLES]/quick/quick-accessibility
|
||||
INSTALLS += target
|
||||
|
||||
EXAMPLE_FILES += \
|
||||
accessibility.qmlproject
|
||||
|
|
|
@ -16,6 +16,7 @@ SUBDIRS = quick-accessibility \
|
|||
scenegraph \
|
||||
shadereffects \
|
||||
text \
|
||||
textureprovider \
|
||||
threading \
|
||||
touchinteraction \
|
||||
tutorials \
|
||||
|
|
|
@ -15,3 +15,6 @@ HEADERS += mainwindow.h \
|
|||
RESOURCES += qquickviewcomparison.qrc
|
||||
|
||||
OTHER_FILES += test.qml
|
||||
|
||||
target.path = $$[QT_INSTALL_EXAMPLES]/quick/quickwidgets/qquickviewcomparison
|
||||
INSTALLS += target
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 11 KiB |
|
@ -6,3 +6,6 @@ TEMPLATE = app
|
|||
SOURCES += main.cpp
|
||||
|
||||
RESOURCES += quickwidget.qrc
|
||||
|
||||
target.path = $$[QT_INSTALL_EXAMPLES]/quick/quickwidgets/quickwidget
|
||||
INSTALLS += target
|
||||
|
|
|
@ -1,9 +1,3 @@
|
|||
#-------------------------------------------------
|
||||
#
|
||||
# Project created by QtCreator 2013-06-11T13:13:18
|
||||
#
|
||||
#-------------------------------------------------
|
||||
|
||||
QT += core gui quick
|
||||
|
||||
TARGET = graph
|
||||
|
@ -32,3 +26,5 @@ OTHER_FILES += \
|
|||
shaders/line.fsh \
|
||||
shaders/line.vsh
|
||||
|
||||
target.path = $$[QT_INSTALL_EXAMPLES]/quick/scenegraph/graph
|
||||
INSTALLS += target
|
||||
|
|
|
@ -2,10 +2,12 @@ TEMPLATE = subdirs
|
|||
|
||||
contains(QT_CONFIG, opengl(es1|es2)?) {
|
||||
SUBDIRS += \
|
||||
graph \
|
||||
simplematerial \
|
||||
sgengine \
|
||||
textureinsgnode \
|
||||
openglunderqml \
|
||||
textureinsgnode \
|
||||
textureinthread \
|
||||
twotextureproviders
|
||||
}
|
||||
|
@ -14,3 +16,6 @@ SUBDIRS += \
|
|||
customgeometry \
|
||||
rendernode \
|
||||
threadedanimation
|
||||
|
||||
EXAMPLE_FILES += \
|
||||
shared
|
||||
|
|
|
@ -18,8 +18,11 @@ SOURCES += \
|
|||
file.cpp \
|
||||
dialogPlugin.cpp
|
||||
|
||||
OTHER_FILES += qmldir
|
||||
EXAMPLE_FILES += qmldir
|
||||
|
||||
# Copy the qmldir file to the same folder as the plugin binary
|
||||
QMAKE_POST_LINK += $$QMAKE_COPY $$shell_quote($$shell_path($$PWD/qmldir)) \
|
||||
$$shell_quote($$shell_path($$DESTDIR)) $$escape_expand(\\n\\t)
|
||||
cpqmldir.files = $$PWD/qmldir
|
||||
cpqmldir.path = $$DESTDIR
|
||||
COPIES += cpqmldir
|
||||
|
||||
CONFIG += install_ok # Do not cargo-cult this!
|
||||
|
|
|
@ -7,4 +7,5 @@ EXAMPLE_FILES = \
|
|||
images \
|
||||
parts \
|
||||
pics \
|
||||
texteditor.qmlproject \
|
||||
texteditor.qml
|
||||
|
|
|
@ -6,7 +6,8 @@ RESOURCES += \
|
|||
window.qrc \
|
||||
../shared/shared.qrc
|
||||
EXAMPLE_FILES = \
|
||||
window.qml
|
||||
window.qml \
|
||||
resources
|
||||
|
||||
target.path = $$[QT_INSTALL_EXAMPLES]/quick/window
|
||||
INSTALLS += target
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
TEMPLATE = aux
|
||||
|
||||
QMLTYPEFILE = builtins.qmltypes
|
||||
|
||||
# install rule
|
||||
builtins.files = $$QMLTYPEFILE
|
||||
builtins.path = $$[QT_INSTALL_QML]
|
||||
INSTALLS += builtins
|
||||
|
||||
# copy to build directory
|
||||
!prefix_build: COPIES += builtins
|
||||
|
||||
# qmltypes target
|
||||
!cross_compile:if(build_pass|!debug_and_release) {
|
||||
qtPrepareTool(QMLPLUGINDUMP, qmlplugindump)
|
||||
|
||||
qmltypes.commands = $$QMLPLUGINDUMP -builtins > $$PWD/$$QMLTYPEFILE
|
||||
QMAKE_EXTRA_TARGETS += qmltypes
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
TEMPLATE = subdirs
|
||||
|
||||
SUBDIRS += \
|
||||
builtins \
|
||||
qtqml \
|
||||
folderlistmodel \
|
||||
localstorage \
|
||||
|
@ -22,35 +23,3 @@ qtHaveModule(quick) {
|
|||
}
|
||||
|
||||
qtHaveModule(xmlpatterns) : SUBDIRS += xmllistmodel
|
||||
|
||||
|
||||
QMLTYPEFILE = builtins.qmltypes
|
||||
|
||||
# install rule
|
||||
builtins.files = $$QMLTYPEFILE
|
||||
builtins.path = $$[QT_INSTALL_QML]
|
||||
INSTALLS += builtins
|
||||
|
||||
# copy to build directory
|
||||
!force_independent:if(!debug_and_release|!build_all|CONFIG(release, debug|release)) {
|
||||
defineReplace(qmlModStripSrcDir) {
|
||||
return($$relative_path($$1, $$_PRO_FILE_PWD_))
|
||||
}
|
||||
|
||||
qmltypes2build.input = QMLTYPEFILE
|
||||
qmltypes2build.output = $$[QT_INSTALL_QML]/${QMAKE_FUNC_FILE_IN_qmlModStripSrcDir}
|
||||
!contains(TEMPLATE, vc.*): qmltypes2build.variable_out = PRE_TARGETDEPS
|
||||
qmltypes2build.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
|
||||
qmltypes2build.name = COPY ${QMAKE_FILE_IN}
|
||||
qmltypes2build.CONFIG = no_link no_clean
|
||||
|
||||
QMAKE_EXTRA_COMPILERS += qmltypes2build
|
||||
}
|
||||
|
||||
# qmltypes target
|
||||
!cross_compile:if(build_pass|!debug_and_release) {
|
||||
qtPrepareTool(QMLPLUGINDUMP, qmlplugindump)
|
||||
|
||||
qmltypes.commands = $$QMLPLUGINDUMP -builtins > $$PWD/$$QMLTYPEFILE
|
||||
QMAKE_EXTRA_TARGETS += qmltypes
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
//
|
||||
|
||||
#include <private/qv8engine_p.h>
|
||||
|
||||
#include <private/qv4persistent_p.h>
|
||||
#include <private/qv4value_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
|
|
@ -54,7 +54,6 @@
|
|||
QT_BEGIN_NAMESPACE
|
||||
|
||||
Q_QML_DEBUG_PLUGIN_LOADER(QQmlAbstractProfilerAdapter)
|
||||
Q_QML_IMPORT_DEBUG_PLUGIN(QQuickProfilerAdapterFactory)
|
||||
|
||||
QQmlProfilerServiceImpl::QQmlProfilerServiceImpl(QObject *parent) :
|
||||
QQmlConfigurableDebugService<QQmlProfilerService>(1, parent),
|
||||
|
|
|
@ -81,8 +81,6 @@ QT_BEGIN_NAMESPACE
|
|||
*/
|
||||
|
||||
Q_QML_DEBUG_PLUGIN_LOADER(QQmlDebugServerConnection)
|
||||
Q_QML_IMPORT_DEBUG_PLUGIN(QTcpServerConnectionFactory)
|
||||
Q_QML_IMPORT_DEBUG_PLUGIN(QLocalClientConnectionFactory)
|
||||
|
||||
const int protocolVersion = 1;
|
||||
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
//
|
||||
|
||||
#include "private/qabstractanimationjob_p.h"
|
||||
#include <QtCore/qdebug.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
|
|
@ -137,7 +137,6 @@ bool QQmlTypeCompiler::compile()
|
|||
customParsers.insert(it.key(), customParser);
|
||||
}
|
||||
|
||||
compiledData->metaObjects.reserve(document->objects.count());
|
||||
compiledData->propertyCaches.reserve(document->objects.count());
|
||||
|
||||
{
|
||||
|
@ -336,32 +335,17 @@ int QQmlTypeCompiler::rootObjectIndex() const
|
|||
return document->indexOfRootObject;
|
||||
}
|
||||
|
||||
void QQmlTypeCompiler::setPropertyCaches(const QVector<QQmlPropertyCache *> &caches)
|
||||
void QQmlTypeCompiler::setPropertyCaches(const QQmlPropertyCacheVector &caches)
|
||||
{
|
||||
compiledData->propertyCaches = caches;
|
||||
Q_ASSERT(caches.count() >= document->indexOfRootObject);
|
||||
if (compiledData->rootPropertyCache)
|
||||
compiledData->rootPropertyCache->release();
|
||||
compiledData->rootPropertyCache = caches.at(document->indexOfRootObject);
|
||||
compiledData->rootPropertyCache->addref();
|
||||
}
|
||||
|
||||
const QVector<QQmlPropertyCache *> &QQmlTypeCompiler::propertyCaches() const
|
||||
const QQmlPropertyCacheVector &QQmlTypeCompiler::propertyCaches() const
|
||||
{
|
||||
return compiledData->propertyCaches;
|
||||
}
|
||||
|
||||
void QQmlTypeCompiler::setVMEMetaObjects(const QVector<QByteArray> &metaObjects)
|
||||
{
|
||||
Q_ASSERT(compiledData->metaObjects.isEmpty());
|
||||
compiledData->metaObjects = metaObjects;
|
||||
}
|
||||
|
||||
QVector<QByteArray> *QQmlTypeCompiler::vmeMetaObjects() const
|
||||
{
|
||||
return &compiledData->metaObjects;
|
||||
}
|
||||
|
||||
QHash<int, int> *QQmlTypeCompiler::objectIndexToIdForRoot()
|
||||
{
|
||||
return &compiledData->objectIndexToIdForRoot;
|
||||
|
@ -435,7 +419,7 @@ QQmlPropertyCacheCreator::QQmlPropertyCacheCreator(QQmlTypeCompiler *typeCompile
|
|||
QQmlPropertyCacheCreator::~QQmlPropertyCacheCreator()
|
||||
{
|
||||
for (int i = 0; i < propertyCaches.count(); ++i)
|
||||
if (QQmlPropertyCache *cache = propertyCaches.at(i))
|
||||
if (QQmlPropertyCache *cache = propertyCaches.at(i).data())
|
||||
cache->release();
|
||||
propertyCaches.clear();
|
||||
}
|
||||
|
@ -443,12 +427,10 @@ QQmlPropertyCacheCreator::~QQmlPropertyCacheCreator()
|
|||
bool QQmlPropertyCacheCreator::buildMetaObjects()
|
||||
{
|
||||
propertyCaches.resize(qmlObjects.count());
|
||||
vmeMetaObjects.resize(qmlObjects.count());
|
||||
|
||||
if (!buildMetaObjectRecursively(compiler->rootObjectIndex(), /*referencing object*/-1, /*instantiating binding*/0))
|
||||
return false;
|
||||
|
||||
compiler->setVMEMetaObjects(vmeMetaObjects);
|
||||
compiler->setPropertyCaches(propertyCaches);
|
||||
propertyCaches.clear();
|
||||
|
||||
|
@ -463,7 +445,7 @@ bool QQmlPropertyCacheCreator::buildMetaObjectRecursively(int objectIndex, int r
|
|||
QQmlPropertyData *instantiatingProperty = 0;
|
||||
if (instantiatingBinding && instantiatingBinding->type == QV4::CompiledData::Binding::Type_GroupProperty) {
|
||||
Q_ASSERT(referencingObjectIndex >= 0);
|
||||
QQmlPropertyCache *parentCache = propertyCaches.at(referencingObjectIndex);
|
||||
QQmlPropertyCache *parentCache = propertyCaches.at(referencingObjectIndex).data();
|
||||
Q_ASSERT(parentCache);
|
||||
Q_ASSERT(instantiatingBinding->propertyNameIndex != 0);
|
||||
|
||||
|
@ -494,7 +476,7 @@ bool QQmlPropertyCacheCreator::buildMetaObjectRecursively(int objectIndex, int r
|
|||
// because interceptors can't go to the shared value type instances.
|
||||
if (instantiatingProperty && QQmlValueTypeFactory::isValueType(instantiatingProperty->propType)) {
|
||||
needVMEMetaObject = false;
|
||||
if (!ensureMetaObject(referencingObjectIndex))
|
||||
if (!ensureVMEMetaObject(referencingObjectIndex))
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
@ -557,12 +539,14 @@ bool QQmlPropertyCacheCreator::buildMetaObjectRecursively(int objectIndex, int r
|
|||
if (!createMetaObject(objectIndex, obj, baseTypeCache))
|
||||
return false;
|
||||
} else {
|
||||
if (QQmlPropertyCache *oldCache = propertyCaches.at(objectIndex).data())
|
||||
oldCache->release();
|
||||
propertyCaches[objectIndex] = baseTypeCache;
|
||||
baseTypeCache->addref();
|
||||
}
|
||||
}
|
||||
|
||||
if (propertyCaches.at(objectIndex)) {
|
||||
if (propertyCaches.at(objectIndex).data()) {
|
||||
for (const QmlIR::Binding *binding = obj->firstBinding(); binding; binding = binding->next)
|
||||
if (binding->type >= QV4::CompiledData::Binding::Type_Object) {
|
||||
if (!buildMetaObjectRecursively(binding->value.objectIndex, objectIndex, binding))
|
||||
|
@ -573,9 +557,10 @@ bool QQmlPropertyCacheCreator::buildMetaObjectRecursively(int objectIndex, int r
|
|||
return true;
|
||||
}
|
||||
|
||||
bool QQmlPropertyCacheCreator::ensureMetaObject(int objectIndex)
|
||||
bool QQmlPropertyCacheCreator::ensureVMEMetaObject(int objectIndex)
|
||||
{
|
||||
if (!vmeMetaObjects.at(objectIndex).isEmpty())
|
||||
const bool willCreateVMEMetaObject = propertyCaches.at(objectIndex).flag();
|
||||
if (willCreateVMEMetaObject)
|
||||
return true;
|
||||
const QmlIR::Object *obj = qmlObjects.at(objectIndex);
|
||||
QQmlCompiledData::TypeReference *typeRef = resolvedTypes->value(obj->inheritedTypeNameIndex);
|
||||
|
@ -589,7 +574,12 @@ bool QQmlPropertyCacheCreator::createMetaObject(int objectIndex, const QmlIR::Ob
|
|||
QQmlPropertyCache *cache = baseTypeCache->copyAndReserve(obj->propertyCount() + obj->aliasCount(),
|
||||
obj->functionCount() + obj->propertyCount() + obj->aliasCount() + obj->signalCount(),
|
||||
obj->signalCount() + obj->propertyCount() + obj->aliasCount());
|
||||
|
||||
if (QQmlPropertyCache *oldCache = propertyCaches.at(objectIndex).data())
|
||||
oldCache->release();
|
||||
propertyCaches[objectIndex] = cache;
|
||||
// Indicate that this object also needs a VME meta-object at run-time
|
||||
propertyCaches[objectIndex].setFlag();
|
||||
|
||||
struct TypeData {
|
||||
QV4::CompiledData::Property::Type dtype;
|
||||
|
@ -659,10 +649,6 @@ bool QQmlPropertyCacheCreator::createMetaObject(int objectIndex, const QmlIR::Ob
|
|||
COMPILE_EXCEPTION(a, tr("Cannot override FINAL property"));
|
||||
}
|
||||
|
||||
typedef QQmlVMEMetaData VMD;
|
||||
|
||||
vmeMetaObjects[objectIndex] = QByteArray(sizeof(QQmlVMEMetaData) + obj->aliasCount() * sizeof(VMD::AliasData), 0);
|
||||
|
||||
int effectivePropertyIndex = cache->propertyIndexCacheStart;
|
||||
int effectiveMethodIndex = cache->methodIndexCacheStart;
|
||||
|
||||
|
@ -878,7 +864,7 @@ bool SignalHandlerConverter::convertSignalHandlerExpressionsToFunctionDeclaratio
|
|||
{
|
||||
for (int objectIndex = 0; objectIndex < qmlObjects.count(); ++objectIndex) {
|
||||
const QmlIR::Object * const obj = qmlObjects.at(objectIndex);
|
||||
QQmlPropertyCache *cache = propertyCaches.at(objectIndex);
|
||||
QQmlPropertyCache *cache = propertyCaches.at(objectIndex).data();
|
||||
if (!cache)
|
||||
continue;
|
||||
if (QQmlCustomParser *customParser = customParsers.value(obj->inheritedTypeNameIndex)) {
|
||||
|
@ -1086,7 +1072,7 @@ QQmlEnumTypeResolver::QQmlEnumTypeResolver(QQmlTypeCompiler *typeCompiler)
|
|||
bool QQmlEnumTypeResolver::resolveEnumBindings()
|
||||
{
|
||||
for (int i = 0; i < qmlObjects.count(); ++i) {
|
||||
QQmlPropertyCache *propertyCache = propertyCaches.at(i);
|
||||
QQmlPropertyCache *propertyCache = propertyCaches.at(i).data();
|
||||
if (!propertyCache)
|
||||
continue;
|
||||
const QmlIR::Object *obj = qmlObjects.at(i);
|
||||
|
@ -1272,7 +1258,7 @@ QQmlAliasAnnotator::QQmlAliasAnnotator(QQmlTypeCompiler *typeCompiler)
|
|||
void QQmlAliasAnnotator::annotateBindingsToAliases()
|
||||
{
|
||||
for (int i = 0; i < qmlObjects.count(); ++i) {
|
||||
QQmlPropertyCache *propertyCache = propertyCaches.at(i);
|
||||
QQmlPropertyCache *propertyCache = propertyCaches.at(i).data();
|
||||
if (!propertyCache)
|
||||
continue;
|
||||
|
||||
|
@ -1304,7 +1290,7 @@ void QQmlScriptStringScanner::scan()
|
|||
{
|
||||
const int scriptStringMetaType = qMetaTypeId<QQmlScriptString>();
|
||||
for (int i = 0; i < qmlObjects.count(); ++i) {
|
||||
QQmlPropertyCache *propertyCache = propertyCaches.at(i);
|
||||
QQmlPropertyCache *propertyCache = propertyCaches.at(i).data();
|
||||
if (!propertyCache)
|
||||
continue;
|
||||
|
||||
|
@ -1341,7 +1327,6 @@ QQmlComponentAndAliasResolver::QQmlComponentAndAliasResolver(QQmlTypeCompiler *t
|
|||
, _objectIndexToIdInScope(0)
|
||||
, resolvedTypes(typeCompiler->resolvedTypes())
|
||||
, propertyCaches(typeCompiler->propertyCaches())
|
||||
, vmeMetaObjectData(typeCompiler->vmeMetaObjects())
|
||||
, objectIndexToIdForRoot(typeCompiler->objectIndexToIdForRoot())
|
||||
, objectIndexToIdPerComponent(typeCompiler->objectIndexToIdPerComponent())
|
||||
{
|
||||
|
@ -1366,7 +1351,7 @@ void QQmlComponentAndAliasResolver::findAndRegisterImplicitComponents(const QmlI
|
|||
if (targetType->metaObject() == &QQmlComponent::staticMetaObject)
|
||||
continue;
|
||||
} else if (tr->component) {
|
||||
if (tr->component->rootPropertyCache->firstCppMetaObject() == &QQmlComponent::staticMetaObject)
|
||||
if (tr->component->rootPropertyCache()->firstCppMetaObject() == &QQmlComponent::staticMetaObject)
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1436,7 +1421,7 @@ bool QQmlComponentAndAliasResolver::resolve()
|
|||
const int objCountWithoutSynthesizedComponents = qmlObjects->count();
|
||||
for (int i = 0; i < objCountWithoutSynthesizedComponents; ++i) {
|
||||
const QmlIR::Object *obj = qmlObjects->at(i);
|
||||
QQmlPropertyCache *cache = propertyCaches.at(i);
|
||||
QQmlPropertyCache *cache = propertyCaches.at(i).data();
|
||||
if (obj->inheritedTypeNameIndex == 0 && !cache)
|
||||
continue;
|
||||
|
||||
|
@ -1554,12 +1539,11 @@ bool QQmlComponentAndAliasResolver::resolveAliases()
|
|||
foreach (int objectIndex, _objectsWithAliases) {
|
||||
const QmlIR::Object *obj = qmlObjects->at(objectIndex);
|
||||
|
||||
QQmlPropertyCache *propertyCache = propertyCaches.at(objectIndex);
|
||||
QQmlPropertyCache *propertyCache = propertyCaches.at(objectIndex).data();
|
||||
Q_ASSERT(propertyCache);
|
||||
|
||||
int effectiveSignalIndex = propertyCache->signalHandlerIndexCacheStart + propertyCache->propertyIndexCache.count();
|
||||
int effectivePropertyIndex = propertyCache->propertyIndexCacheStart + propertyCache->propertyIndexCache.count();
|
||||
int effectiveAliasIndex = 0;
|
||||
|
||||
int aliasIndex = 0;
|
||||
for (QmlIR::Alias *alias = obj->firstAlias(); alias; alias = alias->next, ++aliasIndex) {
|
||||
|
@ -1587,7 +1571,6 @@ bool QQmlComponentAndAliasResolver::resolveAliases()
|
|||
property = QStringRef(&aliasPropertyValue, 0, aliasPropertyValue.length());
|
||||
|
||||
int propIdx = -1;
|
||||
int notifySignal = -1;
|
||||
int type = 0;
|
||||
bool writable = false;
|
||||
bool resettable = false;
|
||||
|
@ -1607,7 +1590,7 @@ bool QQmlComponentAndAliasResolver::resolveAliases()
|
|||
alias->flags |= QV4::CompiledData::Alias::AliasPointsToPointerObject;
|
||||
propertyFlags |= QQmlPropertyData::IsQObjectDerived;
|
||||
} else {
|
||||
QQmlPropertyCache *targetCache = propertyCaches.at(targetObjectIndex);
|
||||
QQmlPropertyCache *targetCache = propertyCaches.at(targetObjectIndex).data();
|
||||
Q_ASSERT(targetCache);
|
||||
QmlIR::PropertyResolver resolver(targetCache);
|
||||
|
||||
|
@ -1622,7 +1605,6 @@ bool QQmlComponentAndAliasResolver::resolveAliases()
|
|||
|
||||
writable = targetProperty->isWritable();
|
||||
resettable = targetProperty->isResettable();
|
||||
notifySignal = targetProperty->notifyIndex;
|
||||
|
||||
if (!subProperty.isEmpty()) {
|
||||
const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(type);
|
||||
|
@ -1662,15 +1644,6 @@ bool QQmlComponentAndAliasResolver::resolveAliases()
|
|||
}
|
||||
|
||||
alias->encodedMetaPropertyIndex = propIdx;
|
||||
QQmlVMEMetaData::AliasData aliasData = { notifySignal };
|
||||
|
||||
typedef QQmlVMEMetaData VMD;
|
||||
QByteArray &dynamicData = (*vmeMetaObjectData)[objectIndex];
|
||||
Q_ASSERT(!dynamicData.isEmpty());
|
||||
VMD *vmd = (QQmlVMEMetaData *)dynamicData.data();
|
||||
*(vmd->aliasData() + effectiveAliasIndex++) = aliasData;
|
||||
|
||||
Q_ASSERT(dynamicData.isDetached());
|
||||
|
||||
if (!(alias->flags & QV4::CompiledData::Property::IsReadOnly) && writable)
|
||||
propertyFlags |= QQmlPropertyData::IsWritable;
|
||||
|
@ -1754,7 +1727,7 @@ bool QQmlPropertyValidator::validateObject(int objectIndex, const QV4::CompiledD
|
|||
return validateObject(componentBinding->value.objectIndex, componentBinding);
|
||||
}
|
||||
|
||||
QQmlPropertyCache *propertyCache = propertyCaches.at(objectIndex);
|
||||
QQmlPropertyCache *propertyCache = propertyCaches.at(objectIndex).data();
|
||||
if (!propertyCache)
|
||||
return true;
|
||||
|
||||
|
@ -2348,7 +2321,7 @@ bool QQmlPropertyValidator::validateObjectBinding(QQmlPropertyData *property, co
|
|||
} else if (property->isQList()) {
|
||||
const int listType = enginePrivate->listType(property->propType);
|
||||
if (!QQmlMetaType::isInterface(listType)) {
|
||||
QQmlPropertyCache *source = propertyCaches.at(binding->value.objectIndex);
|
||||
QQmlPropertyCache *source = propertyCaches.at(binding->value.objectIndex).data();
|
||||
if (!canCoerce(listType, source)) {
|
||||
recordError(binding->valueLocation, tr("Cannot assign object to list property \"%1\"").arg(propertyName));
|
||||
return false;
|
||||
|
@ -2375,7 +2348,7 @@ bool QQmlPropertyValidator::validateObjectBinding(QQmlPropertyData *property, co
|
|||
bool isAssignable = false;
|
||||
// Determine isAssignable value
|
||||
if (propertyMetaObject) {
|
||||
QQmlPropertyCache *c = propertyCaches.at(binding->value.objectIndex);
|
||||
QQmlPropertyCache *c = propertyCaches.at(binding->value.objectIndex).data();
|
||||
while (c && !isAssignable) {
|
||||
isAssignable |= c == propertyMetaObject;
|
||||
c = c->parent();
|
||||
|
@ -2435,7 +2408,7 @@ bool QQmlJSCodeGenerator::compileComponent(int contextObject, const QHash<int, i
|
|||
const QmlIR::Object *obj = qmlObjects.at(objectIndex);
|
||||
m.name = stringAt(obj->idIndex);
|
||||
m.idIndex = idIt.value();
|
||||
m.type = propertyCaches.at(objectIndex);
|
||||
m.type = propertyCaches.at(objectIndex).data();
|
||||
|
||||
QQmlCompiledData::TypeReference *tref = resolvedTypes.value(obj->inheritedTypeNameIndex);
|
||||
if (tref && tref->isFullyDynamicType)
|
||||
|
@ -2444,7 +2417,7 @@ bool QQmlJSCodeGenerator::compileComponent(int contextObject, const QHash<int, i
|
|||
idMapping << m;
|
||||
}
|
||||
}
|
||||
v4CodeGen->beginContextScope(idMapping, propertyCaches.at(contextObject));
|
||||
v4CodeGen->beginContextScope(idMapping, propertyCaches.at(contextObject).data());
|
||||
|
||||
if (!compileJavaScriptCodeInObjectsRecursively(contextObject, contextObject))
|
||||
return false;
|
||||
|
@ -2459,7 +2432,7 @@ bool QQmlJSCodeGenerator::compileJavaScriptCodeInObjectsRecursively(int objectIn
|
|||
|
||||
QmlIR::Object *object = qmlObjects.at(objectIndex);
|
||||
if (object->functionsAndExpressions->count > 0) {
|
||||
QQmlPropertyCache *scopeObject = propertyCaches.at(scopeObjectIndex);
|
||||
QQmlPropertyCache *scopeObject = propertyCaches.at(scopeObjectIndex).data();
|
||||
v4CodeGen->beginObjectScope(scopeObject);
|
||||
|
||||
QList<QmlIR::CompiledFunctionOrExpression> functionsToCompile;
|
||||
|
@ -2512,7 +2485,7 @@ void QQmlDefaultPropertyMerger::mergeDefaultProperties()
|
|||
|
||||
void QQmlDefaultPropertyMerger::mergeDefaultProperties(int objectIndex)
|
||||
{
|
||||
QQmlPropertyCache *propertyCache = propertyCaches.at(objectIndex);
|
||||
QQmlPropertyCache *propertyCache = propertyCaches.at(objectIndex).data();
|
||||
if (!propertyCache)
|
||||
return;
|
||||
|
||||
|
|
|
@ -99,10 +99,8 @@ public:
|
|||
QHash<int, QQmlCompiledData::TypeReference *> *resolvedTypes();
|
||||
QList<QmlIR::Object*> *qmlObjects();
|
||||
int rootObjectIndex() const;
|
||||
void setPropertyCaches(const QVector<QQmlPropertyCache *> &caches);
|
||||
const QVector<QQmlPropertyCache *> &propertyCaches() const;
|
||||
void setVMEMetaObjects(const QVector<QByteArray> &metaObjects);
|
||||
QVector<QByteArray> *vmeMetaObjects() const;
|
||||
void setPropertyCaches(const QQmlPropertyCacheVector &caches);
|
||||
const QQmlPropertyCacheVector &propertyCaches() const;
|
||||
QHash<int, int> *objectIndexToIdForRoot();
|
||||
QHash<int, QHash<int, int> > *objectIndexToIdPerComponent();
|
||||
QHash<int, QBitArray> *customParserBindings();
|
||||
|
@ -149,15 +147,14 @@ public:
|
|||
bool buildMetaObjects();
|
||||
protected:
|
||||
bool buildMetaObjectRecursively(int objectIndex, int referencingObjectIndex, const QV4::CompiledData::Binding *instantiatingBinding);
|
||||
bool ensureMetaObject(int objectIndex);
|
||||
bool ensureVMEMetaObject(int objectIndex);
|
||||
bool createMetaObject(int objectIndex, const QmlIR::Object *obj, QQmlPropertyCache *baseTypeCache);
|
||||
|
||||
QQmlEnginePrivate *enginePrivate;
|
||||
const QList<QmlIR::Object*> &qmlObjects;
|
||||
const QQmlImports *imports;
|
||||
QHash<int, QQmlCompiledData::TypeReference*> *resolvedTypes;
|
||||
QVector<QByteArray> vmeMetaObjects;
|
||||
QVector<QQmlPropertyCache*> propertyCaches;
|
||||
QQmlPropertyCacheVector propertyCaches;
|
||||
};
|
||||
|
||||
// "Converts" signal expressions to full-fleged function declarations with
|
||||
|
@ -181,7 +178,7 @@ private:
|
|||
const QHash<int, QQmlCustomParser*> &customParsers;
|
||||
const QHash<int, QQmlCompiledData::TypeReference*> &resolvedTypes;
|
||||
const QSet<QString> &illegalNames;
|
||||
const QVector<QQmlPropertyCache*> &propertyCaches;
|
||||
const QQmlPropertyCacheVector &propertyCaches;
|
||||
};
|
||||
|
||||
// ### This will go away when the codegen resolves all enums to constant expressions
|
||||
|
@ -208,7 +205,7 @@ private:
|
|||
|
||||
|
||||
const QList<QmlIR::Object*> &qmlObjects;
|
||||
const QVector<QQmlPropertyCache *> propertyCaches;
|
||||
const QQmlPropertyCacheVector propertyCaches;
|
||||
const QQmlImports *imports;
|
||||
QHash<int, QQmlCompiledData::TypeReference *> *resolvedTypes;
|
||||
};
|
||||
|
@ -236,7 +233,7 @@ public:
|
|||
void annotateBindingsToAliases();
|
||||
private:
|
||||
const QList<QmlIR::Object*> &qmlObjects;
|
||||
const QVector<QQmlPropertyCache *> propertyCaches;
|
||||
const QQmlPropertyCacheVector propertyCaches;
|
||||
};
|
||||
|
||||
class QQmlScriptStringScanner : public QQmlCompilePass
|
||||
|
@ -248,7 +245,7 @@ public:
|
|||
|
||||
private:
|
||||
const QList<QmlIR::Object*> &qmlObjects;
|
||||
const QVector<QQmlPropertyCache *> propertyCaches;
|
||||
const QQmlPropertyCacheVector propertyCaches;
|
||||
};
|
||||
|
||||
class QQmlComponentAndAliasResolver : public QQmlCompilePass
|
||||
|
@ -282,8 +279,7 @@ protected:
|
|||
QList<int> _objectsWithAliases;
|
||||
|
||||
QHash<int, QQmlCompiledData::TypeReference*> *resolvedTypes;
|
||||
QVector<QQmlPropertyCache *> propertyCaches;
|
||||
QVector<QByteArray> *vmeMetaObjectData;
|
||||
QQmlPropertyCacheVector propertyCaches;
|
||||
QHash<int, int> *objectIndexToIdForRoot;
|
||||
QHash<int, QHash<int, int> > *objectIndexToIdPerComponent;
|
||||
};
|
||||
|
@ -312,7 +308,7 @@ private:
|
|||
const QV4::CompiledData::Unit *qmlUnit;
|
||||
const QHash<int, QQmlCompiledData::TypeReference*> &resolvedTypes;
|
||||
const QHash<int, QQmlCustomParser*> &customParsers;
|
||||
const QVector<QQmlPropertyCache *> &propertyCaches;
|
||||
const QQmlPropertyCacheVector &propertyCaches;
|
||||
const QHash<int, QHash<int, int> > objectIndexToIdPerComponent;
|
||||
QHash<int, QBitArray> *customParserBindingsPerObject;
|
||||
|
||||
|
@ -340,7 +336,7 @@ private:
|
|||
const QHash<int, QQmlCompiledData::TypeReference*> &resolvedTypes;
|
||||
const QHash<int, QQmlCustomParser*> &customParsers;
|
||||
const QList<QmlIR::Object*> &qmlObjects;
|
||||
const QVector<QQmlPropertyCache *> &propertyCaches;
|
||||
const QQmlPropertyCacheVector &propertyCaches;
|
||||
QmlIR::JSCodeGen * const v4CodeGen;
|
||||
};
|
||||
|
||||
|
@ -355,7 +351,7 @@ private:
|
|||
void mergeDefaultProperties(int objectIndex);
|
||||
|
||||
const QList<QmlIR::Object*> &qmlObjects;
|
||||
const QVector<QQmlPropertyCache*> &propertyCaches;
|
||||
const QQmlPropertyCacheVector &propertyCaches;
|
||||
};
|
||||
|
||||
class QQmlJavaScriptBindingExpressionSimplificationPass : public QQmlCompilePass, public QV4::IR::StmtVisitor
|
||||
|
|
|
@ -54,14 +54,9 @@ QT_BEGIN_NAMESPACE
|
|||
|
||||
// Connectors. We could add more plugins here, and distinguish by arguments to instance()
|
||||
Q_QML_DEBUG_PLUGIN_LOADER(QQmlDebugConnector)
|
||||
Q_QML_IMPORT_DEBUG_PLUGIN(QQmlDebugServerFactory)
|
||||
Q_QML_IMPORT_DEBUG_PLUGIN(QQmlNativeDebugConnectorFactory)
|
||||
|
||||
// Services
|
||||
Q_QML_DEBUG_PLUGIN_LOADER(QQmlDebugService)
|
||||
Q_QML_IMPORT_DEBUG_PLUGIN(QQmlInspectorServiceFactory)
|
||||
Q_QML_IMPORT_DEBUG_PLUGIN(QQmlProfilerServiceFactory)
|
||||
Q_QML_IMPORT_DEBUG_PLUGIN(QQmlDebuggerServiceFactory)
|
||||
|
||||
int QQmlDebugConnector::s_dataStreamVersion = QDataStream::Qt_4_7;
|
||||
|
||||
|
|
|
@ -74,15 +74,6 @@ QT_BEGIN_NAMESPACE
|
|||
|
||||
#else // QT_NO_QML_DEBUGGER
|
||||
|
||||
#ifdef QT_STATIC
|
||||
#define Q_QML_IMPORT_DEBUG_PLUGIN(className)\
|
||||
QT_END_NAMESPACE\
|
||||
Q_IMPORT_PLUGIN(className)\
|
||||
QT_BEGIN_NAMESPACE
|
||||
#else
|
||||
#define Q_QML_IMPORT_DEBUG_PLUGIN(className)
|
||||
#endif // QT_STATIC
|
||||
|
||||
#define Q_QML_DEBUG_PLUGIN_LOADER(interfaceName)\
|
||||
Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, interfaceName##Loader,\
|
||||
(interfaceName##Factory_iid, QLatin1String("/qmltooling")))\
|
||||
|
|
|
@ -4,7 +4,7 @@ project = QtQml
|
|||
description = Qt QML Reference Documentation
|
||||
version = $QT_VERSION
|
||||
|
||||
examplesinstallpath = qtdeclarative/qml
|
||||
examplesinstallpath = qml
|
||||
|
||||
qhp.projects = QtQml
|
||||
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
#include "private/qv4runtime_p.h"
|
||||
#include <private/qqmlbuiltinfunctions_p.h>
|
||||
#include <private/qqmldebugconnector_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
#include <QtCore/qdatetime.h>
|
||||
#include <QtCore/qmetaobject.h>
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
#include "private/qv8engine_p.h"
|
||||
#include <private/qv4mm_p.h>
|
||||
#include <private/qv4scopedvalue_p.h>
|
||||
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
/*!
|
||||
\since 5.0
|
||||
|
|
|
@ -56,7 +56,6 @@
|
|||
#include <private/qv4value_p.h>
|
||||
#include <private/qv4string_p.h>
|
||||
#include <private/qv4engine_p.h>
|
||||
#include <private/qv4object_p.h>
|
||||
#include <private/qflagpointer_p.h>
|
||||
#include <private/qv4mm_p.h>
|
||||
#include <private/qv4persistent_p.h>
|
||||
|
|
|
@ -247,7 +247,7 @@ struct WithContext : public ExecutionContext
|
|||
V4_MANAGED(WithContext, ExecutionContext)
|
||||
};
|
||||
|
||||
struct QmlContext : public ExecutionContext
|
||||
struct Q_QML_EXPORT QmlContext : public ExecutionContext
|
||||
{
|
||||
V4_MANAGED(QmlContext, ExecutionContext)
|
||||
|
||||
|
|
|
@ -111,85 +111,8 @@ static ReturnedValue throwTypeError(CallContext *ctx)
|
|||
return ctx->engine()->throwTypeError();
|
||||
}
|
||||
|
||||
const int MinimumStackSize = 256; // in kbytes
|
||||
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_MSVC(4172) // MSVC 2015: warning C4172: returning address of local variable or temporary: dummy
|
||||
|
||||
quintptr getStackLimit()
|
||||
{
|
||||
quintptr stackLimit;
|
||||
#if USE(PTHREADS) && !OS(QNX)
|
||||
# if OS(DARWIN)
|
||||
pthread_t thread_self = pthread_self();
|
||||
void *stackTop = pthread_get_stackaddr_np(thread_self);
|
||||
stackLimit = reinterpret_cast<quintptr>(stackTop);
|
||||
quintptr size = 0;
|
||||
if (pthread_main_np()) {
|
||||
rlimit limit;
|
||||
getrlimit(RLIMIT_STACK, &limit);
|
||||
size = limit.rlim_cur;
|
||||
} else
|
||||
size = pthread_get_stacksize_np(thread_self);
|
||||
stackLimit -= size;
|
||||
# elif defined(__hppa)
|
||||
// On some architectures the stack grows upwards. All of these are rather exotic, so simply assume
|
||||
// everything is fine there.
|
||||
// Known examples:
|
||||
// -HP PA-RISC
|
||||
stackLimit = 0;
|
||||
|
||||
# else
|
||||
pthread_attr_t attr;
|
||||
#if HAVE(PTHREAD_NP_H) && OS(FREEBSD)
|
||||
// on FreeBSD pthread_attr_init() must be called otherwise getting the attrs crashes
|
||||
if (pthread_attr_init(&attr) == 0 && pthread_attr_get_np(pthread_self(), &attr) == 0) {
|
||||
#else
|
||||
if (pthread_getattr_np(pthread_self(), &attr) == 0) {
|
||||
#endif
|
||||
void *stackBottom = Q_NULLPTR;
|
||||
size_t stackSize = 0;
|
||||
|
||||
pthread_attr_getstack(&attr, &stackBottom, &stackSize);
|
||||
pthread_attr_destroy(&attr);
|
||||
|
||||
# if defined(Q_OS_ANDROID)
|
||||
// Bionic pretends that the main thread has a tiny stack; work around it
|
||||
if (gettid() == getpid()) {
|
||||
rlimit limit;
|
||||
getrlimit(RLIMIT_STACK, &limit);
|
||||
stackBottom = reinterpret_cast<void*>(reinterpret_cast<quintptr>(stackBottom) + stackSize - limit.rlim_cur);
|
||||
}
|
||||
# endif
|
||||
|
||||
stackLimit = reinterpret_cast<quintptr>(stackBottom);
|
||||
} else {
|
||||
int dummy;
|
||||
// this is inexact, as part of the stack is used when being called here,
|
||||
// but let's simply default to 1MB from where the stack is right now
|
||||
stackLimit = reinterpret_cast<qintptr>(&dummy) - 1024*1024;
|
||||
}
|
||||
|
||||
# endif
|
||||
// This is wrong. StackLimit is the currently committed stack size, not the real end.
|
||||
// only way to get that limit is apparently by using VirtualQuery (Yuck)
|
||||
//#elif OS(WINDOWS)
|
||||
// PNT_TIB tib = (PNT_TIB)NtCurrentTeb();
|
||||
// stackLimit = static_cast<quintptr>(tib->StackLimit);
|
||||
#else
|
||||
int dummy;
|
||||
// this is inexact, as part of the stack is used when being called here,
|
||||
// but let's simply default to 1MB from where the stack is right now
|
||||
// (Note: triggers warning C4172 as of MSVC 2015, returning address of local variable)
|
||||
stackLimit = reinterpret_cast<qintptr>(&dummy) - 1024*1024;
|
||||
#endif
|
||||
|
||||
// 256k slack
|
||||
return stackLimit + MinimumStackSize*1024;
|
||||
}
|
||||
|
||||
QT_WARNING_POP
|
||||
|
||||
#ifdef V4_BOOTSTRAP
|
||||
QJSEngine *ExecutionEngine::jsEngine() const
|
||||
{
|
||||
return v8Engine->publicEngine();
|
||||
|
@ -199,10 +122,14 @@ QQmlEngine *ExecutionEngine::qmlEngine() const
|
|||
{
|
||||
return v8Engine->engine();
|
||||
}
|
||||
#endif // V4_BOOTSTRAP
|
||||
|
||||
qint32 ExecutionEngine::maxCallDepth = -1;
|
||||
|
||||
ExecutionEngine::ExecutionEngine(EvalISelFactory *factory)
|
||||
: current(0)
|
||||
, hasException(false)
|
||||
, callDepth(0)
|
||||
, memoryManager(new QV4::MemoryManager(this))
|
||||
, executableAllocator(new QV4::ExecutableAllocator)
|
||||
, regExpAllocator(new QV4::ExecutableAllocator)
|
||||
|
@ -219,6 +146,15 @@ ExecutionEngine::ExecutionEngine(EvalISelFactory *factory)
|
|||
, regExpCache(0)
|
||||
, m_multiplyWrappedQObjects(0)
|
||||
{
|
||||
if (maxCallDepth == -1) {
|
||||
bool ok = false;
|
||||
maxCallDepth = qEnvironmentVariableIntValue("QV4_MAX_CALL_DEPTH", &ok);
|
||||
if (!ok || maxCallDepth <= 0) {
|
||||
maxCallDepth = 1234;
|
||||
}
|
||||
}
|
||||
Q_ASSERT(maxCallDepth > 0);
|
||||
|
||||
MemoryManager::GCBlocker gcBlocker(memoryManager);
|
||||
|
||||
if (!factory) {
|
||||
|
@ -267,9 +203,6 @@ ExecutionEngine::ExecutionEngine(EvalISelFactory *factory)
|
|||
|
||||
// set up stack limits
|
||||
jsStackLimit = jsStackBase + JSStackLimit/sizeof(Value);
|
||||
cStackLimit = getStackLimit();
|
||||
if (!recheckCStackLimits())
|
||||
qFatal("Fatal: Not enough stack space available for QML. Please increase the process stack size to more than %d KBytes.", MinimumStackSize);
|
||||
|
||||
identifierTable = new IdentifierTable(this);
|
||||
|
||||
|
@ -1103,22 +1036,6 @@ QQmlError ExecutionEngine::catchExceptionAsQmlError()
|
|||
return error;
|
||||
}
|
||||
|
||||
bool ExecutionEngine::recheckCStackLimits()
|
||||
{
|
||||
int dummy;
|
||||
#ifdef Q_OS_WIN
|
||||
// ### this is only required on windows, where we currently use heuristics to get the stack limit
|
||||
if (cStackLimit - reinterpret_cast<quintptr>(&dummy) > 128*1024)
|
||||
// we're more then 128k away from our stack limit, assume the thread has changed, and
|
||||
// call getStackLimit
|
||||
#endif
|
||||
// this can happen after a thread change
|
||||
cStackLimit = getStackLimit();
|
||||
|
||||
return (reinterpret_cast<quintptr>(&dummy) >= cStackLimit);
|
||||
}
|
||||
|
||||
|
||||
// Variant conversion code
|
||||
|
||||
typedef QSet<QV4::Heap::Object *> V4ObjectSet;
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
#include "qv4runtimeapi_p.h"
|
||||
#include <private/qintrusivelist_p.h>
|
||||
|
||||
#ifndef V4_BOOTSTRAP
|
||||
# include <private/qv8engine_p.h>
|
||||
#endif
|
||||
|
||||
namespace WTF {
|
||||
class BumpPointerAllocator;
|
||||
class PageAllocation;
|
||||
|
@ -82,15 +86,11 @@ namespace CompiledData {
|
|||
struct CompilationUnit;
|
||||
}
|
||||
|
||||
#define CHECK_STACK_LIMITS(v4) \
|
||||
if ((v4->jsStackTop <= v4->jsStackLimit) && (reinterpret_cast<quintptr>(&v4) >= v4->cStackLimit || v4->recheckCStackLimits())) {} \
|
||||
else \
|
||||
return v4->throwRangeError(QStringLiteral("Maximum call stack size exceeded."))
|
||||
|
||||
|
||||
struct Q_QML_EXPORT ExecutionEngine
|
||||
{
|
||||
private:
|
||||
static qint32 maxCallDepth;
|
||||
|
||||
friend struct ExecutionContextSaver;
|
||||
friend struct ExecutionContext;
|
||||
friend struct Heap::ExecutionContext;
|
||||
|
@ -99,6 +99,7 @@ public:
|
|||
|
||||
Value *jsStackTop;
|
||||
quint32 hasException;
|
||||
qint32 callDepth;
|
||||
|
||||
MemoryManager *memoryManager;
|
||||
ExecutableAllocator *executableAllocator;
|
||||
|
@ -108,7 +109,6 @@ public:
|
|||
ExecutionContext *currentContext;
|
||||
|
||||
Value *jsStackLimit;
|
||||
quintptr cStackLimit;
|
||||
|
||||
Runtime runtime;
|
||||
|
||||
|
@ -142,8 +142,13 @@ public:
|
|||
|
||||
Function *globalCode;
|
||||
|
||||
#ifdef V4_BOOTSTRAP
|
||||
QJSEngine *jsEngine() const;
|
||||
QQmlEngine *qmlEngine() const;
|
||||
#else // !V4_BOOTSTRAP
|
||||
QJSEngine *jsEngine() const { return v8Engine->publicEngine(); }
|
||||
QQmlEngine *qmlEngine() const { return v8Engine->engine(); }
|
||||
#endif // V4_BOOTSTRAP
|
||||
QV8Engine *v8Engine;
|
||||
|
||||
enum JSObjects {
|
||||
|
@ -440,8 +445,6 @@ public:
|
|||
|
||||
InternalClass *newClass(const InternalClass &other);
|
||||
|
||||
bool recheckCStackLimits();
|
||||
|
||||
// Exception handling
|
||||
Value *exceptionValue;
|
||||
StackTrace exceptionStackTrace;
|
||||
|
@ -474,13 +477,19 @@ public:
|
|||
QV4::ReturnedValue metaTypeToJS(int type, const void *data);
|
||||
|
||||
void assertObjectBelongsToEngine(const Heap::Base &baseObject);
|
||||
|
||||
bool checkStackLimits(ReturnedValue &exception);
|
||||
};
|
||||
|
||||
// This is a trick to tell the code generators that functions taking a NoThrowContext won't
|
||||
// throw exceptions and therefore don't need a check after the call.
|
||||
#ifndef V4_BOOTSTRAP
|
||||
struct NoThrowEngine : public ExecutionEngine
|
||||
{
|
||||
};
|
||||
#else
|
||||
struct NoThrowEngine;
|
||||
#endif
|
||||
|
||||
|
||||
inline void ExecutionEngine::pushContext(Heap::ExecutionContext *context)
|
||||
|
@ -526,7 +535,7 @@ inline Heap::QmlContext *ExecutionEngine::qmlContext() const
|
|||
if (ctx->type == Heap::ExecutionContext::Type_SimpleCallContext && !ctx->outer)
|
||||
ctx = parentContext(currentContext)->d();
|
||||
|
||||
if (!ctx->outer)
|
||||
if (ctx->type != Heap::ExecutionContext::Type_QmlContext && !ctx->outer)
|
||||
return 0;
|
||||
|
||||
while (ctx->outer && ctx->outer->type != Heap::ExecutionContext::Type_GlobalContext)
|
||||
|
@ -562,7 +571,26 @@ inline void Value::mark(ExecutionEngine *e)
|
|||
o->mark(e);
|
||||
}
|
||||
|
||||
#define CHECK_STACK_LIMITS(v4) { ReturnedValue e; if ((v4)->checkStackLimits(e)) return e; } \
|
||||
ExecutionEngineCallDepthRecorder _executionEngineCallDepthRecorder(v4);
|
||||
|
||||
struct ExecutionEngineCallDepthRecorder
|
||||
{
|
||||
ExecutionEngine *ee;
|
||||
|
||||
ExecutionEngineCallDepthRecorder(ExecutionEngine *e): ee(e) { ++ee->callDepth; }
|
||||
~ExecutionEngineCallDepthRecorder() { --ee->callDepth; }
|
||||
};
|
||||
|
||||
inline bool ExecutionEngine::checkStackLimits(ReturnedValue &exception)
|
||||
{
|
||||
if (Q_UNLIKELY((jsStackTop > jsStackLimit) || (callDepth >= maxCallDepth))) {
|
||||
exception = throwRangeError(QStringLiteral("Maximum call stack size exceeded."));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace QV4
|
||||
|
||||
|
|
|
@ -86,18 +86,10 @@ Heap::MathObject::MathObject()
|
|||
m->defineDefaultProperty(QStringLiteral("tan"), QV4::MathObject::method_tan, 1);
|
||||
}
|
||||
|
||||
#ifdef Q_OS_ANDROID
|
||||
// C++11's std::copysign is missing in the std namespace, so get it from the root namespace (math.h)
|
||||
static Q_ALWAYS_INLINE double copySign(double x, double y)
|
||||
{
|
||||
return ::copysign(x, y);
|
||||
}
|
||||
#else // Ok, we have a proper C++11 standard library
|
||||
static Q_ALWAYS_INLINE double copySign(double x, double y)
|
||||
{
|
||||
return std::copysign(x, y);
|
||||
}
|
||||
#endif
|
||||
|
||||
ReturnedValue MathObject::method_abs(CallContext *context)
|
||||
{
|
||||
|
|
|
@ -561,7 +561,7 @@ void QObjectWrapper::setProperty(ExecutionEngine *engine, QObject *object, QQmlP
|
|||
}
|
||||
}
|
||||
|
||||
ReturnedValue QObjectWrapper::wrap(ExecutionEngine *engine, QObject *object)
|
||||
ReturnedValue QObjectWrapper::wrap_slowPath(ExecutionEngine *engine, QObject *object)
|
||||
{
|
||||
if (QQmlData::wasDeleted(object))
|
||||
return QV4::Encode::null();
|
||||
|
@ -572,10 +572,7 @@ ReturnedValue QObjectWrapper::wrap(ExecutionEngine *engine, QObject *object)
|
|||
|
||||
Scope scope(engine);
|
||||
|
||||
if (ddata->jsEngineId == engine->m_engineId && !ddata->jsWrapper.isUndefined()) {
|
||||
// We own the JS object
|
||||
return ddata->jsWrapper.value();
|
||||
} else if (ddata->jsWrapper.isUndefined() &&
|
||||
if (ddata->jsWrapper.isUndefined() &&
|
||||
(ddata->jsEngineId == engine->m_engineId || // We own the QObject
|
||||
ddata->jsEngineId == 0 || // No one owns the QObject
|
||||
!ddata->hasTaintedV4Object)) { // Someone else has used the QObject, but it isn't tainted
|
||||
|
|
|
@ -146,8 +146,27 @@ protected:
|
|||
|
||||
static ReturnedValue method_connect(CallContext *ctx);
|
||||
static ReturnedValue method_disconnect(CallContext *ctx);
|
||||
|
||||
private:
|
||||
static ReturnedValue wrap_slowPath(ExecutionEngine *engine, QObject *object);
|
||||
};
|
||||
|
||||
inline ReturnedValue QObjectWrapper::wrap(ExecutionEngine *engine, QObject *object)
|
||||
{
|
||||
if (Q_LIKELY(!QQmlData::wasDeleted(object))) {
|
||||
QObjectPrivate *priv = QObjectPrivate::get(const_cast<QObject *>(object));
|
||||
if (Q_LIKELY(priv->declarativeData)) {
|
||||
auto ddata = static_cast<QQmlData *>(priv->declarativeData);
|
||||
if (Q_LIKELY(ddata->jsEngineId == engine->m_engineId && !ddata->jsWrapper.isUndefined())) {
|
||||
// We own the JS object
|
||||
return ddata->jsWrapper.value();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return wrap_slowPath(engine, object);
|
||||
}
|
||||
|
||||
struct QQmlValueTypeWrapper;
|
||||
|
||||
struct Q_QML_EXPORT QObjectMethod : public QV4::FunctionObject
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
****************************************************************************/
|
||||
|
||||
#include "qv4global_p.h"
|
||||
#include "qv4engine_p.h"
|
||||
#include "qv4runtime_p.h"
|
||||
#ifndef V4_BOOTSTRAP
|
||||
#include "qv4object_p.h"
|
||||
|
|
|
@ -65,6 +65,8 @@
|
|||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QQmlAccessors;
|
||||
|
||||
#undef QV4_COUNT_RUNTIME_FUNCTIONS
|
||||
|
||||
namespace QV4 {
|
||||
|
@ -102,7 +104,6 @@ enum TypeHint {
|
|||
STRING_HINT
|
||||
};
|
||||
|
||||
|
||||
struct Q_QML_PRIVATE_EXPORT RuntimeHelpers {
|
||||
static ReturnedValue objectDefaultValue(const Object *object, int typeHint);
|
||||
static ReturnedValue toPrimitive(const Value &value, int typeHint);
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
#include <private/qv4regexpobject_p.h>
|
||||
#include <private/qv4sequenceobject_p.h>
|
||||
#include <private/qv4objectproto_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
|
|
@ -56,11 +56,7 @@
|
|||
#include "qv4global_p.h"
|
||||
#include <private/qv4heap_p.h>
|
||||
|
||||
/* We cannot rely on QT_POINTER_SIZE to be set correctly on host builds. In qmldevtools the Value objects
|
||||
are only used to store primitives, never object pointers. So we can use the 64-bit encoding. */
|
||||
#ifdef V4_BOOTSTRAP
|
||||
#define QV4_USE_64_BIT_VALUE_ENCODING
|
||||
#elif QT_POINTER_SIZE == 8
|
||||
#if QT_POINTER_SIZE == 8
|
||||
#define QV4_USE_64_BIT_VALUE_ENCODING
|
||||
#endif
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include "qv4objectproto_p.h"
|
||||
#include <private/qqmlvaluetypewrapper_p.h>
|
||||
#include <private/qv8engine_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
#include "qqmlinfo.h"
|
||||
|
||||
#include <private/qv4value_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
#include <QtCore/qdebug.h>
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ QT_BEGIN_NAMESPACE
|
|||
|
||||
QQmlCompiledData::QQmlCompiledData(QQmlEngine *engine)
|
||||
: engine(engine), importCache(0), metaTypeId(-1), listMetaTypeId(-1), isRegisteredWithEngine(false),
|
||||
rootPropertyCache(0), totalBindingsCount(0), totalParserStatusCount(0)
|
||||
totalBindingsCount(0), totalParserStatusCount(0)
|
||||
{
|
||||
Q_ASSERT(engine);
|
||||
}
|
||||
|
@ -86,18 +86,15 @@ QQmlCompiledData::~QQmlCompiledData()
|
|||
qDeleteAll(resolvedTypes);
|
||||
resolvedTypes.clear();
|
||||
|
||||
for (int ii = 0; ii < propertyCaches.count(); ++ii)
|
||||
if (propertyCaches.at(ii))
|
||||
propertyCaches.at(ii)->release();
|
||||
|
||||
for (int ii = 0; ii < scripts.count(); ++ii)
|
||||
scripts.at(ii)->release();
|
||||
|
||||
if (importCache)
|
||||
importCache->release();
|
||||
|
||||
if (rootPropertyCache)
|
||||
rootPropertyCache->release();
|
||||
for (int ii = 0; ii < propertyCaches.count(); ++ii)
|
||||
if (propertyCaches.at(ii).data())
|
||||
propertyCaches.at(ii)->release();
|
||||
}
|
||||
|
||||
void QQmlCompiledData::clear()
|
||||
|
@ -112,7 +109,7 @@ QQmlPropertyCache *QQmlCompiledData::TypeReference::propertyCache() const
|
|||
if (type)
|
||||
return typePropertyCache;
|
||||
else
|
||||
return component->rootPropertyCache;
|
||||
return component->rootPropertyCache();
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -127,7 +124,7 @@ QQmlPropertyCache *QQmlCompiledData::TypeReference::createPropertyCache(QQmlEngi
|
|||
typePropertyCache->addref();
|
||||
return typePropertyCache;
|
||||
} else {
|
||||
return component->rootPropertyCache;
|
||||
return component->rootPropertyCache();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -149,7 +146,7 @@ void QQmlCompiledData::TypeReference::doDynamicTypeCheck()
|
|||
else if (type)
|
||||
mo = type->metaObject();
|
||||
else if (component)
|
||||
mo = component->rootPropertyCache->firstCppMetaObject();
|
||||
mo = component->rootPropertyCache()->firstCppMetaObject();
|
||||
isFullyDynamicType = qtTypeInherits<QQmlPropertyMap>(mo);
|
||||
}
|
||||
|
||||
|
|
|
@ -80,6 +80,10 @@ class QQmlComponent;
|
|||
class QQmlContext;
|
||||
class QQmlContextData;
|
||||
|
||||
// The vector is indexed by QV4::CompiledData::Object index and the flag
|
||||
// indicates whether instantiation of the object requires a VME meta-object.
|
||||
typedef QVector<QFlagPointer<QQmlPropertyCache>> QQmlPropertyCacheVector;
|
||||
|
||||
// ### Merge with QV4::CompiledData::CompilationUnit
|
||||
class Q_AUTOTEST_EXPORT QQmlCompiledData : public QQmlRefCount, public QQmlCleanup
|
||||
{
|
||||
|
@ -122,9 +126,8 @@ public:
|
|||
// map from name index
|
||||
QHash<int, TypeReference*> resolvedTypes;
|
||||
|
||||
QQmlPropertyCache *rootPropertyCache;
|
||||
QVector<QByteArray> metaObjects;
|
||||
QVector<QQmlPropertyCache *> propertyCaches;
|
||||
QQmlPropertyCache *rootPropertyCache() const { return propertyCaches.at(compilationUnit->data->indexOfRootObject).data(); }
|
||||
QQmlPropertyCacheVector propertyCaches;
|
||||
QList<QQmlScriptData *> scripts;
|
||||
|
||||
QQmlRefPointer<QV4::CompiledData::CompilationUnit> compilationUnit;
|
||||
|
@ -139,7 +142,7 @@ public:
|
|||
int totalObjectCount; // Number of objects explicitly instantiated
|
||||
|
||||
bool isComponent(int objectIndex) const { return objectIndexToIdPerComponent.contains(objectIndex); }
|
||||
bool isCompositeType() const { return !metaObjects.at(compilationUnit->data->indexOfRootObject).isEmpty(); }
|
||||
bool isCompositeType() const { return propertyCaches.at(compilationUnit->data->indexOfRootObject).flag(); }
|
||||
|
||||
bool isInitialized() const { return hasEngine(); }
|
||||
void initialize(QQmlEngine *);
|
||||
|
|
|
@ -60,6 +60,7 @@
|
|||
#include <private/qv4script_p.h>
|
||||
#include <private/qv4scopedvalue_p.h>
|
||||
#include <private/qv4objectiterator_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
#include <QStack>
|
||||
#include <QStringList>
|
||||
|
@ -1068,6 +1069,7 @@ struct QmlIncubatorObject : Object {
|
|||
QPointer<QObject> parent;
|
||||
QV4::Value valuemap;
|
||||
QV4::Value statusChanged;
|
||||
Pointer<Heap::QmlContext> qmlContext;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -1182,7 +1184,7 @@ static void QQmlComponent_setQmlParent(QObject *me, QObject *parent)
|
|||
*/
|
||||
|
||||
|
||||
static void setInitialProperties(QV4::ExecutionEngine *engine, const QV4::Value &o, const QV4::Value &v)
|
||||
static void setInitialProperties(QV4::ExecutionEngine *engine, QV4::QmlContext *qmlContext, const QV4::Value &o, const QV4::Value &v)
|
||||
{
|
||||
QV4::Scope scope(engine);
|
||||
QV4::ScopedObject object(scope);
|
||||
|
@ -1193,6 +1195,9 @@ static void setInitialProperties(QV4::ExecutionEngine *engine, const QV4::Value
|
|||
if (engine->hasException)
|
||||
return;
|
||||
|
||||
QV4::ExecutionContextSaver saver(scope);
|
||||
engine->pushContext(qmlContext);
|
||||
|
||||
while (1) {
|
||||
name = it.nextPropertyNameAsString(val);
|
||||
if (!name)
|
||||
|
@ -1266,8 +1271,10 @@ void QQmlComponent::createObject(QQmlV4Function *args)
|
|||
QV4::ScopedValue object(scope, QV4::QObjectWrapper::wrap(v4, rv));
|
||||
Q_ASSERT(object->isObject());
|
||||
|
||||
if (!valuemap->isUndefined())
|
||||
setInitialProperties(v4, object, valuemap);
|
||||
if (!valuemap->isUndefined()) {
|
||||
QV4::Scoped<QV4::QmlContext> qmlContext(scope, v4->qmlContext());
|
||||
setInitialProperties(v4, qmlContext, object, valuemap);
|
||||
}
|
||||
|
||||
d->completeCreate();
|
||||
|
||||
|
@ -1384,6 +1391,7 @@ void QQmlComponent::incubateObject(QQmlV4Function *args)
|
|||
|
||||
if (!valuemap->isUndefined())
|
||||
r->d()->valuemap = valuemap;
|
||||
r->d()->qmlContext = v4->qmlContext();
|
||||
r->d()->parent = parent;
|
||||
|
||||
QQmlIncubator *incubator = r->d()->incubator.data();
|
||||
|
@ -1397,7 +1405,7 @@ void QQmlComponent::incubateObject(QQmlV4Function *args)
|
|||
}
|
||||
|
||||
// XXX used by QSGLoader
|
||||
void QQmlComponentPrivate::initializeObjectWithInitialProperties(const QV4::Value &valuemap, QObject *toCreate)
|
||||
void QQmlComponentPrivate::initializeObjectWithInitialProperties(QV4::QmlContext *qmlContext, const QV4::Value &valuemap, QObject *toCreate)
|
||||
{
|
||||
QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine);
|
||||
QV4::ExecutionEngine *v4engine = QV8Engine::getV4(ep->v8engine());
|
||||
|
@ -1407,7 +1415,7 @@ void QQmlComponentPrivate::initializeObjectWithInitialProperties(const QV4::Valu
|
|||
Q_ASSERT(object->as<QV4::Object>());
|
||||
|
||||
if (!valuemap.isUndefined())
|
||||
setInitialProperties(v4engine, object, valuemap);
|
||||
setInitialProperties(v4engine, qmlContext, object, valuemap);
|
||||
}
|
||||
|
||||
QQmlComponentExtension::QQmlComponentExtension(QV4::ExecutionEngine *v4)
|
||||
|
@ -1484,6 +1492,7 @@ QQmlComponentExtension::~QQmlComponentExtension()
|
|||
QV4::Heap::QmlIncubatorObject::QmlIncubatorObject(QQmlIncubator::IncubationMode m)
|
||||
: valuemap(QV4::Primitive::undefinedValue())
|
||||
, statusChanged(QV4::Primitive::undefinedValue())
|
||||
, qmlContext(0)
|
||||
{
|
||||
incubator.reset(new QQmlComponentIncubator(this, m));
|
||||
}
|
||||
|
@ -1496,7 +1505,8 @@ void QV4::QmlIncubatorObject::setInitialState(QObject *o)
|
|||
QV4::ExecutionEngine *v4 = engine();
|
||||
QV4::Scope scope(v4);
|
||||
QV4::ScopedObject obj(scope, QV4::QObjectWrapper::wrap(v4, o));
|
||||
setInitialProperties(v4, obj, d()->valuemap);
|
||||
QV4::Scoped<QV4::QmlContext> qmlCtxt(scope, d()->qmlContext);
|
||||
setInitialProperties(v4, qmlCtxt, obj, d()->valuemap);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1505,6 +1515,8 @@ void QV4::QmlIncubatorObject::markObjects(QV4::Heap::Base *that, QV4::ExecutionE
|
|||
QmlIncubatorObject::Data *o = static_cast<QmlIncubatorObject::Data *>(that);
|
||||
o->valuemap.mark(e);
|
||||
o->statusChanged.mark(e);
|
||||
if (o->qmlContext)
|
||||
o->qmlContext->mark(e);
|
||||
Object::markObjects(that, e);
|
||||
}
|
||||
|
||||
|
|
|
@ -86,7 +86,7 @@ public:
|
|||
|
||||
QObject *beginCreate(QQmlContextData *);
|
||||
void completeCreate();
|
||||
void initializeObjectWithInitialProperties(const QV4::Value &valuemap, QObject *toCreate);
|
||||
void initializeObjectWithInitialProperties(QV4::QmlContext *qmlContext, const QV4::Value &valuemap, QObject *toCreate);
|
||||
|
||||
QQmlTypeData *typeData;
|
||||
virtual void typeDataReady(QQmlTypeData *);
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
#include <private/qqmllistwrapper_p.h>
|
||||
#include <private/qqmljavascriptexpression_p.h>
|
||||
#include <private/qjsvalue_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
@ -105,14 +106,23 @@ ReturnedValue QmlContextWrapper::get(const Managed *m, String *name, bool *hasPr
|
|||
QV4::ExecutionEngine *v4 = resource->engine();
|
||||
QV4::Scope scope(v4);
|
||||
|
||||
// In V8 the JS global object would come _before_ the QML global object,
|
||||
// so simulate that here.
|
||||
bool hasProp;
|
||||
QV4::ScopedValue result(scope, v4->globalObject->get(name, &hasProp));
|
||||
if (hasProp) {
|
||||
if (hasProperty)
|
||||
*hasProperty = hasProp;
|
||||
return result->asReturnedValue();
|
||||
}
|
||||
|
||||
if (resource->d()->isNullWrapper)
|
||||
return Object::get(m, name, hasProperty);
|
||||
|
||||
if (v4->callingQmlContext() != resource->d()->context)
|
||||
return Object::get(m, name, hasProperty);
|
||||
|
||||
bool hasProp;
|
||||
QV4::ScopedValue result(scope, Object::get(m, name, &hasProp));
|
||||
result = Object::get(m, name, &hasProp);
|
||||
if (hasProp) {
|
||||
if (hasProperty)
|
||||
*hasProperty = hasProp;
|
||||
|
|
|
@ -54,21 +54,13 @@
|
|||
#include <QtCore/qglobal.h>
|
||||
#include <private/qtqmlglobal_p.h>
|
||||
|
||||
#include <private/qv4value_p.h>
|
||||
#include <private/qv4object_p.h>
|
||||
#include <private/qqmlcontext_p.h>
|
||||
#include <private/qv4functionobject_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QV4 {
|
||||
|
||||
namespace CompiledData {
|
||||
struct Function;
|
||||
}
|
||||
|
||||
struct QmlContextWrapper;
|
||||
|
||||
namespace Heap {
|
||||
|
||||
struct QmlContextWrapper : Object {
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include <private/qqmljavascriptexpression_p.h>
|
||||
#include <private/qv4value_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
#include <private/qqmlcontextwrapper_p.h>
|
||||
|
||||
#include <QQmlError>
|
||||
|
||||
|
|
|
@ -2227,7 +2227,7 @@ QQmlMetaObject QQmlEnginePrivate::rawMetaObjectForType(int t) const
|
|||
Locker locker(this);
|
||||
QHash<int, QQmlCompiledData *>::ConstIterator iter = m_compositeTypes.constFind(t);
|
||||
if (iter != m_compositeTypes.cend()) {
|
||||
return QQmlMetaObject((*iter)->rootPropertyCache);
|
||||
return QQmlMetaObject((*iter)->rootPropertyCache());
|
||||
} else {
|
||||
QQmlType *type = QQmlMetaType::qmlType(t);
|
||||
return QQmlMetaObject(type?type->baseMetaObject():0);
|
||||
|
@ -2239,7 +2239,7 @@ QQmlMetaObject QQmlEnginePrivate::metaObjectForType(int t) const
|
|||
Locker locker(this);
|
||||
QHash<int, QQmlCompiledData *>::ConstIterator iter = m_compositeTypes.constFind(t);
|
||||
if (iter != m_compositeTypes.cend()) {
|
||||
return QQmlMetaObject((*iter)->rootPropertyCache);
|
||||
return QQmlMetaObject((*iter)->rootPropertyCache());
|
||||
} else {
|
||||
QQmlType *type = QQmlMetaType::qmlType(t);
|
||||
return QQmlMetaObject(type?type->metaObject():0);
|
||||
|
@ -2251,7 +2251,7 @@ QQmlPropertyCache *QQmlEnginePrivate::propertyCacheForType(int t)
|
|||
Locker locker(this);
|
||||
QHash<int, QQmlCompiledData*>::ConstIterator iter = m_compositeTypes.constFind(t);
|
||||
if (iter != m_compositeTypes.cend()) {
|
||||
return (*iter)->rootPropertyCache;
|
||||
return (*iter)->rootPropertyCache();
|
||||
} else {
|
||||
QQmlType *type = QQmlMetaType::qmlType(t);
|
||||
locker.unlock();
|
||||
|
@ -2264,7 +2264,7 @@ QQmlPropertyCache *QQmlEnginePrivate::rawPropertyCacheForType(int t)
|
|||
Locker locker(this);
|
||||
QHash<int, QQmlCompiledData*>::ConstIterator iter = m_compositeTypes.constFind(t);
|
||||
if (iter != m_compositeTypes.cend()) {
|
||||
return (*iter)->rootPropertyCache;
|
||||
return (*iter)->rootPropertyCache();
|
||||
} else {
|
||||
QQmlType *type = QQmlMetaType::qmlType(t);
|
||||
locker.unlock();
|
||||
|
@ -2274,7 +2274,7 @@ QQmlPropertyCache *QQmlEnginePrivate::rawPropertyCacheForType(int t)
|
|||
|
||||
void QQmlEnginePrivate::registerInternalCompositeType(QQmlCompiledData *data)
|
||||
{
|
||||
QByteArray name = data->rootPropertyCache->className();
|
||||
QByteArray name = data->rootPropertyCache()->className();
|
||||
|
||||
QByteArray ptr = name + '*';
|
||||
QByteArray lst = "QQmlListProperty<" + name + '>';
|
||||
|
|
|
@ -47,6 +47,7 @@
|
|||
#include <private/qv4errorobject_p.h>
|
||||
#include <private/qv4scopedvalue_p.h>
|
||||
#include <private/qqmlglobal_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#include <qv4objectiterator_p.h>
|
||||
|
||||
#include <private/qv4functionobject_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
#include <QtCore/qlocale.h>
|
||||
#include <QtCore/qobject.h>
|
||||
#include <private/qqmlglobal_p.h>
|
||||
#include <private/qv4object_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
|
|
@ -494,7 +494,7 @@ QQmlType *QQmlType::resolveCompositeBaseType(QQmlEnginePrivate *engine) const
|
|||
if (!td || !td->isComplete())
|
||||
return 0;
|
||||
QQmlCompiledData *cd = td->compiledData();
|
||||
const QMetaObject *mo = cd->rootPropertyCache->firstCppMetaObject();
|
||||
const QMetaObject *mo = cd->rootPropertyCache()->firstCppMetaObject();
|
||||
return QQmlMetaType::qmlType(mo);
|
||||
}
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include <private/qqmlvmemetaobject_p.h>
|
||||
#include <private/qv4function_p.h>
|
||||
#include <private/qv4functionobject_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
#include <private/qqmlcontextwrapper_p.h>
|
||||
#include <private/qqmlbinding_p.h>
|
||||
#include <private/qqmlstringconverters_p.h>
|
||||
|
@ -73,7 +74,6 @@ QQmlObjectCreator::QQmlObjectCreator(QQmlContextData *parentContext, QQmlCompile
|
|||
, compiledData(compiledData)
|
||||
, resolvedTypes(compiledData->resolvedTypes)
|
||||
, propertyCaches(compiledData->propertyCaches)
|
||||
, vmeMetaObjectData(compiledData->metaObjects)
|
||||
, activeVMEDataForRootContext(activeVMEDataForRootContext)
|
||||
{
|
||||
init(parentContext);
|
||||
|
@ -98,7 +98,6 @@ QQmlObjectCreator::QQmlObjectCreator(QQmlContextData *parentContext, QQmlCompile
|
|||
, compiledData(compiledData)
|
||||
, resolvedTypes(compiledData->resolvedTypes)
|
||||
, propertyCaches(compiledData->propertyCaches)
|
||||
, vmeMetaObjectData(compiledData->metaObjects)
|
||||
, activeVMEDataForRootContext(0)
|
||||
{
|
||||
init(parentContext);
|
||||
|
@ -1151,7 +1150,7 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo
|
|||
return instance;
|
||||
}
|
||||
|
||||
QQmlRefPointer<QQmlPropertyCache> cache = propertyCaches.at(index);
|
||||
QQmlRefPointer<QQmlPropertyCache> cache = propertyCaches.at(index).data();
|
||||
Q_ASSERT(!cache.isNull());
|
||||
if (installPropertyCache) {
|
||||
if (ddata->propertyCache)
|
||||
|
@ -1282,14 +1281,14 @@ bool QQmlObjectCreator::populateInstance(int index, QObject *instance, QObject *
|
|||
QV4::Scope valueScope(v4);
|
||||
QV4::ScopedValue scopeObjectProtector(valueScope);
|
||||
|
||||
QQmlRefPointer<QQmlPropertyCache> cache = propertyCaches.at(_compiledObjectIndex);
|
||||
QQmlRefPointer<QQmlPropertyCache> cache = propertyCaches.at(_compiledObjectIndex).data();
|
||||
|
||||
QQmlVMEMetaObject *vmeMetaObject = 0;
|
||||
const QByteArray data = vmeMetaObjectData.value(_compiledObjectIndex);
|
||||
if (!data.isEmpty()) {
|
||||
const bool needVMEMetaObject = propertyCaches.at(_compiledObjectIndex).flag();
|
||||
if (needVMEMetaObject) {
|
||||
Q_ASSERT(!cache.isNull());
|
||||
// install on _object
|
||||
vmeMetaObject = new QQmlVMEMetaObject(_qobject, cache, reinterpret_cast<const QQmlVMEMetaData*>(data.constData()), compiledData->compilationUnit, _compiledObjectIndex);
|
||||
vmeMetaObject = new QQmlVMEMetaObject(_qobject, cache, compiledData->compilationUnit, _compiledObjectIndex);
|
||||
if (_ddata->propertyCache)
|
||||
_ddata->propertyCache->release();
|
||||
_ddata->propertyCache = cache;
|
||||
|
|
|
@ -142,8 +142,7 @@ private:
|
|||
QQmlGuardedContextData parentContext;
|
||||
QQmlContextData *context;
|
||||
const QHash<int, QQmlCompiledData::TypeReference*> &resolvedTypes;
|
||||
const QVector<QQmlPropertyCache *> &propertyCaches;
|
||||
const QVector<QByteArray> &vmeMetaObjectData;
|
||||
const QQmlPropertyCacheVector &propertyCaches;
|
||||
QHash<int, int> objectIndexToId;
|
||||
QExplicitlySharedDataPointer<QQmlObjectCreatorSharedState> sharedState;
|
||||
bool topLevelCreator;
|
||||
|
|
|
@ -980,7 +980,7 @@ struct CachedLoader {
|
|||
}
|
||||
void loadAsync(QQmlTypeLoader *loader, QQmlDataBlob *blob) const
|
||||
{
|
||||
loader->m_thread->loadWithCachedUnit(blob, unit);
|
||||
loader->m_thread->loadWithCachedUnitAsync(blob, unit);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -47,6 +47,7 @@
|
|||
#include <private/qjsvalue_p.h>
|
||||
#include <private/qv4functionobject_p.h>
|
||||
#include <private/qv4objectproto_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
#include <private/qv4variantobject_p.h>
|
||||
#include <private/qv4alloca_p.h>
|
||||
#include <private/qv4objectiterator_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
#include <private/qv4variantobject_p.h>
|
||||
#include <private/qv4functionobject_p.h>
|
||||
#include <private/qv4scopedvalue_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
@ -149,15 +150,23 @@ void QQmlVMEMetaObjectEndpoint::tryConnect()
|
|||
metaObject->activate(metaObject->object, sigIdx, 0);
|
||||
} else {
|
||||
const QV4::CompiledData::Alias *aliasData = &metaObject->compiledObject->aliasTable()[aliasId];
|
||||
QQmlVMEMetaData::AliasData *d = metaObject->metaData->aliasData() + aliasId;
|
||||
if (!aliasData->isObjectAlias()) {
|
||||
QQmlContextData *ctxt = metaObject->ctxt;
|
||||
QObject *target = ctxt->idValues[aliasData->targetObjectId].data();
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
if (d->notifySignal != -1)
|
||||
connect(target, d->notifySignal, ctxt->engine);
|
||||
QQmlData *targetDData = QQmlData::get(target, /*create*/false);
|
||||
if (!targetDData)
|
||||
return;
|
||||
int coreIndex;
|
||||
QQmlPropertyData::decodeValueTypePropertyIndex(aliasData->encodedMetaPropertyIndex, &coreIndex);
|
||||
const QQmlPropertyData *pd = targetDData->propertyCache->property(coreIndex);
|
||||
if (!pd)
|
||||
return;
|
||||
|
||||
if (pd->notifyIndex != -1)
|
||||
connect(target, pd->notifyIndex, ctxt->engine);
|
||||
}
|
||||
|
||||
metaObject.setFlag();
|
||||
|
@ -305,10 +314,9 @@ QAbstractDynamicMetaObject *QQmlInterceptorMetaObject::toDynamicMetaObject(QObje
|
|||
}
|
||||
|
||||
QQmlVMEMetaObject::QQmlVMEMetaObject(QObject *obj,
|
||||
QQmlPropertyCache *cache,
|
||||
const QQmlVMEMetaData *meta, QV4::CompiledData::CompilationUnit *qmlCompilationUnit, int qmlObjectId)
|
||||
QQmlPropertyCache *cache, QV4::CompiledData::CompilationUnit *qmlCompilationUnit, int qmlObjectId)
|
||||
: QQmlInterceptorMetaObject(obj, cache),
|
||||
ctxt(QQmlData::get(obj, true)->outerContext), metaData(meta),
|
||||
ctxt(QQmlData::get(obj, true)->outerContext),
|
||||
aliasEndpoints(0), compilationUnit(qmlCompilationUnit), compiledObject(0)
|
||||
{
|
||||
cache->addref();
|
||||
|
@ -733,9 +741,10 @@ int QQmlVMEMetaObject::metaCall(QObject *o, QMetaObject::Call c, int _id, void *
|
|||
case QV4::CompiledData::Property::Quaternion:
|
||||
Q_ASSERT(fallbackMetaType != QMetaType::UnknownType);
|
||||
if (QV4::MemberData *md = propertyAndMethodStorageAsMemberData()) {
|
||||
QV4::VariantObject *v = (md->data() + id)->as<QV4::VariantObject>();
|
||||
if (v)
|
||||
QQml_valueTypeProvider()->readValueType(v->d()->data, a[0], fallbackMetaType);
|
||||
QVariant propertyAsVariant;
|
||||
if (QV4::VariantObject *v = (md->data() + id)->as<QV4::VariantObject>())
|
||||
propertyAsVariant = v->d()->data;
|
||||
QQml_valueTypeProvider()->readValueType(propertyAsVariant, a[0], fallbackMetaType);
|
||||
}
|
||||
break;
|
||||
case QV4::CompiledData::Property::Var:
|
||||
|
|
|
@ -74,20 +74,6 @@
|
|||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
struct QQmlVMEMetaData
|
||||
{
|
||||
// Make sure this structure is always aligned to int
|
||||
int dummy;
|
||||
|
||||
struct AliasData {
|
||||
int notifySignal;
|
||||
};
|
||||
|
||||
AliasData *aliasData() const {
|
||||
return (AliasData *)(((char *)const_cast<QQmlVMEMetaData *>(this)) + sizeof(QQmlVMEMetaData));
|
||||
}
|
||||
};
|
||||
|
||||
class QQmlVMEMetaObject;
|
||||
class QQmlVMEVariantQObjectPtr : public QQmlGuard<QObject>
|
||||
{
|
||||
|
@ -147,7 +133,7 @@ class QQmlVMEMetaObjectEndpoint;
|
|||
class Q_QML_PRIVATE_EXPORT QQmlVMEMetaObject : public QQmlInterceptorMetaObject
|
||||
{
|
||||
public:
|
||||
QQmlVMEMetaObject(QObject *obj, QQmlPropertyCache *cache, const QQmlVMEMetaData *data, QV4::CompiledData::CompilationUnit *qmlCompilationUnit, int qmlObjectId);
|
||||
QQmlVMEMetaObject(QObject *obj, QQmlPropertyCache *cache, QV4::CompiledData::CompilationUnit *qmlCompilationUnit, int qmlObjectId);
|
||||
~QQmlVMEMetaObject();
|
||||
|
||||
bool aliasTarget(int index, QObject **target, int *coreIndex, int *valueTypeIndex) const;
|
||||
|
@ -169,7 +155,6 @@ protected:
|
|||
public:
|
||||
QQmlGuardedContextData ctxt;
|
||||
|
||||
const QQmlVMEMetaData *metaData;
|
||||
inline int propOffset() const;
|
||||
inline int methodOffset() const;
|
||||
inline int signalOffset() const;
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
#include <private/qv4mm_p.h>
|
||||
#include <private/qv4jsonobject_p.h>
|
||||
#include <private/qv4objectproto_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
#include <QtCore/qstring.h>
|
||||
#include <QtCore/qdatetime.h>
|
||||
|
|
|
@ -70,6 +70,7 @@
|
|||
#include <private/qv4value_p.h>
|
||||
#include <private/qv4dateobject_p.h>
|
||||
#include <private/qv4objectiterator_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
#include <private/qv4mm_p.h>
|
||||
#include <private/qv4objectproto_p.h>
|
||||
#include <private/qv4globalobject_p.h>
|
||||
|
|
|
@ -60,16 +60,13 @@
|
|||
#include <QtCore/QElapsedTimer>
|
||||
#include <QtCore/QThreadStorage>
|
||||
|
||||
#include <qjsengine.h>
|
||||
#include <QtQml/qjsengine.h>
|
||||
#include "private/qintrusivelist_p.h"
|
||||
|
||||
#include <private/qqmlpropertycache_p.h>
|
||||
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
#include <private/qv4value_p.h>
|
||||
#include <private/qv4object_p.h>
|
||||
#include <private/qv4identifier_p.h>
|
||||
#include <private/qqmlcontextwrapper_p.h>
|
||||
#include <private/qv4context_p.h>
|
||||
#include <private/qqmldelayedcallqueue_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
@ -77,6 +74,7 @@ QT_BEGIN_NAMESPACE
|
|||
namespace QV4 {
|
||||
struct ArrayObject;
|
||||
struct ExecutionEngine;
|
||||
struct QObjectMethod;
|
||||
}
|
||||
|
||||
#define V4THROW_ERROR(string) \
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
#define QQMLDATAMODEL_P_P_H
|
||||
|
||||
#include "qqmldelegatemodel_p.h"
|
||||
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
#include <QtQml/qqmlcontext.h>
|
||||
#include <QtQml/qqmlincubator.h>
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
#include "qqmllistmodel_p.h"
|
||||
#include <private/qqmlengine_p.h>
|
||||
#include <private/qqmlopenmetaobject_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
#include <qqml.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
|
||||
#include <qqml.h>
|
||||
|
||||
#include <QEvent>
|
||||
#include <QMutex>
|
||||
#include <QWaitCondition>
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
#include <QtQuick/qquickwindow.h>
|
||||
#include <QtGui/qvector3d.h>
|
||||
#include <QtQml/private/qqmlglobal_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
|
|
|
@ -54,6 +54,11 @@ QAccessibleQuickItem::QAccessibleQuickItem(QQuickItem *item)
|
|||
{
|
||||
}
|
||||
|
||||
QWindow *QAccessibleQuickItem::window() const
|
||||
{
|
||||
return item()->window();
|
||||
}
|
||||
|
||||
int QAccessibleQuickItem::childCount() const
|
||||
{
|
||||
return childItems().count();
|
||||
|
|
|
@ -66,70 +66,73 @@ class QAccessibleQuickItem : public QAccessibleObject, public QAccessibleActionI
|
|||
public:
|
||||
QAccessibleQuickItem(QQuickItem *item);
|
||||
|
||||
QRect rect() const;
|
||||
QWindow *window() const Q_DECL_OVERRIDE;
|
||||
|
||||
QRect rect() const Q_DECL_OVERRIDE;
|
||||
QRect viewRect() const;
|
||||
|
||||
bool clipsChildren() const;
|
||||
QAccessibleInterface *childAt(int x, int y) const;
|
||||
QAccessibleInterface *childAt(int x, int y) const Q_DECL_OVERRIDE;
|
||||
|
||||
QAccessibleInterface *parent() const;
|
||||
QAccessibleInterface *child(int index) const;
|
||||
int childCount() const;
|
||||
int indexOfChild(const QAccessibleInterface *iface) const;
|
||||
QAccessibleInterface *parent() const Q_DECL_OVERRIDE;
|
||||
QAccessibleInterface *child(int index) const Q_DECL_OVERRIDE;
|
||||
int childCount() const Q_DECL_OVERRIDE;
|
||||
int indexOfChild(const QAccessibleInterface *iface) const Q_DECL_OVERRIDE;
|
||||
QList<QQuickItem *> childItems() const;
|
||||
|
||||
QAccessible::State state() const;
|
||||
QAccessible::Role role() const;
|
||||
QString text(QAccessible::Text) const;
|
||||
QAccessible::State state() const Q_DECL_OVERRIDE;
|
||||
QAccessible::Role role() const Q_DECL_OVERRIDE;
|
||||
QString text(QAccessible::Text) const Q_DECL_OVERRIDE;
|
||||
|
||||
bool isAccessible() const;
|
||||
|
||||
// Action Interface
|
||||
QStringList actionNames() const;
|
||||
void doAction(const QString &actionName);
|
||||
QStringList keyBindingsForAction(const QString &actionName) const;
|
||||
QStringList actionNames() const Q_DECL_OVERRIDE;
|
||||
void doAction(const QString &actionName) Q_DECL_OVERRIDE;
|
||||
QStringList keyBindingsForAction(const QString &actionName) const Q_DECL_OVERRIDE;
|
||||
|
||||
// Value Interface
|
||||
QVariant currentValue() const;
|
||||
void setCurrentValue(const QVariant &value);
|
||||
QVariant maximumValue() const;
|
||||
QVariant minimumValue() const;
|
||||
QVariant minimumStepSize() const;
|
||||
QVariant currentValue() const Q_DECL_OVERRIDE;
|
||||
void setCurrentValue(const QVariant &value) Q_DECL_OVERRIDE;
|
||||
QVariant maximumValue() const Q_DECL_OVERRIDE;
|
||||
QVariant minimumValue() const Q_DECL_OVERRIDE;
|
||||
QVariant minimumStepSize() const Q_DECL_OVERRIDE;
|
||||
|
||||
|
||||
// Text Interface
|
||||
void selection(int selectionIndex, int *startOffset, int *endOffset) const;
|
||||
int selectionCount() const;
|
||||
void addSelection(int startOffset, int endOffset);
|
||||
void removeSelection(int selectionIndex);
|
||||
void setSelection(int selectionIndex, int startOffset, int endOffset);
|
||||
void selection(int selectionIndex, int *startOffset, int *endOffset) const Q_DECL_OVERRIDE;
|
||||
int selectionCount() const Q_DECL_OVERRIDE;
|
||||
void addSelection(int startOffset, int endOffset) Q_DECL_OVERRIDE;
|
||||
void removeSelection(int selectionIndex) Q_DECL_OVERRIDE;
|
||||
void setSelection(int selectionIndex, int startOffset, int endOffset) Q_DECL_OVERRIDE;
|
||||
|
||||
// cursor
|
||||
int cursorPosition() const;
|
||||
void setCursorPosition(int position);
|
||||
int cursorPosition() const Q_DECL_OVERRIDE;
|
||||
void setCursorPosition(int position) Q_DECL_OVERRIDE;
|
||||
|
||||
// text
|
||||
QString text(int startOffset, int endOffset) const;
|
||||
QString text(int startOffset, int endOffset) const Q_DECL_OVERRIDE;
|
||||
QString textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType,
|
||||
int *startOffset, int *endOffset) const;
|
||||
int *startOffset, int *endOffset) const Q_DECL_OVERRIDE;
|
||||
QString textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType,
|
||||
int *startOffset, int *endOffset) const;
|
||||
int *startOffset, int *endOffset) const Q_DECL_OVERRIDE;
|
||||
QString textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType,
|
||||
int *startOffset, int *endOffset) const;
|
||||
int characterCount() const;
|
||||
int *startOffset, int *endOffset) const Q_DECL_OVERRIDE;
|
||||
int characterCount() const Q_DECL_OVERRIDE;
|
||||
|
||||
// character <-> geometry
|
||||
QRect characterRect(int /* offset */) const { return QRect(); }
|
||||
int offsetAtPoint(const QPoint & /* point */) const { return -1; }
|
||||
QRect characterRect(int /* offset */) const Q_DECL_OVERRIDE { return QRect(); }
|
||||
int offsetAtPoint(const QPoint & /* point */) const Q_DECL_OVERRIDE { return -1; }
|
||||
|
||||
void scrollToSubstring(int /* startIndex */, int /* endIndex */) {}
|
||||
QString attributes(int /* offset */, int *startOffset, int *endOffset) const { *startOffset = 0; *endOffset = 0; return QString(); }
|
||||
void scrollToSubstring(int /* startIndex */, int /* endIndex */) Q_DECL_OVERRIDE {}
|
||||
QString attributes(int /* offset */, int *startOffset, int *endOffset) const Q_DECL_OVERRIDE
|
||||
{ *startOffset = 0; *endOffset = 0; return QString(); }
|
||||
|
||||
QTextDocument *textDocument() const;
|
||||
|
||||
protected:
|
||||
QQuickItem *item() const { return static_cast<QQuickItem*>(object()); }
|
||||
void *interface_cast(QAccessible::InterfaceType t);
|
||||
void *interface_cast(QAccessible::InterfaceType t) Q_DECL_OVERRIDE;
|
||||
|
||||
private:
|
||||
QTextDocument *m_doc;
|
||||
|
|
|
@ -79,20 +79,6 @@ struct MetaPropertyData {
|
|||
QVector<QPair<QVariant, bool> > m_data;
|
||||
};
|
||||
|
||||
static QQmlVMEMetaData* fakeMetaData()
|
||||
{
|
||||
return new QQmlVMEMetaData;
|
||||
}
|
||||
|
||||
static const QQmlVMEMetaData* vMEMetaDataForObject(QObject *object)
|
||||
{
|
||||
QQmlVMEMetaObject *metaObject = QQmlVMEMetaObject::get(object);
|
||||
if (metaObject)
|
||||
return metaObject->metaData;
|
||||
|
||||
return fakeMetaData();
|
||||
}
|
||||
|
||||
static QQmlPropertyCache *cacheForObject(QObject *object, QQmlEngine *engine)
|
||||
{
|
||||
QQmlVMEMetaObject *metaObject = QQmlVMEMetaObject::get(object);
|
||||
|
@ -147,7 +133,7 @@ void QQmlDesignerMetaObject::init(QObject *object, QQmlEngine *engine)
|
|||
}
|
||||
|
||||
QQmlDesignerMetaObject::QQmlDesignerMetaObject(QObject *object, QQmlEngine *engine)
|
||||
: QQmlVMEMetaObject(object, cacheForObject(object, engine), vMEMetaDataForObject(object), /*qml compilation unit*/nullptr, /*qmlObjectId*/-1),
|
||||
: QQmlVMEMetaObject(object, cacheForObject(object, engine), /*qml compilation unit*/nullptr, /*qmlObjectId*/-1),
|
||||
m_context(engine->contextForObject(object)),
|
||||
m_data(new MetaPropertyData),
|
||||
m_cache(0)
|
||||
|
|
|
@ -4,7 +4,7 @@ project = QtQuick
|
|||
description = Qt Quick Reference Documentation
|
||||
version = $QT_VERSION
|
||||
|
||||
examplesinstallpath = qtdeclarative/quick
|
||||
examplesinstallpath = quick
|
||||
|
||||
qhp.projects = QtQuick
|
||||
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
#include <private/qv4value_p.h>
|
||||
#include <private/qv4functionobject_p.h>
|
||||
#include <private/qv4scopedvalue_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
|
||||
#include <QtQuick/qquickitem.h>
|
||||
#include <private/qv8engine_p.h>
|
||||
#include <private/qqmlrefcount_p.h>
|
||||
#include <QtCore/QThread>
|
||||
#include <QtGui/QImage>
|
||||
|
||||
|
|
|
@ -58,6 +58,7 @@
|
|||
#include <private/qv4domerrors_p.h>
|
||||
#include <private/qv4engine_p.h>
|
||||
#include <private/qv4object_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
#include <private/qquickwindow_p.h>
|
||||
|
||||
#include <private/qv4value_p.h>
|
||||
|
|
|
@ -66,6 +66,7 @@
|
|||
#include <QtCore/QWaitCondition>
|
||||
|
||||
#include <private/qv4value_p.h>
|
||||
#include <private/qv4persistent_p.h>
|
||||
|
||||
//#define QQUICKCONTEXT2D_DEBUG //enable this for just DEBUG purpose!
|
||||
|
||||
|
|
|
@ -1402,15 +1402,15 @@ void QQuickFlickable::wheelEvent(QWheelEvent *event)
|
|||
break;
|
||||
case Qt::NoScrollPhase: // default phase with an ordinary wheel mouse
|
||||
case Qt::ScrollUpdate:
|
||||
if (d->scrollingPhase) {
|
||||
if (d->scrollingPhase)
|
||||
d->pressed = true;
|
||||
d->movementEndingTimer.start(MovementEndingTimerInterval, this);
|
||||
}
|
||||
#ifdef Q_OS_OSX
|
||||
d->movementEndingTimer.start(MovementEndingTimerInterval, this);
|
||||
#endif
|
||||
break;
|
||||
case Qt::ScrollEnd:
|
||||
d->pressed = false;
|
||||
d->scrollingPhase = false;
|
||||
d->movementEndingTimer.start(MovementEndingTimerInterval, this);
|
||||
d->draggingEnding();
|
||||
event->accept();
|
||||
returnToBounds();
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
|
||||
#include <QtQuick/private/qsgcontext_p.h>
|
||||
#include <private/qsgadaptationlayer_p.h>
|
||||
#include <private/qnumeric_p.h>
|
||||
|
||||
#include <QtCore/qmath.h>
|
||||
#include <QtGui/qpainter.h>
|
||||
|
|
|
@ -71,6 +71,7 @@
|
|||
|
||||
#include <private/qv4engine_p.h>
|
||||
#include <private/qv4object_p.h>
|
||||
#include <private/qv4qobjectwrapper_p.h>
|
||||
#include <private/qdebug_p.h>
|
||||
|
||||
#ifndef QT_NO_CURSOR
|
||||
|
|
|
@ -583,6 +583,7 @@ void QQuickLoader::setSource(QQmlV4Function *args)
|
|||
d->disposeInitialPropertyValues();
|
||||
d->initialPropertyValues.set(args->v4engine(), ipv);
|
||||
}
|
||||
d->qmlCallingContext.set(scope.engine, scope.engine->qmlContext());
|
||||
|
||||
setSource(sourceUrl, false); // already cleared and set ipv above.
|
||||
}
|
||||
|
@ -651,7 +652,8 @@ void QQuickLoaderPrivate::setInitialState(QObject *obj)
|
|||
Q_ASSERT(v4);
|
||||
QV4::Scope scope(v4);
|
||||
QV4::ScopedValue ipv(scope, initialPropertyValues.value());
|
||||
d->initializeObjectWithInitialProperties(ipv, obj);
|
||||
QV4::Scoped<QV4::QmlContext> qmlContext(scope, qmlCallingContext.value());
|
||||
d->initializeObjectWithInitialProperties(qmlContext, ipv, obj);
|
||||
}
|
||||
|
||||
void QQuickLoaderIncubator::statusChanged(Status status)
|
||||
|
|
|
@ -108,6 +108,7 @@ public:
|
|||
QQmlContext *itemContext;
|
||||
QQuickLoaderIncubator *incubator;
|
||||
QV4::PersistentValue initialPropertyValues;
|
||||
QV4::PersistentValue qmlCallingContext;
|
||||
bool updatingSize: 1;
|
||||
bool active : 1;
|
||||
bool loadingFromSource : 1;
|
||||
|
|
|
@ -650,6 +650,11 @@ QRectF QQuickTextPrivate::setupTextLayout(qreal *const baseline)
|
|||
emit q->lineCountChanged();
|
||||
}
|
||||
|
||||
if (qFuzzyIsNull(q->width())) {
|
||||
layout.setText(QString());
|
||||
textHasChanged = true;
|
||||
}
|
||||
|
||||
QFontMetricsF fm(font);
|
||||
qreal height = (lineHeightMode() == QQuickText::FixedHeight) ? lineHeight() : qCeil(fm.height()) * lineHeight();
|
||||
*baseline = fm.ascent();
|
||||
|
|
|
@ -1176,17 +1176,20 @@ void QQuickWidget::mouseDoubleClickEvent(QMouseEvent *e)
|
|||
void QQuickWidget::showEvent(QShowEvent *)
|
||||
{
|
||||
Q_D(QQuickWidget);
|
||||
d->updatePending = false;
|
||||
if (!d->useSoftwareRenderer) {
|
||||
d->createContext();
|
||||
if (d->offscreenWindow->openglContext())
|
||||
if (d->offscreenWindow->openglContext()) {
|
||||
d->render(true);
|
||||
else
|
||||
if (d->updatePending) {
|
||||
d->updatePending = false;
|
||||
update();
|
||||
}
|
||||
} else {
|
||||
triggerUpdate();
|
||||
}
|
||||
} else {
|
||||
triggerUpdate();
|
||||
}
|
||||
|
||||
QWindowPrivate *offscreenPrivate = QWindowPrivate::get(d->offscreenWindow);
|
||||
if (!offscreenPrivate->visible) {
|
||||
offscreenPrivate->visible = true;
|
||||
|
|
|
@ -39,6 +39,8 @@
|
|||
#include <private/qv8engine_p.h>
|
||||
#include <private/qv4objectiterator_p.h>
|
||||
#include <private/qv4isel_moth_p.h>
|
||||
#include <private/qv4string_p.h>
|
||||
#include <private/qqmlbuiltinfunctions_p.h>
|
||||
|
||||
using namespace QV4;
|
||||
using namespace QV4::Debugging;
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
import QtQml 2.0
|
||||
import qqmlcomponenttest 1.0
|
||||
QtObject {
|
||||
property Component factory
|
||||
property QtObject incubatedObject
|
||||
|
||||
Component.onCompleted: {
|
||||
var incubatorState = factory.incubateObject(null, { value: 42 })
|
||||
incubatorState.onStatusChanged = function(status) {
|
||||
incubatedObject = incubatorState.object
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
import qqmlcomponenttest 1.0
|
||||
CallingContextCheckingClass {
|
||||
}
|
|
@ -35,6 +35,9 @@
|
|||
#include <QtQuick>
|
||||
#include <QtQuick/private/qquickrectangle_p.h>
|
||||
#include <QtQuick/private/qquickmousearea_p.h>
|
||||
#include <private/qv8engine_p.h>
|
||||
#include <private/qqmlcontext_p.h>
|
||||
#include <private/qv4scopedvalue_p.h>
|
||||
#include <qcolor.h>
|
||||
#include "../../shared/util.h"
|
||||
#include "testhttpserver.h"
|
||||
|
@ -111,6 +114,7 @@ private slots:
|
|||
void onDestructionCount();
|
||||
void recursion();
|
||||
void recursionContinuation();
|
||||
void callingContextForInitialProperties();
|
||||
|
||||
private:
|
||||
QQmlEngine engine;
|
||||
|
@ -518,6 +522,63 @@ void tst_qqmlcomponent::recursionContinuation()
|
|||
QVERIFY(object->property("success").toBool());
|
||||
}
|
||||
|
||||
class CallingContextCheckingClass : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(int value READ value WRITE setValue)
|
||||
public:
|
||||
CallingContextCheckingClass()
|
||||
: m_value(0)
|
||||
{}
|
||||
|
||||
int value() const { return m_value; }
|
||||
void setValue(int v) {
|
||||
scopeObject.clear();
|
||||
callingContextData.setContextData(0);
|
||||
|
||||
m_value = v;
|
||||
QJSEngine *jsEngine = qjsEngine(this);
|
||||
if (!jsEngine)
|
||||
return;
|
||||
QV4::ExecutionEngine *v4 = QV8Engine::getV4(jsEngine);
|
||||
if (!v4)
|
||||
return;
|
||||
QV4::Scope scope(v4);
|
||||
QV4::Scoped<QV4::QmlContext> qmlContext(scope, v4->qmlContext());
|
||||
if (!qmlContext)
|
||||
return;
|
||||
callingContextData = qmlContext->qmlContext();
|
||||
scopeObject = qmlContext->qmlScope();
|
||||
}
|
||||
|
||||
int m_value;
|
||||
QQmlGuardedContextData callingContextData;
|
||||
QPointer<QObject> scopeObject;
|
||||
};
|
||||
|
||||
void tst_qqmlcomponent::callingContextForInitialProperties()
|
||||
{
|
||||
qmlRegisterType<CallingContextCheckingClass>("qqmlcomponenttest", 1, 0, "CallingContextCheckingClass");
|
||||
|
||||
QQmlComponent testFactory(&engine, testFileUrl("callingQmlContextComponent.qml"));
|
||||
|
||||
QQmlComponent component(&engine, testFileUrl("callingQmlContext.qml"));
|
||||
QScopedPointer<QObject> root(component.beginCreate(engine.rootContext()));
|
||||
QVERIFY(!root.isNull());
|
||||
root->setProperty("factory", QVariant::fromValue(&testFactory));
|
||||
component.completeCreate();
|
||||
QTRY_VERIFY(qvariant_cast<QObject *>(root->property("incubatedObject")));
|
||||
QObject *o = qvariant_cast<QObject *>(root->property("incubatedObject"));
|
||||
CallingContextCheckingClass *checker = qobject_cast<CallingContextCheckingClass*>(o);
|
||||
QVERIFY(checker);
|
||||
|
||||
QVERIFY(!checker->callingContextData.isNull());
|
||||
QVERIFY(checker->callingContextData->urlString().endsWith(QStringLiteral("callingQmlContext.qml")));
|
||||
|
||||
QVERIFY(!checker->scopeObject.isNull());
|
||||
QVERIFY(checker->scopeObject->metaObject()->indexOfProperty("incubatedObject") != -1);
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_qqmlcomponent)
|
||||
|
||||
#include "tst_qqmlcomponent.moc"
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
import QtQml 2.0
|
||||
QtObject {
|
||||
property int value: {
|
||||
console.log("lookup in global object")
|
||||
return 1
|
||||
}
|
||||
}
|
|
@ -56,6 +56,7 @@ private slots:
|
|||
void refreshExpressions();
|
||||
void refreshExpressionsCrash();
|
||||
void refreshExpressionsRootContext();
|
||||
void skipExpressionRefresh_qtbug_53431();
|
||||
|
||||
void qtbug_22535();
|
||||
void evalAfterInvalidate();
|
||||
|
@ -637,6 +638,19 @@ void tst_qqmlcontext::refreshExpressionsRootContext()
|
|||
delete o1;
|
||||
}
|
||||
|
||||
void tst_qqmlcontext::skipExpressionRefresh_qtbug_53431()
|
||||
{
|
||||
QQmlEngine engine;
|
||||
QQmlComponent component(&engine, testFileUrl("qtbug_53431.qml"));
|
||||
QScopedPointer<QObject> object(component.create(0));
|
||||
QVERIFY(!object.isNull());
|
||||
QCOMPARE(object->property("value").toInt(), 1);
|
||||
object->setProperty("value", 10);
|
||||
QCOMPARE(object->property("value").toInt(), 10);
|
||||
engine.rootContext()->setContextProperty("randomContextProperty", 42);
|
||||
QCOMPARE(object->property("value").toInt(), 10);
|
||||
}
|
||||
|
||||
void tst_qqmlcontext::qtbug_22535()
|
||||
{
|
||||
QQmlEngine engine;
|
||||
|
|
|
@ -248,8 +248,6 @@ private slots:
|
|||
|
||||
void earlyIdObjectAccess();
|
||||
|
||||
void dataAlignment();
|
||||
|
||||
void deleteSingletons();
|
||||
|
||||
void arrayBuffer_data();
|
||||
|
@ -4131,12 +4129,6 @@ void tst_qqmllanguage::earlyIdObjectAccess()
|
|||
QVERIFY(o->property("success").toBool());
|
||||
}
|
||||
|
||||
void tst_qqmllanguage::dataAlignment()
|
||||
{
|
||||
QVERIFY(sizeof(QQmlVMEMetaData) % sizeof(int) == 0);
|
||||
QVERIFY(sizeof(QQmlVMEMetaData::AliasData) % sizeof(int) == 0);
|
||||
}
|
||||
|
||||
void tst_qqmllanguage::deleteSingletons()
|
||||
{
|
||||
QPointer<QObject> singleton;
|
||||
|
|
|
@ -6,7 +6,6 @@ DESTDIR = ../imports/org/qtproject/AutoTestQmlPluginType.2
|
|||
|
||||
QT += core-private gui-private qml-private
|
||||
|
||||
IMPORT_DIR = DESTDIR
|
||||
IMPORT_FILES = \
|
||||
qmldir
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ force_bootstrap {
|
|||
!build_pass: CONFIG += release
|
||||
} else {
|
||||
QT = core
|
||||
!build_pass:contains(QT_CONFIG, build_all): CONFIG += release
|
||||
!build_pass:contains(QT_CONFIG, debug_and_release): CONFIG += release
|
||||
}
|
||||
QT += qmldevtools-private
|
||||
macx:CONFIG -= app_bundle
|
||||
|
|
|
@ -74,15 +74,14 @@ private:
|
|||
tst_examples::tst_examples()
|
||||
{
|
||||
// Add files to exclude here
|
||||
excludedFiles << "examples/quick/canvas/tiger/tiger.qml"; // QTBUG-26528
|
||||
excludedFiles << "snippets/qml/listmodel/listmodel.qml"; //Just a ListModel, no root QQuickItem
|
||||
excludedFiles << "examples/quick/demos/photosurface/photosurface.qml"; // root item is Window rather than Item
|
||||
|
||||
// Add directories you want excluded here (don't add examples/, because they install to examples/qtdeclarative/)
|
||||
// Add directories you want excluded here
|
||||
excludedDirs << "shared"; //Not an example
|
||||
excludedDirs << "quick/text/fonts"; // QTBUG-29004
|
||||
excludedDirs << "snippets/qml/path"; //No root QQuickItem
|
||||
excludedDirs << "tutorials/gettingStartedQml"; //C++ example, but no cpp files in root dir
|
||||
excludedDirs << "examples/qml/qmlextensionplugins"; //Requires special import search path
|
||||
excludedDirs << "examples/quick/tutorials/gettingStartedQml"; //C++ example, but no cpp files in root dir
|
||||
|
||||
// These snippets are not expected to run on their own.
|
||||
excludedDirs << "snippets/qml/visualdatamodel_rootindex";
|
||||
|
@ -182,9 +181,8 @@ void tst_examples::namingConvention(const QDir &d)
|
|||
void tst_examples::namingConvention()
|
||||
{
|
||||
QStringList examplesLocations;
|
||||
examplesLocations << QLibraryInfo::location(QLibraryInfo::ExamplesPath) + QLatin1String("/qtdeclarative");
|
||||
examplesLocations << QLibraryInfo::location(QLibraryInfo::ExamplesPath) + QLatin1String("/qtquick");
|
||||
examplesLocations << QLibraryInfo::location(QLibraryInfo::ExamplesPath) + QLatin1String("/qtqml");
|
||||
examplesLocations << QLibraryInfo::location(QLibraryInfo::ExamplesPath) + QLatin1String("/qml");
|
||||
examplesLocations << QLibraryInfo::location(QLibraryInfo::ExamplesPath) + QLatin1String("/quick");
|
||||
|
||||
foreach(const QString &examples, examplesLocations) {
|
||||
QDir d(examples);
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
import QtQuick 2.0
|
||||
|
||||
Text {
|
||||
width: 0
|
||||
height: 10
|
||||
text: "Meaningless text"
|
||||
elide: Text.ElideRight
|
||||
|
||||
Text {
|
||||
objectName: "elidedRef"
|
||||
width: 10
|
||||
height: 10
|
||||
text: "Meaningless text"
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue