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

📄 qscriptengine_p.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    case QScript::BooleanType:        return toString(object.m_bool_value ? ids->id_true : ids->id_false);    case QScript::IntegerType:        return QString::number(object.m_int_value);    case QScript::NumberType:        return toString(object.m_number_value);    case QScript::PointerType:        return toString(ids->id_pointer);    case QScript::StringType:        return toString(object.m_string_value);    default: {        QScriptValueImpl p = toPrimitive(object, QScriptValueImpl::StringTypeHint);        if (! p.isValid() || p.isObject())            return klass->name();        return convertToNativeString(p);    } // default    } // switch    return toString(ids->id_undefined);}QScriptValueImpl QScriptEnginePrivate::toObject_helper(const QScriptValueImpl &value){    QScriptValueImpl result;    switch (value.type()) {    case QScript::UndefinedType:    case QScript::NullType:        break;    case QScript::BooleanType:        booleanConstructor->newBoolean(&result, value.m_bool_value);        break;    case QScript::NumberType:        numberConstructor->newNumber(&result, value.m_number_value);        break;    case QScript::StringType:        stringConstructor->newString(&result, value.m_string_value->s);        break;    default:        break;    } // switch    return result;}// [[defaultValue]]QScriptValueImpl QScriptEnginePrivate::toPrimitive_helper(const QScriptValueImpl &object,                                                          QScriptValueImpl::TypeHint hint){    QScriptNameIdImpl *functionIds[2];    if ((hint == QScriptValueImpl::NumberTypeHint)        || (hint == QScriptValueImpl::NoTypeHint            && object.m_class != dateConstructor->classInfo())) { // ### date?        functionIds[0] = idTable()->id_valueOf;        functionIds[1] = idTable()->id_toString;    } else {        functionIds[0] = idTable()->id_toString;        functionIds[1] = idTable()->id_valueOf;    }    for (int i = 0; i < 2; ++i) {        QScriptValueImpl base;        QScript::Member member;        if (! object.resolve(functionIds[i], &member, &base, QScriptValue::ResolvePrototype))            return object;        QScriptValueImpl f_valueOf;        base.get(member, &f_valueOf);        if (QScriptFunction *foo = convertToNativeFunction(f_valueOf)) {            QScriptContextPrivate *me = QScriptContextPrivate::get(pushContext());            QScriptValueImpl activation;            newActivation(&activation);            activation.setScope(m_globalObject);            me->setActivationObject(activation);            me->setThisObject(object);            foo->execute(me);            QScriptValueImpl result = me->returnValue();            bool exception = (me->state() == QScriptContext::ExceptionState);            popContext();            if (exception || (result.isValid() && !result.isObject()))                return result;        }    }    return object;}void QScriptEnginePrivate::rehashStringRepository(bool resize){    if (resize) {        delete[] m_string_hash_base;        m_string_hash_size <<= 1; // ### use primes        m_string_hash_base = new QScriptNameIdImpl* [m_string_hash_size];    }    memset(m_string_hash_base, 0, sizeof(QScriptNameIdImpl*) * m_string_hash_size);    for (int index = 0; index < m_stringRepository.size(); ++index) {        QScriptNameIdImpl *entry = m_stringRepository.at(index);        uint h = _q_scriptHash(entry->s) % m_string_hash_size;        entry->h = h;        entry->next = m_string_hash_base[h];        m_string_hash_base[h] = entry;    }}QScriptNameIdImpl *QScriptEnginePrivate::insertStringEntry(const QString &s){    QScriptNameIdImpl *entry = new QScriptNameIdImpl(s);    entry->unique = true;    m_stringRepository.append(entry);    uint h = _q_scriptHash(s) % m_string_hash_size;    entry->h = h;    entry->next = m_string_hash_base[h];    m_string_hash_base[h] = entry;    if (m_stringRepository.count() == m_string_hash_size)        rehashStringRepository();    return entry;}extern double qstrtod(const char *s00, const char **se, bool *ok);extern char *qdtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **digits_str);QString QScriptEnginePrivate::toString_helper(qsreal d){    QByteArray buf;    buf.reserve(80);    int decpt;    int sign;    char *result = 0;    (void) qdtoa(d, 0, 0, &decpt, &sign, 0, &result);    if (! result)        return QString();    else if (decpt <= 0 && decpt > -6) {        buf.fill('0', -decpt + 2 + sign);        if (sign) // fix the sign.            buf[0] = '-';        buf[sign + 1] = '.';        buf += result;    }    else {        if (sign)            buf += '-';        buf += result;        int length = buf.length() - sign;        if (decpt <= 21 && decpt > 0) {            if (length <= decpt)                buf += QByteArray().fill('0', decpt - length);            else                buf.insert(decpt + sign, '.');        }        else if (result[0] >= '0' && result[0] <= '9') {            if (length > 1)                buf.insert(1, '.');            buf += 'e';            buf += (decpt >= 0) ? '+' : '-';            int e = decpt - 1;            if (e < 0)                e = -e;            if (e >= 100)                buf += '0' + e / 100;            if (e >= 10)                buf += '0' + (e % 100) / 10;            buf += '0' + e % 10;        }    }    free(result);    return QString::fromLatin1(buf);}QScriptValueImpl QScriptEnginePrivate::call(const QScriptValueImpl &callee,                                        const QScriptValueImpl &thisObject,                                        const QScriptValueImplList &args,                                        bool asConstructor){    Q_Q(QScriptEngine);    QScriptFunction *function = callee.toFunction();    Q_ASSERT(function);    if (++m_callDepth == m_maxCallDepth) {        QScriptContextPrivate *ctx_p = QScriptContextPrivate::get(currentContext());        return ctx_p->throwError(QLatin1String("call stack overflow"));    }    QScriptContext *nested_frame = pushContext();    QScriptContextPrivate *nested = QScriptContextPrivate::get(nested_frame);    // set up the temp stack    if (! nested->tempStack)        nested->stackPtr = nested->tempStack = tempStackBegin;    newActivation(&nested->m_activation);    if (callee.m_object_value->m_scope.isValid())        nested->m_activation.m_object_value->m_scope = callee.m_object_value->m_scope;    else        nested->m_activation.m_object_value->m_scope = m_globalObject;    QScriptObject *activation_data = nested->m_activation.m_object_value;    QScriptValueImpl undefined;    newUndefined(&undefined);    int formalCount = function->formals.count();    int argc = args.count();    int mx = qMax(formalCount, argc);    activation_data->m_members.resize(mx);    activation_data->m_objects.resize(mx);    for (int i = 0; i < mx; ++i) {        QScriptNameIdImpl *nameId = 0;        if (i < formalCount)            nameId = function->formals.at(i);        activation_data->m_members[i].object(nameId, i, QScriptValue::SkipInEnumeration);        QScriptValueImpl arg = (i < argc) ? args.at(i) : undefined;        if (arg.isValid() && (arg.engine() != q)) {            qWarning("QScriptValue::call() failed: "                     "cannot call function with argument created in "                     "a different engine");            popContext();            return QScriptValueImpl();        }        activation_data->m_objects[i] = arg.isValid() ? arg : undefined;    }    nested->argc = argc;    QVector<QScriptValueImpl> argsv = args.toVector();    nested->args = const_cast<QScriptValueImpl*> (argsv.constData());    if (thisObject.isObject())        nested->m_thisObject = thisObject;    else        nested->m_thisObject = m_globalObject;    nested->m_callee = callee;    nested->m_calledAsConstructor = asConstructor;    newUndefined(&nested->m_result);    function->execute(nested);    --m_callDepth;    QScriptValueImpl result = nested->m_result;    nested->args = 0;    popContext();    return result;}QScriptValueImpl QScriptEnginePrivate::call(const QScriptValueImpl &callee,                                        const QScriptValueImpl &thisObject,                                        const QScriptValueImpl &args,                                        bool asConstructor){    QScriptValueImplList argsList;    if (QScript::Ecma::Array::Instance *arr = arrayConstructor->get(args)) {        QScript::Array actuals = arr->value;        for (quint32 i = 0; i < actuals.count(); ++i) {            QScriptValueImpl a = actuals.at(i);            if (! a.isValid())                argsList << undefinedValue();            else                argsList << a;        }    } else if (args.classInfo() == m_class_arguments) {        QScript::ArgumentsObjectData *arguments;        arguments = static_cast<QScript::ArgumentsObjectData*> (args.objectData().data());        QScriptObject *activation = arguments->activation.objectValue();        for (uint i = 0; i < arguments->length; ++i)            argsList << activation->m_objects[i];    } else if (!(args.isUndefined() || args.isNull())) {        return QScriptContextPrivate::get(currentContext())->throwError(            QScriptContext::TypeError,            QLatin1String("QScriptValue::call(): arguments must be an array"));    }    return call(callee, thisObject, argsList, asConstructor);}QScriptValueImpl QScriptEnginePrivate::arrayFromStringList(const QStringList &lst){    QScriptValueImpl arr = newArray(lst.size());    for (int i = 0; i < lst.size(); ++i)        arr.setProperty(i, QScriptValueImpl(this, lst.at(i)));    return arr;}QStringList QScriptEnginePrivate::stringListFromArray(const QScriptValueImpl &arr){    QStringList lst;    uint len = arr.property(QLatin1String("length")).toUInt32();    for (uint i = 0; i < len; ++i)        lst.append(arr.property(i).toString());    return lst;}QScriptValueImpl QScriptEnginePrivate::arrayFromVariantList(const QVariantList &lst){    QScriptValueImpl arr = newArray(lst.size());    for (int i = 0; i < lst.size(); ++i)        arr.setProperty(i, valueFromVariant(lst.at(i)));    return arr;}QVariantList QScriptEnginePrivate::variantListFromArray(const QScriptValueImpl &arr){    QVariantList lst;    uint len = arr.property(QLatin1String("length")).toUInt32();    for (uint i = 0; i < len; ++i)        lst.append(arr.property(i).toVariant());    return lst;}QScriptValueImpl QScriptEnginePrivate::objectFromVariantMap(const QVariantMap &vmap){    QScriptValueImpl obj = newObject();    QVariantMap::const_iterator it;    for (it = vmap.constBegin(); it != vmap.constEnd(); ++it)        obj.setProperty(it.key(), valueFromVariant(it.value()));    return obj;}QVariantMap QScriptEnginePrivate::variantMapFromObject(const QScriptValueImpl &obj){    QVariantMap vmap;    QScriptValueIterator it(obj);    while (it.hasNext()) {        it.next();

⌨️ 快捷键说明

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