aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/debugger/qqmlprofilerservice.cpp32
-rw-r--r--src/qml/debugger/qqmlprofilerservice_p.h15
-rw-r--r--src/qml/qml/qqmlbinding.cpp2
-rw-r--r--src/qml/qml/v4/qv4bindings.cpp2
-rw-r--r--src/qml/qml/v8/qv8bindings.cpp2
-rw-r--r--tools/qmlprofiler/qmlprofilerapplication.cpp4
-rw-r--r--tools/qmlprofiler/qmlprofilerclient.cpp15
-rw-r--r--tools/qmlprofiler/qmlprofilerclient.h6
-rw-r--r--tools/qmlprofiler/qmlprofilerdata.cpp11
-rw-r--r--tools/qmlprofiler/qmlprofilerdata.h6
10 files changed, 69 insertions, 26 deletions
diff --git a/src/qml/debugger/qqmlprofilerservice.cpp b/src/qml/debugger/qqmlprofilerservice.cpp
index 3600586b28..69a4784a6b 100644
--- a/src/qml/debugger/qqmlprofilerservice.cpp
+++ b/src/qml/debugger/qqmlprofilerservice.cpp
@@ -66,6 +66,9 @@ QByteArray QQmlProfilerData::toByteArray() const
//### using QDataStream is relatively expensive
QQmlDebugStream ds(&data, QIODevice::WriteOnly);
ds << time << messageType << detailType;
+ if (messageType == (int)QQmlProfilerService::RangeStart &&
+ detailType == (int)QQmlProfilerService::Binding)
+ ds << bindingType;
if (messageType == (int)QQmlProfilerService::RangeData)
ds << detailData;
if (messageType == (int)QQmlProfilerService::RangeLocation)
@@ -160,7 +163,8 @@ void QQmlProfilerService::sendStartedProfilingMessageImpl()
if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)StartTrace, QString(), -1, -1, 0, 0};
+ QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)StartTrace,
+ QString(), -1, -1, 0, 0, 0};
QQmlDebugService::sendMessage(ed.toByteArray());
}
@@ -169,16 +173,18 @@ void QQmlProfilerService::addEventImpl(EventType event)
if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)event, QString(), -1, -1, 0, 0};
+ QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)event,
+ QString(), -1, -1, 0, 0, 0};
processMessage(ed);
}
-void QQmlProfilerService::startRange(RangeType range)
+void QQmlProfilerService::startRange(RangeType range, BindingType bindingType)
{
if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeStart, (int)range, QString(), -1, -1, 0, 0};
+ QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeStart, (int)range,
+ QString(), -1, -1, 0, 0, (int)bindingType};
processMessage(rd);
}
@@ -187,7 +193,8 @@ void QQmlProfilerService::rangeData(RangeType range, const QString &rData)
if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData, -1, -1, 0, 0};
+ QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range,
+ rData, -1, -1, 0, 0, 0};
processMessage(rd);
}
@@ -196,7 +203,8 @@ void QQmlProfilerService::rangeData(RangeType range, const QUrl &rData)
if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData.toString(), -1, -1, 0, 0};
+ QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range,
+ rData.toString(), -1, -1, 0, 0, 0};
processMessage(rd);
}
@@ -205,7 +213,8 @@ void QQmlProfilerService::rangeLocation(RangeType range, const QString &fileName
if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName, line, column, 0, 0};
+ QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range,
+ fileName, line, column, 0, 0, 0};
processMessage(rd);
}
@@ -214,7 +223,8 @@ void QQmlProfilerService::rangeLocation(RangeType range, const QUrl &fileName, i
if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName.toString(), line, column, 0, 0};
+ QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range,
+ fileName.toString(), line, column, 0, 0, 0};
processMessage(rd);
}
@@ -223,7 +233,8 @@ void QQmlProfilerService::endRange(RangeType range)
if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
return;
- QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeEnd, (int)range, QString(), -1, -1, 0, 0};
+ QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeEnd, (int)range,
+ QString(), -1, -1, 0, 0, 0};
processMessage(rd);
}
@@ -238,7 +249,8 @@ void QQmlProfilerService::animationFrameImpl(qint64 delta)
if (animCount > 0 && delta > 0) {
// trim fps to integer
int fps = 1000 / delta;
- QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)AnimationFrame, QString(), -1, -1, fps, animCount};
+ QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)AnimationFrame,
+ QString(), -1, -1, fps, animCount, 0};
processMessage(ed);
}
}
diff --git a/src/qml/debugger/qqmlprofilerservice_p.h b/src/qml/debugger/qqmlprofilerservice_p.h
index eeaf871ab4..576f9811b5 100644
--- a/src/qml/debugger/qqmlprofilerservice_p.h
+++ b/src/qml/debugger/qqmlprofilerservice_p.h
@@ -80,6 +80,7 @@ struct Q_AUTOTEST_EXPORT QQmlProfilerData
int column; //used by RangeLocation
int framerate; //used by animation events
int animationcount; //used by animation events
+ int bindingType;
QByteArray toByteArray() const;
};
@@ -125,6 +126,14 @@ public:
MaximumRangeType
};
+ enum BindingType {
+ QmlBinding,
+ V8Binding,
+ V4Binding,
+
+ MaximumBindingType
+ };
+
static void initialize();
static bool startProfiling();
@@ -149,7 +158,7 @@ private:
void addEventImpl(EventType);
void animationFrameImpl(qint64);
- void startRange(RangeType);
+ void startRange(RangeType, BindingType bindingType = QmlBinding);
void rangeData(RangeType, const QString &);
void rangeData(RangeType, const QUrl &);
void rangeLocation(RangeType, const QString &, int, int);
@@ -183,12 +192,12 @@ private:
//
struct QQmlBindingProfiler {
- QQmlBindingProfiler(const QString &url, int line, int column)
+ QQmlBindingProfiler(const QString &url, int line, int column, QQmlProfilerService::BindingType bindingType)
{
QQmlProfilerService *instance = QQmlProfilerService::instance;
enabled = instance ? instance->profilingEnabled() : false;
if (enabled) {
- instance->startRange(QQmlProfilerService::Binding);
+ instance->startRange(QQmlProfilerService::Binding, bindingType);
instance->rangeLocation(QQmlProfilerService::Binding, url, line, column);
}
}
diff --git a/src/qml/qml/qqmlbinding.cpp b/src/qml/qml/qqmlbinding.cpp
index 45c22734bc..d60a1b461f 100644
--- a/src/qml/qml/qqmlbinding.cpp
+++ b/src/qml/qml/qqmlbinding.cpp
@@ -196,7 +196,7 @@ void QQmlBinding::update(QQmlPropertyPrivate::WriteFlags flags)
trace.addDetail("Column", m_columnNumber);
if (!updatingFlag()) {
- QQmlBindingProfiler prof(m_url, m_lineNumber, m_columnNumber);
+ QQmlBindingProfiler prof(m_url, m_lineNumber, m_columnNumber, QQmlProfilerService::QmlBinding);
setUpdatingFlag(true);
QQmlAbstractExpression::DeleteWatcher watcher(this);
diff --git a/src/qml/qml/v4/qv4bindings.cpp b/src/qml/qml/v4/qv4bindings.cpp
index dbbaa23ab8..944d4de210 100644
--- a/src/qml/qml/v4/qv4bindings.cpp
+++ b/src/qml/qml/v4/qv4bindings.cpp
@@ -367,7 +367,7 @@ void QV4Bindings::run(Binding *binding, QQmlPropertyPrivate::WriteFlags flags)
trace.addDetail("Line", binding->line);
trace.addDetail("Column", binding->column);
- QQmlBindingProfiler prof(context->urlString, binding->line, binding->column);
+ QQmlBindingProfiler prof(context->urlString, binding->line, binding->column, QQmlProfilerService::V4Binding);
if (binding->updating) {
QString name;
diff --git a/src/qml/qml/v8/qv8bindings.cpp b/src/qml/qml/v8/qv8bindings.cpp
index 7cb14fb8c1..f4cad9aa4b 100644
--- a/src/qml/qml/v8/qv8bindings.cpp
+++ b/src/qml/qml/v8/qv8bindings.cpp
@@ -119,7 +119,7 @@ void QV8Bindings::Binding::update(QQmlPropertyPrivate::WriteFlags flags)
trace.addDetail("Line", instruction->line);
trace.addDetail("Column", instruction->column);
- QQmlBindingProfiler prof(parent->urlString(), instruction->line, instruction->column);
+ QQmlBindingProfiler prof(parent->urlString(), instruction->line, instruction->column, QQmlProfilerService::V8Binding);
if (!updatingFlag()) {
setUpdatingFlag(true);
diff --git a/tools/qmlprofiler/qmlprofilerapplication.cpp b/tools/qmlprofiler/qmlprofilerapplication.cpp
index 05518dd167..a7b85e1630 100644
--- a/tools/qmlprofiler/qmlprofilerapplication.cpp
+++ b/tools/qmlprofiler/qmlprofilerapplication.cpp
@@ -104,8 +104,8 @@ QmlProfilerApplication::QmlProfilerApplication(int &argc, char **argv) :
connect(&m_qmlProfilerClient, SIGNAL(enabledChanged()), this, SLOT(traceClientEnabled()));
connect(&m_qmlProfilerClient, SIGNAL(recordingChanged(bool)), this, SLOT(recordingChanged()));
- connect(&m_qmlProfilerClient, SIGNAL(range(QQmlProfilerService::RangeType,qint64,qint64,QStringList,QmlEventLocation)),
- &m_profilerData, SLOT(addQmlEvent(QQmlProfilerService::RangeType,qint64,qint64,QStringList,QmlEventLocation)));
+ connect(&m_qmlProfilerClient, SIGNAL(range(QQmlProfilerService::RangeType,QQmlProfilerService::BindingType,qint64,qint64,QStringList,QmlEventLocation)),
+ &m_profilerData, SLOT(addQmlEvent(QQmlProfilerService::RangeType,QQmlProfilerService::BindingType,qint64,qint64,QStringList,QmlEventLocation)));
connect(&m_qmlProfilerClient, SIGNAL(traceFinished(qint64)), &m_profilerData, SLOT(setTraceEndTime(qint64)));
connect(&m_qmlProfilerClient, SIGNAL(traceStarted(qint64)), &m_profilerData, SLOT(setTraceStartTime(qint64)));
connect(&m_qmlProfilerClient, SIGNAL(frame(qint64,int,int)), &m_profilerData, SLOT(addFrameEvent(qint64,int,int)));
diff --git a/tools/qmlprofiler/qmlprofilerclient.cpp b/tools/qmlprofiler/qmlprofilerclient.cpp
index 97ed90e890..103eab8402 100644
--- a/tools/qmlprofiler/qmlprofilerclient.cpp
+++ b/tools/qmlprofiler/qmlprofilerclient.cpp
@@ -118,6 +118,7 @@ public:
QStack<qint64> rangeStartTimes[QQmlProfilerService::MaximumRangeType];
QStack<QStringList> rangeDatas[QQmlProfilerService::MaximumRangeType];
QStack<QmlEventLocation> rangeLocations[QQmlProfilerService::MaximumRangeType];
+ QStack<QQmlProfilerService::BindingType> bindingTypes;
int rangeCount[QQmlProfilerService::MaximumRangeType];
qint64 maximumTime;
};
@@ -138,6 +139,7 @@ void QmlProfilerClient::clearData()
{
::memset(d->rangeCount, 0,
QQmlProfilerService::MaximumRangeType * sizeof(int));
+ d->bindingTypes.clear();
ProfilerClient::clearData();
}
@@ -195,6 +197,14 @@ void QmlProfilerClient::messageReceived(const QByteArray &data)
d->rangeStartTimes[range].push(time);
d->inProgressRanges |= (static_cast<qint64>(1) << range);
++d->rangeCount[range];
+
+ // read binding type
+ if (range == (int)QQmlProfilerService::Binding) {
+ int bindingType = (int)QQmlProfilerService::QmlBinding;
+ if (!stream.atEnd())
+ stream >> bindingType;
+ d->bindingTypes.push((QQmlProfilerService::BindingType)bindingType);
+ }
} else if (messageType == QQmlProfilerService::RangeData) {
QString data;
stream >> data;
@@ -232,8 +242,11 @@ void QmlProfilerClient::messageReceived(const QByteArray &data)
d->rangeLocations[range].pop() : QmlEventLocation();
qint64 startTime = d->rangeStartTimes[range].pop();
+ QQmlProfilerService::BindingType bindingType = QQmlProfilerService::QmlBinding;
+ if (range == (int)QQmlProfilerService::Binding)
+ bindingType = d->bindingTypes.pop();
emit this->range((QQmlProfilerService::RangeType)range,
- startTime, time - startTime, data, location);
+ bindingType, startTime, time - startTime, data, location);
if (d->rangeCount[range] == 0) {
int count = d->rangeDatas[range].count() +
d->rangeStartTimes[range].count() +
diff --git a/tools/qmlprofiler/qmlprofilerclient.h b/tools/qmlprofiler/qmlprofilerclient.h
index 2a8629d1fb..2c1fa4f3f3 100644
--- a/tools/qmlprofiler/qmlprofilerclient.h
+++ b/tools/qmlprofiler/qmlprofilerclient.h
@@ -97,8 +97,10 @@ public slots:
signals:
void traceFinished( qint64 time );
void traceStarted( qint64 time );
- void range(QQmlProfilerService::RangeType type, qint64 startTime,
- qint64 length, const QStringList &data,
+ void range(QQmlProfilerService::RangeType type,
+ QQmlProfilerService::BindingType bindingType,
+ qint64 startTime, qint64 length,
+ const QStringList &data,
const QmlEventLocation &location);
void frame(qint64 time, int frameRate, int animationCount);
diff --git a/tools/qmlprofiler/qmlprofilerdata.cpp b/tools/qmlprofiler/qmlprofilerdata.cpp
index 38e64ff46e..c564079529 100644
--- a/tools/qmlprofiler/qmlprofilerdata.cpp
+++ b/tools/qmlprofiler/qmlprofilerdata.cpp
@@ -59,17 +59,19 @@ namespace Constants {
struct QmlRangeEventData {
QmlRangeEventData() {} // never called
QmlRangeEventData(const QString &_displayName,
+ const QQmlProfilerService::BindingType &_bindingType,
const QString &_eventHashStr,
const QmlEventLocation &_location,
const QString &_details,
const QQmlProfilerService::RangeType &_eventType)
: displayName(_displayName),eventHashStr(_eventHashStr),location(_location),
- details(_details),eventType(_eventType) {}
+ details(_details),eventType(_eventType),bindingType(_bindingType) {}
QString displayName;
QString eventHashStr;
QmlEventLocation location;
QString details;
QQmlProfilerService::RangeType eventType;
+ QQmlProfilerService::BindingType bindingType;
};
struct QmlRangeEventStartInstance {
@@ -221,6 +223,7 @@ qint64 QmlProfilerData::traceEndTime() const
}
void QmlProfilerData::addQmlEvent(QQmlProfilerService::RangeType type,
+ QQmlProfilerService::BindingType bindingType,
qint64 startTime,
qint64 duration,
const QStringList &data,
@@ -262,7 +265,7 @@ void QmlProfilerData::addQmlEvent(QQmlProfilerService::RangeType type,
if (d->eventDescriptions.contains(eventHashStr)) {
newEvent = d->eventDescriptions[eventHashStr];
} else {
- newEvent = new QmlRangeEventData(displayName, eventHashStr, location, details, type);
+ newEvent = new QmlRangeEventData(displayName, bindingType, eventHashStr, location, details, type);
d->eventDescriptions.insert(eventHashStr, newEvent);
}
@@ -283,7 +286,7 @@ void QmlProfilerData::addFrameEvent(qint64 time, int framerate, int animationcou
if (d->eventDescriptions.contains(eventHashStr)) {
newEvent = d->eventDescriptions[eventHashStr];
} else {
- newEvent = new QmlRangeEventData(displayName, eventHashStr, QmlEventLocation(), details, QQmlProfilerService::Painting);
+ newEvent = new QmlRangeEventData(displayName, QQmlProfilerService::QmlBinding, eventHashStr, QmlEventLocation(), details, QQmlProfilerService::Painting);
d->eventDescriptions.insert(eventHashStr, newEvent);
}
@@ -495,6 +498,8 @@ bool QmlProfilerData::save(const QString &filename)
stream.writeTextElement(QStringLiteral("column"), QString::number(eventData->location.column));
}
stream.writeTextElement(QStringLiteral("details"), eventData->details);
+ if (eventData->eventType == QQmlProfilerService::Binding)
+ stream.writeTextElement(QStringLiteral("bindingType"), QString::number((int)eventData->bindingType));
stream.writeEndElement();
}
stream.writeEndElement(); // eventData
diff --git a/tools/qmlprofiler/qmlprofilerdata.h b/tools/qmlprofiler/qmlprofilerdata.h
index 66209a1830..170e77db23 100644
--- a/tools/qmlprofiler/qmlprofilerdata.h
+++ b/tools/qmlprofiler/qmlprofilerdata.h
@@ -82,8 +82,10 @@ public slots:
void clear();
void setTraceEndTime(qint64 time);
void setTraceStartTime(qint64 time);
- void addQmlEvent(QQmlProfilerService::RangeType type, qint64 startTime, qint64 duration,
- const QStringList &data, const QmlEventLocation &location);
+ void addQmlEvent(QQmlProfilerService::RangeType type,
+ QQmlProfilerService::BindingType bindingType,
+ qint64 startTime, qint64 duration, const QStringList &data,
+ const QmlEventLocation &location);
void addV8Event(int depth, const QString &function, const QString &filename,
int lineNumber, double totalTime, double selfTime);
void addFrameEvent(qint64 time, int framerate, int animationcount);