diff options
author | Kai Koehne <kai.koehne@nokia.com> | 2011-11-03 17:58:07 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-11-09 08:23:57 +0100 |
commit | cd633df026733f420b5b63ea8b6a4ab943408db9 (patch) | |
tree | b13caa4b3f3851b4bc6f4836a0edf0740169258c | |
parent | 2b5432bd63483998da39aa4eadfb10d0e43ba0b6 (diff) |
Add console.time / console.timeEnd API
Implement console.time() / console.timeEnd() as also provided by FireBug
/ Safari.
Task-number: QTBUG-22347
Change-Id: I94fcadbb0c54fdf60dc2559e3ae63d613e29630b
Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
-rw-r--r-- | doc/src/declarative/globalobject.qdoc | 2 | ||||
-rw-r--r-- | doc/src/declarative/qdeclarativedebugging.qdoc | 14 | ||||
-rw-r--r-- | src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp | 22 | ||||
-rw-r--r-- | src/declarative/qml/v8/qdeclarativebuiltinfunctions_p.h | 2 | ||||
-rw-r--r-- | src/declarative/qml/v8/qv8engine.cpp | 22 | ||||
-rw-r--r-- | src/declarative/qml/v8/qv8engine_p.h | 8 |
6 files changed, 69 insertions, 1 deletions
diff --git a/doc/src/declarative/globalobject.qdoc b/doc/src/declarative/globalobject.qdoc index f4e9d0df8f..ced797b14a 100644 --- a/doc/src/declarative/globalobject.qdoc +++ b/doc/src/declarative/globalobject.qdoc @@ -203,7 +203,7 @@ May throw exception with code property SQLException.DATABASE_ERR, SQLException.S \section1 Logging -\c console.log() and \c console.debug() can be used to print information +\c console.log(), \c console.debug(), \c console.time(), and \c console.timeEnd() can be used to print information to the console. See \l{Debugging QML} for more information. */ diff --git a/doc/src/declarative/qdeclarativedebugging.qdoc b/doc/src/declarative/qdeclarativedebugging.qdoc index 189d4449e5..a34c2faa62 100644 --- a/doc/src/declarative/qdeclarativedebugging.qdoc +++ b/doc/src/declarative/qdeclarativedebugging.qdoc @@ -43,6 +43,20 @@ Rectangle { } \endqml +\c console.time and console.timeEnd log the time (in milliseconds) that was spent between +the calls. Both take a string argument that identifies the measurement. For example: + +\qml +function f() { + console.time("wholeFunction"); + console.time("firstPart"); + // first part + console.timeEnd("firstPart"); + // second part + console.timeEnd("wholeFunction"); +} +\endqml + \section1 Debugging Transitions When a transition doesn't look quite right, it can be helpful to view it in slow diff --git a/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp b/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp index 96c51da0ef..1ced8687ff 100644 --- a/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp +++ b/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp @@ -92,6 +92,28 @@ v8::Handle<v8::Value> print(const v8::Arguments &args) return v8::Undefined(); } +v8::Handle<v8::Value> consoleTime(const v8::Arguments &args) +{ + if (args.Length() != 1) + V8THROW_ERROR("console.time(): Invalid arguments"); + QString name = V8ENGINE()->toString(args[0]); + V8ENGINE()->startTimer(name); + return v8::Undefined(); +} + +v8::Handle<v8::Value> consoleTimeEnd(const v8::Arguments &args) +{ + if (args.Length() != 1) + V8THROW_ERROR("console.time(): Invalid arguments"); + QString name = V8ENGINE()->toString(args[0]); + bool wasRunning; + qint64 elapsed = V8ENGINE()->stopTimer(name, &wasRunning); + if (wasRunning) { + qDebug("%s: %llims", qPrintable(name), elapsed); + } + return v8::Undefined(); +} + v8::Handle<v8::Value> stringArg(const v8::Arguments &args) { QString value = V8ENGINE()->toString(args.This()->ToString()); diff --git a/src/declarative/qml/v8/qdeclarativebuiltinfunctions_p.h b/src/declarative/qml/v8/qdeclarativebuiltinfunctions_p.h index 847dc66e37..35ea885b3c 100644 --- a/src/declarative/qml/v8/qdeclarativebuiltinfunctions_p.h +++ b/src/declarative/qml/v8/qdeclarativebuiltinfunctions_p.h @@ -91,6 +91,8 @@ v8::Handle<v8::Value> qsTr(const v8::Arguments &args); v8::Handle<v8::Value> qsTrNoOp(const v8::Arguments &args); v8::Handle<v8::Value> qsTrId(const v8::Arguments &args); v8::Handle<v8::Value> qsTrIdNoOp(const v8::Arguments &args); +v8::Handle<v8::Value> consoleTime(const v8::Arguments &args); +v8::Handle<v8::Value> consoleTimeEnd(const v8::Arguments &args); v8::Handle<v8::Value> stringArg(const v8::Arguments &args); } diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp index d239f30734..6f744e5e00 100644 --- a/src/declarative/qml/v8/qv8engine.cpp +++ b/src/declarative/qml/v8/qv8engine.cpp @@ -519,10 +519,14 @@ void QV8Engine::initializeGlobal(v8::Handle<v8::Object> global) { using namespace QDeclarativeBuiltinFunctions; v8::Local<v8::Function> printFn = V8FUNCTION(print, this); + v8::Local<v8::Function> consoleTimeFn = V8FUNCTION(consoleTime, this); + v8::Local<v8::Function> consoleTimeEndFn = V8FUNCTION(consoleTimeEnd, this); v8::Local<v8::Object> console = v8::Object::New(); console->Set(v8::String::New("log"), printFn); console->Set(v8::String::New("debug"), printFn); + console->Set(v8::String::New("time"), consoleTimeFn); + console->Set(v8::String::New("timeEnd"), consoleTimeEndFn); v8::Local<v8::Object> qt = v8::Object::New(); @@ -1398,6 +1402,24 @@ void QV8Engine::emitSignalHandlerException() emit q->signalHandlerException(scriptValueFromInternal(uncaughtException())); } +void QV8Engine::startTimer(const QString &timerName) +{ + if (!m_time.isValid()) + m_time.start(); + m_startedTimers[timerName] = m_time.elapsed(); +} + +qint64 QV8Engine::stopTimer(const QString &timerName, bool *wasRunning) +{ + if (!m_startedTimers.contains(timerName)) { + *wasRunning = false; + return 0; + } + *wasRunning = true; + qint64 startedAt = m_startedTimers.take(timerName); + return m_time.elapsed() - startedAt; +} + QThreadStorage<QV8GCCallback::ThreadData *> QV8GCCallback::threadData; void QV8GCCallback::initializeThreadData() { diff --git a/src/declarative/qml/v8/qv8engine_p.h b/src/declarative/qml/v8/qv8engine_p.h index 92e6123ca1..7b85cfcc31 100644 --- a/src/declarative/qml/v8/qv8engine_p.h +++ b/src/declarative/qml/v8/qv8engine_p.h @@ -59,6 +59,7 @@ #include <QtCore/qmutex.h> #include <QtCore/qstack.h> #include <QtCore/qstringlist.h> +#include <QtCore/QElapsedTimer> #include <private/qv8_p.h> #include <qjsengine.h> @@ -405,6 +406,10 @@ public: void emitSignalHandlerException(); + // used for console.time(), console.timeEnd() + void startTimer(const QString &timerName); + qint64 stopTimer(const QString &timerName, bool *wasRunning); + QObject *qtObjectFromJS(v8::Handle<v8::Value> value); QSet<int> visitedConversionObjects; protected: @@ -436,6 +441,9 @@ protected: Exception m_exception; + QElapsedTimer m_time; + QHash<QString, qint64> m_startedTimers; + QVariant toBasicVariant(v8::Handle<v8::Value>); void initializeGlobal(v8::Handle<v8::Object>); |