⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qscriptengine_p.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        vmap.insert(it.name(), it.value().toVariant());    }    return vmap;}QScriptValueImpl QScriptEnginePrivate::create(int type, const void *ptr){    Q_Q(QScriptEngine);    Q_ASSERT(ptr);    QScriptValueImpl result;    QScriptCustomTypeInfo info = m_customTypes.value(type);    if (info.marshal) {        result = QScriptValuePrivate::valueOf(info.marshal(q, ptr));    } else {        // check if it's one of the types we know        switch (QMetaType::Type(type)) {        case QMetaType::Bool:            result = QScriptValueImpl(this, *reinterpret_cast<const bool*>(ptr));            break;        case QMetaType::Int:            result = QScriptValueImpl(this, *reinterpret_cast<const int*>(ptr));            break;        case QMetaType::UInt:            result = QScriptValueImpl(this, *reinterpret_cast<const uint*>(ptr));            break;        case QMetaType::LongLong:            result = QScriptValueImpl(this, qsreal(*reinterpret_cast<const qlonglong*>(ptr)));            break;        case QMetaType::ULongLong:#if defined(Q_OS_WIN) && defined(_MSC_FULL_VER) && _MSC_FULL_VER <= 12008804#pragma message("** NOTE: You need the Visual Studio Processor Pack to compile support for 64bit unsigned integers.")            result = QScriptValueImpl(this, qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr)));#elif defined(Q_CC_MSVC) && !defined(Q_CC_MSVC_NET)            result = QScriptValueImpl(this, qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr)));#else            result = QScriptValueImpl(this, qsreal(*reinterpret_cast<const qulonglong*>(ptr)));#endif            break;        case QMetaType::Double:            result = QScriptValueImpl(this, *reinterpret_cast<const double*>(ptr));            break;        case QMetaType::QString:            result = QScriptValueImpl(this, *reinterpret_cast<const QString*>(ptr));            break;        case QMetaType::Float:            result = QScriptValueImpl(this, *reinterpret_cast<const float*>(ptr));            break;        case QMetaType::Short:            result = QScriptValueImpl(this, *reinterpret_cast<const short*>(ptr));            break;        case QMetaType::UShort:            result = QScriptValueImpl(this, *reinterpret_cast<const unsigned short*>(ptr));            break;        case QMetaType::Char:            result = QScriptValueImpl(this, *reinterpret_cast<const char*>(ptr));            break;        case QMetaType::UChar:            result = QScriptValueImpl(this, *reinterpret_cast<const unsigned char*>(ptr));            break;        case QMetaType::QChar:            result = QScriptValueImpl(this, (*reinterpret_cast<const QChar*>(ptr)).unicode());            break;        case QMetaType::QStringList:            result = arrayFromStringList(*reinterpret_cast<const QStringList *>(ptr));            break;        case QMetaType::QVariantList:            result = arrayFromVariantList(*reinterpret_cast<const QVariantList *>(ptr));            break;        case QMetaType::QVariantMap:            result = objectFromVariantMap(*reinterpret_cast<const QVariantMap *>(ptr));            break;        case QMetaType::QDateTime: {            QDateTime dateTime = *reinterpret_cast<const QDateTime *>(ptr);            dateConstructor->newDate(&result, dateTime);        } break;        case QMetaType::QDate: {            QDate date = *reinterpret_cast<const QDate *>(ptr);            dateConstructor->newDate(&result, date);        } break;#ifndef QT_NO_REGEXP        case QMetaType::QRegExp: {            QRegExp rx = *reinterpret_cast<const QRegExp *>(ptr);            regexpConstructor->newRegExp(&result, rx);        } break;#endif#ifndef QT_NO_QOBJECT        case QMetaType::QObjectStar:        case QMetaType::QWidgetStar:            result = newQObject(*reinterpret_cast<QObject* const *>(ptr));            break;#endif        default:            if (type == qMetaTypeId<QScriptValue>())                result = QScriptValuePrivate::valueOf(*reinterpret_cast<const QScriptValue*>(ptr));            else if (type == qMetaTypeId<QVariant>())                result = newVariant(*reinterpret_cast<const QVariant*>(ptr));#ifndef QT_NO_QOBJECT            // lazy registration of some common list types            else if (type == qMetaTypeId<QObjectList>()) {                qScriptRegisterSequenceMetaType<QObjectList>(q);                return create(type, ptr);            }#endif            else if (type == qMetaTypeId<QList<int> >()) {                qScriptRegisterSequenceMetaType<QList<int> >(q);                return create(type, ptr);            }            else {                QByteArray typeName = QMetaType::typeName(type);                if (typeName.endsWith('*') && !*reinterpret_cast<void* const *>(ptr))                    result = nullValue();                else                    result = newVariant(QVariant(type, ptr));            }        }    }    if (result.isObject() && info.prototype.isValid())        result.setPrototype(info.prototype);    return result;}bool QScriptEnginePrivate::convert(const QScriptValueImpl &value,                                   int type, void *ptr){    Q_Q(QScriptEngine);    QScriptCustomTypeInfo info = m_customTypes.value(type);    if (info.demarshal) {        info.demarshal(value, ptr);        return true;    }    // check if it's one of the types we know    switch (QMetaType::Type(type)) {    case QMetaType::Bool:        *reinterpret_cast<bool*>(ptr) = value.toBoolean();        return true;    case QMetaType::Int:        *reinterpret_cast<int*>(ptr) = value.toInt32();        return true;    case QMetaType::UInt:        *reinterpret_cast<uint*>(ptr) = value.toUInt32();        return true;    case QMetaType::LongLong:        *reinterpret_cast<qlonglong*>(ptr) = qlonglong(value.toInteger());        return true;    case QMetaType::ULongLong:        *reinterpret_cast<qulonglong*>(ptr) = qulonglong(value.toInteger());        return true;    case QMetaType::Double:        *reinterpret_cast<double*>(ptr) = value.toNumber();        return true;    case QMetaType::QString:        *reinterpret_cast<QString*>(ptr) = value.toString();        return true;    case QMetaType::Float:        *reinterpret_cast<float*>(ptr) = value.toNumber();        return true;    case QMetaType::Short:        *reinterpret_cast<short*>(ptr) = short(value.toInt32());        return true;    case QMetaType::UShort:        *reinterpret_cast<unsigned short*>(ptr) = value.toUInt16();        return true;    case QMetaType::Char:        *reinterpret_cast<char*>(ptr) = char(value.toInt32());        return true;    case QMetaType::UChar:        *reinterpret_cast<unsigned char*>(ptr) = (unsigned char)(value.toInt32());        return true;    case QMetaType::QChar:        if (value.isString()) {            QString str = value.toString();            *reinterpret_cast<QChar*>(ptr) = str.isEmpty() ? QChar() : str.at(0);        } else {            *reinterpret_cast<QChar*>(ptr) = QChar(value.toUInt16());        }        return true;    case QMetaType::QDateTime:        if (value.isDate()) {            *reinterpret_cast<QDateTime *>(ptr) = value.toDateTime();            return true;        } break;    case QMetaType::QDate:        if (value.isDate()) {            *reinterpret_cast<QDate *>(ptr) = value.toDateTime().date();            return true;        } break;#ifndef QT_NO_REGEXP    case QMetaType::QRegExp:        if (value.isRegExp()) {            *reinterpret_cast<QRegExp *>(ptr) = value.toRegExp();            return true;        } break;#endif#ifndef QT_NO_QOBJECT    case QMetaType::QObjectStar:    case QMetaType::QWidgetStar:        if (value.isQObject() || value.isNull()) {            *reinterpret_cast<QObject* *>(ptr) = value.toQObject();            return true;        } break;#endif    case QMetaType::QStringList:        if (value.isArray()) {            *reinterpret_cast<QStringList *>(ptr) = stringListFromArray(value);            return true;        } break;    case QMetaType::QVariantList:        if (value.isArray()) {            *reinterpret_cast<QVariantList *>(ptr) = variantListFromArray(value);            return true;        } break;    case QMetaType::QVariantMap:        if (value.isObject()) {            *reinterpret_cast<QVariantMap *>(ptr) = variantMapFromObject(value);            return true;        } break;    default:    ;    }    QByteArray name = QMetaType::typeName(type);#ifndef QT_NO_QOBJECT    if (value.isQObject() && name.endsWith('*')) {        QByteArray className = name.left(name.size()-1);        QObject *qobject = value.toQObject();        if (void *instance = qobject->qt_metacast(className)) {            *reinterpret_cast<void* *>(ptr) = instance;            return true;        }    }#endif    if (value.isVariant() && name.endsWith('*')) {        int valueType = QMetaType::type(name.left(name.size()-1));        QVariant &var = value.variantValue();        if (valueType == var.userType()) {            *reinterpret_cast<void* *>(ptr) = var.data();            return true;        } else {            // look in the prototype chain            QScriptValueImpl proto = value.prototype();            while (proto.isObject() && proto.isVariant()) {                if ((type == proto.variantValue().userType())                    || (valueType && (valueType == proto.variantValue().userType()))) {                    QByteArray varTypeName = QMetaType::typeName(var.userType());                    if (varTypeName.endsWith('*'))                        *reinterpret_cast<void* *>(ptr) = *reinterpret_cast<void* *>(var.data());                    else                        *reinterpret_cast<void* *>(ptr) = var.data();                    return true;                }                proto = proto.prototype();            }        }    } else if (type == qMetaTypeId<QScriptValue>()) {        *reinterpret_cast<QScriptValue*>(ptr) = value;        return true;    } else if (type == qMetaTypeId<QVariant>()) {        *reinterpret_cast<QVariant*>(ptr) = value.toVariant();        return true;    }    // lazy registration of some common list types#ifndef QT_NO_QOBJECT    else if (type == qMetaTypeId<QObjectList>()) {        qScriptRegisterSequenceMetaType<QObjectList>(q);        return convert(value, type, ptr);    }#endif    else if (type == qMetaTypeId<QList<int> >()) {        qScriptRegisterSequenceMetaType<QList<int> >(q);        return convert(value, type, ptr);    }#if 0    if (!name.isEmpty()) {        qWarning("QScriptEngine::convert: unable to convert value to type `%s'",                 name.constData());    }#endif    return false;}QScriptValuePrivate *QScriptEnginePrivate::registerValue(const QScriptValueImpl &value){    if (value.isString()) {        QScriptNameIdImpl *id = value.stringValue();        QScriptValuePrivate *p = m_stringHandles.value(id);        if (p)            return p;        p = m_handleRepository.get();        p->value = value;        m_stringHandles.insert(id, p);        return p;    } else if (value.isObject()) {        QScriptObject *instance = value.objectValue();        QScriptValuePrivate *p = m_objectHandles.value(instance);        if (p)            return p;        p = m_handleRepository.get();        p->value = value;        m_objectHandles.insert(instance, p);        return p;    }    QVector<QScriptValuePrivate*>::const_iterator it;    for (it = m_otherHandles.constBegin(); it != m_otherHandles.constEnd(); ++it) {        if ((*it)->value.strictlyEquals(value))            return *it;    }    QScriptValuePrivate *p = m_handleRepository.get();    p->value = value;    m_otherHandles.append(p);    return p;}void QScriptEnginePrivate::init(){    qMetaTypeId<QScriptValue>();    m_callDepth = 0;#if defined(Q_OS_WIN)    m_maxCallDepth = 88;#elif defined(Q_OS_MAC)    m_maxCallDepth = 640;#elif defined(QT_ARCH_ARM)    m_maxCallDepth = 360;#else    m_maxCallDepth = 768;#endif    m_oldStringRepositorySize = 0;    m_oldTempStringRepositorySize = 0;    m_context = 0;    m_abstractSyntaxTree = 0;    m_lexer = 0;    objectConstructor = 0;    numberConstructor = 0;    booleanConstructor = 0;    stringConstructor = 0;    dateConstructor = 0;    functionConstructor = 0;    arrayConstructor = 0;    regexpConstructor = 0;    errorConstructor = 0;    enumerationConstructor = 0;    variantConstructor = 0;    qobjectConstructor = 0;    qmetaObjectConstructor = 0;    m_processEventsInterval = -1;    m_nextProcessEvents = 0;    m_processEventIncr = 0;    m_stringRepository.reserve(DefaultHashSize);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -