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

📄 qt_runtime.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                    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 + -