From ff379a67cb891bf2c06ae549bc6e6b0ddfaf54e0 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 10 Dec 2013 12:02:40 +0100 Subject: Rename V8 profiler classes to V4 Change-Id: I54a71b83bdcaa4198b63a08572bc3d9d1bf8deea Reviewed-by: Simon Hausmann --- src/qml/debugger/debugger.pri | 4 +- src/qml/debugger/qv4profilerservice.cpp | 330 ++++++++++++++++++++ src/qml/debugger/qv4profilerservice_p.h | 116 +++++++ src/qml/debugger/qv8profilerservice.cpp | 331 -------------------- src/qml/debugger/qv8profilerservice_p.h | 116 ------- src/qml/qml/qqmlengine.cpp | 4 +- src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 6 +- src/qml/qml/v8/qv8profiler_p.h | 42 --- src/qml/qml/v8/v8.pri | 1 - tests/auto/qml/debugger/debugger.pro | 2 +- .../debugger/qv4profilerservice/data/console.qml | 14 + .../qml/debugger/qv4profilerservice/data/exit.qml | 11 + .../qml/debugger/qv4profilerservice/data/test.qml | 5 + .../qv4profilerservice/qv4profilerservice.pro | 16 + .../qv4profilerservice/tst_qv4profilerservice.cpp | 334 +++++++++++++++++++++ .../debugger/qv8profilerservice/data/console.qml | 14 - .../qml/debugger/qv8profilerservice/data/exit.qml | 11 - .../qml/debugger/qv8profilerservice/data/test.qml | 5 - .../qv8profilerservice/qv8profilerservice.pro | 16 - .../qv8profilerservice/tst_qv8profilerservice.cpp | 334 --------------------- 20 files changed, 834 insertions(+), 878 deletions(-) create mode 100644 src/qml/debugger/qv4profilerservice.cpp create mode 100644 src/qml/debugger/qv4profilerservice_p.h delete mode 100644 src/qml/debugger/qv8profilerservice.cpp delete mode 100644 src/qml/debugger/qv8profilerservice_p.h delete mode 100644 src/qml/qml/v8/qv8profiler_p.h create mode 100644 tests/auto/qml/debugger/qv4profilerservice/data/console.qml create mode 100644 tests/auto/qml/debugger/qv4profilerservice/data/exit.qml create mode 100644 tests/auto/qml/debugger/qv4profilerservice/data/test.qml create mode 100644 tests/auto/qml/debugger/qv4profilerservice/qv4profilerservice.pro create mode 100644 tests/auto/qml/debugger/qv4profilerservice/tst_qv4profilerservice.cpp delete mode 100644 tests/auto/qml/debugger/qv8profilerservice/data/console.qml delete mode 100644 tests/auto/qml/debugger/qv8profilerservice/data/exit.qml delete mode 100644 tests/auto/qml/debugger/qv8profilerservice/data/test.qml delete mode 100644 tests/auto/qml/debugger/qv8profilerservice/qv8profilerservice.pro delete mode 100644 tests/auto/qml/debugger/qv8profilerservice/tst_qv8profilerservice.cpp diff --git a/src/qml/debugger/debugger.pri b/src/qml/debugger/debugger.pri index c10f43c8c9..16785c48e3 100644 --- a/src/qml/debugger/debugger.pri +++ b/src/qml/debugger/debugger.pri @@ -3,7 +3,7 @@ SOURCES += \ $$PWD/qqmlprofilerservice.cpp \ $$PWD/qqmldebugserver.cpp \ $$PWD/qqmlinspectorservice.cpp \ - $$PWD/qv8profilerservice.cpp \ + $$PWD/qv4profilerservice.cpp \ $$PWD/qqmlenginedebugservice.cpp \ $$PWD/qdebugmessageservice.cpp \ $$PWD/qv4debugservice.cpp @@ -17,7 +17,7 @@ HEADERS += \ $$PWD/qqmldebugstatesdelegate_p.h \ $$PWD/qqmlinspectorservice_p.h \ $$PWD/qqmlinspectorinterface_p.h \ - $$PWD/qv8profilerservice_p.h \ + $$PWD/qv4profilerservice_p.h \ $$PWD/qqmlenginedebugservice_p.h \ $$PWD/qqmldebug.h \ $$PWD/qdebugmessageservice_p.h \ diff --git a/src/qml/debugger/qv4profilerservice.cpp b/src/qml/debugger/qv4profilerservice.cpp new file mode 100644 index 0000000000..50bec8ec25 --- /dev/null +++ b/src/qml/debugger/qv4profilerservice.cpp @@ -0,0 +1,330 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qv4profilerservice_p.h" +#include "qqmldebugservice_p_p.h" + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +Q_GLOBAL_STATIC(QV4ProfilerService, v4ProfilerInstance) + +#if 0 +// ### FIXME: v4 +class DebugServiceOutputStream : public v8::OutputStream +{ +public: + DebugServiceOutputStream() + : v8::OutputStream() {} + void EndOfStream() {} + WriteResult WriteAsciiChunk(char *rawData, int size) + { + QByteArray data; + QQmlDebugStream ds(&data, QIODevice::WriteOnly); + ds << QV4ProfilerService::V4SnapshotChunk << QByteArray(rawData, size); + messages.append(data); + return kContinue; + } + QList messages; +}; +#endif + +// convert to a QByteArray that can be sent to the debug client +QByteArray QV4ProfilerData::toByteArray() const +{ + QByteArray data; + //### using QDataStream is relatively expensive + QQmlDebugStream ds(&data, QIODevice::WriteOnly); + ds << messageType << filename << functionname << lineNumber << totalTime << selfTime << treeLevel; + + return data; +} + +class QV4ProfilerServicePrivate : public QQmlDebugServicePrivate +{ + Q_DECLARE_PUBLIC(QV4ProfilerService) + +public: + QV4ProfilerServicePrivate() + :initialized(false) + { + } + + // ### FIXME: v4 +// void takeSnapshot(v8::HeapSnapshot::Type); +// void printProfileTree(const v8::CpuProfileNode *node, int level = 0); +// void sendMessages(); + + QList m_data; + + bool initialized; + QMutex initializeMutex; + QWaitCondition initializeCondition; + QList m_ongoing; +}; + +QV4ProfilerService::QV4ProfilerService(QObject *parent) + : QQmlDebugService(*(new QV4ProfilerServicePrivate()), QStringLiteral("V8Profiler"), 1, parent) +{ + Q_D(QV4ProfilerService); + + QMutexLocker lock(&d->initializeMutex); + + if (registerService() == Enabled + && QQmlDebugService::blockingMode()) { + // let's wait for first message ... + d->initializeCondition.wait(&d->initializeMutex); + } +} + +QV4ProfilerService::~QV4ProfilerService() +{ +} + +QV4ProfilerService *QV4ProfilerService::instance() +{ + return v4ProfilerInstance(); +} + +void QV4ProfilerService::initialize() +{ + // just make sure that the service is properly registered + v4ProfilerInstance(); +} + +void QV4ProfilerService::stateAboutToBeChanged(QQmlDebugService::State newState) +{ + Q_D(QV4ProfilerService); + + if (state() == newState) + return; + + if (state() == Enabled) { + foreach (const QString &title, d->m_ongoing) { + QMetaObject::invokeMethod(this, "stopProfiling", Qt::BlockingQueuedConnection, + Q_ARG(QString, title)); + } + QMetaObject::invokeMethod(this, "sendProfilingData", Qt::BlockingQueuedConnection); + } else { + // wake up constructor in blocking mode + // (we might got disabled before first message arrived) + d->initializeCondition.wakeAll(); + } +} + +void QV4ProfilerService::messageReceived(const QByteArray &message) +{ + Q_D(QV4ProfilerService); + + QQmlDebugStream ds(message); + QByteArray command; + QByteArray option; + QByteArray title; + ds >> command >> option; + + QMutexLocker lock(&d->initializeMutex); + + if (command == "V8PROFILER") { + ds >> title; + QString titleStr = QString::fromUtf8(title); + if (option == "start") { + QMetaObject::invokeMethod(this, "startProfiling", Qt::QueuedConnection, Q_ARG(QString, titleStr)); + } else if (option == "stop" && d->initialized) { + QMetaObject::invokeMethod(this, "stopProfiling", Qt::QueuedConnection, Q_ARG(QString, titleStr)); + QMetaObject::invokeMethod(this, "sendProfilingData", Qt::QueuedConnection); + } + d->initialized = true; + } + + if (command == "V8SNAPSHOT") { + if (option == "full") + QMetaObject::invokeMethod(this, "takeSnapshot", Qt::QueuedConnection); + else if (option == "delete") { + QMetaObject::invokeMethod(this, "deleteSnapshots", Qt::QueuedConnection); + } + } + + // wake up constructor in blocking mode + d->initializeCondition.wakeAll(); + + QQmlDebugService::messageReceived(message); +} + +void QV4ProfilerService::startProfiling(const QString &title) +{ + Q_D(QV4ProfilerService); + // Start Profiling + + if (d->m_ongoing.contains(title)) + return; + +// v8::Handle v8title = v8::String::New(reinterpret_cast(title.data()), title.size()); + // ### FIXME: v4 +// v8::CpuProfiler::StartProfiling(v8title); + + d->m_ongoing.append(title); + + // indicate profiling started + QByteArray data; + QQmlDebugStream ds(&data, QIODevice::WriteOnly); + ds << (int)QV4ProfilerService::V4Started; + + sendMessage(data); +} + +void QV4ProfilerService::stopProfiling(const QString &title) +{ + Q_D(QV4ProfilerService); + // Stop profiling + + if (!d->m_ongoing.contains(title)) + return; + d->m_ongoing.removeOne(title); + +#if 0 + // ### FIXME: v4 + v8::HandleScope handle_scope; + v8::Handle v8title = v8::String::New(reinterpret_cast(title.data()), title.size()); + const v8::CpuProfile *cpuProfile = v8::CpuProfiler::StopProfiling(v8title); + if (cpuProfile) { + // can happen at start + const v8::CpuProfileNode *rootNode = cpuProfile->GetTopDownRoot(); + d->printProfileTree(rootNode); + } else { +#endif + // indicate completion, even without data + QByteArray data; + QQmlDebugStream ds(&data, QIODevice::WriteOnly); + ds << (int)QV4ProfilerService::V4Complete; + + sendMessage(data); +#if 0 + } +#endif +} + +void QV4ProfilerService::takeSnapshot() +{ +// Q_D(QV4ProfilerService); + // ### FIXME: v4 +// d->takeSnapshot(v8::HeapSnapshot::kFull); +} + +void QV4ProfilerService::deleteSnapshots() +{ + // ### FIXME: v4 +// v8::HeapProfiler::DeleteAllSnapshots(); +} + +void QV4ProfilerService::sendProfilingData() +{ +// Q_D(QV4ProfilerService); + // Send messages to client + // ### FIXME: v4 +// d->sendMessages(); +} + +#if 0 +// ### FIXME: v4 +void QV4ProfilerServicePrivate::printProfileTree(const v8::CpuProfileNode *node, int level) +{ + for (int index = 0 ; index < node->GetChildrenCount() ; index++) { + const v8::CpuProfileNode* childNode = node->GetChild(index); + QString scriptResourceName = QJSConverter::toString(childNode->GetScriptResourceName()); + if (scriptResourceName.length() > 0) { + + QV4ProfilerData rd = {(int)QV4ProfilerService::V4Entry, scriptResourceName, + QJSConverter::toString(childNode->GetFunctionName()), + childNode->GetLineNumber(), childNode->GetTotalTime(), childNode->GetSelfTime(), level}; + m_data.append(rd); + + // different nodes might have common children: fix at client side + if (childNode->GetChildrenCount() > 0) { + printProfileTree(childNode, level+1); + } + } + } +} + +void QV4ProfilerServicePrivate::takeSnapshot(v8::HeapSnapshot::Type snapshotType) +{ + Q_Q(QV4ProfilerService); + + v8::HandleScope scope; + v8::Handle title = v8::String::New(""); + + DebugServiceOutputStream outputStream; + const v8::HeapSnapshot *snapshot = v8::HeapProfiler::TakeSnapshot(title, snapshotType); + snapshot->Serialize(&outputStream, v8::HeapSnapshot::kJSON); + QList messages = outputStream.messages; + + //indicate completion + QByteArray data; + QQmlDebugStream ds(&data, QIODevice::WriteOnly); + ds << (int)QV4ProfilerService::V4SnapshotComplete; + messages.append(data); + + q->sendMessages(messages); +} + +void QV4ProfilerServicePrivate::sendMessages() +{ + Q_Q(QV4ProfilerService); + + QList messages; + for (int i = 0; i < m_data.count(); ++i) + messages.append(m_data.at(i).toByteArray()); + m_data.clear(); + + //indicate completion + QByteArray data; + QQmlDebugStream ds(&data, QIODevice::WriteOnly); + ds << (int)QV4ProfilerService::V4Complete; + messages.append(data); + + q->sendMessages(messages); +} +#endif + +QT_END_NAMESPACE diff --git a/src/qml/debugger/qv4profilerservice_p.h b/src/qml/debugger/qv4profilerservice_p.h new file mode 100644 index 0000000000..252c154a68 --- /dev/null +++ b/src/qml/debugger/qv4profilerservice_p.h @@ -0,0 +1,116 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QV4PROFILERSERVICE_P_H +#define QV4PROFILERSERVICE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +QT_BEGIN_NAMESPACE + + +struct Q_AUTOTEST_EXPORT QV4ProfilerData +{ + int messageType; + QString filename; + QString functionname; + int lineNumber; + double totalTime; + double selfTime; + int treeLevel; + + QByteArray toByteArray() const; +}; + +class QQmlEngine; +class QV4ProfilerServicePrivate; + +class Q_AUTOTEST_EXPORT QV4ProfilerService : public QQmlDebugService +{ + Q_OBJECT +public: + enum MessageType { + V4Entry, + V4Complete, + V4SnapshotChunk, + V4SnapshotComplete, + V4Started, + + V4MaximumMessage + }; + + QV4ProfilerService(QObject *parent = 0); + ~QV4ProfilerService(); + + static QV4ProfilerService *instance(); + static void initialize(); + +public Q_SLOTS: + void startProfiling(const QString &title); + void stopProfiling(const QString &title); + void takeSnapshot(); + void deleteSnapshots(); + + void sendProfilingData(); + +protected: + void stateAboutToBeChanged(State state); + void messageReceived(const QByteArray &); + +private: + Q_DISABLE_COPY(QV4ProfilerService) + Q_DECLARE_PRIVATE(QV4ProfilerService) +}; + +QT_END_NAMESPACE + +#endif // QV4PROFILERSERVICE_P_H diff --git a/src/qml/debugger/qv8profilerservice.cpp b/src/qml/debugger/qv8profilerservice.cpp deleted file mode 100644 index 7b9331da66..0000000000 --- a/src/qml/debugger/qv8profilerservice.cpp +++ /dev/null @@ -1,331 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qv8profilerservice_p.h" -#include "qqmldebugservice_p_p.h" -#include - -#include -#include -#include - -QT_BEGIN_NAMESPACE - -Q_GLOBAL_STATIC(QV8ProfilerService, v8ProfilerInstance) - -#if 0 -// ### FIXME: v4 -class DebugServiceOutputStream : public v8::OutputStream -{ -public: - DebugServiceOutputStream() - : v8::OutputStream() {} - void EndOfStream() {} - WriteResult WriteAsciiChunk(char *rawData, int size) - { - QByteArray data; - QQmlDebugStream ds(&data, QIODevice::WriteOnly); - ds << QV8ProfilerService::V8SnapshotChunk << QByteArray(rawData, size); - messages.append(data); - return kContinue; - } - QList messages; -}; -#endif - -// convert to a QByteArray that can be sent to the debug client -QByteArray QV8ProfilerData::toByteArray() const -{ - QByteArray data; - //### using QDataStream is relatively expensive - QQmlDebugStream ds(&data, QIODevice::WriteOnly); - ds << messageType << filename << functionname << lineNumber << totalTime << selfTime << treeLevel; - - return data; -} - -class QV8ProfilerServicePrivate : public QQmlDebugServicePrivate -{ - Q_DECLARE_PUBLIC(QV8ProfilerService) - -public: - QV8ProfilerServicePrivate() - :initialized(false) - { - } - - // ### FIXME: v4 -// void takeSnapshot(v8::HeapSnapshot::Type); -// void printProfileTree(const v8::CpuProfileNode *node, int level = 0); -// void sendMessages(); - - QList m_data; - - bool initialized; - QMutex initializeMutex; - QWaitCondition initializeCondition; - QList m_ongoing; -}; - -QV8ProfilerService::QV8ProfilerService(QObject *parent) - : QQmlDebugService(*(new QV8ProfilerServicePrivate()), QStringLiteral("V8Profiler"), 1, parent) -{ - Q_D(QV8ProfilerService); - - QMutexLocker lock(&d->initializeMutex); - - if (registerService() == Enabled - && QQmlDebugService::blockingMode()) { - // let's wait for first message ... - d->initializeCondition.wait(&d->initializeMutex); - } -} - -QV8ProfilerService::~QV8ProfilerService() -{ -} - -QV8ProfilerService *QV8ProfilerService::instance() -{ - return v8ProfilerInstance(); -} - -void QV8ProfilerService::initialize() -{ - // just make sure that the service is properly registered - v8ProfilerInstance(); -} - -void QV8ProfilerService::stateAboutToBeChanged(QQmlDebugService::State newState) -{ - Q_D(QV8ProfilerService); - - if (state() == newState) - return; - - if (state() == Enabled) { - foreach (const QString &title, d->m_ongoing) { - QMetaObject::invokeMethod(this, "stopProfiling", Qt::BlockingQueuedConnection, - Q_ARG(QString, title)); - } - QMetaObject::invokeMethod(this, "sendProfilingData", Qt::BlockingQueuedConnection); - } else { - // wake up constructor in blocking mode - // (we might got disabled before first message arrived) - d->initializeCondition.wakeAll(); - } -} - -void QV8ProfilerService::messageReceived(const QByteArray &message) -{ - Q_D(QV8ProfilerService); - - QQmlDebugStream ds(message); - QByteArray command; - QByteArray option; - QByteArray title; - ds >> command >> option; - - QMutexLocker lock(&d->initializeMutex); - - if (command == "V8PROFILER") { - ds >> title; - QString titleStr = QString::fromUtf8(title); - if (option == "start") { - QMetaObject::invokeMethod(this, "startProfiling", Qt::QueuedConnection, Q_ARG(QString, titleStr)); - } else if (option == "stop" && d->initialized) { - QMetaObject::invokeMethod(this, "stopProfiling", Qt::QueuedConnection, Q_ARG(QString, titleStr)); - QMetaObject::invokeMethod(this, "sendProfilingData", Qt::QueuedConnection); - } - d->initialized = true; - } - - if (command == "V8SNAPSHOT") { - if (option == "full") - QMetaObject::invokeMethod(this, "takeSnapshot", Qt::QueuedConnection); - else if (option == "delete") { - QMetaObject::invokeMethod(this, "deleteSnapshots", Qt::QueuedConnection); - } - } - - // wake up constructor in blocking mode - d->initializeCondition.wakeAll(); - - QQmlDebugService::messageReceived(message); -} - -void QV8ProfilerService::startProfiling(const QString &title) -{ - Q_D(QV8ProfilerService); - // Start Profiling - - if (d->m_ongoing.contains(title)) - return; - -// v8::Handle v8title = v8::String::New(reinterpret_cast(title.data()), title.size()); - // ### FIXME: v4 -// v8::CpuProfiler::StartProfiling(v8title); - - d->m_ongoing.append(title); - - // indicate profiling started - QByteArray data; - QQmlDebugStream ds(&data, QIODevice::WriteOnly); - ds << (int)QV8ProfilerService::V8Started; - - sendMessage(data); -} - -void QV8ProfilerService::stopProfiling(const QString &title) -{ - Q_D(QV8ProfilerService); - // Stop profiling - - if (!d->m_ongoing.contains(title)) - return; - d->m_ongoing.removeOne(title); - -#if 0 - // ### FIXME: v4 - v8::HandleScope handle_scope; - v8::Handle v8title = v8::String::New(reinterpret_cast(title.data()), title.size()); - const v8::CpuProfile *cpuProfile = v8::CpuProfiler::StopProfiling(v8title); - if (cpuProfile) { - // can happen at start - const v8::CpuProfileNode *rootNode = cpuProfile->GetTopDownRoot(); - d->printProfileTree(rootNode); - } else { -#endif - // indicate completion, even without data - QByteArray data; - QQmlDebugStream ds(&data, QIODevice::WriteOnly); - ds << (int)QV8ProfilerService::V8Complete; - - sendMessage(data); -#if 0 - } -#endif -} - -void QV8ProfilerService::takeSnapshot() -{ -// Q_D(QV8ProfilerService); - // ### FIXME: v4 -// d->takeSnapshot(v8::HeapSnapshot::kFull); -} - -void QV8ProfilerService::deleteSnapshots() -{ - // ### FIXME: v4 -// v8::HeapProfiler::DeleteAllSnapshots(); -} - -void QV8ProfilerService::sendProfilingData() -{ -// Q_D(QV8ProfilerService); - // Send messages to client - // ### FIXME: v4 -// d->sendMessages(); -} - -#if 0 -// ### FIXME: v4 -void QV8ProfilerServicePrivate::printProfileTree(const v8::CpuProfileNode *node, int level) -{ - for (int index = 0 ; index < node->GetChildrenCount() ; index++) { - const v8::CpuProfileNode* childNode = node->GetChild(index); - QString scriptResourceName = QJSConverter::toString(childNode->GetScriptResourceName()); - if (scriptResourceName.length() > 0) { - - QV8ProfilerData rd = {(int)QV8ProfilerService::V8Entry, scriptResourceName, - QJSConverter::toString(childNode->GetFunctionName()), - childNode->GetLineNumber(), childNode->GetTotalTime(), childNode->GetSelfTime(), level}; - m_data.append(rd); - - // different nodes might have common children: fix at client side - if (childNode->GetChildrenCount() > 0) { - printProfileTree(childNode, level+1); - } - } - } -} - -void QV8ProfilerServicePrivate::takeSnapshot(v8::HeapSnapshot::Type snapshotType) -{ - Q_Q(QV8ProfilerService); - - v8::HandleScope scope; - v8::Handle title = v8::String::New(""); - - DebugServiceOutputStream outputStream; - const v8::HeapSnapshot *snapshot = v8::HeapProfiler::TakeSnapshot(title, snapshotType); - snapshot->Serialize(&outputStream, v8::HeapSnapshot::kJSON); - QList messages = outputStream.messages; - - //indicate completion - QByteArray data; - QQmlDebugStream ds(&data, QIODevice::WriteOnly); - ds << (int)QV8ProfilerService::V8SnapshotComplete; - messages.append(data); - - q->sendMessages(messages); -} - -void QV8ProfilerServicePrivate::sendMessages() -{ - Q_Q(QV8ProfilerService); - - QList messages; - for (int i = 0; i < m_data.count(); ++i) - messages.append(m_data.at(i).toByteArray()); - m_data.clear(); - - //indicate completion - QByteArray data; - QQmlDebugStream ds(&data, QIODevice::WriteOnly); - ds << (int)QV8ProfilerService::V8Complete; - messages.append(data); - - q->sendMessages(messages); -} -#endif - -QT_END_NAMESPACE diff --git a/src/qml/debugger/qv8profilerservice_p.h b/src/qml/debugger/qv8profilerservice_p.h deleted file mode 100644 index 60dc70f4db..0000000000 --- a/src/qml/debugger/qv8profilerservice_p.h +++ /dev/null @@ -1,116 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QV8PROFILERSERVICE_P_H -#define QV8PROFILERSERVICE_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include - -QT_BEGIN_NAMESPACE - - -struct Q_AUTOTEST_EXPORT QV8ProfilerData -{ - int messageType; - QString filename; - QString functionname; - int lineNumber; - double totalTime; - double selfTime; - int treeLevel; - - QByteArray toByteArray() const; -}; - -class QQmlEngine; -class QV8ProfilerServicePrivate; - -class Q_AUTOTEST_EXPORT QV8ProfilerService : public QQmlDebugService -{ - Q_OBJECT -public: - enum MessageType { - V8Entry, - V8Complete, - V8SnapshotChunk, - V8SnapshotComplete, - V8Started, - - V8MaximumMessage - }; - - QV8ProfilerService(QObject *parent = 0); - ~QV8ProfilerService(); - - static QV8ProfilerService *instance(); - static void initialize(); - -public Q_SLOTS: - void startProfiling(const QString &title); - void stopProfiling(const QString &title); - void takeSnapshot(); - void deleteSnapshots(); - - void sendProfilingData(); - -protected: - void stateAboutToBeChanged(State state); - void messageReceived(const QByteArray &); - -private: - Q_DISABLE_COPY(QV8ProfilerService) - Q_DECLARE_PRIVATE(QV8ProfilerService) -}; - -QT_END_NAMESPACE - -#endif // QV8PROFILERSERVICE_P_H diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index 205034dfbb..965741241a 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -67,7 +67,7 @@ #include #include "qqmlincubator.h" #include "qqmlabstracturlinterceptor.h" -#include +#include #include #include @@ -815,7 +815,7 @@ void QQmlEnginePrivate::init() isDebugging = true; QQmlEngineDebugService::instance()->addEngine(q); QV4DebugService::instance()->addEngine(q); - QV8ProfilerService::initialize(); + QV4ProfilerService::initialize(); QQmlProfilerService::initialize(); QDebugMessageService::instance(); } diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 972e8cf2e3..26ef86836c 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -48,7 +48,7 @@ #include #include -#include +#include #include #include @@ -1435,7 +1435,7 @@ QV4::ReturnedValue ConsoleObject::method_profile(CallContext *ctx) if (!QQmlDebugService::isDebuggingEnabled()) { logger.warning("Cannot start profiling because debug service is disabled. Start with -qmljsdebugger=port:XXXXX."); } else if (QQmlProfilerService::startProfiling()) { - QV8ProfilerService::instance()->startProfiling(title); + QV4ProfilerService::instance()->startProfiling(title); logger.debug("Profiling started."); } else { @@ -1460,7 +1460,7 @@ QV4::ReturnedValue ConsoleObject::method_profileEnd(CallContext *ctx) QMessageLogger logger(baSource.constData(), frame.line, baFunction.constData()); if (QQmlProfilerService::stopProfiling()) { - QV8ProfilerService *profiler = QV8ProfilerService::instance(); + QV4ProfilerService *profiler = QV4ProfilerService::instance(); profiler->stopProfiling(title); QQmlProfilerService::sendProfilingData(); profiler->sendProfilingData(); diff --git a/src/qml/qml/v8/qv8profiler_p.h b/src/qml/qml/v8/qv8profiler_p.h deleted file mode 100644 index 39a87f2156..0000000000 --- a/src/qml/qml/v8/qv8profiler_p.h +++ /dev/null @@ -1,42 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//#include diff --git a/src/qml/qml/v8/v8.pri b/src/qml/qml/v8/v8.pri index 2480848514..b4eb706574 100644 --- a/src/qml/qml/v8/v8.pri +++ b/src/qml/qml/v8/v8.pri @@ -1,6 +1,5 @@ HEADERS += \ $$PWD/qv8debug_p.h \ - $$PWD/qv8profiler_p.h \ $$PWD/qv8engine_p.h \ $$PWD/qv4domerrors_p.h \ $$PWD/qv4sqlerrors_p.h \ diff --git a/tests/auto/qml/debugger/debugger.pro b/tests/auto/qml/debugger/debugger.pro index aa3ad6a3a3..6838d01352 100644 --- a/tests/auto/qml/debugger/debugger.pro +++ b/tests/auto/qml/debugger/debugger.pro @@ -4,7 +4,7 @@ PUBLICTESTS += \ qqmlenginedebugservice \ qqmldebugjs \ qpacketprotocol \ -# qv8profilerservice \ +# qv4profilerservice \ # qdebugmessageservice \ qqmlenginedebuginspectorintegrationtest \ qqmlinspector \ diff --git a/tests/auto/qml/debugger/qv4profilerservice/data/console.qml b/tests/auto/qml/debugger/qv4profilerservice/data/console.qml new file mode 100644 index 0000000000..c23c820216 --- /dev/null +++ b/tests/auto/qml/debugger/qv4profilerservice/data/console.qml @@ -0,0 +1,14 @@ +import QtQuick 2.0 + + +Item { + function f() + { + } + + Component.onCompleted: { + console.profile(); + f(); + console.profileEnd(); + } +} diff --git a/tests/auto/qml/debugger/qv4profilerservice/data/exit.qml b/tests/auto/qml/debugger/qv4profilerservice/data/exit.qml new file mode 100644 index 0000000000..604265354c --- /dev/null +++ b/tests/auto/qml/debugger/qv4profilerservice/data/exit.qml @@ -0,0 +1,11 @@ +import QtQuick 2.0 + +Item { + Timer { + running: true + interval: 1 + onTriggered: { + Qt.quit(); + } + } +} diff --git a/tests/auto/qml/debugger/qv4profilerservice/data/test.qml b/tests/auto/qml/debugger/qv4profilerservice/data/test.qml new file mode 100644 index 0000000000..9c36e13c5b --- /dev/null +++ b/tests/auto/qml/debugger/qv4profilerservice/data/test.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 + +Item { + +} diff --git a/tests/auto/qml/debugger/qv4profilerservice/qv4profilerservice.pro b/tests/auto/qml/debugger/qv4profilerservice/qv4profilerservice.pro new file mode 100644 index 0000000000..459f931f94 --- /dev/null +++ b/tests/auto/qml/debugger/qv4profilerservice/qv4profilerservice.pro @@ -0,0 +1,16 @@ +CONFIG += testcase +TARGET = tst_qv4profilerservice +macx:CONFIG -= app_bundle + +SOURCES += tst_qv4profilerservice.cpp + +INCLUDEPATH += ../shared +include(../../../shared/util.pri) +include(../shared/debugutil.pri) + +TESTDATA = data/* + +QT += qml testlib gui-private + +DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 +CONFIG+=insignificant_test diff --git a/tests/auto/qml/debugger/qv4profilerservice/tst_qv4profilerservice.cpp b/tests/auto/qml/debugger/qv4profilerservice/tst_qv4profilerservice.cpp new file mode 100644 index 0000000000..23dfb3c75f --- /dev/null +++ b/tests/auto/qml/debugger/qv4profilerservice/tst_qv4profilerservice.cpp @@ -0,0 +1,334 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include "debugutil_p.h" +#include "qqmldebugclient.h" +#include "../../../shared/util.h" + +#define STR_PORT_FROM "13774" +#define STR_PORT_TO "13790" + +struct QV4ProfilerData +{ + int messageType; + QString filename; + QString functionname; + int lineNumber; + double totalTime; + double selfTime; + int treeLevel; + + QByteArray toByteArray() const; +}; + +class QV4ProfilerClient : public QQmlDebugClient +{ + Q_OBJECT + +public: + enum MessageType { + V4Entry, + V4Complete, + V4SnapshotChunk, + V4SnapshotComplete, + V4Started, + + V4MaximumMessage + }; + + enum ServiceState { NotRunning, Running } serviceState; + + QV4ProfilerClient(QQmlDebugConnection *connection) + : QQmlDebugClient(QLatin1String("V8Profiler"), connection) + , serviceState(NotRunning) + { + } + + void startProfiling(const QString &name) { + QByteArray message; + QDataStream stream(&message, QIODevice::WriteOnly); + stream << QByteArray("V8PROFILER") << QByteArray("start") << name; + sendMessage(message); + } + + void stopProfiling(const QString &name) { + QByteArray message; + QDataStream stream(&message, QIODevice::WriteOnly); + stream << QByteArray("V8PROFILER") << QByteArray("stop") << name; + sendMessage(message); + } + + void takeSnapshot() { + QByteArray message; + QDataStream stream(&message, QIODevice::WriteOnly); + stream << QByteArray("V8SNAPSHOT") << QByteArray("full"); + sendMessage(message); + } + + void deleteSnapshots() { + QByteArray message; + QDataStream stream(&message, QIODevice::WriteOnly); + stream << QByteArray("V8SNAPSHOT") << QByteArray("delete"); + sendMessage(message); + } + + QList traceMessages; + QList snapshotMessages; + +signals: + void started(); + void complete(); + void snapshot(); + +protected: + void messageReceived(const QByteArray &message); +}; + +class tst_QV4ProfilerService : public QQmlDataTest +{ + Q_OBJECT + +public: + tst_QV4ProfilerService() + : m_process(0) + , m_connection(0) + , m_client(0) + { + } + +private: + QQmlDebugProcess *m_process; + QQmlDebugConnection *m_connection; + QV4ProfilerClient *m_client; + + bool connect(bool block, const QString &testFile, QString *error); + +private slots: + void cleanup(); + + void blockingConnectWithTraceEnabled(); + void blockingConnectWithTraceDisabled(); + void nonBlockingConnect(); + void snapshot(); + void profileOnExit(); + void console(); +}; + +void QV4ProfilerClient::messageReceived(const QByteArray &message) +{ + QByteArray msg = message; + QDataStream stream(&msg, QIODevice::ReadOnly); + + int messageType; + stream >> messageType; + + QVERIFY(messageType >= 0); + QVERIFY(messageType < QV4ProfilerClient::V4MaximumMessage); + + switch (messageType) { + case QV4ProfilerClient::V4Entry: { + QCOMPARE(serviceState, Running); + QV4ProfilerData entry; + stream >> entry.filename >> entry.functionname >> entry.lineNumber >> entry.totalTime >> entry.selfTime >> entry.treeLevel; + traceMessages.append(entry); + break; + } + case QV4ProfilerClient::V4Complete: + QCOMPARE(serviceState, Running); + serviceState = NotRunning; + emit complete(); + break; + case QV4ProfilerClient::V4SnapshotChunk: { + QByteArray json; + stream >> json; + snapshotMessages.append(json); + break; + } + case QV4ProfilerClient::V4SnapshotComplete: + emit snapshot(); + break; + case QV4ProfilerClient::V4Started: + QCOMPARE(serviceState, NotRunning); + serviceState = Running; + emit started(); + break; + default: + QString failMessage = QString("Unknown message type: %1").arg(messageType); + QFAIL(qPrintable(failMessage)); + } + + QVERIFY(stream.atEnd()); +} + +bool tst_QV4ProfilerService::connect(bool block, const QString &testFile, + QString *error) +{ + const QString executable = QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qml"; + QStringList arguments; + + if (block) + arguments << QString("-qmljsdebugger=port:" STR_PORT_FROM "," STR_PORT_TO ",block"); + else + arguments << QString("-qmljsdebugger=port:" STR_PORT_FROM "," STR_PORT_TO); + + arguments << QQmlDataTest::instance()->testFile(testFile); + + m_connection = new QQmlDebugConnection(); + m_client = new QV4ProfilerClient(m_connection); + + m_process = new QQmlDebugProcess(executable); + m_process->start(QStringList() << arguments); + if (!m_process->waitForSessionStart()) { + *error = QLatin1String("Could not launch application, or did not get 'Waiting for connection'."); + return false; + } + + m_connection->connectToHost(QLatin1String("127.0.0.1"), m_process->debugPort()); + if (!m_connection->waitForConnected()) { + *error = QLatin1String("Could not connect to debugger port."); + return false; + } + return true; +} + +void tst_QV4ProfilerService::cleanup() +{ + if (QTest::currentTestFailed()) { + qDebug() << "Process State:" << m_process->state(); + qDebug() << "Application Output:" << m_process->output(); + } + delete m_client; + delete m_process; + delete m_connection; +} + +void tst_QV4ProfilerService::blockingConnectWithTraceEnabled() +{ + QString error; + if (!connect(true, "test.qml", &error)) + QFAIL(qPrintable(error)); + + QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); + + m_client->startProfiling(""); + m_client->stopProfiling(""); + QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete())), + "No trace received in time."); +} + +void tst_QV4ProfilerService::blockingConnectWithTraceDisabled() +{ + QString error; + if (!connect(true, "test.qml", &error)) + QFAIL(qPrintable(error)); + + QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); + + m_client->stopProfiling(""); + QVERIFY2(!QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete()), 1000), + "Unexpected trace received."); + m_client->startProfiling(""); + m_client->stopProfiling(""); + QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete())), + "No trace received in time."); +} + +void tst_QV4ProfilerService::nonBlockingConnect() +{ + QString error; + if (!connect(false, "test.qml", &error)) + QFAIL(qPrintable(error)); + + QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); + + m_client->startProfiling(""); + m_client->stopProfiling(""); + QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete())), + "No trace received in time."); +} + +void tst_QV4ProfilerService::snapshot() +{ + QString error; + if (!connect(false, "test.qml", &error)) + QFAIL(qPrintable(error)); + + QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); + + m_client->takeSnapshot(); + QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(snapshot())), + "No trace received in time."); +} + +void tst_QV4ProfilerService::profileOnExit() +{ + QString error; + if (!connect(true, "exit.qml", &error)) + QFAIL(qPrintable(error)); + + QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); + + m_client->startProfiling(""); + QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete())), + "No trace received in time."); +} + +void tst_QV4ProfilerService::console() +{ + QString error; + if (!connect(true, "console.qml", &error)) + QFAIL(qPrintable(error)); + + QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); + + m_client->stopProfiling(""); + + QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete())), + "No trace received in time."); + QVERIFY(!m_client->traceMessages.isEmpty()); +} + +QTEST_MAIN(tst_QV4ProfilerService) + +#include "tst_qv4profilerservice.moc" diff --git a/tests/auto/qml/debugger/qv8profilerservice/data/console.qml b/tests/auto/qml/debugger/qv8profilerservice/data/console.qml deleted file mode 100644 index c23c820216..0000000000 --- a/tests/auto/qml/debugger/qv8profilerservice/data/console.qml +++ /dev/null @@ -1,14 +0,0 @@ -import QtQuick 2.0 - - -Item { - function f() - { - } - - Component.onCompleted: { - console.profile(); - f(); - console.profileEnd(); - } -} diff --git a/tests/auto/qml/debugger/qv8profilerservice/data/exit.qml b/tests/auto/qml/debugger/qv8profilerservice/data/exit.qml deleted file mode 100644 index 604265354c..0000000000 --- a/tests/auto/qml/debugger/qv8profilerservice/data/exit.qml +++ /dev/null @@ -1,11 +0,0 @@ -import QtQuick 2.0 - -Item { - Timer { - running: true - interval: 1 - onTriggered: { - Qt.quit(); - } - } -} diff --git a/tests/auto/qml/debugger/qv8profilerservice/data/test.qml b/tests/auto/qml/debugger/qv8profilerservice/data/test.qml deleted file mode 100644 index 9c36e13c5b..0000000000 --- a/tests/auto/qml/debugger/qv8profilerservice/data/test.qml +++ /dev/null @@ -1,5 +0,0 @@ -import QtQuick 2.0 - -Item { - -} diff --git a/tests/auto/qml/debugger/qv8profilerservice/qv8profilerservice.pro b/tests/auto/qml/debugger/qv8profilerservice/qv8profilerservice.pro deleted file mode 100644 index dc6f4c5038..0000000000 --- a/tests/auto/qml/debugger/qv8profilerservice/qv8profilerservice.pro +++ /dev/null @@ -1,16 +0,0 @@ -CONFIG += testcase -TARGET = tst_qv8profilerservice -macx:CONFIG -= app_bundle - -SOURCES += tst_qv8profilerservice.cpp - -INCLUDEPATH += ../shared -include(../../../shared/util.pri) -include(../shared/debugutil.pri) - -TESTDATA = data/* - -QT += qml testlib gui-private - -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 -CONFIG+=insignificant_test diff --git a/tests/auto/qml/debugger/qv8profilerservice/tst_qv8profilerservice.cpp b/tests/auto/qml/debugger/qv8profilerservice/tst_qv8profilerservice.cpp deleted file mode 100644 index a461519c75..0000000000 --- a/tests/auto/qml/debugger/qv8profilerservice/tst_qv8profilerservice.cpp +++ /dev/null @@ -1,334 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include - -#include "debugutil_p.h" -#include "qqmldebugclient.h" -#include "../../../shared/util.h" - -#define STR_PORT_FROM "13774" -#define STR_PORT_TO "13790" - -struct QV8ProfilerData -{ - int messageType; - QString filename; - QString functionname; - int lineNumber; - double totalTime; - double selfTime; - int treeLevel; - - QByteArray toByteArray() const; -}; - -class QV8ProfilerClient : public QQmlDebugClient -{ - Q_OBJECT - -public: - enum MessageType { - V8Entry, - V8Complete, - V8SnapshotChunk, - V8SnapshotComplete, - V8Started, - - V8MaximumMessage - }; - - enum ServiceState { NotRunning, Running } serviceState; - - QV8ProfilerClient(QQmlDebugConnection *connection) - : QQmlDebugClient(QLatin1String("V8Profiler"), connection) - , serviceState(NotRunning) - { - } - - void startProfiling(const QString &name) { - QByteArray message; - QDataStream stream(&message, QIODevice::WriteOnly); - stream << QByteArray("V8PROFILER") << QByteArray("start") << name; - sendMessage(message); - } - - void stopProfiling(const QString &name) { - QByteArray message; - QDataStream stream(&message, QIODevice::WriteOnly); - stream << QByteArray("V8PROFILER") << QByteArray("stop") << name; - sendMessage(message); - } - - void takeSnapshot() { - QByteArray message; - QDataStream stream(&message, QIODevice::WriteOnly); - stream << QByteArray("V8SNAPSHOT") << QByteArray("full"); - sendMessage(message); - } - - void deleteSnapshots() { - QByteArray message; - QDataStream stream(&message, QIODevice::WriteOnly); - stream << QByteArray("V8SNAPSHOT") << QByteArray("delete"); - sendMessage(message); - } - - QList traceMessages; - QList snapshotMessages; - -signals: - void started(); - void complete(); - void snapshot(); - -protected: - void messageReceived(const QByteArray &message); -}; - -class tst_QV8ProfilerService : public QQmlDataTest -{ - Q_OBJECT - -public: - tst_QV8ProfilerService() - : m_process(0) - , m_connection(0) - , m_client(0) - { - } - -private: - QQmlDebugProcess *m_process; - QQmlDebugConnection *m_connection; - QV8ProfilerClient *m_client; - - bool connect(bool block, const QString &testFile, QString *error); - -private slots: - void cleanup(); - - void blockingConnectWithTraceEnabled(); - void blockingConnectWithTraceDisabled(); - void nonBlockingConnect(); - void snapshot(); - void profileOnExit(); - void console(); -}; - -void QV8ProfilerClient::messageReceived(const QByteArray &message) -{ - QByteArray msg = message; - QDataStream stream(&msg, QIODevice::ReadOnly); - - int messageType; - stream >> messageType; - - QVERIFY(messageType >= 0); - QVERIFY(messageType < QV8ProfilerClient::V8MaximumMessage); - - switch (messageType) { - case QV8ProfilerClient::V8Entry: { - QCOMPARE(serviceState, Running); - QV8ProfilerData entry; - stream >> entry.filename >> entry.functionname >> entry.lineNumber >> entry.totalTime >> entry.selfTime >> entry.treeLevel; - traceMessages.append(entry); - break; - } - case QV8ProfilerClient::V8Complete: - QCOMPARE(serviceState, Running); - serviceState = NotRunning; - emit complete(); - break; - case QV8ProfilerClient::V8SnapshotChunk: { - QByteArray json; - stream >> json; - snapshotMessages.append(json); - break; - } - case QV8ProfilerClient::V8SnapshotComplete: - emit snapshot(); - break; - case QV8ProfilerClient::V8Started: - QCOMPARE(serviceState, NotRunning); - serviceState = Running; - emit started(); - break; - default: - QString failMessage = QString("Unknown message type: %1").arg(messageType); - QFAIL(qPrintable(failMessage)); - } - - QVERIFY(stream.atEnd()); -} - -bool tst_QV8ProfilerService::connect(bool block, const QString &testFile, - QString *error) -{ - const QString executable = QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qml"; - QStringList arguments; - - if (block) - arguments << QString("-qmljsdebugger=port:" STR_PORT_FROM "," STR_PORT_TO ",block"); - else - arguments << QString("-qmljsdebugger=port:" STR_PORT_FROM "," STR_PORT_TO); - - arguments << QQmlDataTest::instance()->testFile(testFile); - - m_connection = new QQmlDebugConnection(); - m_client = new QV8ProfilerClient(m_connection); - - m_process = new QQmlDebugProcess(executable); - m_process->start(QStringList() << arguments); - if (!m_process->waitForSessionStart()) { - *error = QLatin1String("Could not launch application, or did not get 'Waiting for connection'."); - return false; - } - - m_connection->connectToHost(QLatin1String("127.0.0.1"), m_process->debugPort()); - if (!m_connection->waitForConnected()) { - *error = QLatin1String("Could not connect to debugger port."); - return false; - } - return true; -} - -void tst_QV8ProfilerService::cleanup() -{ - if (QTest::currentTestFailed()) { - qDebug() << "Process State:" << m_process->state(); - qDebug() << "Application Output:" << m_process->output(); - } - delete m_client; - delete m_process; - delete m_connection; -} - -void tst_QV8ProfilerService::blockingConnectWithTraceEnabled() -{ - QString error; - if (!connect(true, "test.qml", &error)) - QFAIL(qPrintable(error)); - - QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); - - m_client->startProfiling(""); - m_client->stopProfiling(""); - QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete())), - "No trace received in time."); -} - -void tst_QV8ProfilerService::blockingConnectWithTraceDisabled() -{ - QString error; - if (!connect(true, "test.qml", &error)) - QFAIL(qPrintable(error)); - - QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); - - m_client->stopProfiling(""); - QVERIFY2(!QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete()), 1000), - "Unexpected trace received."); - m_client->startProfiling(""); - m_client->stopProfiling(""); - QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete())), - "No trace received in time."); -} - -void tst_QV8ProfilerService::nonBlockingConnect() -{ - QString error; - if (!connect(false, "test.qml", &error)) - QFAIL(qPrintable(error)); - - QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); - - m_client->startProfiling(""); - m_client->stopProfiling(""); - QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete())), - "No trace received in time."); -} - -void tst_QV8ProfilerService::snapshot() -{ - QString error; - if (!connect(false, "test.qml", &error)) - QFAIL(qPrintable(error)); - - QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); - - m_client->takeSnapshot(); - QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(snapshot())), - "No trace received in time."); -} - -void tst_QV8ProfilerService::profileOnExit() -{ - QString error; - if (!connect(true, "exit.qml", &error)) - QFAIL(qPrintable(error)); - - QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); - - m_client->startProfiling(""); - QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete())), - "No trace received in time."); -} - -void tst_QV8ProfilerService::console() -{ - QString error; - if (!connect(true, "console.qml", &error)) - QFAIL(qPrintable(error)); - - QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); - - m_client->stopProfiling(""); - - QVERIFY2(QQmlDebugTest::waitForSignal(m_client, SIGNAL(complete())), - "No trace received in time."); - QVERIFY(!m_client->traceMessages.isEmpty()); -} - -QTEST_MAIN(tst_QV8ProfilerService) - -#include "tst_qv8profilerservice.moc" -- cgit v1.2.3