diff options
Diffstat (limited to 'src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp')
-rw-r--r-- | src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp | 112 |
1 files changed, 96 insertions, 16 deletions
diff --git a/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp b/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp index 96c51da0ef..fed0569039 100644 --- a/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp +++ b/src/declarative/qml/v8/qdeclarativebuiltinfunctions.cpp @@ -66,6 +66,65 @@ QT_BEGIN_NAMESPACE namespace QDeclarativeBuiltinFunctions { +enum ConsoleLogTypes { + Log, + Warn, + Error +}; + +v8::Handle<v8::Value> console(ConsoleLogTypes logType, const v8::Arguments &args) +{ + int line = -1; + QString scriptName; + v8::HandleScope handleScope; + + { + v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(1); + if (stackTrace->GetFrameCount()) { + v8::Local<v8::StackFrame> currentStackFrame = stackTrace->GetFrame(0); + line = currentStackFrame->GetLineNumber(); + scriptName = V8ENGINE()->toString(currentStackFrame->GetScriptName()); + } + } + + QString result; + for (int i = 0; i < args.Length(); ++i) { + if (i != 0) + result.append(QLatin1Char(' ')); + + v8::Local<v8::Value> value = args[i]; + //Check for Object Type + if (value->IsObject() && !value->IsFunction() + && !value->IsArray() && !value->IsDate() + && !value->IsRegExp()) { + result = QLatin1String("Object"); + } else { + v8::Local<v8::String> jsstr = value->ToString(); + result.append(V8ENGINE()->toString(jsstr)); + if (value->IsArray()) + result = QString(QLatin1String("[%1]")).arg(result); + } + } + + QString log = QString(QLatin1String("%1 (%2:%3)")).arg(result).arg(scriptName).arg(line); + + switch (logType) { + case Log: + qDebug("%s", qPrintable(log)); + break; + case Warn: + qWarning("%s", qPrintable(log)); + break; + case Error: + qCritical("%s", qPrintable(log)); + break; + default: + break; + } + + return v8::Undefined(); +} + v8::Handle<v8::Value> gc(const v8::Arguments &args) { Q_UNUSED(args); @@ -73,25 +132,46 @@ v8::Handle<v8::Value> gc(const v8::Arguments &args) return v8::Undefined(); } -v8::Handle<v8::Value> print(const v8::Arguments &args) +v8::Handle<v8::Value> consoleTime(const v8::Arguments &args) { - QString result; - for (int i = 0; i < args.Length(); ++i) { - if (i != 0) - result.append(QLatin1Char(' ')); + if (args.Length() != 1) + V8THROW_ERROR("console.time(): Invalid arguments"); + QString name = V8ENGINE()->toString(args[0]); + V8ENGINE()->startTimer(name); + return v8::Undefined(); +} - v8::Local<v8::String> jsstr = args[i]->ToString(); - if (!jsstr.IsEmpty()) { - QString qstr; - qstr.resize(jsstr->Length()); - jsstr->Write((uint16_t*)qstr.data()); - result.append(qstr); - } +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); } - qDebug("%s", qPrintable(result)); return v8::Undefined(); } +v8::Handle<v8::Value> consoleLog(const v8::Arguments &args) +{ + //console.log + //console.debug + //print + return console(Log, args); +} + +v8::Handle<v8::Value> consoleWarn(const v8::Arguments &args) +{ + return console(Warn, args); +} + +v8::Handle<v8::Value> consoleError(const v8::Arguments &args) +{ + return console(Error, args); +} + v8::Handle<v8::Value> stringArg(const v8::Arguments &args) { QString value = V8ENGINE()->toString(args.This()->ToString()); @@ -654,12 +734,12 @@ v8::Handle<v8::Value> resolvedUrl(const v8::Arguments &args) if (p) { QDeclarativeContextData *ctxt = V8ENGINE()->callingContext(); if (ctxt) - return V8ENGINE()->fromVariant(ctxt->resolvedUrl(url)); + return V8ENGINE()->toString(ctxt->resolvedUrl(url).toString()); else - return V8ENGINE()->fromVariant(url); + return V8ENGINE()->toString(url.toString()); } - return V8ENGINE()->fromVariant(e->baseUrl().resolved(url)); + return V8ENGINE()->toString(e->baseUrl().resolved(url).toString()); } /*! |