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