Remove unused codepaths from QV8SequenceWrapper
The object equality comparison callback does not allow an object with a sequence resource to be equal to an object with a variant resource. As such, the SequenceType::isEqual(QVariant) codepaths are not needed. Also, QVariantList conversion is handled by toBasicVariant() in the QV8Engine, and thus we don't need conversion code for this type in the sequence wrapper. Change-Id: I2ec599c5ad6cfdb715cd4e0aae3f0cc3bb36cfdf Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
This commit is contained in:
parent
851412e58e
commit
43c516be86
|
@ -89,19 +89,11 @@ void QV8SequenceWrapper::destroy()
|
||||||
qPersistentDispose(m_constructor);
|
qPersistentDispose(m_constructor);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QV8SequenceWrapper::isEqual(QV8ObjectResource *lhs, const QVariant &rhs)
|
|
||||||
{
|
|
||||||
Q_ASSERT(lhs->resourceType() == QV8ObjectResource::SequenceType);
|
|
||||||
QV8SequenceResource *r = static_cast<QV8SequenceResource *>(lhs);
|
|
||||||
Q_ASSERT(r);
|
|
||||||
return r->isEqual(rhs);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QV8SequenceWrapper::isEqual(QV8ObjectResource *lhs, QV8ObjectResource *rhs)
|
bool QV8SequenceWrapper::isEqual(QV8ObjectResource *lhs, QV8ObjectResource *rhs)
|
||||||
{
|
{
|
||||||
|
Q_ASSERT(lhs && rhs && lhs->resourceType() == QV8ObjectResource::SequenceType && rhs->resourceType() == QV8ObjectResource::SequenceType);
|
||||||
QV8SequenceResource *lr = static_cast<QV8SequenceResource *>(lhs);
|
QV8SequenceResource *lr = static_cast<QV8SequenceResource *>(lhs);
|
||||||
QV8SequenceResource *rr = static_cast<QV8SequenceResource *>(rhs);
|
QV8SequenceResource *rr = static_cast<QV8SequenceResource *>(rhs);
|
||||||
Q_ASSERT(lr && rr);
|
|
||||||
return lr->isEqual(rr);
|
return lr->isEqual(rr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,23 +165,7 @@ QVariant QV8SequenceWrapper::toVariant(QV8ObjectResource *r)
|
||||||
QVariant QV8SequenceWrapper::toVariant(v8::Handle<v8::Array> array, int typeHint, bool *succeeded)
|
QVariant QV8SequenceWrapper::toVariant(v8::Handle<v8::Array> array, int typeHint, bool *succeeded)
|
||||||
{
|
{
|
||||||
*succeeded = true;
|
*succeeded = true;
|
||||||
QV8SequenceResource *sr = static_cast<QV8SequenceResource *>(array->GetExternalResource());
|
|
||||||
if (sr)
|
|
||||||
return sr->toVariant();
|
|
||||||
|
|
||||||
// if no typehint is given it's just a sequence of arbitrary variants
|
|
||||||
uint32_t length = array->Length();
|
uint32_t length = array->Length();
|
||||||
if (typeHint == -1) {
|
|
||||||
QVariantList list;
|
|
||||||
for (uint32_t ii = 0; ii < length; ++ii) {
|
|
||||||
v8::Local<v8::Value> arrayItem = array->Get(ii);
|
|
||||||
list.append(m_engine->toVariant(arrayItem, -1));
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise, try to build a sequence of the correct type
|
|
||||||
FOREACH_QML_SEQUENCE_TYPE(SEQUENCE_TO_VARIANT) { /* else */ *succeeded = false; return QVariant(); }
|
FOREACH_QML_SEQUENCE_TYPE(SEQUENCE_TO_VARIANT) { /* else */ *succeeded = false; return QVariant(); }
|
||||||
}
|
}
|
||||||
#undef SEQUENCE_TO_VARIANT
|
#undef SEQUENCE_TO_VARIANT
|
||||||
|
|
|
@ -79,7 +79,6 @@ public:
|
||||||
enum ObjectType { Reference, Copy };
|
enum ObjectType { Reference, Copy };
|
||||||
|
|
||||||
virtual QVariant toVariant() = 0;
|
virtual QVariant toVariant() = 0;
|
||||||
virtual bool isEqual(const QVariant &v) = 0;
|
|
||||||
virtual bool isEqual(const QV8SequenceResource *v) = 0;
|
virtual bool isEqual(const QV8SequenceResource *v) = 0;
|
||||||
|
|
||||||
virtual quint32 lengthGetter() = 0;
|
virtual quint32 lengthGetter() = 0;
|
||||||
|
@ -256,16 +255,6 @@ static QString convertUrlToString(QV8Engine *, const QUrl &v)
|
||||||
} \
|
} \
|
||||||
return QVariant::fromValue<SequenceType>(c); \
|
return QVariant::fromValue<SequenceType>(c); \
|
||||||
} \
|
} \
|
||||||
bool isEqual(const QVariant &v) \
|
|
||||||
{ \
|
|
||||||
if (objectType == QV8SequenceResource::Reference) { \
|
|
||||||
if (!object) \
|
|
||||||
return false; \
|
|
||||||
void *a[] = { &c, 0 }; \
|
|
||||||
QMetaObject::metacall(object, QMetaObject::ReadProperty, propertyIndex, a); \
|
|
||||||
} \
|
|
||||||
return (c == v.value<SequenceType>()); \
|
|
||||||
} \
|
|
||||||
bool isEqual(const QV8SequenceResource *v) \
|
bool isEqual(const QV8SequenceResource *v) \
|
||||||
{ \
|
{ \
|
||||||
/* Note: two different sequences can never be equal (even if they */ \
|
/* Note: two different sequences can never be equal (even if they */ \
|
||||||
|
|
|
@ -43,6 +43,11 @@ Item {
|
||||||
worker.sendSequence(msco.urlListProperty);
|
worker.sendSequence(msco.urlListProperty);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testVariantSequence() {
|
||||||
|
msco.variantListProperty = [ "one", true, 3, "four" ];
|
||||||
|
worker.sendSequence(msco.variantListProperty);
|
||||||
|
}
|
||||||
|
|
||||||
WorkerScript {
|
WorkerScript {
|
||||||
id: worker
|
id: worker
|
||||||
source: "threadScript.js"
|
source: "threadScript.js"
|
||||||
|
|
|
@ -1160,9 +1160,10 @@ class MySequenceConversionObject : public QObject
|
||||||
Q_PROPERTY (QList<bool> boolListProperty READ boolListProperty WRITE setBoolListProperty NOTIFY boolListPropertyChanged)
|
Q_PROPERTY (QList<bool> boolListProperty READ boolListProperty WRITE setBoolListProperty NOTIFY boolListPropertyChanged)
|
||||||
Q_PROPERTY (QList<QString> stringListProperty READ stringListProperty WRITE setStringListProperty NOTIFY stringListPropertyChanged)
|
Q_PROPERTY (QList<QString> stringListProperty READ stringListProperty WRITE setStringListProperty NOTIFY stringListPropertyChanged)
|
||||||
Q_PROPERTY (QList<QUrl> urlListProperty READ urlListProperty WRITE setUrlListProperty NOTIFY urlListPropertyChanged)
|
Q_PROPERTY (QList<QUrl> urlListProperty READ urlListProperty WRITE setUrlListProperty NOTIFY urlListPropertyChanged)
|
||||||
|
|
||||||
Q_PROPERTY (QStringList qstringListProperty READ qstringListProperty WRITE setQStringListProperty NOTIFY qstringListPropertyChanged)
|
Q_PROPERTY (QStringList qstringListProperty READ qstringListProperty WRITE setQStringListProperty NOTIFY qstringListPropertyChanged)
|
||||||
|
|
||||||
Q_PROPERTY (QList<QPoint> pointListProperty READ pointListProperty WRITE setPointListProperty NOTIFY pointListPropertyChanged)
|
Q_PROPERTY (QList<QPoint> pointListProperty READ pointListProperty WRITE setPointListProperty NOTIFY pointListPropertyChanged)
|
||||||
|
Q_PROPERTY (QList<QVariant> variantListProperty READ variantListProperty WRITE setVariantListProperty NOTIFY variantListPropertyChanged)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MySequenceConversionObject()
|
MySequenceConversionObject()
|
||||||
|
@ -1173,9 +1174,10 @@ public:
|
||||||
m_boolList << true << false << true << false;
|
m_boolList << true << false << true << false;
|
||||||
m_stringList << QLatin1String("first") << QLatin1String("second") << QLatin1String("third") << QLatin1String("fourth");
|
m_stringList << QLatin1String("first") << QLatin1String("second") << QLatin1String("third") << QLatin1String("fourth");
|
||||||
m_urlList << QUrl("http://www.example1.com") << QUrl("http://www.example2.com") << QUrl("http://www.example3.com");
|
m_urlList << QUrl("http://www.example1.com") << QUrl("http://www.example2.com") << QUrl("http://www.example3.com");
|
||||||
|
|
||||||
m_qstringList << QLatin1String("first") << QLatin1String("second") << QLatin1String("third") << QLatin1String("fourth");
|
m_qstringList << QLatin1String("first") << QLatin1String("second") << QLatin1String("third") << QLatin1String("fourth");
|
||||||
|
|
||||||
m_pointList << QPoint(1, 2) << QPoint(3, 4) << QPoint(5, 6);
|
m_pointList << QPoint(1, 2) << QPoint(3, 4) << QPoint(5, 6);
|
||||||
|
m_variantList << QVariant(QLatin1String("one")) << QVariant(true) << QVariant(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
~MySequenceConversionObject() {}
|
~MySequenceConversionObject() {}
|
||||||
|
@ -1196,6 +1198,8 @@ public:
|
||||||
void setQStringListProperty(const QStringList &list) { m_qstringList = list; emit qstringListPropertyChanged(); }
|
void setQStringListProperty(const QStringList &list) { m_qstringList = list; emit qstringListPropertyChanged(); }
|
||||||
QList<QPoint> pointListProperty() const { return m_pointList; }
|
QList<QPoint> pointListProperty() const { return m_pointList; }
|
||||||
void setPointListProperty(const QList<QPoint> &list) { m_pointList = list; emit pointListPropertyChanged(); }
|
void setPointListProperty(const QList<QPoint> &list) { m_pointList = list; emit pointListPropertyChanged(); }
|
||||||
|
QList<QVariant> variantListProperty() const { return m_variantList; }
|
||||||
|
void setVariantListProperty(const QList<QVariant> &list) { m_variantList = list; emit variantListPropertyChanged(); }
|
||||||
|
|
||||||
// now for "copy resource" sequences:
|
// now for "copy resource" sequences:
|
||||||
Q_INVOKABLE QList<int> generateIntSequence() const { QList<int> retn; retn << 1 << 2 << 3; return retn; }
|
Q_INVOKABLE QList<int> generateIntSequence() const { QList<int> retn; retn << 1 << 2 << 3; return retn; }
|
||||||
|
@ -1218,6 +1222,7 @@ signals:
|
||||||
void urlListPropertyChanged();
|
void urlListPropertyChanged();
|
||||||
void qstringListPropertyChanged();
|
void qstringListPropertyChanged();
|
||||||
void pointListPropertyChanged();
|
void pointListPropertyChanged();
|
||||||
|
void variantListPropertyChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<int> m_intList;
|
QList<int> m_intList;
|
||||||
|
@ -1226,9 +1231,10 @@ private:
|
||||||
QList<bool> m_boolList;
|
QList<bool> m_boolList;
|
||||||
QList<QString> m_stringList;
|
QList<QString> m_stringList;
|
||||||
QList<QUrl> m_urlList;
|
QList<QUrl> m_urlList;
|
||||||
|
QStringList m_qstringList;
|
||||||
|
|
||||||
QStringList m_qstringList; // not a supported sequence type, but QStringList support is hardcoded.
|
|
||||||
QList<QPoint> m_pointList; // not a supported sequence type
|
QList<QPoint> m_pointList; // not a supported sequence type
|
||||||
|
QList<QVariant> m_variantList; // not a supported sequence type, but QVariantList support is hardcoded.
|
||||||
};
|
};
|
||||||
|
|
||||||
class MyDeleteObject : public QObject
|
class MyDeleteObject : public QObject
|
||||||
|
|
|
@ -4239,6 +4239,10 @@ void tst_qdeclarativeecmascript::sequenceConversionThreads()
|
||||||
QTRY_VERIFY(object->property("finished").toBool());
|
QTRY_VERIFY(object->property("finished").toBool());
|
||||||
QVERIFY(object->property("success").toBool());
|
QVERIFY(object->property("success").toBool());
|
||||||
|
|
||||||
|
QMetaObject::invokeMethod(object, "testVariantSequence");
|
||||||
|
QTRY_VERIFY(object->property("finished").toBool());
|
||||||
|
QVERIFY(object->property("success").toBool());
|
||||||
|
|
||||||
delete object;
|
delete object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue