aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlworkerscript/qv4serialize.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2022-05-17 15:50:06 +0200
committerUlf Hermann <ulf.hermann@qt.io>2022-06-02 02:42:51 +0200
commite3e8008ec325bdc690fd9600025d66860cac5e62 (patch)
treee82ab867c272e042afc44c627a6f861c2a306418 /src/qmlworkerscript/qv4serialize.cpp
parent7bfbd706b56c426e2683e519543b56426310520f (diff)
Allow retrieval of sequences from QJSValue
As we can store sequence types in QJSValue, we should be able to retrieve them, too. Move the declaration of the QV4::Sequence struct into a header to make it less of a hassle to identify sequences. Change-Id: I3e45bfe193c669107f90cd6c502765c0c9f60fb0 Reviewed-by: Andrei Golubev <andrei.golubev@qt.io> Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/qmlworkerscript/qv4serialize.cpp')
-rw-r--r--src/qmlworkerscript/qv4serialize.cpp37
1 files changed, 18 insertions, 19 deletions
diff --git a/src/qmlworkerscript/qv4serialize.cpp b/src/qmlworkerscript/qv4serialize.cpp
index b9b4d6aa08..b7ad2a6313 100644
--- a/src/qmlworkerscript/qv4serialize.cpp
+++ b/src/qmlworkerscript/qv4serialize.cpp
@@ -240,28 +240,27 @@ void Serialize::serialize(QByteArray &data, const QV4::Value &v, ExecutionEngine
}
// No other QObject's are allowed to be sent
push(data, valueheader(WorkerUndefined));
- } else if (const Object *o = v.as<Object>()) {
- if (o->isListType()) {
- // valid sequence. we generate a length (sequence length + 1 for the sequence type)
- uint seqLength = ScopedValue(scope, o->get(engine->id_length()))->toUInt32();
- uint length = seqLength + 1;
- if (length > 0xFFFFFF) {
- push(data, valueheader(WorkerUndefined));
- return;
- }
- reserve(data, sizeof(quint32) + length * sizeof(quint32));
- push(data, valueheader(WorkerSequence, length));
+ } else if (const Sequence *s = v.as<Sequence>()) {
+ // valid sequence. we generate a length (sequence length + 1 for the sequence type)
+ uint seqLength = ScopedValue(scope, s->get(engine->id_length()))->toUInt32();
+ uint length = seqLength + 1;
+ if (length > 0xFFFFFF) {
+ push(data, valueheader(WorkerUndefined));
+ return;
+ }
+ reserve(data, sizeof(quint32) + length * sizeof(quint32));
+ push(data, valueheader(WorkerSequence, length));
- // sequence type
- serialize(data, QV4::Value::fromInt32(
- QV4::SequencePrototype::metaTypeForSequence(o).id()), engine);
+ // sequence type
+ serialize(data, QV4::Value::fromInt32(
+ QV4::SequencePrototype::metaTypeForSequence(s).id()), engine);
- ScopedValue val(scope);
- for (uint ii = 0; ii < seqLength; ++ii)
- serialize(data, (val = o->get(ii)), engine); // sequence elements
+ ScopedValue val(scope);
+ for (uint ii = 0; ii < seqLength; ++ii)
+ serialize(data, (val = s->get(ii)), engine); // sequence elements
- return;
- }
+ return;
+ } else if (const Object *o = v.as<Object>()) {
const QVariant variant = engine->toVariant(v, QMetaType::fromType<QUrl>(), false);
if (variant.userType() == QMetaType::QUrl) {
serializeString(data, variant.value<QUrl>().toString(), WorkerUrl);