diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2022-05-17 15:50:06 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2022-06-02 02:42:51 +0200 |
commit | e3e8008ec325bdc690fd9600025d66860cac5e62 (patch) | |
tree | e82ab867c272e042afc44c627a6f861c2a306418 /src/qmlworkerscript/qv4serialize.cpp | |
parent | 7bfbd706b56c426e2683e519543b56426310520f (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.cpp | 37 |
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); |