diff options
Diffstat (limited to 'src/script/api/qscriptengine.cpp')
-rw-r--r-- | src/script/api/qscriptengine.cpp | 139 |
1 files changed, 118 insertions, 21 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp index f5b798a..bf76cd4 100644 --- a/src/script/api/qscriptengine.cpp +++ b/src/script/api/qscriptengine.cpp @@ -10,6 +10,8 @@ ****************************************************************************/ #include "qscriptengine.h" +#include "qscriptsyntaxchecker_p.h" +#include "qnumeric.h" #ifndef QT_NO_SCRIPT @@ -277,6 +279,19 @@ QT_BEGIN_NAMESPACE \value SkipMethodsInEnumeration Don't include methods (signals and slots) when enumerating the object's properties. */ +class QScriptSyntaxCheckResultPrivate +{ +public: + QScriptSyntaxCheckResultPrivate() { ref = 0; } + ~QScriptSyntaxCheckResultPrivate() {} + + QScriptSyntaxCheckResult::State state; + int errorColumnNumber; + int errorLineNumber; + QString errorMessage; + QBasicAtomicInt ref; +}; + class QScriptTypeInfo { public: @@ -291,6 +306,75 @@ public: namespace QScript { +static int toDigit(char c) +{ + if ((c >= '0') && (c <= '9')) + return c - '0'; + else if ((c >= 'a') && (c <= 'z')) + return 10 + c - 'a'; + else if ((c >= 'A') && (c <= 'Z')) + return 10 + c - 'A'; + return -1; +} + +qsreal integerFromString(const char *buf, int size, int radix) +{ + if (size == 0) + return qSNaN(); + + qsreal sign = 1.0; + int i = 0; + if (buf[0] == '+') { + ++i; + } else if (buf[0] == '-') { + sign = -1.0; + ++i; + } + + if (((size-i) >= 2) && (buf[i] == '0')) { + if (((buf[i+1] == 'x') || (buf[i+1] == 'X')) + && (radix < 34)) { + if ((radix != 0) && (radix != 16)) + return 0; + radix = 16; + i += 2; + } else { + if (radix == 0) { + radix = 8; + ++i; + } + } + } else if (radix == 0) { + radix = 10; + } + + int j = i; + for ( ; i < size; ++i) { + int d = toDigit(buf[i]); + if ((d == -1) || (d >= radix)) + break; + } + qsreal result; + if (j == i) { + if (!qstrcmp(buf, "Infinity")) + result = qInf(); + else + result = qSNaN(); + } else { + result = 0; + qsreal multiplier = 1; + for (--i ; i >= j; --i, multiplier *= radix) + result += toDigit(buf[i]) * multiplier; + } + result *= sign; + return result; +} + +qsreal integerFromString(const QString &str, int radix) +{ + QByteArray ba = str.trimmed().toUtf8(); + return integerFromString(ba.constData(), ba.size(), radix); +} JSC::UString qtStringToJSCUString(const QString &str) { @@ -1726,10 +1810,15 @@ QScriptValue QScriptEngine::newQMetaObject( */ bool QScriptEngine::canEvaluate(const QString &program) const { - qWarning("QScriptEngine::canEvaluate() not implemented"); - // ### use our own parser or JSC::Interpreter::checkSyntax() - Q_UNUSED(program); - return true; + return QScriptEnginePrivate::canEvaluate(program); +} + + +bool QScriptEnginePrivate::canEvaluate(const QString &program) +{ + QScript::SyntaxChecker checker; + QScript::SyntaxChecker::Result result = checker.checkSyntax(program); + return (result.state != QScript::SyntaxChecker::Intermediate); } /*! @@ -1740,12 +1829,33 @@ bool QScriptEngine::canEvaluate(const QString &program) const */ QScriptSyntaxCheckResult QScriptEngine::checkSyntax(const QString &program) { - qWarning("QScriptEngine::checkSyntax() not implemented"); - // use our own parser or JSC::Interpreter::checkSyntax() - Q_UNUSED(program); - return QScriptSyntaxCheckResult(); + return QScriptEnginePrivate::checkSyntax(program); } +QScriptSyntaxCheckResult QScriptEnginePrivate::checkSyntax(const QString &program) +{ + QScript::SyntaxChecker checker; + QScript::SyntaxChecker::Result result = checker.checkSyntax(program); + QScriptSyntaxCheckResultPrivate *p = new QScriptSyntaxCheckResultPrivate(); + switch (result.state) { + case QScript::SyntaxChecker::Error: + p->state = QScriptSyntaxCheckResult::Error; + break; + case QScript::SyntaxChecker::Intermediate: + p->state = QScriptSyntaxCheckResult::Intermediate; + break; + case QScript::SyntaxChecker::Valid: + p->state = QScriptSyntaxCheckResult::Valid; + break; + } + p->errorLineNumber = result.errorLineNumber; + p->errorColumnNumber = result.errorColumnNumber; + p->errorMessage = result.errorMessage; + return QScriptSyntaxCheckResult(p); +} + + + /*! Evaluates \a program, using \a lineNumber as the base line number, and returns the result of the evaluation. @@ -3224,19 +3334,6 @@ QScriptValue QScriptEngine::objectById(qint64 id) const \value Valid The program is a syntactically correct Qt Script program. */ -class QScriptSyntaxCheckResultPrivate -{ -public: - QScriptSyntaxCheckResultPrivate() { ref = 0; } - ~QScriptSyntaxCheckResultPrivate() {} - - QScriptSyntaxCheckResult::State state; - int errorColumnNumber; - int errorLineNumber; - QString errorMessage; - QBasicAtomicInt ref; -}; - /*! Constructs a new QScriptSyntaxCheckResult from the \a other result. */ |