📄 qscriptengine_p.cpp
字号:
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 + -