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);
1652 if (conversionMetaType == QMetaType::fromType<QVariant>())
1655 const QMetaType type = retrieve();
1656 if (type == conversionMetaType)
1659 if (
const QMetaObject *conversionMetaObject = conversionMetaType.metaObject()) {
1660 if (
const QMetaObject *mo = type.metaObject(); mo && mo->inherits(conversionMetaObject))
1664 if (QMetaType::canConvert(type, conversionMetaType)) {
1665 if (conversionMetaType == QMetaType::fromType<QJSValue>()
1666 || conversionMetaType == QMetaType::fromType<
double>()
1667 || conversionMetaType == QMetaType::fromType<QString>()) {
1687static int MatchScore(
const Value &actual, QMetaType conversionMetaType)
1689 const int conversionType = conversionMetaType.id();
1690 const auto convertibleScore = [&](QMetaType actualType) {
1693 if (!QMetaType::canConvert(actualType, conversionMetaType))
1698 if (conversionMetaType == QMetaType::fromType<QJSValue>())
1704 switch (conversionType) {
1705 case QMetaType::QVariant:
1706 case QMetaType::Double:
1707 case QMetaType::QString:
1717 if (actual.isNumber()) {
1718 switch (conversionType) {
1719 case QMetaType::Double:
1721 case QMetaType::Float:
1723 case QMetaType::LongLong:
1724 case QMetaType::ULongLong:
1726 case QMetaType::Long:
1727 case QMetaType::ULong:
1729 case QMetaType::Int:
1730 case QMetaType::UInt:
1732 case QMetaType::Short:
1733 case QMetaType::UShort:
1736 case QMetaType::Char:
1737 case QMetaType::UChar:
1739 case QMetaType::QJsonValue:
1742 return convertibleScore(actual.isInteger()
1743 ? QMetaType::fromType<
int>()
1744 : QMetaType::fromType<
double>());
1746 }
else if (actual.isString()) {
1747 switch (conversionType) {
1748 case QMetaType::QString:
1750 case QMetaType::QJsonValue:
1752 case QMetaType::QUrl:
1754 case QMetaType::Double:
1755 case QMetaType::Float:
1756 case QMetaType::LongLong:
1757 case QMetaType::ULongLong:
1758 case QMetaType::Int:
1759 case QMetaType::UInt:
1760 case QMetaType::Short:
1761 case QMetaType::UShort:
1762 case QMetaType::Char:
1763 case QMetaType::UChar:
1768 return convertibleScore(QMetaType::fromType<QString>());
1770 }
else if (actual.isBoolean()) {
1771 switch (conversionType) {
1772 case QMetaType::Bool:
1774 case QMetaType::QJsonValue:
1777 return convertibleScore(QMetaType::fromType<
bool>());
1779 }
else if (actual.as<DateObject>()) {
1780 switch (conversionType) {
1781 case QMetaType::QDateTime:
1783 case QMetaType::QDate:
1785 case QMetaType::QTime:
1788 return convertibleScore(QMetaType::fromType<QDateTime>());
1790 }
else if (actual.as<RegExpObject>()) {
1791 switch (conversionType) {
1792#if QT_CONFIG(regularexpression)
1793 case QMetaType::QRegularExpression:
1796 return convertibleScore(QMetaType::fromType<QRegularExpression>());
1799 return convertibleScore(QMetaType());
1802 }
else if (actual.as<ArrayBuffer>()) {
1803 switch (conversionType) {
1804 case QMetaType::QByteArray:
1807 return convertibleScore(QMetaType::fromType<QByteArray>());
1809 }
else if (actual.as<ArrayObject>()) {
1810 switch (conversionType) {
1811 case QMetaType::QJsonArray:
1813 case QMetaType::QStringList:
1814 case QMetaType::QVariantList:
1816 case QMetaType::QVector4D:
1817 case QMetaType::QMatrix4x4:
1819 case QMetaType::QVector3D:
1822 return convertibleScore(QMetaType());
1824 }
else if (actual.isNull()) {
1825 switch (conversionType) {
1826 case QMetaType::Nullptr:
1827 case QMetaType::VoidStar:
1828 case QMetaType::QObjectStar:
1829 case QMetaType::QJsonValue:
1832 if (conversionMetaType.flags().testFlag(QMetaType::IsPointer))
1835 return convertibleScore(QMetaType());
1838 }
else if (
const Object *obj = actual.as<Object>()) {
1839 if (
const VariantObject *variantObject = obj->as<VariantObject>()) {
1840 return MatchVariant(conversionMetaType, [variantObject]() {
1841 return variantObject->d()->data().metaType();
1845 if (
const QObjectWrapper *wrapper = obj->as<QObjectWrapper>()) {
1846 switch (conversionType) {
1847 case QMetaType::QObjectStar:
1850 if (conversionMetaType.flags() & QMetaType::PointerToQObject) {
1851 QObject *wrapped = wrapper->object();
1854 if (qmlobject_can_cpp_cast(wrapped, conversionMetaType.metaObject()))
1859 return convertibleScore(QMetaType::fromType<QObject *>());
1862 if (
const QQmlTypeWrapper *wrapper = obj->as<QQmlTypeWrapper>()) {
1863 const QQmlType type = wrapper->d()->type();
1864 if (type.isSingleton()) {
1865 const QMetaType metaType = type.typeId();
1866 if (metaType == conversionMetaType)
1869 if (conversionMetaType.flags() & QMetaType::PointerToQObject
1870 && metaType.flags() & QMetaType::PointerToQObject
1871 && type.metaObject()->inherits(conversionMetaType.metaObject())) {
1874 }
else if (QObject *object = wrapper->object()) {
1875 if (conversionMetaType.flags() & QMetaType::PointerToQObject
1876 && qmlobject_can_cpp_cast(object, conversionMetaType.metaObject())) {
1881 return convertibleScore(QMetaType());
1884 if (
const Sequence *sequence = obj->as<Sequence>()) {
1885 const QMetaType sequenceType = SequencePrototype::metaTypeForSequence(sequence);
1886 if (sequenceType == conversionMetaType)
1889 return convertibleScore(sequenceType);
1892 if (
const QQmlValueTypeWrapper *wrapper = obj->as<QQmlValueTypeWrapper>()) {
1893 return MatchVariant(conversionMetaType, [wrapper]() {
1894 return wrapper->d()->isVariant()
1895 ? wrapper->toVariant().metaType()
1900 if (conversionMetaType == QMetaType::fromType<QJSValue>())
1903 switch (conversionType) {
1904 case QMetaType::QJsonObject:
1905 case QMetaType::QVariantMap:
1913 return convertibleScore(QMetaType());
2222static bool ExactMatch(QMetaType passed, QMetaType required,
const void *data)
2224 if (required == QMetaType::fromType<QVariant>()
2225 || required == QMetaType::fromType<QJSValue>()
2226 || required == QMetaType::fromType<QJSManagedValue>()) {
2231 if (passed == QMetaType::fromType<QVariant>())
2232 passed =
static_cast<
const QVariant *>(data)->metaType();
2233 else if (passed == QMetaType::fromType<QJSPrimitiveValue>())
2234 passed =
static_cast<
const QJSPrimitiveValue *>(data)->metaType();
2237 if (passed == required)
2240 if (required == QMetaType::fromType<QJSPrimitiveValue>()) {
2241 switch (passed.id()) {
2242 case QMetaType::UnknownType:
2243 case QMetaType::Nullptr:
2244 case QMetaType::Bool:
2245 case QMetaType::Int:
2246 case QMetaType::Double:
2247 case QMetaType::QString: