@@ -1478,7 +1478,9 @@ QQmlError ExecutionEngine::catchExceptionAsQmlError()
14781478//  Variant conversion code
14791479
14801480typedef  QSet<QV4::Heap::Object *> V4ObjectSet;
1481- static  QVariant toVariant (const  QV4::Value &value, QMetaType typeHint, bool  createJSValueForObjects, V4ObjectSet *visitedObjects);
1481+ static  QVariant toVariant (
1482+     const  QV4::Value &value, QMetaType typeHint, bool  createJSValueForObjectsAndSymbols,
1483+     V4ObjectSet *visitedObjects);
14821484static  QObject *qtObjectFromJS (const  QV4::Value &value);
14831485static  QVariant objectToVariant (const  QV4::Object *o, V4ObjectSet *visitedObjects = nullptr );
14841486static  bool  convertToNativeQObject (const  QV4::Value &value, QMetaType targetType, void  **result);
@@ -1491,7 +1493,7 @@ static QV4::ReturnedValue variantToJS(QV4::ExecutionEngine *v4, const QVariant &
14911493}
14921494
14931495static  QVariant toVariant (
1494-         const  QV4::Value &value, QMetaType metaType, bool  createJSValueForObjects ,
1496+         const  QV4::Value &value, QMetaType metaType, bool  createJSValueForObjectsAndSymbols ,
14951497        V4ObjectSet *visitedObjects)
14961498{
14971499    Q_ASSERT  (!value.isEmpty ());
@@ -1634,6 +1636,9 @@ static QVariant toVariant(
16341636        return  *ld->d ()->locale ;
16351637#endif 
16361638    if  (const  QV4::DateObject *d = value.as <DateObject>()) {
1639+         //  NOTE: since we convert QTime to JS Date,
1640+         //        round trip will change the variant type (to QDateTime)!
1641+ 
16371642        if  (metaType == QMetaType::fromType<QDate>())
16381643            return  DateObject::dateTimeToDate (d->toQDateTime ());
16391644
@@ -1649,7 +1654,11 @@ static QVariant toVariant(
16491654        return  d->toQUrl ();
16501655    if  (const  ArrayBuffer *d = value.as <ArrayBuffer>())
16511656        return  d->asByteArray ();
1652-     //  NOTE: since we convert QTime to JS Date, round trip will change the variant type (to QDateTime)!
1657+     if  (const  Symbol *symbol = value.as <Symbol>()) {
1658+         return  createJSValueForObjectsAndSymbols
1659+             ? QVariant::fromValue (QJSValuePrivate::fromReturnedValue (symbol->asReturnedValue ()))
1660+             : symbol->descriptiveString ();
1661+     }
16531662
16541663    const  QV4::Object *object = value.as <QV4::Object>();
16551664    Q_ASSERT (object);
@@ -1667,16 +1676,17 @@ static QVariant toVariant(
16671676            return  result;
16681677    }
16691678
1670-     if  (createJSValueForObjects )
1679+     if  (createJSValueForObjectsAndSymbols )
16711680        return  QVariant::fromValue (QJSValuePrivate::fromReturnedValue (o->asReturnedValue ()));
16721681
16731682    return  objectToVariant (o, visitedObjects);
16741683}
16751684
16761685
1677- QVariant ExecutionEngine::toVariant (const  Value &value, QMetaType typeHint, bool  createJSValueForObjects)
1686+ QVariant ExecutionEngine::toVariant (
1687+     const  Value &value, QMetaType typeHint, bool  createJSValueForObjectsAndSymbols)
16781688{
1679-     return  ::toVariant (value, typeHint, createJSValueForObjects , nullptr );
1689+     return  ::toVariant (value, typeHint, createJSValueForObjectsAndSymbols , nullptr );
16801690}
16811691
16821692static  QVariant objectToVariant (const  QV4::Object *o, V4ObjectSet *visitedObjects)
@@ -1707,7 +1717,8 @@ static QVariant objectToVariant(const QV4::Object *o, V4ObjectSet *visitedObject
17071717        int  length = a->getLength ();
17081718        for  (int  ii = 0 ; ii < length; ++ii) {
17091719            v = a->get (ii);
1710-             list << ::toVariant (v, QMetaType {}, /* createJSValueForObjects*/ false , visitedObjects);
1720+             list << ::toVariant (v, QMetaType {}, /* createJSValueForObjectsAndSymbols*/ false ,
1721+                                 visitedObjects);
17111722        }
17121723
17131724        result = list;
@@ -1725,7 +1736,7 @@ static QVariant objectToVariant(const QV4::Object *o, V4ObjectSet *visitedObject
17251736            QString key = name->toQStringNoThrow ();
17261737            map.insert (key, ::toVariant (
17271738                           val, /* type hint*/   QMetaType {},
1728-                            /* createJSValueForObjects */ false , visitedObjects));
1739+                            /* createJSValueForObjectsAndSymbols */ false , visitedObjects));
17291740        }
17301741
17311742        result = map;
@@ -2589,7 +2600,8 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi
25892600        const  QV4::ArrayObject *a = value.as <QV4::ArrayObject>();
25902601        if  (a) {
25912602            *reinterpret_cast <QVariantList *>(data) = ExecutionEngine::toVariant (
2592-                         *a, /* typeHint*/  QMetaType{}, /* createJSValueForObjects*/ false ).toList ();
2603+                         *a, /* typeHint*/  QMetaType{}, /* createJSValueForObjectsAndSymbols*/ false )
2604+                 .toList ();
25932605            return  true ;
25942606        }
25952607        break ;
@@ -2605,7 +2617,7 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi
26052617    case  QMetaType::QVariant:
26062618        if  (value.as <QV4::Managed>()) {
26072619            *reinterpret_cast <QVariant*>(data) = ExecutionEngine::toVariant (
2608-                     value, /* typeHint*/  QMetaType{}, /* createJSValueForObjects */ false );
2620+                     value, /* typeHint*/  QMetaType{}, /* createJSValueForObjectsAndSymbols */ false );
26092621        } else  if  (value.isNull ()) {
26102622            *reinterpret_cast <QVariant*>(data) = QVariant::fromValue (nullptr );
26112623        } else  if  (value.isUndefined ()) {
0 commit comments