summaryrefslogtreecommitdiff
path: root/src/declarative/qml/v8/qv8engine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/qml/v8/qv8engine.cpp')
-rw-r--r--src/declarative/qml/v8/qv8engine.cpp89
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()
{