📄 qt_runtime.cpp
字号:
break; // Failed converting a list entry, so fail the array } } if (objdist != -1) { dist = 5; ret = QVariant(result); } } else if (type == Array) { JSArray* array = static_cast<JSArray*>(object); QVariantList result; int len = array->length(); int objdist = 0; qConvDebug() << "converting a " << len << " length Array"; for (int i = 0; i < len; ++i) { JSValuePtr val = array->get(exec, i); result.append(convertValueToQVariant(exec, val, QMetaType::Void, &objdist, visitedObjects)); if (objdist == -1) { qConvDebug() << "Failed converting element at index " << i; break; // Failed converting a list entry, so fail the array } } if (objdist != -1) { dist = 5; ret = QVariant(result); } } else { // Make a single length array int objdist; qConvDebug() << "making a single length variantlist"; QVariant var = convertValueToQVariant(exec, value, QMetaType::Void, &objdist, visitedObjects); if (objdist != -1) { QVariantList result; result << var; ret = QVariant(result); dist = 10; } else { qConvDebug() << "failed making single length varlist"; } } break; case QMetaType::QStringList: { if (type == RTArray) { RuntimeArray* rtarray = static_cast<RuntimeArray*>(object); QStringList result; int len = rtarray->getLength(); for (int i = 0; i < len; ++i) { JSValuePtr val = rtarray->getConcreteArray()->valueAt(exec, i); UString ustring = val.toString(exec); QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size()); result.append(qstring); } dist = 5; ret = QVariant(result); } else if (type == Array) { JSArray* array = static_cast<JSArray*>(object); QStringList result; int len = array->length(); for (int i = 0; i < len; ++i) { JSValuePtr val = array->get(exec, i); UString ustring = val.toString(exec); QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size()); result.append(qstring); } dist = 5; ret = QVariant(result); } else { // Make a single length array UString ustring = value.toString(exec); QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size()); QStringList result; result.append(qstring); ret = QVariant(result); dist = 10; } break; } case QMetaType::QByteArray: { if (type == JSByteArray) { WTF::ByteArray* arr = asByteArray(value)->storage(); ret = QVariant(QByteArray(reinterpret_cast<const char*>(arr->data()), arr->length())); dist = 0; } else { UString ustring = value.toString(exec); ret = QVariant(QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size()).toLatin1()); if (type == String) dist = 5; else dist = 10; } break; } case QMetaType::QDateTime: case QMetaType::QDate: case QMetaType::QTime: if (type == Date) { DateInstance* date = static_cast<DateInstance*>(object); GregorianDateTime gdt; date->getUTCTime(gdt); if (hint == QMetaType::QDateTime) { ret = QDateTime(QDate(gdt.year + 1900, gdt.month + 1, gdt.monthDay), QTime(gdt.hour, gdt.minute, gdt.second), Qt::UTC); dist = 0; } else if (hint == QMetaType::QDate) { ret = QDate(gdt.year + 1900, gdt.month + 1, gdt.monthDay); dist = 1; } else { ret = QTime(gdt.hour + 1900, gdt.minute, gdt.second); dist = 2; } } else if (type == Number) { double b = value.toNumber(exec); GregorianDateTime gdt; msToGregorianDateTime(b, true, gdt); if (hint == QMetaType::QDateTime) { ret = QDateTime(QDate(gdt.year + 1900, gdt.month + 1, gdt.monthDay), QTime(gdt.hour, gdt.minute, gdt.second), Qt::UTC); dist = 6; } else if (hint == QMetaType::QDate) { ret = QDate(gdt.year + 1900, gdt.month + 1, gdt.monthDay); dist = 8; } else { ret = QTime(gdt.hour, gdt.minute, gdt.second); dist = 10; } } else if (type == String) { UString ustring = value.toString(exec); QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size()); if (hint == QMetaType::QDateTime) { QDateTime dt = QDateTime::fromString(qstring, Qt::ISODate); if (!dt.isValid()) dt = QDateTime::fromString(qstring, Qt::TextDate); if (!dt.isValid()) dt = QDateTime::fromString(qstring, Qt::SystemLocaleDate); if (!dt.isValid()) dt = QDateTime::fromString(qstring, Qt::LocaleDate); if (dt.isValid()) { ret = dt; dist = 2; } } else if (hint == QMetaType::QDate) { QDate dt = QDate::fromString(qstring, Qt::ISODate); if (!dt.isValid()) dt = QDate::fromString(qstring, Qt::TextDate); if (!dt.isValid()) dt = QDate::fromString(qstring, Qt::SystemLocaleDate); if (!dt.isValid()) dt = QDate::fromString(qstring, Qt::LocaleDate); if (dt.isValid()) { ret = dt; dist = 3; } } else { QTime dt = QTime::fromString(qstring, Qt::ISODate); if (!dt.isValid()) dt = QTime::fromString(qstring, Qt::TextDate); if (!dt.isValid()) dt = QTime::fromString(qstring, Qt::SystemLocaleDate); if (!dt.isValid()) dt = QTime::fromString(qstring, Qt::LocaleDate); if (dt.isValid()) { ret = dt; dist = 3; } } } break; case QMetaType::QRegExp: if (type == RegExp) {/* RegExpObject *re = static_cast<RegExpObject*>(object);*/ // Attempt to convert.. a bit risky UString ustring = value.toString(exec); QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size()); // this is of the form '/xxxxxx/i' int firstSlash = qstring.indexOf(QLatin1Char('/')); int lastSlash = qstring.lastIndexOf(QLatin1Char('/')); if (firstSlash >=0 && lastSlash > firstSlash) { QRegExp realRe; realRe.setPattern(qstring.mid(firstSlash + 1, lastSlash - firstSlash - 1)); if (qstring.mid(lastSlash + 1).contains(QLatin1Char('i'))) realRe.setCaseSensitivity(Qt::CaseInsensitive); ret = qVariantFromValue(realRe); dist = 0; } else { qConvDebug() << "couldn't parse a JS regexp"; } } else if (type == String) { UString ustring = value.toString(exec); QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size()); QRegExp re(qstring); if (re.isValid()) { ret = qVariantFromValue(re); dist = 10; } } break; case QMetaType::QObjectStar: if (type == QObj) { QtInstance* qtinst = QtInstance::getInstance(object); if (qtinst) { if (qtinst->getObject()) { qConvDebug() << "found instance, with object:" << (void*) qtinst->getObject(); ret = qVariantFromValue(qtinst->getObject()); qConvDebug() << ret; dist = 0; } else { qConvDebug() << "can't convert deleted qobject"; } } else { qConvDebug() << "wasn't a qtinstance"; } } else if (type == Null) { QObject* nullobj = 0; ret = qVariantFromValue(nullobj); dist = 0; } else { qConvDebug() << "previous type was not an object:" << type; } break; case QMetaType::VoidStar: if (type == QObj) { QtInstance* qtinst = QtInstance::getInstance(object); if (qtinst) { if (qtinst->getObject()) { qConvDebug() << "found instance, with object:" << (void*) qtinst->getObject(); ret = qVariantFromValue((void *)qtinst->getObject()); qConvDebug() << ret; dist = 0; } else { qConvDebug() << "can't convert deleted qobject"; } } else { qConvDebug() << "wasn't a qtinstance"; } } else if (type == Null) { ret = qVariantFromValue((void*)0); dist = 0; } else if (type == Number) { // I don't think that converting a double to a pointer is a wise // move. Except maybe 0. qConvDebug() << "got number for void * - not converting, seems unsafe:" << value.toNumber(exec); } else { qConvDebug() << "void* - unhandled type" << type; } break; default: // Non const type ids if (hint == (QMetaType::Type) qMetaTypeId<QObjectList>()) { if (type == RTArray) { RuntimeArray* rtarray = static_cast<RuntimeArray*>(object); QObjectList result; int len = rtarray->getLength(); for (int i = 0; i < len; ++i) { JSValuePtr val = rtarray->getConcreteArray()->valueAt(exec, i); int itemdist = -1; QVariant item = convertValueToQVariant(exec, val, QMetaType::QObjectStar, &itemdist, visitedObjects); if (itemdist >= 0) result.append(item.value<QObject*>()); else break; } // If we didn't fail conversion if (result.count() == len) { dist = 5; ret = QVariant::fromValue(result); } } else if (type == Array) { JSObject* object = value.toObject(exec); JSArray* array = static_cast<JSArray *>(object); QObjectList result; int len = array->length(); for (int i = 0; i < len; ++i) { JSValuePtr val = array->get(exec, i); int itemdist = -1; QVariant item = convertValueToQVariant(exec, val, QMetaType::QObjectStar, &itemdist, visitedObjects); if (itemdist >= 0) result.append(item.value<QObject*>()); else break; } // If we didn't fail conversion if (result.count() == len) { dist = 5; ret = QVariant::fromValue(result); } } else { // Make a single length array QObjectList result; int itemdist = -1; QVariant item = convertValueToQVariant(exec, value, QMetaType::QObjectStar, &itemdist, visitedObjects); if (itemdist >= 0) { result.append(item.value<QObject*>()); dist = 10; ret = QVariant::fromValue(result); } } break; } else if (hint == (QMetaType::Type) qMetaTypeId<QList<int> >()) { if (type == RTArray) { RuntimeArray* rtarray = static_cast<RuntimeArray*>(object); QList<int> result; int len = rtarray->getLength(); for (int i = 0; i < len; ++i) { JSValuePtr val = rtarray->getConcreteArray()->valueAt(exec, i); int itemdist = -1; QVariant item = convertValueToQVariant(exec, val, QMetaType::Int, &itemdist, visitedObjects); if (itemdist >= 0) result.append(item.value<int>()); else break; } // If we didn't fail conversion if (result.count() == len) { dist = 5; ret = QVariant::fromValue(result); } } else if (type == Array) { JSArray* array = static_cast<JSArray *>(object); QList<int> result; int len = array->length(); for (int i = 0; i < len; ++i) { JSValuePtr val = array->get(exec, i); int itemdist = -1; QVariant item = convertValueToQVariant(exec, val, QMetaType::Int, &itemdist, visitedObjects); if (itemdist >= 0) result.append(item.value<int>()); else break; } // If we didn't fail conversion
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -