📄 qscriptecmaglobal.cpp
字号:
};} // anonumousnamespace QScript { namespace Ecma {Global::Global(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo) : m_engine(engine), m_classInfo(classInfo){}Global::~Global(){}void Global::construct(QScriptValueImpl *object, QScriptEnginePrivate *eng){ QScriptClassInfo *classInfo = eng->registerClass(QLatin1String("global"), QScript::ActivationType); // create with prototype null, since Object.prototype doesn't exist at this point eng->newObject(object, eng->nullValue(), classInfo); Global *instance = new Global(eng, classInfo); object->setObjectData(QExplicitlySharedDataPointer<QScriptObjectData>(instance));}void Global::initialize(QScriptValueImpl *object, QScriptEnginePrivate *eng){ // set the real prototype object->setPrototype(eng->objectConstructor->publicPrototype); const QScriptValue::PropertyFlags flags = QScriptValue::Undeletable | QScriptValue::SkipInEnumeration; object->setProperty(QLatin1String("NaN"), QScriptValueImpl(eng, qSNaN()), flags); object->setProperty(QLatin1String("Infinity"), QScriptValueImpl(eng, qInf()), flags); object->setProperty(QLatin1String("undefined"), eng->undefinedValue(), flags); QScriptClassInfo *classInfo = object->classInfo(); object->setProperty(QLatin1String("print"), eng->createFunction(new PrintFunction()), flags); object->setProperty(QLatin1String("parseInt"), eng->createFunction(method_parseInt, 2, classInfo), flags); object->setProperty(QLatin1String("parseFloat"), eng->createFunction(method_parseFloat, 1, classInfo), flags); object->setProperty(QLatin1String("isNaN"), eng->createFunction(method_isNaN, 1, classInfo), flags); object->setProperty(QLatin1String("isFinite"), eng->createFunction(method_isFinite, 1, classInfo), flags); object->setProperty(QLatin1String("decodeURI"), eng->createFunction(method_decodeURI, 1, classInfo), flags); object->setProperty(QLatin1String("decodeURIComponent"), eng->createFunction(method_decodeURIComponent, 1, classInfo), flags); object->setProperty(QLatin1String("encodeURI"), eng->createFunction(method_encodeURI, 1, classInfo), flags); object->setProperty(QLatin1String("encodeURIComponent"), eng->createFunction(method_encodeURIComponent, 1, classInfo), flags); object->setProperty(QLatin1String("escape"), eng->createFunction(method_escape, 1, classInfo), flags); object->setProperty(QLatin1String("unescape"), eng->createFunction(method_unescape, 1, classInfo), flags); object->setProperty(QLatin1String("version"), eng->createFunction(method_version, 0, classInfo), flags); object->setProperty(QLatin1String("gc"), eng->createFunction(method_gc, 0, classInfo), flags);}QScriptValueImpl Global::method_parseInt(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ if (context->argumentCount() == 0) { return QScriptValueImpl(eng, qSNaN()); } qsreal radix = 0; if (context->argumentCount() > 1) { radix = context->argument(1).toInteger(); if (qIsNaN(radix) || (radix && (radix < 2 || radix > 36))) { return QScriptValueImpl(eng, qSNaN()); } } QString str = context->argument(0).toString().trimmed(); if (radix == 0) { if ((str.length() >= 2) && (str.at(0) == QLatin1Char('0'))) { if ((str.at(1) == QLatin1Char('x')) || (str.at(1) == QLatin1Char('X'))) { str.remove(0, 2); radix = 16; } else { str.remove(0, 1); radix = 8; } } } const QByteArray ba = str.toUtf8(); const char *startPtr = ba.constData(); qsreal result;//#if defined(Q_WS_WIN) && !defined(Q_CC_MINGW)// always use the Qt version for now#if 1 const char *endPtr = 0; bool ok; result = qstrtoll(startPtr, &endPtr, int (radix), &ok);#else char *endPtr = 0; result = strtoll(startPtr, &endPtr, int (radix));#endif if (startPtr == endPtr) { if (str.isEmpty()) result = qSNaN(); else if (str == QLatin1String("Infinity")) result = +qInf(); else if (str == QLatin1String("+Infinity")) result = +qInf(); else if (str == QLatin1String("-Infinity")) result = -qInf(); else result = qSNaN(); } return QScriptValueImpl(eng, result);}QScriptValueImpl Global::method_parseFloat(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ if (context->argumentCount() == 0) return QScriptValueImpl(eng, qSNaN()); QString str = context->argument(0).toString().trimmed(); bool ok = false; qsreal result = str.toDouble(&ok); if (!ok) { if (str == QLatin1String("Infinity")) result = +qInf(); else if (str == QLatin1String("+Infinity")) result = +qInf(); else if (str == QLatin1String("-Infinity")) result = -qInf(); else if (str.isEmpty()) result = qSNaN(); else if (str.at(0).isNumber()) result = 0; else result = qSNaN(); } return QScriptValueImpl(eng, result);}QScriptValueImpl Global::method_isNaN(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ qsreal v = qSNaN(); if (context->argumentCount() > 0) v = context->argument(0).toNumber(); return (QScriptValueImpl(eng, qIsNaN(v)));}QScriptValueImpl Global::method_isFinite(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ qsreal v = qInf(); if (context->argumentCount() > 0) v = context->argument(0).toNumber(); return (QScriptValueImpl(eng, qIsFinite(v)));}QScriptValueImpl Global::method_decodeURI(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ QScriptValueImpl result; if (context->argumentCount() > 0) { QString str = context->argument(0).toString(); bool ok; QString out = decode(str, QString::fromUtf8(uriReserved) + QString::fromUtf8("#"), &ok); if (ok) return QScriptValueImpl(eng, out); else return context->throwError(QScriptContext::URIError, QLatin1String("malformed URI sequence")); } return eng->undefinedValue();}QScriptValueImpl Global::method_decodeURIComponent(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ QScriptValueImpl result; if (context->argumentCount() > 0) { QString str = context->argument(0).toString(); bool ok; QString out = decode(str, QString::fromUtf8(""), &ok); if (ok) result = QScriptValueImpl(eng, out); else result = context->throwError(QScriptContext::URIError, QLatin1String("malformed URI sequence")); } else { result = eng->undefinedValue(); } return result;}QScriptValueImpl Global::method_encodeURI(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ QScriptValueImpl result; if (context->argumentCount() > 0) { QString str = context->argument(0).toString(); bool ok; QString out = encode(str, QLatin1String(uriReserved) + QLatin1String(uriUnescaped) + QString::fromUtf8("#"), &ok); if (ok) result = QScriptValueImpl(eng, out); else result = context->throwError(QScriptContext::URIError, QLatin1String("malformed URI sequence")); } else { result = eng->undefinedValue(); } return result;}QScriptValueImpl Global::method_encodeURIComponent(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ QScriptValueImpl result; if (context->argumentCount() > 0) { QString str = context->argument(0).toString(); bool ok; QString out = encode(str, QLatin1String(uriUnescaped), &ok); if (ok) result = QScriptValueImpl(eng, out); else result = context->throwError(QScriptContext::URIError, QLatin1String("malformed URI sequence")); } else { result = eng->undefinedValue(); } return result;}QScriptValueImpl Global::method_escape(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ if (context->argumentCount() > 0) { QString str = context->argument(0).toString(); return QScriptValueImpl(eng, QLatin1String(escape(str))); } return QScriptValueImpl(eng, QLatin1String("undefined"));}QScriptValueImpl Global::method_unescape(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ if (context->argumentCount() > 0) { QByteArray data = context->argument(0).toString().toLatin1(); return QScriptValueImpl(eng, unescape(data)); } return QScriptValueImpl(eng, QLatin1String("undefined"));}QScriptValueImpl Global::method_version(QScriptContextPrivate *, QScriptEnginePrivate *eng, QScriptClassInfo *){ return (QScriptValueImpl(eng, 1));}QScriptValueImpl Global::method_gc(QScriptContextPrivate *, QScriptEnginePrivate *eng, QScriptClassInfo *){ eng->gc(); return QScriptValueImpl(eng, eng->objectAllocator.freeBlocks());}} } // namespace QScript::Ecma#endif // QT_NO_SCRIPT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -