Various fixes to RegExp
authorLars Knoll <lars.knoll@digia.com>
Fri, 3 May 2013 20:38:57 +0000 (22:38 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Sat, 4 May 2013 08:25:14 +0000 (10:25 +0200)
Duplicated pattern flags in regexp literals should lead to a parse error
Make sure RegExpObjects created from a QRegExp have proper type and vtable
Fix RegExp constructor when invoked with an empty pattern

Fixes two qjsengine autotests.

Change-Id: Idbb7dde73f20cb81dea4a07cf0f2cb030aee321b
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/qml/parser/qqmljslexer.cpp
src/qml/qml/v4/qv4regexpobject.cpp

index cb78238..a441504 100644 (file)
@@ -1037,7 +1037,7 @@ bool Lexer::scanRegExp(RegExpBodyPrefix prefix)
             _patternFlags = 0;
             while (isIdentLetter(_char)) {
                 int flag = regExpFlagFromChar(_char);
-                if (flag == 0) {
+                if (flag == 0 || _patternFlags & flag) {
                     _errorMessage = QCoreApplication::translate("QQmlParser", "Invalid regular expression flag '%0'")
                              .arg(QChar(_char));
                     return false;
index 00f3ce3..1a8f05c 100644 (file)
@@ -95,6 +95,9 @@ RegExpObject::RegExpObject(ExecutionEngine *engine, const QRegExp &re)
     , value(0)
     , global(false)
 {
+    vtbl = &static_vtbl;
+    type = Type_RegExpObject;
+
     // Convert the pattern to a ECMAScript pattern.
     QString pattern = qt_regexp_toCanonical(re.pattern(), re.patternSyntax());
     if (re.isMinimal()) {
@@ -184,10 +187,12 @@ Value RegExpCtor::construct(Managed *, ExecutionContext *ctx, Value *argv, int a
         return Value::fromObject(o);
     }
 
-    if (r.isUndefined())
-        r = Value::fromString(ctx, QString());
-    else if (!r.isString())
-        r = __qmljs_to_string(r, ctx);
+    QString pattern;
+    if (!r.isUndefined())
+        pattern = r.toString(ctx)->toQString();
+    // See sec 15.10.4.1
+    if (pattern.isEmpty())
+        pattern = QStringLiteral("(?:)");
 
     bool global = false;
     bool ignoreCase = false;
@@ -208,7 +213,7 @@ Value RegExpCtor::construct(Managed *, ExecutionContext *ctx, Value *argv, int a
         }
     }
 
-    RegExp* re = RegExp::create(ctx->engine, r.stringValue()->toQString(), ignoreCase, multiLine);
+    RegExp* re = RegExp::create(ctx->engine, pattern, ignoreCase, multiLine);
     if (!re->isValid())
         ctx->throwSyntaxError(0);