📄 qt_runtime.cpp
字号:
if (result.count() == len) { dist = 5; ret = QVariant::fromValue(result); } } else { // Make a single length array QList<int> result; int itemdist = -1; QVariant item = convertValueToQVariant(exec, value, QMetaType::Int, &itemdist, visitedObjects); if (itemdist >= 0) { result.append(item.value<int>()); dist = 10; ret = QVariant::fromValue(result); } } break; } else if (hint == (QMetaType::Type) qMetaTypeId<QVariant>()) { if (value.isUndefinedOrNull()) { if (distance) *distance = 1; return QVariant(); } else { if (type == Object) { // Since we haven't really visited this object yet, we remove it visitedObjects->remove(object); } // And then recurse with the autodetect flag ret = convertValueToQVariant(exec, value, QMetaType::Void, distance, visitedObjects); dist = 10; } break; } dist = 10; break; } if (!ret.isValid()) dist = -1; if (distance) *distance = dist; return ret;}QVariant convertValueToQVariant(ExecState* exec, JSValuePtr value, QMetaType::Type hint, int *distance){ HashSet<JSObject*> visitedObjects; return convertValueToQVariant(exec, value, hint, distance, &visitedObjects);}JSValuePtr convertQVariantToValue(ExecState* exec, PassRefPtr<RootObject> root, const QVariant& variant){ // Variants with QObject * can be isNull but not a null pointer // An empty QString variant is also null QMetaType::Type type = (QMetaType::Type) variant.userType(); qConvDebug() << "convertQVariantToValue: metatype:" << type << ", isnull: " << variant.isNull(); if (variant.isNull() && type != QMetaType::QObjectStar && type != QMetaType::VoidStar && type != QMetaType::QWidgetStar && type != QMetaType::QString) { return jsNull(); } JSLock lock(false); if (type == QMetaType::Bool) return jsBoolean(variant.toBool()); if (type == QMetaType::Int || type == QMetaType::UInt || type == QMetaType::Long || type == QMetaType::ULong || type == QMetaType::LongLong || type == QMetaType::ULongLong || type == QMetaType::Short || type == QMetaType::UShort || type == QMetaType::Float || type == QMetaType::Double) return jsNumber(exec, variant.toDouble()); if (type == QMetaType::QRegExp) { QRegExp re = variant.value<QRegExp>(); if (re.isValid()) { UString uflags; if (re.caseSensitivity() == Qt::CaseInsensitive) uflags = "i"; // ### Can't do g or m UString pattern((UChar*)re.pattern().utf16(), re.pattern().length()); RefPtr<JSC::RegExp> regExp = JSC::RegExp::create(&exec->globalData(), pattern, uflags); if (regExp->isValid()) return new (exec) RegExpObject(exec->lexicalGlobalObject()->regExpStructure(), regExp.release()); else return jsNull(); } } if (type == QMetaType::QDateTime || type == QMetaType::QDate || type == QMetaType::QTime) { QDate date = QDate::currentDate(); QTime time(0,0,0); // midnight if (type == QMetaType::QDate) date = variant.value<QDate>(); else if (type == QMetaType::QTime) time = variant.value<QTime>(); else { QDateTime dt = variant.value<QDateTime>().toLocalTime(); date = dt.date(); time = dt.time(); } // Dates specified this way are in local time (we convert DateTimes above) GregorianDateTime dt; dt.year = date.year() - 1900; dt.month = date.month() - 1; dt.monthDay = date.day(); dt.hour = time.hour(); dt.minute = time.minute(); dt.second = time.second(); dt.isDST = -1; double ms = JSC::gregorianDateTimeToMS(dt, time.msec(), /*inputIsUTC*/ false); DateInstance* instance = new (exec) DateInstance(exec->lexicalGlobalObject()->dateStructure()); instance->setInternalValue(jsNumber(exec, trunc(ms))); return instance; } if (type == QMetaType::QByteArray) { QByteArray qtByteArray = variant.value<QByteArray>(); WTF::RefPtr<WTF::ByteArray> wtfByteArray = WTF::ByteArray::create(qtByteArray.length()); qMemCopy(wtfByteArray->data(), qtByteArray.constData(), qtByteArray.length()); return new (exec) JSC::JSByteArray(exec, JSC::JSByteArray::createStructure(jsNull()), wtfByteArray.get()); } if (type == QMetaType::QObjectStar || type == QMetaType::QWidgetStar) { QObject* obj = variant.value<QObject*>(); return QtInstance::getQtInstance(obj, root, QScriptEngine::QtOwnership)->createRuntimeObject(exec); } if (type == QMetaType::QVariantMap) { // create a new object, and stuff properties into it JSObject* ret = constructEmptyObject(exec); QVariantMap map = variant.value<QVariantMap>(); QVariantMap::const_iterator i = map.constBegin(); while (i != map.constEnd()) { QString s = i.key(); JSValuePtr val = convertQVariantToValue(exec, root, i.value()); if (val) { PutPropertySlot slot; ret->put(exec, Identifier(exec, (const UChar *)s.constData(), s.length()), val, slot); // ### error case? } ++i; } return ret; } // List types if (type == QMetaType::QVariantList) { QVariantList vl = variant.toList(); qConvDebug() << "got a " << vl.count() << " length list:" << vl; return new (exec) RuntimeArray(exec, new QtArray<QVariant>(vl, QMetaType::Void, root)); } else if (type == QMetaType::QStringList) { QStringList sl = variant.value<QStringList>(); return new (exec) RuntimeArray(exec, new QtArray<QString>(sl, QMetaType::QString, root)); } else if (type == (QMetaType::Type) qMetaTypeId<QObjectList>()) { QObjectList ol= variant.value<QObjectList>(); return new (exec) RuntimeArray(exec, new QtArray<QObject*>(ol, QMetaType::QObjectStar, root)); } else if (type == (QMetaType::Type)qMetaTypeId<QList<int> >()) { QList<int> il= variant.value<QList<int> >(); return new (exec) RuntimeArray(exec, new QtArray<int>(il, QMetaType::Int, root)); } if (type == (QMetaType::Type)qMetaTypeId<QVariant>()) { QVariant real = variant.value<QVariant>(); qConvDebug() << "real variant is:" << real; return convertQVariantToValue(exec, root, real); } qConvDebug() << "fallback path for" << variant << variant.userType(); QString string = variant.toString(); UString ustring((UChar*)string.utf16(), string.length()); return jsString(exec, ustring);}// ===============// Qt-like macros#define QW_D(Class) Class##Data* d = d_func()#define QW_DS(Class,Instance) Class##Data* d = Instance->d_func()const ClassInfo QtRuntimeMethod::s_info = { "QtRuntimeMethod", 0, 0, 0 };QtRuntimeMethod::QtRuntimeMethod(QtRuntimeMethodData* dd, ExecState* exec, const Identifier& ident, PassRefPtr<QtInstance> inst) : InternalFunction(&exec->globalData(), getDOMStructure<QtRuntimeMethod>(exec), ident) , d_ptr(dd){ QW_D(QtRuntimeMethod); d->m_instance = inst;}QtRuntimeMethod::~QtRuntimeMethod(){ delete d_ptr;}// ===============QtRuntimeMethodData::~QtRuntimeMethodData(){}QtRuntimeMetaMethodData::~QtRuntimeMetaMethodData(){}QtRuntimeConnectionMethodData::~QtRuntimeConnectionMethodData(){}// ===============// Type conversion metadata (from QtScript originally)class QtMethodMatchType{public: enum Kind { Invalid, Variant, MetaType, Unresolved, MetaEnum }; QtMethodMatchType() : m_kind(Invalid) { } Kind kind() const { return m_kind; } QMetaType::Type typeId() const; bool isValid() const { return (m_kind != Invalid); } bool isVariant() const { return (m_kind == Variant); } bool isMetaType() const { return (m_kind == MetaType); } bool isUnresolved() const { return (m_kind == Unresolved); } bool isMetaEnum() const { return (m_kind == MetaEnum); } QByteArray name() const; int enumeratorIndex() const { Q_ASSERT(isMetaEnum()); return m_typeId; } static QtMethodMatchType variant() { return QtMethodMatchType(Variant); } static QtMethodMatchType metaType(int typeId, const QByteArray &name) { return QtMethodMatchType(MetaType, typeId, name); } static QtMethodMatchType metaEnum(int enumIndex, const QByteArray &name) { return QtMethodMatchType(MetaEnum, enumIndex, name); } static QtMethodMatchType unresolved(const QByteArray &name) { return QtMethodMatchType(Unresolved, /*typeId=*/0, name); }private: QtMethodMatchType(Kind kind, int typeId = 0, const QByteArray &name = QByteArray()) : m_kind(kind), m_typeId(typeId), m_name(name) { } Kind m_kind; int m_typeId; QByteArray m_name;};QMetaType::Type QtMethodMatchType::typeId() const{ if (isVariant()) return (QMetaType::Type) QMetaType::type("QVariant"); return (QMetaType::Type) (isMetaEnum() ? QMetaType::Int : m_typeId);}QByteArray QtMethodMatchType::name() const{ if (!m_name.isEmpty()) return m_name; else if (m_kind == Variant) return "QVariant"; return QByteArray();}struct QtMethodMatchData{ int matchDistance; int index; QVector<QtMethodMatchType> types; QVarLengthArray<QVariant, 10> args; QtMethodMatchData(int dist, int idx, QVector<QtMethodMatchType> typs, const QVarLengthArray<QVariant, 10> &as) : matchDistance(dist), index(idx), types(typs), args(as) { } QtMethodMatchData() : index(-1) { } bool isValid() const { return (index != -1); } int firstUnresolvedIndex() const { for (int i=0; i < types.count(); i++) { if (types.at(i).isUnresolved()) return i; } return -1; }};static int indexOfMetaEnum(const QMetaObject *meta, const QByteArray &str){ QByteArray scope; QByteArray name; int scopeIdx = str.indexOf("::"); if (scopeIdx != -1) { scope = str.left(scopeIdx); name = str.mid(scopeIdx + 2); } else { name = str; } for (int i = meta->enumeratorCount() - 1; i >= 0; --i) { QMetaEnum m = meta->enumerator(i);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -