426 ExecutionEngine *v4, String *name,
const QQmlRefPointer<QQmlContextData> &qmlContext,
427 QObject *qobj,
bool *hasProperty =
nullptr)
429 if (!qmlContext || !qmlContext->imports())
430 return OptionalReturnedValue();
435 if (QQmlTypeLoader *typeLoader = v4->typeLoader()) {
436 QQmlTypeNameCache::Result r = qmlContext->imports()->query(name, typeLoader);
439 return OptionalReturnedValue();
441 if (r.scriptIndex != -1) {
442 return OptionalReturnedValue(Encode::undefined());
443 }
else if (r.type.isValid()) {
444 return OptionalReturnedValue(
445 QQmlTypeWrapper::create(v4, qobj,r.type, Heap::QQmlTypeWrapper::ExcludeEnums));
446 }
else if (r.importNamespace) {
447 return OptionalReturnedValue(QQmlTypeWrapper::create(
448 v4, qobj, qmlContext->imports(), r.importNamespace,
449 Heap::QQmlTypeWrapper::ExcludeEnums));
451 Q_UNREACHABLE_RETURN(OptionalReturnedValue());
453 return OptionalReturnedValue();
1041 static const int destroyedIdx1 = QObject::staticMetaObject.indexOfSignal(
"destroyed(QObject*)");
1042 static const int destroyedIdx2 = QObject::staticMetaObject.indexOfSignal(
"destroyed()");
1043 static const int deleteLaterIdx = QObject::staticMetaObject.indexOfSlot(
"deleteLater()");
1045 const QObjectWrapper *that =
static_cast<
const QObjectWrapper*>(o);
1047 QObject *thatObject = that->d()->object();
1048 if (thatObject && !QQmlData::wasDeleted(thatObject)) {
1049 const QMetaObject *mo = thatObject->metaObject();
1051 const bool preventDestruction = mo->superClass() || mo == &QObject::staticMetaObject;
1052 const int propertyCount = mo->propertyCount();
1054 ExecutionEngine *thatEngine = that->engine();
1055 Scope scope(thatEngine);
1057 ScopedString propName(scope, thatEngine->newString(QString::fromUtf8(property.name())));
1063 local.load(property);
1064 pd->value = that->getProperty(
1065 thatEngine, that->d(), thatObject, &local,
1066 QObjectWrapper::AttachMethods);
1068 return propName->toPropertyKey();
1070 const int methodCount = mo->methodCount();
1074 const QMetaMethod method = mo->method(index);
1076 if (method.access() == QMetaMethod::Private || (preventDestruction && (index == deleteLaterIdx || index == destroyedIdx1 || index == destroyedIdx2)))
1079 if (m_alreadySeen.contains(method.name()))
1082 m_alreadySeen.insert(method.name());
1083 ExecutionEngine *thatEngine = that->engine();
1084 Scope scope(thatEngine);
1085 ScopedString methodName(scope, thatEngine->newString(QString::fromUtf8(method.name())));
1091 pd->value = that->getProperty(
1092 thatEngine, that->d(), thatObject, &local,
1093 QObjectWrapper::AttachMethods);
1095 return methodName->toPropertyKey();
1099 return ObjectOwnPropertyKeyIterator::next(o, pd, attrs);
1669 if (conversionMetaType == QMetaType::fromType<QVariant>())
1672 const QMetaType type = retrieve();
1673 if (type == conversionMetaType)
1676 if (
const QMetaObject *conversionMetaObject = conversionMetaType.metaObject()) {
1677 if (
const QMetaObject *mo = type.metaObject(); mo && mo->inherits(conversionMetaObject))
1681 if (QMetaType::canConvert(type, conversionMetaType)) {
1682 if (conversionMetaType == QMetaType::fromType<QJSValue>()
1683 || conversionMetaType == QMetaType::fromType<
double>()
1684 || conversionMetaType == QMetaType::fromType<QString>()) {
1704static int MatchScore(
const Value &actual, QMetaType conversionMetaType)
1706 const int conversionType = conversionMetaType.id();
1707 const auto convertibleScore = [&](QMetaType actualType) {
1710 if (!QMetaType::canConvert(actualType, conversionMetaType))
1715 if (conversionMetaType == QMetaType::fromType<QJSValue>())
1721 switch (conversionType) {
1722 case QMetaType::QVariant:
1723 case QMetaType::Double:
1724 case QMetaType::QString:
1734 if (actual.isNumber()) {
1735 switch (conversionType) {
1736 case QMetaType::Double:
1738 case QMetaType::Float:
1740 case QMetaType::LongLong:
1741 case QMetaType::ULongLong:
1743 case QMetaType::Long:
1744 case QMetaType::ULong:
1746 case QMetaType::Int:
1747 case QMetaType::UInt:
1749 case QMetaType::Short:
1750 case QMetaType::UShort:
1753 case QMetaType::Char:
1754 case QMetaType::UChar:
1756 case QMetaType::QJsonValue:
1759 return convertibleScore(actual.isInteger()
1760 ? QMetaType::fromType<
int>()
1761 : QMetaType::fromType<
double>());
1763 }
else if (actual.isString()) {
1764 switch (conversionType) {
1765 case QMetaType::QString:
1767 case QMetaType::QJsonValue:
1769 case QMetaType::QUrl:
1771 case QMetaType::Double:
1772 case QMetaType::Float:
1773 case QMetaType::LongLong:
1774 case QMetaType::ULongLong:
1775 case QMetaType::Int:
1776 case QMetaType::UInt:
1777 case QMetaType::Short:
1778 case QMetaType::UShort:
1779 case QMetaType::Char:
1780 case QMetaType::UChar:
1785 return convertibleScore(QMetaType::fromType<QString>());
1787 }
else if (actual.isBoolean()) {
1788 switch (conversionType) {
1789 case QMetaType::Bool:
1791 case QMetaType::QJsonValue:
1794 return convertibleScore(QMetaType::fromType<
bool>());
1796 }
else if (actual.as<DateObject>()) {
1797 switch (conversionType) {
1798 case QMetaType::QDateTime:
1800 case QMetaType::QDate:
1802 case QMetaType::QTime:
1805 return convertibleScore(QMetaType::fromType<QDateTime>());
1807 }
else if (actual.as<RegExpObject>()) {
1808 switch (conversionType) {
1809#if QT_CONFIG(regularexpression)
1810 case QMetaType::QRegularExpression:
1813 return convertibleScore(QMetaType::fromType<QRegularExpression>());
1816 return convertibleScore(QMetaType());
1819 }
else if (actual.as<ArrayBuffer>()) {
1820 switch (conversionType) {
1821 case QMetaType::QByteArray:
1824 return convertibleScore(QMetaType::fromType<QByteArray>());
1826 }
else if (actual.as<ArrayObject>()) {
1827 switch (conversionType) {
1828 case QMetaType::QJsonArray:
1830 case QMetaType::QStringList:
1831 case QMetaType::QVariantList:
1833 case QMetaType::QVector4D:
1834 case QMetaType::QMatrix4x4:
1836 case QMetaType::QVector3D:
1839 return convertibleScore(QMetaType());
1841 }
else if (actual.isNull()) {
1842 switch (conversionType) {
1843 case QMetaType::Nullptr:
1844 case QMetaType::VoidStar:
1845 case QMetaType::QObjectStar:
1846 case QMetaType::QJsonValue:
1849 if (conversionMetaType.flags().testFlag(QMetaType::IsPointer))
1852 return convertibleScore(QMetaType());
1855 }
else if (
const Object *obj = actual.as<Object>()) {
1856 if (
const VariantObject *variantObject = obj->as<VariantObject>()) {
1857 return MatchVariant(conversionMetaType, [variantObject]() {
1858 return variantObject->d()->data().metaType();
1862 if (
const QObjectWrapper *wrapper = obj->as<QObjectWrapper>()) {
1863 switch (conversionType) {
1864 case QMetaType::QObjectStar:
1867 if (conversionMetaType.flags() & QMetaType::PointerToQObject) {
1868 QObject *wrapped = wrapper->object();
1871 if (qmlobject_can_cpp_cast(wrapped, conversionMetaType.metaObject()))
1876 return convertibleScore(QMetaType::fromType<QObject *>());
1879 if (
const QQmlTypeWrapper *wrapper = obj->as<QQmlTypeWrapper>()) {
1880 const QQmlType type = wrapper->d()->type();
1881 if (type.isSingleton()) {
1882 const QMetaType metaType = type.typeId();
1883 if (metaType == conversionMetaType)
1886 if (conversionMetaType.flags() & QMetaType::PointerToQObject
1887 && metaType.flags() & QMetaType::PointerToQObject
1888 && type.metaObject()->inherits(conversionMetaType.metaObject())) {
1891 }
else if (QObject *object = wrapper->object()) {
1892 if (conversionMetaType.flags() & QMetaType::PointerToQObject
1893 && qmlobject_can_cpp_cast(object, conversionMetaType.metaObject())) {
1898 return convertibleScore(QMetaType());
1901 if (
const Sequence *sequence = obj->as<Sequence>()) {
1902 const QMetaType sequenceType = SequencePrototype::metaTypeForSequence(sequence);
1903 if (sequenceType == conversionMetaType)
1906 return convertibleScore(sequenceType);
1909 if (
const QQmlValueTypeWrapper *wrapper = obj->as<QQmlValueTypeWrapper>()) {
1910 return MatchVariant(conversionMetaType, [wrapper]() {
1911 return wrapper->d()->isVariant()
1912 ? wrapper->toVariant().metaType()
1917 if (conversionMetaType == QMetaType::fromType<QJSValue>())
1920 switch (conversionType) {
1921 case QMetaType::QJsonObject:
1922 case QMetaType::QVariantMap:
1930 return convertibleScore(QMetaType());
2239static bool ExactMatch(QMetaType passed, QMetaType required,
const void *data)
2241 if (required == QMetaType::fromType<QVariant>()
2242 || required == QMetaType::fromType<QJSValue>()
2243 || required == QMetaType::fromType<QJSManagedValue>()) {
2248 if (passed == QMetaType::fromType<QVariant>())
2249 passed =
static_cast<
const QVariant *>(data)->metaType();
2250 else if (passed == QMetaType::fromType<QJSPrimitiveValue>())
2251 passed =
static_cast<
const QJSPrimitiveValue *>(data)->metaType();
2254 if (passed == required)
2257 if (required == QMetaType::fromType<QJSPrimitiveValue>()) {
2258 switch (passed.id()) {
2259 case QMetaType::UnknownType:
2260 case QMetaType::Nullptr:
2261 case QMetaType::Bool:
2262 case QMetaType::Int:
2263 case QMetaType::Double:
2264 case QMetaType::QString: