JavaScriptCore:
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 13 Nov 2007 17:25:26 +0000 (17:25 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 13 Nov 2007 17:25:26 +0000 (17:25 +0000)
        Reviewed by Geoff.

        - fix http://bugs.webkit.org/show_bug.cgi?id=11231
          RegExp bug when handling newline characters
          and a number of other differences between PCRE behvior
          and JavaScript regular expressions:

          + single-digit sequences like \4 should be treated as octal
            character constants, unless there is a sufficient number
            of brackets for them to be treated as backreferences

          + \8 turns into the character "8", not a binary zero character
            followed by "8" (same for 9)

          + only the first 3 digits should be considered part of an
            octal character constant (the old behavior was to decode
            an arbitrarily long sequence and then mask with 0xFF)

          + if \x is followed by anything other than two valid hex digits,
            then it should simply be treated a the letter "x"; that includes
            not supporting the \x{41} syntax

          + if \u is followed by anything less than four valid hex digits,
            then it should simply be treated a the letter "u"

          + an extra "+" should be a syntax error, rather than being treated
            as the "possessive quantifier"

          + if a "]" character appears immediately after a "[" character that
            starts a character class, then that's an empty character class,
            rather than being the start of a character class that includes a
            "]" character

          + a "$" should not match a terminating newline; we could have gotten
            PCRE to handle this the way we wanted by passing an appropriate option

        Test: fast/js/regexp-no-extensions.html

        * pcre/pcre_compile.cpp:
        (check_escape): Check backreferences against bracount to catch both
        overflows and things that should be treated as octal. Rewrite octal
        loop to not go on indefinitely. Rewrite both hex loops to match and
        remove \x{} support.
        (compile_branch): Restructure loops so that we don't special-case a "]"
        at the beginning of a character class. Remove code that treated "+" as
        the possessive quantifier.
        (jsRegExpCompile): Change the "]" handling here too.

        * pcre/pcre_exec.cpp: (match): Changed CIRC to match the DOLL implementation.
        Changed DOLL to remove handling of "terminating newline", a Perl concept
        which we don't need.

        * tests/mozilla/expected.html: Two tests are fixed now:
        ecma_3/RegExp/regress-100199.js and ecma_3/RegExp/regress-188206.js.
        One test fails now: ecma_3/RegExp/perlstress-002.js -- our success before
        was due to a bug (we treated all 1-character numeric escapes as backreferences).
        The date tests also now both expect success -- whatever was making them fail
        before was probably due to the time being close to a DST shift; maybe we need
        to get rid of those tests.

LayoutTests:

        Reviewed by Geoff.

        - test for http://bugs.webkit.org/show_bug.cgi?id=11231
          RegExp bug when handling newline characters and other regular expression
          behavior that is different for JavaScript and PCRE

        * fast/js/regexp-no-extensions-expected.txt: Added.
        * fast/js/regexp-no-extensions.html: Added.
        * fast/js/resources/regexp-no-extensions.js: Added.

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

JavaScriptCore/ChangeLog
JavaScriptCore/pcre/pcre_compile.cpp
JavaScriptCore/pcre/pcre_exec.cpp
JavaScriptCore/tests/mozilla/expected.html
LayoutTests/ChangeLog
LayoutTests/fast/js/regexp-no-extensions-expected.txt [new file with mode: 0644]
LayoutTests/fast/js/regexp-no-extensions.html [new file with mode: 0644]
LayoutTests/fast/js/resources/regexp-no-extensions.js [new file with mode: 0644]

index dda6733a61adaea876843113076ee78dd0d19239..e9931ba76eafca772cac88c949dff00d15626a3b 100644 (file)
@@ -1,3 +1,65 @@
+2007-11-13  Darin Adler  <darin@apple.com>
+
+        Reviewed by Geoff.
+
+        - fix http://bugs.webkit.org/show_bug.cgi?id=11231
+          RegExp bug when handling newline characters
+          and a number of other differences between PCRE behvior
+          and JavaScript regular expressions:
+
+          + single-digit sequences like \4 should be treated as octal
+            character constants, unless there is a sufficient number
+            of brackets for them to be treated as backreferences
+
+          + \8 turns into the character "8", not a binary zero character
+            followed by "8" (same for 9)
+
+          + only the first 3 digits should be considered part of an
+            octal character constant (the old behavior was to decode
+            an arbitrarily long sequence and then mask with 0xFF)
+
+          + if \x is followed by anything other than two valid hex digits,
+            then it should simply be treated a the letter "x"; that includes
+            not supporting the \x{41} syntax
+
+          + if \u is followed by anything less than four valid hex digits,
+            then it should simply be treated a the letter "u"
+
+          + an extra "+" should be a syntax error, rather than being treated
+            as the "possessive quantifier"
+
+          + if a "]" character appears immediately after a "[" character that
+            starts a character class, then that's an empty character class,
+            rather than being the start of a character class that includes a
+            "]" character
+
+          + a "$" should not match a terminating newline; we could have gotten
+            PCRE to handle this the way we wanted by passing an appropriate option
+
+        Test: fast/js/regexp-no-extensions.html
+
+        * pcre/pcre_compile.cpp:
+        (check_escape): Check backreferences against bracount to catch both
+        overflows and things that should be treated as octal. Rewrite octal
+        loop to not go on indefinitely. Rewrite both hex loops to match and
+        remove \x{} support.
+        (compile_branch): Restructure loops so that we don't special-case a "]"
+        at the beginning of a character class. Remove code that treated "+" as
+        the possessive quantifier.
+        (jsRegExpCompile): Change the "]" handling here too.
+
+        * pcre/pcre_exec.cpp: (match): Changed CIRC to match the DOLL implementation.
+        Changed DOLL to remove handling of "terminating newline", a Perl concept
+        which we don't need.
+
+        * tests/mozilla/expected.html: Two tests are fixed now:
+        ecma_3/RegExp/regress-100199.js and ecma_3/RegExp/regress-188206.js.
+        One test fails now: ecma_3/RegExp/perlstress-002.js -- our success before
+        was due to a bug (we treated all 1-character numeric escapes as backreferences).
+        The date tests also now both expect success -- whatever was making them fail
+        before was probably due to the time being close to a DST shift; maybe we need
+        to get rid of those tests.
+
 2007-11-13  Darin Adler  <darin@apple.com>
 
         * kjs/JSImmediate.h: (KJS::JSImmediate::getTruncatedInt32):
index bb0bca13d1ca1abfae2c811f86167776c5c4ad26..5701c02d8ab9c18b2e0667d9d22d9c6534298269 100644 (file)
@@ -161,7 +161,7 @@ check_escape(const pcre_uchar **ptrptr, const pcre_uchar *patternEnd, ErrorCode*
   BOOL isclass)
 {
 const pcre_uchar *ptr = *ptrptr + 1;
-int c, i;
+int i;
 
 /* If backslash is at the end of the pattern, it's an error. */
 if (ptr == patternEnd) {
@@ -170,7 +170,7 @@ if (ptr == patternEnd) {
     return 0;
 }
 
-c = *ptr;
+int c = *ptr;
 
 /* Non-alphamerics are literals. For digits or letters, do an initial lookup in
 a table. A non-zero result is something that can be returned immediately.
@@ -183,34 +183,23 @@ else if ((i = escapes[c - '0']) != 0) c = i;
 
 else
   {
-  const pcre_uchar *oldptr;
   switch (c)
     {
-    /* A number of Perl escapes are not handled by PCRE. We give an explicit
-    error. */
-
-    /* The handling of escape sequences consisting of a string of digits
-    starting with one that is not zero is not straightforward. By experiment,
-    the way Perl works seems to be as follows:
-
-    Outside a character class, the digits are read as a decimal number. If the
-    number is less than 10, or if there are that many previous extracting
-    left brackets, then it is a back reference. Otherwise, up to three octal
-    digits are read to form an escaped byte. Thus \123 is likely to be octal
-    123 (cf \0123, which is octal 012 followed by the literal 3). If the octal
-    value is greater than 377, the least significant 8 bits are taken. Inside a
-    character class, \ followed by a digit is always an octal number. */
+    /* Escape sequences starting with a non-zero digit are backreferences,
+    unless there are insufficient brackets, in which case they are octal
+    escape sequences. Those sequences end on the first non-octal character
+    or when we overflow 0-255, whichever comes first. */
 
     case '1': case '2': case '3': case '4': case '5':
     case '6': case '7': case '8': case '9':
 
     if (!isclass)
       {
-      oldptr = ptr;
+      const pcre_uchar *oldptr = ptr;
       c -= '0';
-      while (ptr + 1 < patternEnd && isASCIIDigit(ptr[1]))
+      while (ptr + 1 < patternEnd && isASCIIDigit(ptr[1]) && c <= bracount)
         c = c * 10 + *(++ptr) - '0';
-      if (c < 10 || c <= bracount)
+      if (c <= bracount)
         {
         c = -(ESC_REF + c);
         break;
@@ -218,98 +207,62 @@ else
       ptr = oldptr;      /* Put the pointer back and fall through */
       }
 
-    /* Handle an octal number following \. If the first digit is 8 or 9, Perl
-    generates a binary zero byte and treats the digit as a following literal.
-    Thus we have to pull back the pointer by one. */
+    /* Handle an octal number following \. If the first digit is 8 or 9,
+    this is not octal. */
 
     if ((c = *ptr) >= '8')
-      {
-      ptr--;
-      c = 0;
       break;
-      }
 
     /* \0 always starts an octal number, but we may drop through to here with a
     larger first octal digit. */
 
     case '0':
     c -= '0';
-    while (i++ < 2 && ptr + 1 < patternEnd && ptr[1] >= '0' && ptr[1] <= '7')
-        c = c * 8 + *(++ptr) - '0';
-    c &= 255;     /* Take least significant 8 bits */
+    for (i = 1; i <= 2; ++i)
+      {
+      if (ptr + i >= patternEnd || ptr[i] < '0' || ptr[i] > '7')
+        break;
+      int cc = c * 8 + ptr[i] - '0';
+      if (cc > 255)
+        break;
+      c = cc;
+      }
+    ptr += i - 1;
     break;
 
-    /* \x is complicated. \x{ddd} is a character number which can be greater
-    than 0xff in utf8 mode, but only if the ddd are hex digits. If not, { is
-    treated as a data character. */
-
     case 'x':
-    if (ptr + 1 < patternEnd && ptr[1] == '{')
+    c = 0;
+    for (i = 1; i <= 2; ++i)
       {
-      const pcre_uchar *pt = ptr + 2;
-      int count = 0;
-
-      c = 0;
-      while (pt < patternEnd && isASCIIHexDigit(*pt))
-        {
-        register int cc = *pt++;
-        if (c == 0 && cc == '0') continue;     /* Leading zeroes */
-        count++;
-
-        if (cc >= 'a') cc -= 32;               /* Convert to upper case */
-        c = (c << 4) + cc - ((cc < 'A')? '0' : ('A' - 10));
-        }
-
-      if (pt < patternEnd && *pt == '}')
+      if (ptr + i >= patternEnd || !isASCIIHexDigit(ptr[i]))
         {
-        if (c < 0 || count > 8) *errorcodeptr = ERR3;
-        else if (c >= 0xD800 && c <= 0xDFFF) *errorcodeptr = ERR3; // half of surrogate pair
-        else if (c >= 0xFDD0 && c <= 0xFDEF) *errorcodeptr = ERR3; // ?
-        else if (c == 0xFFFE) *errorcodeptr = ERR3; // not a character
-        else if (c == 0xFFFF)  *errorcodeptr = ERR3; // not a character
-        else if (c > 0x10FFFF) *errorcodeptr = ERR3; // out of Unicode character range
-        ptr = pt;
+        c = 'x';
+        i = 1;
         break;
         }
-
-      /* If the sequence of hex digits does not end with '}', then we don't
-      recognize this construct; fall through to the normal \x handling. */
-      }
-
-    /* Read just a single-byte hex-defined char */
-
-    c = 0;
-    while (i++ < 2 && ptr + 1 < patternEnd && isASCIIHexDigit(ptr[1]))
-      {
-      int cc;                               /* Some compilers don't like ++ */
-      cc = *(++ptr);                        /* in initializers */
-      if (cc >= 'a') cc -= 32;              /* Convert to upper case */
-      c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10));
+      int cc = ptr[i];
+      if (cc >= 'a') cc -= 32;             /* Convert to upper case */
+      c = c * 16 + cc - ((cc < 'A') ? '0' : ('A' - 10));
       }
+    ptr += i - 1;
     break;
 
-    case 'u': {
-    const pcre_uchar *pt = ptr;
+    case 'u':
     c = 0;
-    while (i++ < 4)
+    for (i = 1; i <= 4; ++i)
       {
-      if (pt + 1 >= patternEnd || !isASCIIHexDigit(pt[1]))
+      if (ptr + i >= patternEnd || !isASCIIHexDigit(ptr[i]))
         {
-        pt = ptr;
         c = 'u';
+        i = 1;
         break;
         }
-      else
-        {
-        int cc;                              /* Some compilers don't like ++ */
-        cc = *(++pt);                        /* in initializers */
-        if (cc >= 'a') cc -= 32;             /* Convert to upper case */
-        c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10));
-        }
+      int cc = ptr[i];
+      if (cc >= 'a') cc -= 32;             /* Convert to upper case */
+      c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10));
       }
-    ptr = pt;
+    ptr += i - 1;
     break;
-    }
 
     /* Other special escapes not starting with a digit are straightforward */
 
@@ -933,7 +886,6 @@ for (;; ptr++)
   {
   BOOL negate_class;
   BOOL should_flip_negation; /* If a negative special such as \S is used, we should negate the whole class to properly support Unicode. */
-  BOOL possessive_quantifier;
   BOOL is_quantifier;
   int class_charcount;
   int class_lastchar;
@@ -1025,10 +977,10 @@ for (;; ptr++)
 
     /* If the first character is '^', set the negation flag and skip it. */
 
-    if ((c = *(++ptr)) == '^')
+    if (ptr[1] == '^')
       {
       negate_class = true;
-      c = *(++ptr);
+      ++ptr;
       }
     else
       {
@@ -1052,13 +1004,12 @@ for (;; ptr++)
 
     memset(classbits, 0, 32 * sizeof(uschar));
 
-    /* Process characters until ] is reached. By writing this as a "do" it
-    means that an initial ] is taken as a data character. The first pass
+    /* Process characters until ] is reached. The first pass
     through the regex checked the overall syntax, so we don't need to be very
     strict here. At the start of the loop, c contains the first byte of the
     character. */
 
-    do
+    while ((c = *(++ptr)) != ']')
       {
       if (c > 127)
         {                           /* Braces are required because the */
@@ -1285,11 +1236,6 @@ for (;; ptr++)
         }
       }
 
-    /* Loop until ']' reached; the check for end of string happens inside the
-    loop. This "while" is the end of the "do" above. */
-
-    while ((c = *(++ptr)) != ']');
-
     /* If class_charcount is 1, we saw precisely one character whose value is
     less than 256. In non-UTF-8 mode we can always optimize. In UTF-8 mode, we
     can optimize the negative case only if there were no characters >= 128
@@ -1430,7 +1376,6 @@ for (;; ptr++)
     reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY;
 
     op_type = 0;                    /* Default single-char op codes */
-    possessive_quantifier = false;  /* Default not possessive quantifier */
 
     /* Save start of previous item, in case we have to move it up to make space
     for an inserted OP_ONCE for the additional '+' extension. */
@@ -1443,13 +1388,7 @@ for (;; ptr++)
     but if PCRE_UNGREEDY is set, it works the other way round. We change the
     repeat type to the non-default. */
 
-    if (ptr + 1 < patternEnd && ptr[1] == '+')
-      {
-      repeat_type = 0;                  /* Force greedy */
-      possessive_quantifier = true;
-      ptr++;
-      }
-    else if (ptr + 1 < patternEnd && ptr[1] == '?')
+    if (ptr + 1 < patternEnd && ptr[1] == '?')
       {
       repeat_type = 1;
       ptr++;
@@ -1830,24 +1769,6 @@ for (;; ptr++)
       goto FAILED;
       }
 
-    /* If the character following a repeat is '+', we wrap the entire repeated
-    item inside OP_ONCE brackets. This is just syntactic sugar, taken from
-    Sun's Java package. The repeated item starts at tempcode, not at previous,
-    which might be the first part of a string whose (former) last char we
-    repeated. However, we don't support '+' after a greediness '?'. */
-
-    if (possessive_quantifier)
-      {
-      int len = code - tempcode;
-      memmove(tempcode + 1+LINK_SIZE, tempcode, len);
-      code += 1 + LINK_SIZE;
-      len += 1 + LINK_SIZE;
-      tempcode[0] = OP_ONCE;
-      *code++ = OP_KET;
-      PUTINC(code, 0, len);
-      PUT(tempcode, 1, len);
-      }
-
     /* In all case we no longer have a previous item. We also set the
     "follows varying string" flag for subsequently encountered reqbytes if
     it isn't already set and we have just passed a varying length item. */
@@ -2735,11 +2656,9 @@ while (++ptr < patternEnd)
 
     class_utf8 = false;
 
-    /* Written as a "do" so that an initial ']' is taken as data */
-
-    if (*ptr != 0) do
+    for (; ptr < patternEnd && *ptr != ']'; ++ptr)
       {
-      /* Outside \Q...\E, check for escapes */
+      /* Check for escapes */
 
       if (*ptr == '\\')
         {
@@ -2889,7 +2808,6 @@ while (++ptr < patternEnd)
           }
         }
       }
-    while (++ptr < patternEnd && *ptr != ']'); /* Concludes "do" above */
 
     if (ptr >= patternEnd)                          /* Missing terminating ']' */
       {
index 6069c576652f6bbdbf6b2b834704b69c6875e60b..250705de0d89cd50fc4d0ef2bb4c44f6904772b0 100644 (file)
@@ -603,7 +603,6 @@ for (;;)
     BEGIN_OPCODE(KET):
     BEGIN_OPCODE(KETRMIN):
     BEGIN_OPCODE(KETRMAX):
-      {
       frame->prev = frame->ecode - GET(frame->ecode, 1);
       frame->saved_eptr = frame->eptrb->epb_saved_eptr;
 
@@ -681,52 +680,32 @@ for (;;)
         RMATCH(19, frame->ecode + 1+LINK_SIZE, frame->eptrb, 0);
         if (is_match) RRETURN;
         }
-      }
     RRETURN;
 
-    /* Start of subject unless notbol, or after internal newline if multiline */
+    /* Start of subject, or after internal newline if multiline. */
 
     BEGIN_OPCODE(CIRC):
-    if (md->multiline)
-      {
-      if (frame->eptr != md->start_subject && !IS_NEWLINE(frame->eptr[-1]))
-        RRETURN_NO_MATCH;
-      frame->ecode++;
-      NEXT_OPCODE;
-      }
-    if (frame->eptr != md->start_subject) RRETURN_NO_MATCH;
+    if (frame->eptr != md->start_subject && (!md->multiline || !IS_NEWLINE(frame->eptr[-1])))
+      RRETURN_NO_MATCH;
     frame->ecode++;
     NEXT_OPCODE;
 
-    /* Assert before internal newline if multiline, or before a terminating
-    newline unless endonly is set, else end of subject unless noteol is set. */
+    /* End of subject, or before internal newline if multiline. */
 
     BEGIN_OPCODE(DOLL):
-    if (md->multiline)
-      {
-      if (frame->eptr < md->end_subject)
-        { if (!IS_NEWLINE(*frame->eptr)) RRETURN_NO_MATCH; }
-      frame->ecode++;
-      }
-    else
-      {
-      if (frame->eptr < md->end_subject - 1 ||
-         (frame->eptr == md->end_subject - 1 && !IS_NEWLINE(*frame->eptr)))
-        RRETURN_NO_MATCH;
-      frame->ecode++;
-      }
+    if (frame->eptr < md->end_subject && (!md->multiline || !IS_NEWLINE(*frame->eptr)))
+      RRETURN_NO_MATCH;
+    frame->ecode++;
     NEXT_OPCODE;
 
     /* Word boundary assertions */
 
     BEGIN_OPCODE(NOT_WORD_BOUNDARY):
     BEGIN_OPCODE(WORD_BOUNDARY):
-      {
       /* Find out if the previous and current characters are "word" characters.
       It takes a bit more work in UTF-8 mode. Characters > 128 are assumed to
       be "non-word" characters. */
 
-        {
         if (frame->eptr == md->start_subject) prev_is_word = false; else
           {
           const pcre_uchar *lastptr = frame->eptr - 1;
@@ -739,14 +718,12 @@ for (;;)
           GETCHAR(c, frame->eptr);
           cur_is_word = c < 128 && (md->ctypes[c] & ctype_word) != 0;
           }
-        }
 
       /* Now see if the situation is what we want */
 
       if ((*frame->ecode++ == OP_WORD_BOUNDARY)?
            cur_is_word == prev_is_word : cur_is_word != prev_is_word)
         RRETURN_NO_MATCH;
-      }
     NEXT_OPCODE;
 
     /* Match a single character type; inline for speed */
index eb9c52edd7b3a25f2bcfe21635d4c5f7c82d7781..5cfd3a3a293713dfee593b669939acd5668d14d2 100644 (file)
@@ -7,51 +7,31 @@
 <p class='results_summary'>
 Test List: All tests<br>
 Skip List: (none)<br>
-1135 test(s) selected, 1127 test(s) completed, 56 failures reported (4.96% failed)<br>
-Engine command line: /Build/symroots/Debug/testkjs <br>
-OS type: Darwin il0301a-dhcp64.apple.com 9.0.0 Darwin Kernel Version 9.0.0: Tue Oct  9 21:35:55 PDT 2007; root:xnu-1228~1/RELEASE_I386 i386<br>
-Testcase execution time: 1 minutes, 41 seconds.<br>
-Tests completed on Sat Nov  3 17:02:52 2007.<br><br>
+1135 test(s) selected, 1127 test(s) completed, 53 failures reported (4.7% failed)<br>
+Engine command line: /Users/darin/Build/Debug/testkjs <br>
+OS type: Darwin il0301a-dhcp126.apple.com 9.0.0 Darwin Kernel Version 9.0.0: Tue Oct  9 21:37:58 PDT 2007; root:xnu-1228~1/RELEASE_PPC Power Macintosh<br>
+Testcase execution time: 4 minutes, 38 seconds.<br>
+Tests completed on Mon Nov 12 16:13:45 2007.<br><br>
 [ <a href='#fail_detail'>Failure Details</a> | <a href='#retest_list'>Retest List</a> | <a href='menu.html'>Test Selection Page</a> ]<br>
 <hr>
 <a name='fail_detail'></a>
 <h2>Failure Details</h2><br>
-<dl><a name='failure1'></a><dd><b>Testcase <a target='other_window' href='./ecma/Date/15.9.5.14.js'>ecma/Date/15.9.5.14.js</a> failed</b> <br>
+<dl><a name='failure1'></a><dd><b>Testcase <a target='other_window' href='./ecma/TypeConversion/9.3.1-3.js'>ecma/TypeConversion/9.3.1-3.js</a> failed</b> <br>
  [ <a href='#failure2'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
-(new Date(1194138115746)).getHours() = 18 FAILED! expected: 17<br>
-(new Date(1194141715746)).getHours() = 19 FAILED! expected: 18<br>
-(new Date(1194145315746)).getHours() = 20 FAILED! expected: 19<br>
-(new Date(1194148915746)).getHours() = 21 FAILED! expected: 20<br>
-(new Date(1194152515746)).getHours() = 22 FAILED! expected: 21<br>
-(new Date(1194156115746)).getHours() = 23 FAILED! expected: 22<br>
-</tt><br>
-<a name='failure2'></a><dd><b>Testcase <a target='other_window' href='./ecma/Date/15.9.5.34-1.js'>ecma/Date/15.9.5.34-1.js</a> failed</b> <br>
- [ <a href='#failure1'>Previous Failure</a> | <a href='#failure3'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
-<tt><br>
-Failure messages were:<br>
-TDATE = new Date(now); (TDATE).setMonth(11,31); TDATE.getTime() = 1199149325796 FAILED! expected: 1199145725796<br>
-TDATE = new Date(now); (TDATE).setMonth(11,31); TDATE.valueOf() = 1199149325796 FAILED! expected: 1199145725796<br>
-TDATE = new Date(now); (TDATE).setMonth(11,31); TDATE.getUTCHours() = 1 FAILED! expected: 0<br>
-TDATE = new Date(now); (TDATE).setMonth(11,31); TDATE.getHours() = 17 FAILED! expected: 16<br>
-</tt><br>
-<a name='failure3'></a><dd><b>Testcase <a target='other_window' href='./ecma/TypeConversion/9.3.1-3.js'>ecma/TypeConversion/9.3.1-3.js</a> failed</b> <br>
- [ <a href='#failure2'>Previous Failure</a> | <a href='#failure4'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
-<tt><br>
-Failure messages were:<br>
 - "-0x123456789abcde8" = NaN FAILED! expected: 81985529216486880<br>
 - "-0x123456789abcde8" = NaN FAILED! expected: 81985529216486880<br>
 -"\u20001234\u2001" = NaN FAILED! expected: -1234<br>
 </tt><br>
-<a name='failure4'></a><dd><b>Testcase <a target='other_window' href='./ecma_2/Exceptions/function-001.js'>ecma_2/Exceptions/function-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=10278' target='other_window'>Bug Number 10278</a><br>
- [ <a href='#failure3'>Previous Failure</a> | <a href='#failure5'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure2'></a><dd><b>Testcase <a target='other_window' href='./ecma_2/Exceptions/function-001.js'>ecma_2/Exceptions/function-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=10278' target='other_window'>Bug Number 10278</a><br>
+ [ <a href='#failure1'>Previous Failure</a> | <a href='#failure3'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 eval("function f(){}function g(){}") (threw no exception thrown = fail FAILED! expected: pass<br>
 </tt><br>
-<a name='failure5'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Date/15.9.5.7.js'>ecma_3/Date/15.9.5.7.js</a> failed</b> <br>
- [ <a href='#failure4'>Previous Failure</a> | <a href='#failure6'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure3'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Date/15.9.5.7.js'>ecma_3/Date/15.9.5.7.js</a> failed</b> <br>
+ [ <a href='#failure2'>Previous Failure</a> | <a href='#failure4'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 (Wed Dec 31 1969 16:00:00 GMT-0800 (PST)).toLocaleTimeString() = 4:00:00 PM PST FAILED! expected: 16:00:00<br>
@@ -63,20 +43,20 @@ Failure messages were:<br>
 (Mon Feb 28 2000 16:00:00 GMT-0800 (PST)).toLocaleTimeString() = 4:00:00 PM PST FAILED! expected: 16:00:00<br>
 (Mon Feb 28 2000 15:59:59 GMT-0800 (PST)).toLocaleTimeString() = 3:59:59 PM PST FAILED! expected: 15:59:59<br>
 (Tue Feb 29 2000 00:00:00 GMT-0800 (PST)).toLocaleTimeString() = 12:00:00 AM PST FAILED! expected: 00:00:00<br>
-(Sat Nov 03 2007 17:02:35 GMT-0700 (PDT)).toLocaleTimeString() = 5:02:35 PM PDT FAILED! expected: 17:02:35<br>
-(Sun Nov 04 2007 01:02:35 GMT-0700 (PDT)).toLocaleTimeString() = 1:02:35 AM PDT FAILED! expected: 01:02:35<br>
+(Mon Nov 12 2007 16:12:41 GMT-0800 (PST)).toLocaleTimeString() = 4:12:41 PM PST FAILED! expected: 16:12:41<br>
+(Tue Nov 13 2007 00:12:41 GMT-0800 (PST)).toLocaleTimeString() = 12:12:41 AM PST FAILED! expected: 00:12:41<br>
 (Fri Dec 31 2004 16:00:00 GMT-0800 (PST)).toLocaleTimeString() = 4:00:00 PM PST FAILED! expected: 16:00:00<br>
 (Fri Dec 31 2004 15:59:59 GMT-0800 (PST)).toLocaleTimeString() = 3:59:59 PM PST FAILED! expected: 15:59:59<br>
 (Sat Jan 01 2005 00:00:00 GMT-0800 (PST)).toLocaleTimeString() = 12:00:00 AM PST FAILED! expected: 00:00:00<br>
 </tt><br>
-<a name='failure6'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/FunExpr/fe-001.js'>ecma_3/FunExpr/fe-001.js</a> failed</b> <br>
- [ <a href='#failure5'>Previous Failure</a> | <a href='#failure7'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure4'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/FunExpr/fe-001.js'>ecma_3/FunExpr/fe-001.js</a> failed</b> <br>
+ [ <a href='#failure3'>Previous Failure</a> | <a href='#failure5'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 Testcase produced no output!</tt><br>
-<a name='failure7'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/15.10.2-1.js'>ecma_3/RegExp/15.10.2-1.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=(none)' target='other_window'>Bug Number (none)</a><br>
- [ <a href='#failure6'>Previous Failure</a> | <a href='#failure8'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure5'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/15.10.2-1.js'>ecma_3/RegExp/15.10.2-1.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=(none)' target='other_window'>Bug Number (none)</a><br>
+ [ <a href='#failure4'>Previous Failure</a> | <a href='#failure6'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>STATUS: RegExp conformance test<br>
 Failure messages were:<br>
 FAILED!: [reported from test()] Section 7 of test -<br>
@@ -101,8 +81,8 @@ FAILED!: [reported from test()] Expect: ["baaabaac", "ba", , "abaac"]<br>
 FAILED!: [reported from test()] Actual: ["baaabaac", "ba", "aa", "abaac"]<br>
 FAILED!: [reported from test()] <br>
 </tt><br>
-<a name='failure8'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/perlstress-001.js'>ecma_3/RegExp/perlstress-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=85721' target='other_window'>Bug Number 85721</a><br>
- [ <a href='#failure7'>Previous Failure</a> | <a href='#failure9'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure6'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/perlstress-001.js'>ecma_3/RegExp/perlstress-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=85721' target='other_window'>Bug Number 85721</a><br>
+ [ <a href='#failure5'>Previous Failure</a> | <a href='#failure7'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>STATUS: Testing regular expression edge cases<br>
 Failure messages were:<br>
 FAILED!: [reported from test()] Section 218 of test -<br>
@@ -141,23 +121,20 @@ FAILED!: [reported from test()] Expect: ["aabbaa", "aa", , ]<br>
 FAILED!: [reported from test()] Actual: ["aabbaa", "aa", "bb"]<br>
 FAILED!: [reported from test()] <br>
 </tt><br>
-<a name='failure9'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-100199.js'>ecma_3/RegExp/regress-100199.js</a> failed</b> <br>
- [ <a href='#failure8'>Previous Failure</a> | <a href='#failure10'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
-<tt>Expected exit code 0, got 3<br>
-Testcase terminated with signal 0<br>
-Complete testcase output was:<br>
-[19243] ./ecma_3/RegExp/regress-100199.js line 48: SyntaxError: Invalid regular expression: missing terminating ] for character class<br>
-</tt><br>
-<a name='failure10'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-188206.js'>ecma_3/RegExp/regress-188206.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=188206' target='other_window'>Bug Number 188206</a><br>
- [ <a href='#failure9'>Previous Failure</a> | <a href='#failure11'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
-<tt>STATUS: Invalid use of regexp quantifiers should generate SyntaxErrors<br>
+<a name='failure7'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/perlstress-002.js'>ecma_3/RegExp/perlstress-002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=85721' target='other_window'>Bug Number 85721</a><br>
+ [ <a href='#failure6'>Previous Failure</a> | <a href='#failure8'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<tt>STATUS: Testing regular expression edge cases<br>
 Failure messages were:<br>
-FAILED!: [reported from test()] Section 3 of test -<br>
-FAILED!: [reported from test()] Expected value 'SyntaxError', Actual value 'Did not generate ANY error!!!'<br>
+FAILED!: [reported from test()] Section 41 of test -<br>
+FAILED!: [reported from test()] regexp = /((\3|b)\2(a)x)+/<br>
+FAILED!: [reported from test()] string = 'aaxabxbaxbbx'<br>
+FAILED!: [reported from test()] ERROR !!! regexp FAILED to match anything !!!<br>
+FAILED!: [reported from test()] Expect: ["ax", "ax", "", "a"]<br>
+FAILED!: [reported from test()] Actual: null<br>
 FAILED!: [reported from test()] <br>
 </tt><br>
-<a name='failure11'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-209919.js'>ecma_3/RegExp/regress-209919.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=209919' target='other_window'>Bug Number 209919</a><br>
- [ <a href='#failure10'>Previous Failure</a> | <a href='#failure12'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure8'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-209919.js'>ecma_3/RegExp/regress-209919.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=209919' target='other_window'>Bug Number 209919</a><br>
+ [ <a href='#failure7'>Previous Failure</a> | <a href='#failure9'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>STATUS: Testing regexp submatches with quantifiers<br>
 Failure messages were:<br>
 FAILED!: [reported from test()] Section 1 of test -<br>
@@ -196,40 +173,40 @@ FAILED!: [reported from test()] Expect: ["1.000,00", "000", ",00"]<br>
 FAILED!: [reported from test()] Actual: ["1.000,00", "", ",00"]<br>
 FAILED!: [reported from test()] <br>
 </tt><br>
-<a name='failure12'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Statements/regress-194364.js'>ecma_3/Statements/regress-194364.js</a> failed</b> <br>
- [ <a href='#failure11'>Previous Failure</a> | <a href='#failure13'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure9'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Statements/regress-194364.js'>ecma_3/Statements/regress-194364.js</a> failed</b> <br>
+ [ <a href='#failure8'>Previous Failure</a> | <a href='#failure10'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 LEAK: 2 KJS::Node<br>
-[19269] ./ecma_3/Statements/regress-194364.js line 1: SyntaxError: Parse error<br>
+[40396] ./ecma_3/Statements/regress-194364.js line 1: SyntaxError: Parse error<br>
 </tt><br>
-<a name='failure13'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Unicode/uc-001.js'>ecma_3/Unicode/uc-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=23610' target='other_window'>Bug Number 23610</a><br>
- [ <a href='#failure12'>Previous Failure</a> | <a href='#failure14'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure10'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Unicode/uc-001.js'>ecma_3/Unicode/uc-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=23610' target='other_window'>Bug Number 23610</a><br>
+ [ <a href='#failure9'>Previous Failure</a> | <a href='#failure11'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>STATUS: Unicode format-control character (Category Cf) test.<br>
 Failure messages were:<br>
 FAILED!: [reported from test()] Unicode format-control character test (Category Cf.)<br>
 FAILED!: [reported from test()] Expected value 'no error', Actual value 'no‎ error'<br>
 FAILED!: [reported from test()] <br>
 </tt><br>
-<a name='failure14'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Unicode/uc-002.js'>ecma_3/Unicode/uc-002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=23613' target='other_window'>Bug Number 23613</a><br>
- [ <a href='#failure13'>Previous Failure</a> | <a href='#failure15'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure11'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Unicode/uc-002.js'>ecma_3/Unicode/uc-002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=23613' target='other_window'>Bug Number 23613</a><br>
+ [ <a href='#failure10'>Previous Failure</a> | <a href='#failure12'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>STATUS: Unicode non-breaking space character test.<br>
 Failure messages were:<br>
 FAILED!: [reported from test()] Unicode non-breaking space character regexp test.<br>
 FAILED!: [reported from test()] Expected value '0', Actual value '-1'<br>
 FAILED!: [reported from test()] <br>
 </tt><br>
-<a name='failure15'></a><dd><b>Testcase <a target='other_window' href='./js1_2/Objects/toString-001.js'>js1_2/Objects/toString-001.js</a> failed</b> <br>
- [ <a href='#failure14'>Previous Failure</a> | <a href='#failure16'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure12'></a><dd><b>Testcase <a target='other_window' href='./js1_2/Objects/toString-001.js'>js1_2/Objects/toString-001.js</a> failed</b> <br>
+ [ <a href='#failure11'>Previous Failure</a> | <a href='#failure13'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 var o = new Object(); o.toString() = [object Object] FAILED! expected: {}<br>
 o = {}; o.toString() = [object Object] FAILED! expected: {}<br>
 o = { name:"object", length:0, value:"hello" }; o.toString() = false FAILED! expected: true<br>
 </tt><br>
-<a name='failure16'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/Function_object.js'>js1_2/function/Function_object.js</a> failed</b> <br>
- [ <a href='#failure15'>Previous Failure</a> | <a href='#failure17'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure13'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/Function_object.js'>js1_2/function/Function_object.js</a> failed</b> <br>
+ [ <a href='#failure12'>Previous Failure</a> | <a href='#failure14'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 f.name = undefined FAILED! expected: a_test_function<br>
@@ -237,16 +214,17 @@ f.arity = undefined FAILED! expected: 3<br>
 (new Function()).name = undefined FAILED! expected: anonymous<br>
 } FAILED! expected: <br>
 </tt><br>
-<a name='failure17'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/function-001-n.js'>js1_2/function/function-001-n.js</a> failed</b> <br>
- [ <a href='#failure16'>Previous Failure</a> | <a href='#failure18'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure14'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/function-001-n.js'>js1_2/function/function-001-n.js</a> failed</b> <br>
+ [ <a href='#failure13'>Previous Failure</a> | <a href='#failure15'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 3, got 0<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
+LEAK: 280 KJS::Node<br>
 function-001.js functions not separated by semicolons are errors in version 120 and higher<br>
 eval("function f(){}function g(){}") = undefined FAILED! expected: error<br>
 </tt><br>
-<a name='failure18'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/tostring-1.js'>js1_2/function/tostring-1.js</a> failed</b> <br>
- [ <a href='#failure17'>Previous Failure</a> | <a href='#failure19'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure15'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/tostring-1.js'>js1_2/function/tostring-1.js</a> failed</b> <br>
+ [ <a href='#failure14'>Previous Failure</a> | <a href='#failure16'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 } FAILED! expected: <br>
@@ -255,8 +233,8 @@ Failure messages were:<br>
 } FAILED! expected: <br>
 } FAILED! expected: <br>
 </tt><br>
-<a name='failure19'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/tostring-2.js'>js1_2/function/tostring-2.js</a> failed</b> <br>
- [ <a href='#failure18'>Previous Failure</a> | <a href='#failure20'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure16'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/tostring-2.js'>js1_2/function/tostring-2.js</a> failed</b> <br>
+ [ <a href='#failure15'>Previous Failure</a> | <a href='#failure17'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 } FAILED! expected: <br>
@@ -269,22 +247,22 @@ Failure messages were:<br>
 } FAILED! expected: <br>
 } FAILED! expected: <br>
 </tt><br>
-<a name='failure20'></a><dd><b>Testcase <a target='other_window' href='./js1_2/operator/equality.js'>js1_2/operator/equality.js</a> failed</b> <br>
- [ <a href='#failure19'>Previous Failure</a> | <a href='#failure21'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure17'></a><dd><b>Testcase <a target='other_window' href='./js1_2/operator/equality.js'>js1_2/operator/equality.js</a> failed</b> <br>
+ [ <a href='#failure16'>Previous Failure</a> | <a href='#failure18'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 (new String('x') == 'x')                  = true FAILED! expected: false<br>
 ('x' == new String('x'))                  = true FAILED! expected: false<br>
 </tt><br>
-<a name='failure21'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_lastIndex.js'>js1_2/regexp/RegExp_lastIndex.js</a> failed</b> <br>
- [ <a href='#failure20'>Previous Failure</a> | <a href='#failure22'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure18'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_lastIndex.js'>js1_2/regexp/RegExp_lastIndex.js</a> failed</b> <br>
+ [ <a href='#failure17'>Previous Failure</a> | <a href='#failure19'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 re=/x./g; re.lastIndex=4; re.exec('xyabcdxa') = xa FAILED! expected: ["xa"]<br>
 re.exec('xyabcdef') = xy FAILED! expected: ["xy"]<br>
 </tt><br>
-<a name='failure22'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_multiline.js'>js1_2/regexp/RegExp_multiline.js</a> failed</b> <br>
- [ <a href='#failure21'>Previous Failure</a> | <a href='#failure23'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure19'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_multiline.js'>js1_2/regexp/RegExp_multiline.js</a> failed</b> <br>
+ [ <a href='#failure18'>Previous Failure</a> | <a href='#failure20'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 (multiline == true) '123\n456'.match(/^4../) = null FAILED! expected: 456<br>
@@ -293,8 +271,8 @@ Failure messages were:<br>
 (multiline == true) 'a11\na22\na23\na24'.match(/a..$/g) = a24 FAILED! expected: a11,a22,a23,a24<br>
 (multiline == true) 'a11\na22\na23\na24'.match(new RegExp('a..$','g')) = a24 FAILED! expected: a11,a22,a23,a24<br>
 </tt><br>
-<a name='failure23'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_multiline_as_array.js'>js1_2/regexp/RegExp_multiline_as_array.js</a> failed</b> <br>
- [ <a href='#failure22'>Previous Failure</a> | <a href='#failure24'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure20'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_multiline_as_array.js'>js1_2/regexp/RegExp_multiline_as_array.js</a> failed</b> <br>
+ [ <a href='#failure19'>Previous Failure</a> | <a href='#failure21'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 (['$*'] == true) '123\n456'.match(/^4../) = null FAILED! expected: 456<br>
@@ -303,20 +281,20 @@ Failure messages were:<br>
 (['$*'] == true) 'a11\na22\na23\na24'.match(/a..$/g) = a24 FAILED! expected: a11,a22,a23,a24<br>
 (['$*'] == true) 'a11\na22\na23\na24'.match(new RegExp('a..$','g')) = a24 FAILED! expected: a11,a22,a23,a24<br>
 </tt><br>
-<a name='failure24'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/beginLine.js'>js1_2/regexp/beginLine.js</a> failed</b> <br>
- [ <a href='#failure23'>Previous Failure</a> | <a href='#failure25'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure21'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/beginLine.js'>js1_2/regexp/beginLine.js</a> failed</b> <br>
+ [ <a href='#failure20'>Previous Failure</a> | <a href='#failure22'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 123xyz'.match(new RegExp('^\d+')) = null FAILED! expected: 123<br>
 </tt><br>
-<a name='failure25'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/endLine.js'>js1_2/regexp/endLine.js</a> failed</b> <br>
- [ <a href='#failure24'>Previous Failure</a> | <a href='#failure26'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure22'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/endLine.js'>js1_2/regexp/endLine.js</a> failed</b> <br>
+ [ <a href='#failure21'>Previous Failure</a> | <a href='#failure23'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 xyz'.match(new RegExp('\d+$')) = null FAILED! expected: 890<br>
 </tt><br>
-<a name='failure26'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/string_split.js'>js1_2/regexp/string_split.js</a> failed</b> <br>
- [ <a href='#failure25'>Previous Failure</a> | <a href='#failure27'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure23'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/string_split.js'>js1_2/regexp/string_split.js</a> failed</b> <br>
+ [ <a href='#failure22'>Previous Failure</a> | <a href='#failure24'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 'abc'.split(/[a-z]/) = ,,, FAILED! expected: ,,<br>
@@ -324,142 +302,144 @@ Failure messages were:<br>
 'abc'.split(new RegExp('[a-z]')) = ,,, FAILED! expected: ,,<br>
 'abc'.split(new RegExp('[a-z]')) = ,,, FAILED! expected: ,,<br>
 </tt><br>
-<a name='failure27'></a><dd><b>Testcase <a target='other_window' href='./js1_2/version120/boolean-001.js'>js1_2/version120/boolean-001.js</a> failed</b> <br>
- [ <a href='#failure26'>Previous Failure</a> | <a href='#failure28'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure24'></a><dd><b>Testcase <a target='other_window' href='./js1_2/version120/boolean-001.js'>js1_2/version120/boolean-001.js</a> failed</b> <br>
+ [ <a href='#failure23'>Previous Failure</a> | <a href='#failure25'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt><br>
 Failure messages were:<br>
 new Boolean(false) = true FAILED! expected: false<br>
 </tt><br>
-<a name='failure28'></a><dd><b>Testcase <a target='other_window' href='./js1_2/version120/regress-99663.js'>js1_2/version120/regress-99663.js</a> failed</b> <br>
- [ <a href='#failure27'>Previous Failure</a> | <a href='#failure29'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure25'></a><dd><b>Testcase <a target='other_window' href='./js1_2/version120/regress-99663.js'>js1_2/version120/regress-99663.js</a> failed</b> <br>
+ [ <a href='#failure24'>Previous Failure</a> | <a href='#failure26'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>STATUS: Regression test for Bugzilla bug 99663<br>
 Failure messages were:<br>
 Section 1 of test - got Error: Can't find variable: it FAILED! expected: a "read-only" error<br>
 Section 2 of test - got Error: Can't find variable: it FAILED! expected: a "read-only" error<br>
 Section 3 of test - got Error: Can't find variable: it FAILED! expected: a "read-only" error<br>
 </tt><br>
-<a name='failure29'></a><dd><b>Testcase <a target='other_window' href='./js1_3/Script/function-001-n.js'>js1_3/Script/function-001-n.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=10278' target='other_window'>Bug Number 10278</a><br>
- [ <a href='#failure28'>Previous Failure</a> | <a href='#failure30'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure26'></a><dd><b>Testcase <a target='other_window' href='./js1_3/Script/function-001-n.js'>js1_3/Script/function-001-n.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=10278' target='other_window'>Bug Number 10278</a><br>
+ [ <a href='#failure25'>Previous Failure</a> | <a href='#failure27'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 3, got 0<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
+LEAK: 330 KJS::Node<br>
 BUGNUMBER: 10278<br>
 function-001.js functions not separated by semicolons are errors in version 120 and higher<br>
 eval("function f(){}function g(){}") = undefined FAILED! expected: error<br>
 </tt><br>
-<a name='failure30'></a><dd><b>Testcase <a target='other_window' href='./js1_3/Script/script-001.js'>js1_3/Script/script-001.js</a> failed</b> <br>
- [ <a href='#failure29'>Previous Failure</a> | <a href='#failure31'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure27'></a><dd><b>Testcase <a target='other_window' href='./js1_3/Script/script-001.js'>js1_3/Script/script-001.js</a> failed</b> <br>
+ [ <a href='#failure26'>Previous Failure</a> | <a href='#failure28'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 script-001 NativeScript<br>
-[19374] ./js1_3/Script/script-001.js line 133: ReferenceError: Can't find variable: Script<br>
+[40502] ./js1_3/Script/script-001.js line 133: ReferenceError: Can't find variable: Script<br>
 </tt><br>
-<a name='failure31'></a><dd><b>Testcase <a target='other_window' href='./js1_3/regress/function-001-n.js'>js1_3/regress/function-001-n.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=10278' target='other_window'>Bug Number 10278</a><br>
- [ <a href='#failure30'>Previous Failure</a> | <a href='#failure32'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure28'></a><dd><b>Testcase <a target='other_window' href='./js1_3/regress/function-001-n.js'>js1_3/regress/function-001-n.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=10278' target='other_window'>Bug Number 10278</a><br>
+ [ <a href='#failure27'>Previous Failure</a> | <a href='#failure29'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 3, got 0<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
+LEAK: 330 KJS::Node<br>
 BUGNUMBER: 10278<br>
 function-001.js functions not separated by semicolons are errors in version 120 and higher<br>
 eval("function f(){}function g(){}") = undefined FAILED! expected: error<br>
 </tt><br>
-<a name='failure32'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/catchguard-001.js'>js1_5/Exceptions/catchguard-001.js</a> failed</b> <br>
- [ <a href='#failure31'>Previous Failure</a> | <a href='#failure33'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure29'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/catchguard-001.js'>js1_5/Exceptions/catchguard-001.js</a> failed</b> <br>
+ [ <a href='#failure28'>Previous Failure</a> | <a href='#failure30'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 LEAK: 25 KJS::Node<br>
 </tt><br>
-<a name='failure33'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/catchguard-002.js'>js1_5/Exceptions/catchguard-002.js</a> failed</b> <br>
- [ <a href='#failure32'>Previous Failure</a> | <a href='#failure34'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure30'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/catchguard-002.js'>js1_5/Exceptions/catchguard-002.js</a> failed</b> <br>
+ [ <a href='#failure29'>Previous Failure</a> | <a href='#failure31'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 LEAK: 23 KJS::Node<br>
 </tt><br>
-<a name='failure34'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/catchguard-003.js'>js1_5/Exceptions/catchguard-003.js</a> failed</b> <br>
- [ <a href='#failure33'>Previous Failure</a> | <a href='#failure35'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure31'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/catchguard-003.js'>js1_5/Exceptions/catchguard-003.js</a> failed</b> <br>
+ [ <a href='#failure30'>Previous Failure</a> | <a href='#failure32'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 LEAK: 28 KJS::Node<br>
 </tt><br>
-<a name='failure35'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/errstack-001.js'>js1_5/Exceptions/errstack-001.js</a> failed</b> <br>
- [ <a href='#failure34'>Previous Failure</a> | <a href='#failure36'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure32'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/errstack-001.js'>js1_5/Exceptions/errstack-001.js</a> failed</b> <br>
+ [ <a href='#failure31'>Previous Failure</a> | <a href='#failure33'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
-[19419] ./js1_5/Exceptions/errstack-001.js line 247: TypeError: Undefined value<br>
+[40549] ./js1_5/Exceptions/errstack-001.js line 247: TypeError: Undefined value<br>
 </tt><br>
-<a name='failure36'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/regress-50447.js'>js1_5/Exceptions/regress-50447.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=50447' target='other_window'>Bug Number 50447</a><br>
- [ <a href='#failure35'>Previous Failure</a> | <a href='#failure37'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure33'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/regress-50447.js'>js1_5/Exceptions/regress-50447.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=50447' target='other_window'>Bug Number 50447</a><br>
+ [ <a href='#failure32'>Previous Failure</a> | <a href='#failure34'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 BUGNUMBER: 50447<br>
 STATUS: Test (non-ECMA) Error object properties fileName, lineNumber<br>
-[19420] ./js1_5/Exceptions/regress-50447.js line 65: TypeError: Undefined value<br>
+[40550] ./js1_5/Exceptions/regress-50447.js line 65: TypeError: Undefined value<br>
 </tt><br>
-<a name='failure37'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-001.js'>js1_5/GetSet/getset-001.js</a> failed</b> <br>
- [ <a href='#failure36'>Previous Failure</a> | <a href='#failure38'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure34'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-001.js'>js1_5/GetSet/getset-001.js</a> failed</b> <br>
+ [ <a href='#failure33'>Previous Failure</a> | <a href='#failure35'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 LEAK: 7 KJS::Node<br>
 </tt><br>
-<a name='failure38'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-002.js'>js1_5/GetSet/getset-002.js</a> failed</b> <br>
- [ <a href='#failure37'>Previous Failure</a> | <a href='#failure39'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure35'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-002.js'>js1_5/GetSet/getset-002.js</a> failed</b> <br>
+ [ <a href='#failure34'>Previous Failure</a> | <a href='#failure36'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 Testcase produced no output!</tt><br>
-<a name='failure39'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-003.js'>js1_5/GetSet/getset-003.js</a> failed</b> <br>
- [ <a href='#failure38'>Previous Failure</a> | <a href='#failure40'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure36'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-003.js'>js1_5/GetSet/getset-003.js</a> failed</b> <br>
+ [ <a href='#failure35'>Previous Failure</a> | <a href='#failure37'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 LEAK: 73 KJS::Node<br>
 </tt><br>
-<a name='failure40'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-90596-001.js'>js1_5/Object/regress-90596-001.js</a> failed</b> <br>
- [ <a href='#failure39'>Previous Failure</a> | <a href='#failure41'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure37'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-90596-001.js'>js1_5/Object/regress-90596-001.js</a> failed</b> <br>
+ [ <a href='#failure36'>Previous Failure</a> | <a href='#failure38'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
-[19435] ./js1_5/Object/regress-90596-001.js line 48: TypeError: Value undefined (result of expression obj.toSource) is not object.<br>
+[40565] ./js1_5/Object/regress-90596-001.js line 48: TypeError: Value undefined (result of expression obj.toSource) is not object.<br>
 </tt><br>
-<a name='failure41'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-90596-002.js'>js1_5/Object/regress-90596-002.js</a> failed</b> <br>
- [ <a href='#failure40'>Previous Failure</a> | <a href='#failure42'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure38'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-90596-002.js'>js1_5/Object/regress-90596-002.js</a> failed</b> <br>
+ [ <a href='#failure37'>Previous Failure</a> | <a href='#failure39'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
-[19436] ./js1_5/Object/regress-90596-002.js line 48: ReferenceError: Can't find variable: uneval<br>
+[40566] ./js1_5/Object/regress-90596-002.js line 48: ReferenceError: Can't find variable: uneval<br>
 </tt><br>
-<a name='failure42'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-96284-001.js'>js1_5/Object/regress-96284-001.js</a> failed</b> <br>
- [ <a href='#failure41'>Previous Failure</a> | <a href='#failure43'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure39'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-96284-001.js'>js1_5/Object/regress-96284-001.js</a> failed</b> <br>
+ [ <a href='#failure38'>Previous Failure</a> | <a href='#failure40'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
-[19438] ./js1_5/Object/regress-96284-001.js line 49: TypeError: Value undefined (result of expression obj1.toSource) is not object.<br>
+[40568] ./js1_5/Object/regress-96284-001.js line 49: TypeError: Value undefined (result of expression obj1.toSource) is not object.<br>
 </tt><br>
-<a name='failure43'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-96284-002.js'>js1_5/Object/regress-96284-002.js</a> failed</b> <br>
- [ <a href='#failure42'>Previous Failure</a> | <a href='#failure44'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure40'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-96284-002.js'>js1_5/Object/regress-96284-002.js</a> failed</b> <br>
+ [ <a href='#failure39'>Previous Failure</a> | <a href='#failure41'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
-[19439] ./js1_5/Object/regress-96284-002.js line 49: ReferenceError: Can't find variable: uneval<br>
+[40569] ./js1_5/Object/regress-96284-002.js line 49: ReferenceError: Can't find variable: uneval<br>
 </tt><br>
-<a name='failure44'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-44009.js'>js1_5/Regress/regress-44009.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=44009' target='other_window'>Bug Number 44009</a><br>
- [ <a href='#failure43'>Previous Failure</a> | <a href='#failure45'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure41'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-44009.js'>js1_5/Regress/regress-44009.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=44009' target='other_window'>Bug Number 44009</a><br>
+ [ <a href='#failure40'>Previous Failure</a> | <a href='#failure42'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 BUGNUMBER: 44009<br>
 STATUS: Testing that we don't crash on obj.toSource()<br>
-[19444] ./js1_5/Regress/regress-44009.js line 60: TypeError: Value undefined (result of expression obj.toSource) is not object.<br>
+[40574] ./js1_5/Regress/regress-44009.js line 60: TypeError: Value undefined (result of expression obj.toSource) is not object.<br>
 </tt><br>
-<a name='failure45'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-68498-003.js'>js1_5/Regress/regress-68498-003.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=68498' target='other_window'>Bug Number 68498</a><br>
- [ <a href='#failure44'>Previous Failure</a> | <a href='#failure46'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure42'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-68498-003.js'>js1_5/Regress/regress-68498-003.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=68498' target='other_window'>Bug Number 68498</a><br>
+ [ <a href='#failure41'>Previous Failure</a> | <a href='#failure43'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>STATUS: Testing calling obj.eval(str)<br>
 Failure messages were:<br>
 FAILED!: [reported from test()] Testing calling obj.eval(str); currently at expect[1] within test -<br>
@@ -467,8 +447,8 @@ FAILED!: [reported from test()] Type mismatch, expected type number, actual type
 FAILED!: [reported from test()] Expected value '43', Actual value 'false'<br>
 FAILED!: [reported from test()] <br>
 </tt><br>
-<a name='failure46'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-103602.js'>js1_5/Regress/regress-103602.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=103602' target='other_window'>Bug Number 103602</a><br>
- [ <a href='#failure45'>Previous Failure</a> | <a href='#failure47'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure43'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-103602.js'>js1_5/Regress/regress-103602.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=103602' target='other_window'>Bug Number 103602</a><br>
+ [ <a href='#failure42'>Previous Failure</a> | <a href='#failure44'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>STATUS: Reassignment to a const is NOT an error per ECMA<br>
 Failure messages were:<br>
 FAILED!: [reported from test()] Section 1 of test -<br>
@@ -478,29 +458,29 @@ FAILED!: [reported from test()] Section 3 of test -<br>
 FAILED!: [reported from test()] Expected value '1', Actual value '2'<br>
 FAILED!: [reported from test()] <br>
 </tt><br>
-<a name='failure47'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-104077.js'>js1_5/Regress/regress-104077.js</a> failed</b> <br>
- [ <a href='#failure46'>Previous Failure</a> | <a href='#failure48'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure44'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-104077.js'>js1_5/Regress/regress-104077.js</a> failed</b> <br>
+ [ <a href='#failure43'>Previous Failure</a> | <a href='#failure45'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 LEAK: 457 KJS::Node<br>
 </tt><br>
-<a name='failure48'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-127557.js'>js1_5/Regress/regress-127557.js</a> failed</b> <br>
- [ <a href='#failure47'>Previous Failure</a> | <a href='#failure49'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure45'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-127557.js'>js1_5/Regress/regress-127557.js</a> failed</b> <br>
+ [ <a href='#failure44'>Previous Failure</a> | <a href='#failure46'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
-[19470] ./js1_5/Regress/regress-127557.js line 75: ReferenceError: Can't find variable: clone<br>
+[40601] ./js1_5/Regress/regress-127557.js line 75: ReferenceError: Can't find variable: clone<br>
 </tt><br>
-<a name='failure49'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-172699.js'>js1_5/Regress/regress-172699.js</a> failed</b> <br>
- [ <a href='#failure48'>Previous Failure</a> | <a href='#failure50'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure46'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-172699.js'>js1_5/Regress/regress-172699.js</a> failed</b> <br>
+ [ <a href='#failure45'>Previous Failure</a> | <a href='#failure47'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
-[19492] ./js1_5/Regress/regress-172699.js line 61: URIError: URI error<br>
+[40610] ./js1_5/Regress/regress-172699.js line 61: URIError: URI error<br>
 </tt><br>
-<a name='failure50'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-179524.js'>js1_5/Regress/regress-179524.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=179524' target='other_window'>Bug Number 179524</a><br>
- [ <a href='#failure49'>Previous Failure</a> | <a href='#failure51'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure47'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-179524.js'>js1_5/Regress/regress-179524.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=179524' target='other_window'>Bug Number 179524</a><br>
+ [ <a href='#failure46'>Previous Failure</a> | <a href='#failure48'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>STATUS: Don't crash on extraneous arguments to str.match(), etc.<br>
 Failure messages were:<br>
 FAILED!: [reported from test()] Section 14 of test -<br>
@@ -550,15 +530,15 @@ FAILED!: [reported from test()] Section 36 of test -<br>
 FAILED!: [reported from test()] Expected value 'SHOULD HAVE FALLEN INTO CATCH-BLOCK!', Actual value 'ABC Zbc'<br>
 FAILED!: [reported from test()] <br>
 </tt><br>
-<a name='failure51'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Scope/regress-220584.js'>js1_5/Scope/regress-220584.js</a> failed</b> <br>
- [ <a href='#failure50'>Previous Failure</a> | <a href='#failure52'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure48'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Scope/regress-220584.js'>js1_5/Scope/regress-220584.js</a> failed</b> <br>
+ [ <a href='#failure47'>Previous Failure</a> | <a href='#failure49'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
-[19517] ./js1_5/Scope/regress-220584.js line 56: ReferenceError: Can't find variable: Script<br>
+[40635] ./js1_5/Scope/regress-220584.js line 56: ReferenceError: Can't find variable: Script<br>
 </tt><br>
-<a name='failure52'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Scope/scope-001.js'>js1_5/Scope/scope-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=53268' target='other_window'>Bug Number 53268</a><br>
- [ <a href='#failure51'>Previous Failure</a> | <a href='#failure53'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure49'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Scope/scope-001.js'>js1_5/Scope/scope-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=53268' target='other_window'>Bug Number 53268</a><br>
+ [ <a href='#failure48'>Previous Failure</a> | <a href='#failure50'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>STATUS: Testing scope after changing obj.__proto__<br>
 Failure messages were:<br>
 FAILED!: [reported from test()] Step 1:  setting obj.__proto__ = global object<br>
@@ -569,8 +549,8 @@ FAILED!: [reported from test()] Type mismatch, expected type undefined, actual t
 FAILED!: [reported from test()] Expected value 'undefined', Actual value '1'<br>
 FAILED!: [reported from test()] <br>
 </tt><br>
-<a name='failure53'></a><dd><b>Testcase <a target='other_window' href='./js1_6/Regress/regress-301574.js'>js1_6/Regress/regress-301574.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=301574' target='other_window'>Bug Number 301574</a><br>
- [ <a href='#failure52'>Previous Failure</a> | <a href='#failure54'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure50'></a><dd><b>Testcase <a target='other_window' href='./js1_6/Regress/regress-301574.js'>js1_6/Regress/regress-301574.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=301574' target='other_window'>Bug Number 301574</a><br>
+ [ <a href='#failure49'>Previous Failure</a> | <a href='#failure51'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>STATUS: E4X should be enabled even when e4x=1 not specified<br>
 Failure messages were:<br>
 FAILED!: E4X should be enabled even when e4x=1 not specified: XML()<br>
@@ -580,28 +560,28 @@ FAILED!: E4X should be enabled even when e4x=1 not specified: XMLList()<br>
 FAILED!: Expected value 'No error', Actual value 'error: ReferenceError: Can't find variable: XML'<br>
 FAILED!: <br>
 </tt><br>
-<a name='failure54'></a><dd><b>Testcase <a target='other_window' href='./js1_6/Regress/regress-309242.js'>js1_6/Regress/regress-309242.js</a> failed</b> <br>
- [ <a href='#failure53'>Previous Failure</a> | <a href='#failure55'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure51'></a><dd><b>Testcase <a target='other_window' href='./js1_6/Regress/regress-309242.js'>js1_6/Regress/regress-309242.js</a> failed</b> <br>
+ [ <a href='#failure50'>Previous Failure</a> | <a href='#failure52'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 LEAK: 63 KJS::Node<br>
 </tt><br>
-<a name='failure55'></a><dd><b>Testcase <a target='other_window' href='./js1_6/Regress/regress-314887.js'>js1_6/Regress/regress-314887.js</a> failed</b> <br>
- [ <a href='#failure54'>Previous Failure</a> | <a href='#failure56'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure52'></a><dd><b>Testcase <a target='other_window' href='./js1_6/Regress/regress-314887.js'>js1_6/Regress/regress-314887.js</a> failed</b> <br>
+ [ <a href='#failure51'>Previous Failure</a> | <a href='#failure53'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 Testcase produced no output!</tt><br>
-<a name='failure56'></a><dd><b>Testcase <a target='other_window' href='./js1_6/String/regress-306591.js'>js1_6/String/regress-306591.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=306591' target='other_window'>Bug Number 306591</a><br>
- [ <a href='#failure55'>Previous Failure</a> | <a href='#failure57'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
+<a name='failure53'></a><dd><b>Testcase <a target='other_window' href='./js1_6/String/regress-306591.js'>js1_6/String/regress-306591.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=306591' target='other_window'>Bug Number 306591</a><br>
+ [ <a href='#failure52'>Previous Failure</a> | <a href='#failure54'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
 <tt>Expected exit code 0, got 3<br>
 Testcase terminated with signal 0<br>
 Complete testcase output was:<br>
 BUGNUMBER: 306591<br>
 STATUS: String static methods<br>
 STATUS: See https://bugzilla.mozilla.org/show_bug.cgi?id=304828<br>
-[19539] ./js1_6/String/regress-306591.js line 48: TypeError: Value undefined (result of expression String.split) is not object.<br>
+[40657] ./js1_6/String/regress-306591.js line 48: TypeError: Value undefined (result of expression String.split) is not object.<br>
 </tt><br>
 </dl>
 [ <a href='#tippy_top'>Top of Page</a> | <a href='#fail_detail'>Top of Failures</a> ]<br>
@@ -609,19 +589,16 @@ STATUS: See https://bugzilla.mozilla.org/show_bug.cgi?id=304828<br>
 <pre>
 <a name='retest_list'></a>
 <h2>Retest List</h2><br>
-# Retest List, kjs, generated Sat Nov  3 17:02:52 2007.
+# Retest List, kjs, generated Mon Nov 12 16:13:45 2007.
 # Original test base was: All tests.
-# 1127 of 1135 test(s) were completed, 56 failures reported.
-ecma/Date/15.9.5.14.js
-ecma/Date/15.9.5.34-1.js
+# 1127 of 1135 test(s) were completed, 53 failures reported.
 ecma/TypeConversion/9.3.1-3.js
 ecma_2/Exceptions/function-001.js
 ecma_3/Date/15.9.5.7.js
 ecma_3/FunExpr/fe-001.js
 ecma_3/RegExp/15.10.2-1.js
 ecma_3/RegExp/perlstress-001.js
-ecma_3/RegExp/regress-100199.js
-ecma_3/RegExp/regress-188206.js
+ecma_3/RegExp/perlstress-002.js
 ecma_3/RegExp/regress-209919.js
 ecma_3/Statements/regress-194364.js
 ecma_3/Unicode/uc-001.js
index f0e9689cf12a120c880f5efe6b3ddcfca4a0c862..a8290ead70eac497809f06bf80d9d339969ca8d6 100644 (file)
@@ -1,3 +1,15 @@
+2007-11-13  Darin Adler  <darin@apple.com>
+
+        Reviewed by Geoff.
+
+        - test for http://bugs.webkit.org/show_bug.cgi?id=11231
+          RegExp bug when handling newline characters and other regular expression
+          behavior that is different for JavaScript and PCRE
+
+        * fast/js/regexp-no-extensions-expected.txt: Added.
+        * fast/js/regexp-no-extensions.html: Added.
+        * fast/js/resources/regexp-no-extensions.js: Added.
+
 2007-11-12  Dan Bernstein  <mitz@apple.com>
 
         Reviewed by Darin Adler.
diff --git a/LayoutTests/fast/js/regexp-no-extensions-expected.txt b/LayoutTests/fast/js/regexp-no-extensions-expected.txt
new file mode 100644 (file)
index 0000000..238eb55
--- /dev/null
@@ -0,0 +1,46 @@
+Tests that regular expressions do not have extensions that diverge from the JavaScript specification. Because WebKit originally used a copy of PCRE, various non-JavaScript regular expression features were historically present. Also tests various related edge cases.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS /\x{41}/.exec("yA1") is null
+PASS /[\x{41}]/.exec("yA1").toString() is "1"
+PASS /\x1g/.exec("x1g").toString() is "x1g"
+PASS /[\x1g]/.exec("x").toString() is "x"
+PASS /[\x1g]/.exec("1").toString() is "1"
+PASS /\2147483648/.exec(String.fromCharCode(140) + "7483648").toString() is String.fromCharCode(140) + "7483648"
+PASS /\4294967296/.exec("\"94967296").toString() is "\"94967296"
+PASS /\8589934592/.exec("8589934592").toString() is "8589934592"
+PASS "\nAbc\n".replace(/(\n)[^\n]+$/, "$1") is "\nAbc\n"
+PASS /x$/.exec("x\n") is null
+PASS /x++/ threw exception SyntaxError: Invalid regular expression: nothing to repeat.
+PASS /[]]/.exec("]") is null
+
+Octal escape sequences are in Annex B of the standard.
+
+PASS /\060/.exec("y01").toString() is "0"
+PASS /[\060]/.exec("y01").toString() is "0"
+PASS /\606/.exec("y06").toString() is "06"
+PASS /[\606]/.exec("y06").toString() is "0"
+PASS /[\606]/.exec("y6").toString() is "6"
+PASS /\101/.exec("yA1").toString() is "A"
+PASS /[\101]/.exec("yA1").toString() is "A"
+PASS /\1011/.exec("yA1").toString() is "A1"
+PASS /[\1011]/.exec("yA1").toString() is "A"
+PASS /[\1011]/.exec("y1").toString() is "1"
+PASS /\10q/.exec("y" + String.fromCharCode(8) + "q").toString() is String.fromCharCode(8) + "q"
+PASS /[\10q]/.exec("y" + String.fromCharCode(8) + "q").toString() is String.fromCharCode(8)
+PASS /\1q/.exec("y" + String.fromCharCode(1) + "q").toString() is String.fromCharCode(1) + "q"
+PASS /[\1q]/.exec("y" + String.fromCharCode(1) + "q").toString() is String.fromCharCode(1)
+PASS /[\1q]/.exec("yq").toString() is "q"
+PASS /\8q/.exec("y8q").toString() is "8q"
+PASS /[\8q]/.exec("y8q").toString() is "8"
+PASS /[\8q]/.exec("yq").toString() is "q"
+PASS /(x)\1q/.exec("xxq").toString() is "xxq,x"
+PASS /(x)[\1q]/.exec("xxq").toString() is "xq,x"
+PASS /(x)[\1q]/.exec("xx" + String.fromCharCode(1)).toString() is "x" + String.fromCharCode(1) + ",x"
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/js/regexp-no-extensions.html b/LayoutTests/fast/js/regexp-no-extensions.html
new file mode 100644 (file)
index 0000000..0aa6fa5
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="resources/js-test-style.css">
+<script src="resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="resources/regexp-no-extensions.js"></script>
+<script src="resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/js/resources/regexp-no-extensions.js b/LayoutTests/fast/js/resources/regexp-no-extensions.js
new file mode 100644 (file)
index 0000000..ced4d6f
--- /dev/null
@@ -0,0 +1,48 @@
+description(
+'Tests that regular expressions do not have extensions that diverge from the JavaScript specification. '
++ 'Because WebKit originally used a copy of PCRE, various non-JavaScript regular expression features were historically present. '
++ 'Also tests various related edge cases.'
+);
+
+shouldBe('/\\x{41}/.exec("yA1")', 'null');
+shouldBe('/[\\x{41}]/.exec("yA1").toString()', '"1"');
+shouldBe('/\\x1g/.exec("x1g").toString()', '"x1g"');
+shouldBe('/[\\x1g]/.exec("x").toString()', '"x"');
+shouldBe('/[\\x1g]/.exec("1").toString()', '"1"');
+shouldBe('/\\2147483648/.exec(String.fromCharCode(140) + "7483648").toString()', 'String.fromCharCode(140) + "7483648"');
+shouldBe('/\\4294967296/.exec("\\"94967296").toString()', '"\\"94967296"');
+shouldBe('/\\8589934592/.exec("8589934592").toString()', '"8589934592"');
+shouldBe('"\\nAbc\\n".replace(/(\\n)[^\\n]+$/, "$1")', '"\\nAbc\\n"');
+shouldBe('/x$/.exec("x\\n")', 'null');
+shouldThrow('/x++/');
+shouldBe('/[]]/.exec("]")', 'null');
+
+debug('');
+debug('Octal escape sequences are in Annex B of the standard.');
+debug('');
+
+shouldBe('/\\060/.exec("y01").toString()', '"0"');
+shouldBe('/[\\060]/.exec("y01").toString()', '"0"');
+shouldBe('/\\606/.exec("y06").toString()', '"06"');
+shouldBe('/[\\606]/.exec("y06").toString()', '"0"');
+shouldBe('/[\\606]/.exec("y6").toString()', '"6"');
+shouldBe('/\\101/.exec("yA1").toString()', '"A"');
+shouldBe('/[\\101]/.exec("yA1").toString()', '"A"');
+shouldBe('/\\1011/.exec("yA1").toString()', '"A1"');
+shouldBe('/[\\1011]/.exec("yA1").toString()', '"A"');
+shouldBe('/[\\1011]/.exec("y1").toString()', '"1"');
+shouldBe('/\\10q/.exec("y" + String.fromCharCode(8) + "q").toString()', 'String.fromCharCode(8) + "q"');
+shouldBe('/[\\10q]/.exec("y" + String.fromCharCode(8) + "q").toString()', 'String.fromCharCode(8)');
+shouldBe('/\\1q/.exec("y" + String.fromCharCode(1) + "q").toString()', 'String.fromCharCode(1) + "q"');
+shouldBe('/[\\1q]/.exec("y" + String.fromCharCode(1) + "q").toString()', 'String.fromCharCode(1)');
+shouldBe('/[\\1q]/.exec("yq").toString()', '"q"');
+shouldBe('/\\8q/.exec("y8q").toString()', '"8q"');
+shouldBe('/[\\8q]/.exec("y8q").toString()', '"8"');
+shouldBe('/[\\8q]/.exec("yq").toString()', '"q"');
+shouldBe('/(x)\\1q/.exec("xxq").toString()', '"xxq,x"');
+shouldBe('/(x)[\\1q]/.exec("xxq").toString()', '"xq,x"');
+shouldBe('/(x)[\\1q]/.exec("xx" + String.fromCharCode(1)).toString()', '"x" + String.fromCharCode(1) + ",x"');
+
+debug('');
+
+var successfullyParsed = true;