From 398e27f8907362b598fe1dfe2ecbf76bcbe530c4 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 16 Jan 2012 15:40:27 +0100 Subject: Console API: Add console.count console.count can be handy to check how often code snippets are executed. Change-Id: I0eaf17ab893c76e7b8956122aa31e218745e92bf Reviewed-by: Kai Koehne --- .../qml/v8/qdeclarativebuiltinfunctions.cpp | 55 +++++++++++++++++----- .../qml/v8/qdeclarativebuiltinfunctions_p.h | 1 + src/declarative/qml/v8/qv8engine.cpp | 10 ++++ src/declarative/qml/v8/qv8engine_p.h | 5 ++ 4 files changed, 58 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp b/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp index 2e258b3bb6..a77c8a07c5 100644 --- a/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp +++ b/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp @@ -80,6 +80,20 @@ enum ConsoleLogTypes { Error }; +static QString extendMessage(const QString &msg) { + if (qmlConsoleExtended()) { + v8::Local stackTrace = v8::StackTrace::CurrentStackTrace(1); + if (stackTrace->GetFrameCount()) { + v8::Local frame = stackTrace->GetFrame(0); + int line = frame->GetLineNumber(); + QString scriptName = QString::fromUtf16(*v8::String::Value(frame->GetScriptName())); + + return QString::fromLatin1("%1 (%2:%3)").arg(msg).arg(scriptName).arg(line); + } + } + return msg; +} + v8::Handle console(ConsoleLogTypes logType, const v8::Arguments &args) { v8::HandleScope handleScope; @@ -105,19 +119,7 @@ v8::Handle console(ConsoleLogTypes logType, const v8::Arguments &args } } - if (qmlConsoleExtended()) { - int line = -1; - QString scriptName; - //get only current frame - v8::Local stackTrace = v8::StackTrace::CurrentStackTrace(1); - if (stackTrace->GetFrameCount()) { - v8::Local currentStackFrame = stackTrace->GetFrame(0); - line = currentStackFrame->GetLineNumber(); - scriptName = V8ENGINE()->toString(currentStackFrame->GetScriptName()); - } - - result = QString(QLatin1String("%1 (%2:%3)")).arg(result).arg(scriptName).arg(line); - } + result = extendMessage(result); switch (logType) { case Log: @@ -218,6 +220,33 @@ v8::Handle consoleTimeEnd(const v8::Arguments &args) return v8::Undefined(); } +v8::Handle consoleCount(const v8::Arguments &args) +{ + // first argument: name to print. Ignore any additional arguments + QString name; + if (args.Length() > 0) + name = V8ENGINE()->toString(args[0]); + + v8::Handle stackTrace = + v8::StackTrace::CurrentStackTrace(1, v8::StackTrace::kOverview); + + if (stackTrace->GetFrameCount()) { + v8::Local frame = stackTrace->GetFrame(0); + + QString scriptName = V8ENGINE()->toString(frame->GetScriptName()); + int line = frame->GetLineNumber(); + int column = frame->GetColumn(); + + int value = V8ENGINE()->consoleCountHelper(scriptName, line, column); + QString message = name + QLatin1String(": ") + QString::number(value); + if (qmlConsoleExtended()) + message = QString::fromLatin1("%1 (%2:%3)").arg(message).arg(scriptName).arg(line); + qDebug("%s", qPrintable(message)); + } + + return v8::Undefined(); +} + v8::Handle consoleTrace(const v8::Arguments &args) { if (args.Length() != 0) diff --git a/src/declarative/qml/v8/qdeclarativebuiltinfunctions_p.h b/src/declarative/qml/v8/qdeclarativebuiltinfunctions_p.h index 37e2c14649..8761bdc838 100644 --- a/src/declarative/qml/v8/qdeclarativebuiltinfunctions_p.h +++ b/src/declarative/qml/v8/qdeclarativebuiltinfunctions_p.h @@ -67,6 +67,7 @@ v8::Handle consoleProfile(const v8::Arguments &args); v8::Handle consoleProfileEnd(const v8::Arguments &args); v8::Handle consoleTime(const v8::Arguments &args); v8::Handle consoleTimeEnd(const v8::Arguments &args); +v8::Handle consoleCount(const v8::Arguments &args); v8::Handle consoleTrace(const v8::Arguments &args); v8::Handle consoleWarn(const v8::Arguments &args); v8::Handle isQtObject(const v8::Arguments &args); diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp index 8c31809307..aaf912a35c 100644 --- a/src/declarative/qml/v8/qv8engine.cpp +++ b/src/declarative/qml/v8/qv8engine.cpp @@ -531,6 +531,7 @@ void QV8Engine::initializeGlobal(v8::Handle global) console->Set(v8::String::New("warn"), V8FUNCTION(consoleWarn, this)); console->Set(v8::String::New("error"), V8FUNCTION(consoleError, this)); + console->Set(v8::String::New("count"), V8FUNCTION(consoleCount, this)); console->Set(v8::String::New("profile"), V8FUNCTION(consoleProfile, this)); console->Set(v8::String::New("profileEnd"), V8FUNCTION(consoleProfileEnd, this)); console->Set(v8::String::New("time"), V8FUNCTION(consoleTime, this)); @@ -1514,6 +1515,15 @@ qint64 QV8Engine::stopTimer(const QString &timerName, bool *wasRunning) return m_time.elapsed() - startedAt; } +int QV8Engine::consoleCountHelper(const QString &file, int line, int column) +{ + const QString key = file + QString::number(line) + QString::number(column); + int number = m_consoleCount.value(key, 0); + number++; + m_consoleCount.insert(key, number); + return number; +} + void QV8GCCallback::registerGcPrologueCallback() { QV8Engine::ThreadData *td = QV8Engine::threadData(); diff --git a/src/declarative/qml/v8/qv8engine_p.h b/src/declarative/qml/v8/qv8engine_p.h index 20fc474daa..b625704c5b 100644 --- a/src/declarative/qml/v8/qv8engine_p.h +++ b/src/declarative/qml/v8/qv8engine_p.h @@ -432,6 +432,9 @@ public: void startTimer(const QString &timerName); qint64 stopTimer(const QString &timerName, bool *wasRunning); + // used for console.count() + int consoleCountHelper(const QString &file, int line, int column); + QObject *qtObjectFromJS(v8::Handle value); QSet visitedConversionObjects; @@ -486,6 +489,8 @@ protected: QElapsedTimer m_time; QHash m_startedTimers; + QHash m_consoleCount; + QVariant toBasicVariant(v8::Handle); void initializeGlobal(v8::Handle); -- cgit v1.2.3