From 661bccfb6f014cfa4b69c7e375153c901929fa21 Mon Sep 17 00:00:00 2001 From: Christiaan Janssen Date: Fri, 13 Jan 2012 15:41:59 +0100 Subject: [PATCH] QmlProfiler: profiling compiled v8 bindings Change-Id: I8c61b3805244595de6e1c7fbed7ed23440fe0a82 Reviewed-by: Kai Koehne --- .../debugger/qdeclarativedebugtrace.cpp | 16 ++++++++++++++++ .../debugger/qdeclarativedebugtrace_p.h | 8 ++++++++ src/declarative/qml/qdeclarativebinding.cpp | 19 ++----------------- src/declarative/qml/v4/qv4bindings.cpp | 8 ++++---- src/declarative/qml/v8/qv8bindings.cpp | 2 ++ 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/declarative/debugger/qdeclarativedebugtrace.cpp b/src/declarative/debugger/qdeclarativedebugtrace.cpp index ce94ed3..dc4a919 100644 --- a/src/declarative/debugger/qdeclarativedebugtrace.cpp +++ b/src/declarative/debugger/qdeclarativedebugtrace.cpp @@ -54,6 +54,22 @@ QT_BEGIN_NAMESPACE Q_GLOBAL_STATIC(QDeclarativeDebugTrace, traceInstance) +QDeclarativeBindingProfiler::QDeclarativeBindingProfiler(const QString &url, int line, int column) +{ + QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Binding); + QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Binding, url, line, column); +} + +QDeclarativeBindingProfiler::~QDeclarativeBindingProfiler() +{ + QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::Binding); +} + +void QDeclarativeBindingProfiler::addDetail(const QString &details) +{ + QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Binding, details); +} + // convert to a QByteArray that can be sent to the debug client // use of QDataStream can skew results // (see tst_qdeclarativedebugtrace::trace() benchmark) diff --git a/src/declarative/debugger/qdeclarativedebugtrace_p.h b/src/declarative/debugger/qdeclarativedebugtrace_p.h index aa7a7bf..e0d04aa 100644 --- a/src/declarative/debugger/qdeclarativedebugtrace_p.h +++ b/src/declarative/debugger/qdeclarativedebugtrace_p.h @@ -83,6 +83,14 @@ Q_DECLARE_TYPEINFO(QDeclarativeDebugData, Q_MOVABLE_TYPE); class QUrl; class QDeclarativeEngine; +// RAII +class Q_AUTOTEST_EXPORT QDeclarativeBindingProfiler { +public: + QDeclarativeBindingProfiler(const QString &url, int line, int column); + ~QDeclarativeBindingProfiler(); + void addDetail(const QString &details); +}; + class Q_DECLARATIVE_EXPORT QDeclarativeDebugTrace : public QDeclarativeDebugService { public: diff --git a/src/declarative/qml/qdeclarativebinding.cpp b/src/declarative/qml/qdeclarativebinding.cpp index 910a73c..9c31774 100644 --- a/src/declarative/qml/qdeclarativebinding.cpp +++ b/src/declarative/qml/qdeclarativebinding.cpp @@ -332,22 +332,6 @@ QDeclarativeBinding::EvaluateFlags QDeclarativeBinding::evaluateFlags() const return d->requiresThisObject()?RequiresThisObject:None; } - -class QDeclarativeBindingProfiler { -public: - QDeclarativeBindingProfiler(QDeclarativeBinding *bind) - { - QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Binding); - QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Binding, bind->expression()); - QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Binding, bind->sourceFile(), bind->lineNumber(), bind->columnNumber()); - } - - ~QDeclarativeBindingProfiler() - { - QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::Binding); - } -}; - void QDeclarativeBinding::update(QDeclarativePropertyPrivate::WriteFlags flags) { Q_D(QDeclarativeBinding); @@ -361,7 +345,8 @@ void QDeclarativeBinding::update(QDeclarativePropertyPrivate::WriteFlags flags) trace.addDetail("Column", d->columnNumber); if (!d->updating) { - QDeclarativeBindingProfiler prof(this); + QDeclarativeBindingProfiler prof(d->url, d->line, d->column); + prof.addDetail(expression()); d->updating = true; QDeleteWatcher watcher(d); diff --git a/src/declarative/qml/v4/qv4bindings.cpp b/src/declarative/qml/v4/qv4bindings.cpp index 5f71809..e646198 100644 --- a/src/declarative/qml/v4/qv4bindings.cpp +++ b/src/declarative/qml/v4/qv4bindings.cpp @@ -242,12 +242,12 @@ void QV4Bindings::Binding::setEnabled(bool e, QDeclarativePropertyPrivate::Write void QV4Bindings::Binding::update(QDeclarativePropertyPrivate::WriteFlags flags) { - QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Binding); + QString bindingUrl; if (parent->context()) - QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Binding, - parent->context()->url, line, column); + bindingUrl = parent->context()->url.toString(); + + QDeclarativeBindingProfiler prof(bindingUrl, line, column); parent->run(this, flags); - QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::Binding); } void QV4Bindings::Binding::destroy() diff --git a/src/declarative/qml/v8/qv8bindings.cpp b/src/declarative/qml/v8/qv8bindings.cpp index 86baa2d..112808c 100644 --- a/src/declarative/qml/v8/qv8bindings.cpp +++ b/src/declarative/qml/v8/qv8bindings.cpp @@ -49,6 +49,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE @@ -86,6 +87,7 @@ void QV8Bindings::Binding::update(QDeclarativePropertyPrivate::WriteFlags flags) return; if (!updating) { + QDeclarativeBindingProfiler prof(parent->url.toString(), line, column); updating = true; QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(context->engine); -- 1.7.2.5