diff options
Diffstat (limited to 'src/declarative/qml/qdeclarativecomponent.cpp')
-rw-r--r-- | src/declarative/qml/qdeclarativecomponent.cpp | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp index d9f291ba64..01e2434f76 100644 --- a/src/declarative/qml/qdeclarativecomponent.cpp +++ b/src/declarative/qml/qdeclarativecomponent.cpp @@ -455,7 +455,7 @@ QDeclarativeComponent::QDeclarativeComponent(QDeclarativeEngine *engine, const Q /*! \internal */ -QDeclarativeComponent::QDeclarativeComponent(QDeclarativeEngine *engine, QDeclarativeCompiledData *cc, int start, int count, QObject *parent) +QDeclarativeComponent::QDeclarativeComponent(QDeclarativeEngine *engine, QDeclarativeCompiledData *cc, int start, QObject *parent) : QObject(*(new QDeclarativeComponentPrivate), parent) { Q_D(QDeclarativeComponent); @@ -463,7 +463,6 @@ QDeclarativeComponent::QDeclarativeComponent(QDeclarativeEngine *engine, QDeclar d->cc = cc; cc->addref(); d->start = start; - d->count = count; d->url = cc->url; d->progress = 1.0; } @@ -833,12 +832,40 @@ QDeclarativeComponentPrivate::beginCreate(QDeclarativeContextData *context, cons return 0; } - return begin(context, creationContext, cc, start, count, &state, 0, bindings); + return begin(context, creationContext, cc, start, &state, 0, bindings); +} + +/* + Try to do what's necessary for a reasonable display of the type + name, but no more (just enough for the client to do more extensive cleanup). + + Should only be called when debugging is enabled. +*/ +static inline QString buildTypeNameForDebug(const QMetaObject *metaObject) +{ + static const QString qmlMarker(QLatin1String("_QML")); + static const QChar underscore(QLatin1Char('_')); + static const QChar asterisk(QLatin1Char('*')); + QDeclarativeType *type = QDeclarativeMetaType::qmlType(metaObject); + QString typeName = type ? QLatin1String(type->qmlTypeName()) : QLatin1String(metaObject->className()); + if (!type) { + //### optimize further? + int marker = typeName.indexOf(qmlMarker); + if (marker != -1 && marker < typeName.count() - 1) { + if (typeName[marker + 1] == underscore) { + const QString className = typeName.left(marker) + asterisk; + type = QDeclarativeMetaType::qmlType(QMetaType::type(className.toLatin1())); + if (type) + typeName = QLatin1String(type->qmlTypeName()); + } + } + } + return typeName; } QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentContext, QDeclarativeContextData *componentCreationContext, - QDeclarativeCompiledData *component, int start, int count, + QDeclarativeCompiledData *component, int start, ConstructionState *state, QList<QDeclarativeError> *errors, const QBitField &bindings) { @@ -848,10 +875,8 @@ QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentCon Q_ASSERT(!isRoot || state); // Either this isn't a root component, or a state data must be provided Q_ASSERT((state != 0) ^ (errors != 0)); // One of state or errors (but not both) must be provided - if (isRoot) { + if (isRoot) QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Creating); - QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Creating, component->url); - } QDeclarativeContextData *ctxt = new QDeclarativeContextData; ctxt->isInternal = true; @@ -868,7 +893,9 @@ QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentCon enginePriv->inBeginCreate = true; QDeclarativeVME vme; - QObject *rv = vme.run(ctxt, component, start, count, bindings); + enginePriv->referenceScarceResources(); // "hold" scarce resources in memory during evaluation. + QObject *rv = vme.run(ctxt, component, start, bindings); + enginePriv->dereferenceScarceResources(); // "release" scarce resources if top-level expression evaluation is complete. if (vme.isError()) { if(errors) *errors = vme.errors(); @@ -897,6 +924,11 @@ QObject * QDeclarativeComponentPrivate::begin(QDeclarativeContextData *parentCon if (!parentContext->isInternal) parentContext->asQDeclarativeContextPrivate()->instances.append(rv); QDeclarativeEngineDebugServer::instance()->objectCreated(parentContext->engine, rv); + if (isRoot) { + QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Creating, buildTypeNameForDebug(rv->metaObject())); + QDeclarativeData *data = QDeclarativeData::get(rv); + QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Creating, component->url, data ? data->lineNumber : -1); + } } return rv; |