aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/v8/qv8worker.cpp
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-06-07 16:54:09 +1000
committerAaron Kennedy <aaron.kennedy@nokia.com>2011-06-07 17:00:11 +1000
commit1325c549744346154a915115e9787b97427fad81 (patch)
treee566a9e5ddc957cf6ccc3e91bbca3544da312964 /src/declarative/qml/v8/qv8worker.cpp
parent53085399f56714db27cbdebe554146528d13c94e (diff)
Implement ListModel in V8
Diffstat (limited to 'src/declarative/qml/v8/qv8worker.cpp')
-rw-r--r--src/declarative/qml/v8/qv8worker.cpp58
1 files changed, 43 insertions, 15 deletions
diff --git a/src/declarative/qml/v8/qv8worker.cpp b/src/declarative/qml/v8/qv8worker.cpp
index 6b6ecd8c2a..846fdb7759 100644
--- a/src/declarative/qml/v8/qv8worker.cpp
+++ b/src/declarative/qml/v8/qv8worker.cpp
@@ -41,6 +41,9 @@
#include "qv8worker_p.h"
+#include <private/qdeclarativelistmodel_p.h>
+#include <private/qdeclarativelistmodelworkeragent_p.h>
+
QT_BEGIN_NAMESPACE
// We allow the following JavaScript types to be passed between the main and
@@ -70,7 +73,8 @@ enum Type {
WorkerUint32,
WorkerNumber,
WorkerDate,
- WorkerRegexp
+ WorkerRegexp,
+ WorkerListModel
};
static inline quint32 valueheader(Type type, quint32 size = 0)
@@ -98,6 +102,11 @@ static inline void push(QByteArray &data, double value)
data.append((const char *)&value, sizeof(double));
}
+static inline void push(QByteArray &data, void *ptr)
+{
+ data.append((const char *)&ptr, sizeof(void *));
+}
+
static inline void reserve(QByteArray &data, int extra)
{
data.reserve(data.size() + extra);
@@ -117,6 +126,13 @@ static inline double popDouble(const char *&data)
return rv;
}
+static inline void *popPtr(const char *&data)
+{
+ void *rv = *((void **)data);
+ data += sizeof(void *);
+ return rv;
+}
+
// XXX double check exception safety
#include <QDebug>
@@ -221,23 +237,21 @@ void QV8Worker::serialize(QByteArray &data, v8::Handle<v8::Value> v, QV8Engine *
serialize(data, val, engine);
}
}
+ } else if (engine->isQObject(v)) {
+ // XXX Can we generalize this?
+ QDeclarativeListModel *lm = qobject_cast<QDeclarativeListModel *>(engine->toQObject(v));
+ if (lm && lm->agent()) {
+ QDeclarativeListModelWorkerAgent *agent = lm->agent();
+ agent->addref();
+ push(data, valueheader(WorkerListModel));
+ push(data, (void *)agent);
+ return;
+ }
+ // No other QObject's are allowed to be sent
+ push(data, valueheader(WorkerUndefined));
} else {
push(data, valueheader(WorkerUndefined));
}
-
- // XXX Need to serialize QDeclarativeListModel
- /*
- QDeclarativeListModel *lm = qobject_cast<QDeclarativeListModel *>(value.toQObject());
- if (lm) {
- QDeclarativeListModelWorkerAgent *agent = lm->agent();
- if (agent) {
- QDeclarativeListModelWorkerAgent::VariantRef v(agent);
- return QVariant::fromValue(v);
- } else {
- return QVariant();
- }
- }
- */
}
v8::Handle<v8::Value> QV8Worker::deserialize(const char *&data, QV8Engine *engine)
@@ -300,6 +314,20 @@ v8::Handle<v8::Value> QV8Worker::deserialize(const char *&data, QV8Engine *engin
data += ALIGN(length * sizeof(uint16_t));
return v8::RegExp::New(source, (v8::RegExp::Flags)flags);
}
+ case WorkerListModel:
+ {
+ void *ptr = popPtr(data);
+ QDeclarativeListModelWorkerAgent *agent = (QDeclarativeListModelWorkerAgent *)ptr;
+ v8::Handle<v8::Value> rv = engine->newQObject(agent);
+ if (rv->IsObject()) {
+ QDeclarativeListModelWorkerAgent::VariantRef ref(agent);
+ QVariant var = qVariantFromValue(ref);
+ rv->ToObject()->SetHiddenValue(v8::String::New("qml::ref"), engine->fromVariant(var));
+ }
+ agent->release();
+ agent->setV8Engine(engine);
+ return rv;
+ }
}
Q_ASSERT(!"Unreachable");
return v8::Undefined();