409 ExecutionEngine *v4, String *name,
const QQmlRefPointer<QQmlContextData> &qmlContext,
410 QObject *qobj,
bool *hasProperty =
nullptr)
412 if (!qmlContext || !qmlContext->imports())
413 return OptionalReturnedValue();
418 if (QQmlTypeLoader *typeLoader = v4->typeLoader()) {
419 QQmlTypeNameCache::Result r = qmlContext->imports()->query(name, typeLoader);
422 return OptionalReturnedValue();
424 if (r.scriptIndex != -1) {
425 return OptionalReturnedValue(Encode::undefined());
426 }
else if (r.type.isValid()) {
427 return OptionalReturnedValue(
428 QQmlTypeWrapper::create(v4, qobj,r.type, Heap::QQmlTypeWrapper::ExcludeEnums));
429 }
else if (r.importNamespace) {
430 return OptionalReturnedValue(QQmlTypeWrapper::create(
431 v4, qobj, qmlContext->imports(), r.importNamespace,
432 Heap::QQmlTypeWrapper::ExcludeEnums));
434 Q_UNREACHABLE_RETURN(OptionalReturnedValue());
436 return OptionalReturnedValue();
1024 static const int destroyedIdx1 = QObject::staticMetaObject.indexOfSignal(
"destroyed(QObject*)");
1025 static const int destroyedIdx2 = QObject::staticMetaObject.indexOfSignal(
"destroyed()");
1026 static const int deleteLaterIdx = QObject::staticMetaObject.indexOfSlot(
"deleteLater()");
1028 const QObjectWrapper *that =
static_cast<
const QObjectWrapper*>(o);
1030 QObject *thatObject = that->d()->object();
1031 if (thatObject && !QQmlData::wasDeleted(thatObject)) {
1032 const QMetaObject *mo = thatObject->metaObject();
1034 const bool preventDestruction = mo->superClass() || mo == &QObject::staticMetaObject;
1035 const int propertyCount = mo->propertyCount();
1037 ExecutionEngine *thatEngine = that->engine();
1038 Scope scope(thatEngine);
1040 ScopedString propName(scope, thatEngine->newString(QString::fromUtf8(property.name())));
1046 local.load(property);
1047 pd->value = that->getProperty(
1048 thatEngine, that->d(), thatObject, &local,
1049 QObjectWrapper::AttachMethods);
1051 return propName->toPropertyKey();
1053 const int methodCount = mo->methodCount();
1057 const QMetaMethod method = mo->method(index);
1059 if (method.access() == QMetaMethod::Private || (preventDestruction && (index == deleteLaterIdx || index == destroyedIdx1 || index == destroyedIdx2)))
1062 if (m_alreadySeen.contains(method.name()))
1065 m_alreadySeen.insert(method.name());
1066 ExecutionEngine *thatEngine = that->engine();
1067 Scope scope(thatEngine);
1068 ScopedString methodName(scope, thatEngine->newString(QString::fromUtf8(method.name())));
1074 pd->value = that->getProperty(
1075 thatEngine, that->d(), thatObject, &local,
1076 QObjectWrapper::AttachMethods);
1078 return methodName->toPropertyKey();
1082 return ObjectOwnPropertyKeyIterator::next(o, pd, attrs);
1621 if (conversionMetaType == QMetaType::fromType<QVariant>())
1624 const QMetaType type = retrieve();
1625 if (type == conversionMetaType)
1628 if (
const QMetaObject *conversionMetaObject = conversionMetaType.metaObject()) {
1629 if (
const QMetaObject *mo = type.metaObject(); mo && mo->inherits(conversionMetaObject))
1633 if (QMetaType::canConvert(type, conversionMetaType)) {
1634 if (conversionMetaType == QMetaType::fromType<QJSValue>()
1635 || conversionMetaType == QMetaType::fromType<
double>()
1636 || conversionMetaType == QMetaType::fromType<QString>()) {
1656static int MatchScore(
const Value &actual, QMetaType conversionMetaType)
1658 const int conversionType = conversionMetaType.id();
1659 const auto convertibleScore = [&](QMetaType actualType) {
1662 if (!QMetaType::canConvert(actualType, conversionMetaType))
1667 if (conversionMetaType == QMetaType::fromType<QJSValue>())
1673 switch (conversionType) {
1674 case QMetaType::QVariant:
1675 case QMetaType::Double:
1676 case QMetaType::QString:
1686 if (actual.isNumber()) {
1687 switch (conversionType) {
1688 case QMetaType::Double:
1690 case QMetaType::Float:
1692 case QMetaType::LongLong:
1693 case QMetaType::ULongLong:
1695 case QMetaType::Long:
1696 case QMetaType::ULong:
1698 case QMetaType::Int:
1699 case QMetaType::UInt:
1701 case QMetaType::Short:
1702 case QMetaType::UShort:
1705 case QMetaType::Char:
1706 case QMetaType::UChar:
1708 case QMetaType::QJsonValue:
1711 return convertibleScore(actual.isInteger()
1712 ? QMetaType::fromType<
int>()
1713 : QMetaType::fromType<
double>());
1715 }
else if (actual.isString()) {
1716 switch (conversionType) {
1717 case QMetaType::QString:
1719 case QMetaType::QJsonValue:
1721 case QMetaType::QUrl:
1723 case QMetaType::Double:
1724 case QMetaType::Float:
1725 case QMetaType::LongLong:
1726 case QMetaType::ULongLong:
1727 case QMetaType::Int:
1728 case QMetaType::UInt:
1729 case QMetaType::Short:
1730 case QMetaType::UShort:
1731 case QMetaType::Char:
1732 case QMetaType::UChar:
1737 return convertibleScore(QMetaType::fromType<QString>());
1739 }
else if (actual.isBoolean()) {
1740 switch (conversionType) {
1741 case QMetaType::Bool:
1743 case QMetaType::QJsonValue:
1746 return convertibleScore(QMetaType::fromType<
bool>());
1748 }
else if (actual.as<DateObject>()) {
1749 switch (conversionType) {
1750 case QMetaType::QDateTime:
1752 case QMetaType::QDate:
1754 case QMetaType::QTime:
1757 return convertibleScore(QMetaType::fromType<QDateTime>());
1759 }
else if (actual.as<RegExpObject>()) {
1760 switch (conversionType) {
1761#if QT_CONFIG(regularexpression)
1762 case QMetaType::QRegularExpression:
1765 return convertibleScore(QMetaType::fromType<QRegularExpression>());
1768 return convertibleScore(QMetaType());
1771 }
else if (actual.as<ArrayBuffer>()) {
1772 switch (conversionType) {
1773 case QMetaType::QByteArray:
1776 return convertibleScore(QMetaType::fromType<QByteArray>());
1778 }
else if (actual.as<ArrayObject>()) {
1779 switch (conversionType) {
1780 case QMetaType::QJsonArray:
1782 case QMetaType::QStringList:
1783 case QMetaType::QVariantList:
1785 case QMetaType::QVector4D:
1786 case QMetaType::QMatrix4x4:
1788 case QMetaType::QVector3D:
1791 return convertibleScore(QMetaType());
1793 }
else if (actual.isNull()) {
1794 switch (conversionType) {
1795 case QMetaType::Nullptr:
1796 case QMetaType::VoidStar:
1797 case QMetaType::QObjectStar:
1798 case QMetaType::QJsonValue:
1801 if (conversionMetaType.flags().testFlag(QMetaType::IsPointer))
1804 return convertibleScore(QMetaType());
1807 }
else if (
const Object *obj = actual.as<Object>()) {
1808 if (
const VariantObject *variantObject = obj->as<VariantObject>()) {
1809 return MatchVariant(conversionMetaType, [variantObject]() {
1810 return variantObject->d()->data().metaType();
1814 if (
const QObjectWrapper *wrapper = obj->as<QObjectWrapper>()) {
1815 switch (conversionType) {
1816 case QMetaType::QObjectStar:
1819 if (conversionMetaType.flags() & QMetaType::PointerToQObject) {
1820 QObject *wrapped = wrapper->object();
1823 if (qmlobject_can_cpp_cast(wrapped, conversionMetaType.metaObject()))
1828 return convertibleScore(QMetaType::fromType<QObject *>());
1831 if (
const QQmlTypeWrapper *wrapper = obj->as<QQmlTypeWrapper>()) {
1832 const QQmlType type = wrapper->d()->type();
1833 if (type.isSingleton()) {
1834 const QMetaType metaType = type.typeId();
1835 if (metaType == conversionMetaType)
1838 if (conversionMetaType.flags() & QMetaType::PointerToQObject
1839 && metaType.flags() & QMetaType::PointerToQObject
1840 && type.metaObject()->inherits(conversionMetaType.metaObject())) {
1843 }
else if (QObject *object = wrapper->object()) {
1844 if (conversionMetaType.flags() & QMetaType::PointerToQObject
1845 && qmlobject_can_cpp_cast(object, conversionMetaType.metaObject())) {
1850 return convertibleScore(QMetaType());
1853 if (
const Sequence *sequence = obj->as<Sequence>()) {
1854 const QMetaType sequenceType = SequencePrototype::metaTypeForSequence(sequence);
1855 if (sequenceType == conversionMetaType)
1858 return convertibleScore(sequenceType);
1861 if (
const QQmlValueTypeWrapper *wrapper = obj->as<QQmlValueTypeWrapper>()) {
1862 return MatchVariant(conversionMetaType, [wrapper]() {
1863 return wrapper->d()->isVariant()
1864 ? wrapper->toVariant().metaType()
1869 if (conversionMetaType == QMetaType::fromType<QJSValue>())
1872 switch (conversionType) {
1873 case QMetaType::QJsonObject:
1874 case QMetaType::QVariantMap:
1882 return convertibleScore(QMetaType());
2191static bool ExactMatch(QMetaType passed, QMetaType required,
const void *data)
2193 if (required == QMetaType::fromType<QVariant>()
2194 || required == QMetaType::fromType<QJSValue>()
2195 || required == QMetaType::fromType<QJSManagedValue>()) {
2200 if (passed == QMetaType::fromType<QVariant>())
2201 passed =
static_cast<
const QVariant *>(data)->metaType();
2202 else if (passed == QMetaType::fromType<QJSPrimitiveValue>())
2203 passed =
static_cast<
const QJSPrimitiveValue *>(data)->metaType();
2206 if (passed == required)
2209 if (required == QMetaType::fromType<QJSPrimitiveValue>()) {
2210 switch (passed.id()) {
2211 case QMetaType::UnknownType:
2212 case QMetaType::Nullptr:
2213 case QMetaType::Bool:
2214 case QMetaType::Int:
2215 case QMetaType::Double:
2216 case QMetaType::QString: