2006-10-26 W. Andy Carrel <wac@google.com>
authorbdash <bdash@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 27 Oct 2006 05:30:25 +0000 (05:30 +0000)
committerbdash <bdash@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 27 Oct 2006 05:30:25 +0000 (05:30 +0000)
        Reviewed by Maciej.

        - Fix http://bugs.webkit.org/show_bug.cgi?id=7445 /
          <rdar://problem/4614195> (and 7253 / <rdar://4694011>) by changing
          inline regexps so that they can have \u escaped Unicode sequences and
          still work properly.

        * kjs/lexer.cpp:
        (Lexer::Lexer):
        (Lexer::setCode):
        (Lexer::shift): Looking ahead one additional character for the benefit
        of scanRegExp
        (Lexer::scanRegExp): Change code to support unicode escapes in inline
        regexps.
        * kjs/lexer.h: Extra lookahead added.
        * tests/mozilla/ecma_2/RegExp/properties-001.js: Changed test to look
        for Unicode character rather than the '\u' escaped equivalent for
        .source and .toString().

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@17354 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/lexer.cpp
JavaScriptCore/kjs/lexer.h
JavaScriptCore/tests/mozilla/ecma_2/RegExp/properties-001.js

index 851e6074b4aca394fc08c0e86cb3f42efb945b83..61d4b540fb9da4ab8fdb34effcbc68321f95ac76 100644 (file)
@@ -1,3 +1,24 @@
+2006-10-26  W. Andy Carrel  <wac@google.com>
+
+        Reviewed by Maciej.
+
+        - Fix http://bugs.webkit.org/show_bug.cgi?id=7445 /
+          <rdar://problem/4614195> (and 7253 / <rdar://4694011>) by changing
+          inline regexps so that they can have \u escaped Unicode sequences and
+          still work properly.
+
+        * kjs/lexer.cpp:
+        (Lexer::Lexer): 
+        (Lexer::setCode):
+        (Lexer::shift): Looking ahead one additional character for the benefit
+        of scanRegExp
+        (Lexer::scanRegExp): Change code to support unicode escapes in inline 
+        regexps.
+        * kjs/lexer.h: Extra lookahead added.
+        * tests/mozilla/ecma_2/RegExp/properties-001.js: Changed test to look
+        for Unicode character rather than the '\u' escaped equivalent for
+        .source and .toString().
+
 === Safari-521.29 ===
 
 2006-10-26  Nikolas Zimmermann  <zimmermann@kde.org>
index e9741dca6b2869baec398407abef466971d064b2..fb958293c151febc64e6b8ecf8dad5107f89bbe3 100644 (file)
@@ -60,7 +60,7 @@ Lexer::Lexer()
 #ifndef KJS_PURE_ECMA
     bol(true),
 #endif
-    current(0), next1(0), next2(0), next3(0),
+    current(0), next1(0), next2(0), next3(0), next4(0),
     strings(0), numStrings(0), stringsCapacity(0),
     identifiers(0), numIdentifiers(0), identifiersCapacity(0)
 {
@@ -118,6 +118,7 @@ void Lexer::setCode(const UString &sourceURL, int startingLineNumber, const KJS:
   next1 = (length > 1) ? code[1].uc : -1;
   next2 = (length > 2) ? code[2].uc : -1;
   next3 = (length > 3) ? code[3].uc : -1;
+  next4 = (length > 4) ? code[4].uc : -1;
 }
 
 void Lexer::shift(unsigned int p)
@@ -129,7 +130,8 @@ void Lexer::shift(unsigned int p)
     current = next1;
     next1 = next2;
     next2 = next3;
-    next3 = (pos + 3 < length) ? code[pos+3].uc : -1;
+    next3 = next4;
+    next4 = (pos + 4 < length) ? code[pos+4].uc : -1;
   }
 }
 
@@ -836,14 +838,29 @@ bool Lexer::scanRegExp()
       return false;
     else if (current != '/' || lastWasEscape == true || inBrackets == true)
     {
-        // keep track of '[' and ']'
-        if ( !lastWasEscape ) {
+        if (lastWasEscape) {
+          // deal with unicode escapes in inline regexps
+          if (current == 'u') {
+            if (isHexDigit(next1) && isHexDigit(next2) && 
+                isHexDigit(next3) && isHexDigit(next4)) {
+              record16(convertUnicode(next1, next2, next3, next4));
+              shift(5);
+              lastWasEscape = false;
+              continue;
+            } else 
+              // this wasn't unicode after all
+              record16('\\');
+          }
+        } else {
+          // keep track of '[' and ']'
           if ( current == '[' && !inBrackets )
             inBrackets = true;
           if ( current == ']' && inBrackets )
             inBrackets = false;
         }
-        record16(current);
+        // don't want to capture the '\' for unicode escapes
+        if (current != '\\' || next1 != 'u')
+          record16(current);
         lastWasEscape =
             !lastWasEscape && (current == '\\');
     }
index f9aec1d5a26986d01f1e32c5d83b910c020f48e5..7de638938ed86abaa0a259bb201057ae9d17adce 100644 (file)
@@ -148,7 +148,7 @@ namespace KJS {
     bool error;
 
     // current and following unicode characters (int to allow for -1 for end-of-file marker)
-    int current, next1, next2, next3;
+    int current, next1, next2, next3, next4;
 
     UString **strings;
     unsigned int numStrings;
index 16f265c352be90f252f86160e3c03c2e5f456d5a..835a25ab09cc410693153d9d97482a625d0376a7 100644 (file)
@@ -22,7 +22,7 @@
     AddRegExpCases( /[a-zA-Z0-9]*/gm, "[a-zA-Z0-9]*", true, false, true, 0 );
     AddRegExpCases( /x|y|z/gim, "x|y|z", true, true, true, 0 );
 
-    AddRegExpCases( /\u0051/im, "\\u0051", false, true, true, 0 );
+    AddRegExpCases( /\u0051/im, "\u0051", false, true, true, 0 );
     AddRegExpCases( /\x45/gm, "\\x45", true, false, true, 0 );
     AddRegExpCases( /\097/gi, "\\097", true, true, false, 0 );