diff options
Diffstat (limited to 'src/declarative/qml/v8/qv8engine.cpp')
-rw-r--r-- | src/declarative/qml/v8/qv8engine.cpp | 89 |
1 files changed, 72 insertions, 17 deletions
diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp index 62abbbe59b..791c972c0b 100644 --- a/src/declarative/qml/v8/qv8engine.cpp +++ b/src/declarative/qml/v8/qv8engine.cpp @@ -45,6 +45,7 @@ #include "qv8contextwrapper_p.h" #include "qv8valuetypewrapper_p.h" #include "qv8gccallback_p.h" +#include "qv8sequencewrapper_p.h" #include "qv8include_p.h" #include "../../../3rdparty/javascriptcore/DateMath.h" @@ -82,6 +83,7 @@ static bool ObjectComparisonCallback(v8::Local<v8::Object> lhs, v8::Local<v8::Ob switch (lhst) { case QV8ObjectResource::ValueTypeType: + // a value type might be equal to a variant or another value type if (rhst == QV8ObjectResource::ValueTypeType) { return lhsr->engine->valueTypeWrapper()->isEqual(lhsr, lhsr->engine->valueTypeWrapper()->toVariant(rhsr)); } else if (rhst == QV8ObjectResource::VariantType) { @@ -89,6 +91,7 @@ static bool ObjectComparisonCallback(v8::Local<v8::Object> lhs, v8::Local<v8::Ob } break; case QV8ObjectResource::VariantType: + // a variant might be equal to a value type or other variant. if (rhst == QV8ObjectResource::VariantType) { return lhsr->engine->variantWrapper()->toVariant(lhsr) == lhsr->engine->variantWrapper()->toVariant(rhsr); @@ -96,6 +99,12 @@ static bool ObjectComparisonCallback(v8::Local<v8::Object> lhs, v8::Local<v8::Ob return rhsr->engine->valueTypeWrapper()->isEqual(rhsr, rhsr->engine->variantWrapper()->toVariant(lhsr)); } break; + case QV8ObjectResource::SequenceType: + // a sequence might be equal to itself. + if (rhst == QV8ObjectResource::SequenceType) { + return lhsr->engine->sequenceWrapper()->isEqual(lhsr, rhsr); + } + break; default: break; } @@ -135,6 +144,7 @@ QV8Engine::QV8Engine(QJSEngine* qq, QJSEngine::ContextOwnership ownership) m_listWrapper.init(this); m_variantWrapper.init(this); m_valueTypeWrapper.init(this); + m_sequenceWrapper.init(this); QV8GCCallback::registerGcPrologueCallback(); @@ -164,6 +174,7 @@ QV8Engine::~QV8Engine() invalidateAllValues(); clearExceptions(); + m_sequenceWrapper.destroy(); m_valueTypeWrapper.destroy(); m_variantWrapper.destroy(); m_listWrapper.destroy(); @@ -226,25 +237,33 @@ QVariant QV8Engine::toVariant(v8::Handle<v8::Value> value, int typeHint) return m_variantWrapper.toVariant(r); case QV8ObjectResource::ValueTypeType: return m_valueTypeWrapper.toVariant(r); + case QV8ObjectResource::SequenceType: + return m_sequenceWrapper.toVariant(r); } } } - if (typeHint == qMetaTypeId<QList<QObject *> >() && value->IsArray()) { + if (value->IsArray()) { v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(value); - - QList<QObject *> list; - uint32_t length = array->Length(); - for (uint32_t ii = 0; ii < length; ++ii) { - v8::Local<v8::Value> arrayItem = array->Get(ii); - if (arrayItem->IsObject()) { - list << toQObject(arrayItem->ToObject()); - } else { - list << 0; + if (typeHint == qMetaTypeId<QList<QObject *> >()) { + QList<QObject *> list; + uint32_t length = array->Length(); + for (uint32_t ii = 0; ii < length; ++ii) { + v8::Local<v8::Value> arrayItem = array->Get(ii); + if (arrayItem->IsObject()) { + list << toQObject(arrayItem->ToObject()); + } else { + list << 0; + } } + + return qVariantFromValue<QList<QObject*> >(list); } - return qVariantFromValue<QList<QObject*> >(list); + bool succeeded = false; + QVariant retn = m_sequenceWrapper.toVariant(array, typeHint, &succeeded); + if (succeeded) + return retn; } return toBasicVariant(value); @@ -325,8 +344,14 @@ v8::Handle<v8::Value> QV8Engine::fromVariant(const QVariant &variant) case QMetaType::QObjectStar: case QMetaType::QWidgetStar: return newQObject(*reinterpret_cast<QObject* const *>(ptr)); - case QMetaType::QStringList: + case QMetaType::QStringList: + { + bool succeeded = false; + v8::Handle<v8::Value> retn = m_sequenceWrapper.fromVariant(variant, &succeeded); + if (succeeded) + return retn; return arrayFromStringList(this, *reinterpret_cast<const QStringList *>(ptr)); + } case QMetaType::QVariantList: return arrayFromVariantList(this, *reinterpret_cast<const QVariantList *>(ptr)); case QMetaType::QVariantMap: @@ -369,6 +394,11 @@ v8::Handle<v8::Value> QV8Engine::fromVariant(const QVariant &variant) QObject *obj = QDeclarativeMetaType::toQObject(variant, &objOk); if (objOk) return newQObject(obj); + + bool succeeded = false; + v8::Handle<v8::Value> retn = m_sequenceWrapper.fromVariant(variant, &succeeded); + if (succeeded) + return retn; } // XXX TODO: To be compatible, we still need to handle: @@ -459,7 +489,6 @@ QVariant QV8Engine::toBasicVariant(v8::Handle<v8::Value> value) int length = array->Length(); for (int ii = 0; ii < length; ++ii) rv << toVariant(array->Get(ii), -1); - return rv; } if (!value->IsFunction()) { @@ -489,11 +518,19 @@ struct StaticQtMetaObject : public QObject void QV8Engine::initializeGlobal(v8::Handle<v8::Object> global) { using namespace QDeclarativeBuiltinFunctions; - v8::Local<v8::Function> printFn = V8FUNCTION(print, this); v8::Local<v8::Object> console = v8::Object::New(); - console->Set(v8::String::New("log"), printFn); - console->Set(v8::String::New("debug"), printFn); + v8::Local<v8::Function> consoleLogFn = V8FUNCTION(consoleLog, this); + v8::Local<v8::Function> consoleWarnFn = V8FUNCTION(consoleWarn, this); + v8::Local<v8::Function> consoleErrorFn = V8FUNCTION(consoleError, this); + v8::Local<v8::Function> consoleTimeFn = V8FUNCTION(consoleTime, this); + v8::Local<v8::Function> consoleTimeEndFn = V8FUNCTION(consoleTimeEnd, this); + console->Set(v8::String::New("log"), consoleLogFn); + console->Set(v8::String::New("debug"), consoleLogFn); + console->Set(v8::String::New("warn"), consoleWarnFn); + console->Set(v8::String::New("error"), consoleErrorFn); + console->Set(v8::String::New("time"), consoleTimeFn); + console->Set(v8::String::New("timeEnd"), consoleTimeEndFn); v8::Local<v8::Object> qt = v8::Object::New(); @@ -546,7 +583,7 @@ void QV8Engine::initializeGlobal(v8::Handle<v8::Object> global) global->Set(v8::String::New("qsTrId"), V8FUNCTION(qsTrId, this)); global->Set(v8::String::New("QT_TRID_NOOP"), V8FUNCTION(qsTrIdNoOp, this)); - global->Set(v8::String::New("print"), printFn); + global->Set(v8::String::New("print"), consoleLogFn); global->Set(v8::String::New("console"), console); global->Set(v8::String::New("Qt"), qt); global->Set(v8::String::New("gc"), V8FUNCTION(QDeclarativeBuiltinFunctions::gc, this)); @@ -1369,6 +1406,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() { |