summaryrefslogtreecommitdiffstats
path: root/src/script/api/qscriptengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/script/api/qscriptengine.cpp')
-rw-r--r--src/script/api/qscriptengine.cpp139
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.
*/