[Pcre-svn] [105] code/trunk: The tests all run clean with JI…

Top Page
Delete this message
Author: Subversion repository
Date:  
To: pcre-svn
Subject: [Pcre-svn] [105] code/trunk: The tests all run clean with JIT.
Revision: 105
          http://www.exim.org/viewvc/pcre2?view=rev&revision=105
Author:   ph10
Date:     2014-10-11 16:56:25 +0100 (Sat, 11 Oct 2014)


Log Message:
-----------
The tests all run clean with JIT.

Modified Paths:
--------------
    code/trunk/doc/pcre2test.1
    code/trunk/src/pcre2test.c
    code/trunk/testdata/testinput16
    code/trunk/testdata/testoutput16
    code/trunk/testdata/testoutput2
    code/trunk/testdata/testoutput6


Modified: code/trunk/doc/pcre2test.1
===================================================================
--- code/trunk/doc/pcre2test.1    2014-10-10 17:29:08 UTC (rev 104)
+++ code/trunk/doc/pcre2test.1    2014-10-11 15:56:25 UTC (rev 105)
@@ -1,4 +1,4 @@
-.TH PCRE2TEST 1 "10 October 2014" "PCRE 10.00"
+.TH PCRE2TEST 1 "11 October 2014" "PCRE 10.00"
 .SH NAME
 pcre2test - a program for testing Perl-compatible regular expressions.
 .SH SYNOPSIS
@@ -433,6 +433,7 @@
   /I  info                      show info about compiled pattern
       hex                       pattern is coded in hexadecimal
       jit[=<number>]            use JIT
+      jitverify                 verify JIT use 
       locale=<name>             use this locale
       memory                    show memory used
       newline=<type>            set newline type
@@ -505,30 +506,33 @@
 .SS "JIT compilation"
 .rs
 .sp
-The \fB/jit\fP modifier may optionally be followed by a number in the range 0
-to 7:
+The \fB/jit\fP modifier may optionally be followed by and equals sign and a
+number in the range 0 to 7:
 .sp
   0  disable JIT
-  1  normal match only
-  2  soft partial match only
-  3  normal match and soft partial match
-  4  hard partial match only
-  6  soft and hard partial match
+  1  use JIT for normal match only
+  2  use JIT for soft partial match only
+  3  use JIT for normal match and soft partial match
+  4  use JIT for hard partial match only
+  6  use JIT for soft and hard partial match
   7  all three modes
 .sp
 If no number is given, 7 is assumed. If JIT compilation is successful, the
-compiled JIT code will automatically be used when \fBpcre2_match()\fP is run,
-except when incompatible run-time options are specified. For more details, see
-the
+compiled JIT code will automatically be used when \fBpcre2_match()\fP is run 
+for the appropriate type of match, except when incompatible run-time options
+are specified. For more details, see the
 .\" HREF
 \fBpcre2jit\fP
 .\"
 documentation. See also the \fBjitstack\fP modifier below for a way of
 setting the size of the JIT stack.
 .P
-If the \fBjitverify\fP modifier is specified, the text "(JIT)" is added to the
-first output line after a match or non match when JIT-compiled code was
-actually used. This modifier can also be set on a subject line.
+If the \fBjitverify\fP modifier is specified, information about the compiled
+pattern shows whether JIT compilation was or was not successful. If
+\fBjitverify\fP is specified without \fBjit\fP, jit=7 is assumed. If JIT
+compilation is successful when \fBjitverify\fP is set, the text "(JIT)" is
+added to the first output line after a match or non match when JIT-compiled
+code was actually used.
 .
 .
 .SS "Setting a locale"
@@ -632,7 +636,6 @@
       allcaptures               show all captures
       allusedtext               show all consulted text
   /g  global                    global matching
-      jitverify                 verify JIT usage
       mark                      show mark values
 .sp
 These modifiers may not appear in a \fB#pattern\fP command. If you want them as
@@ -701,7 +704,6 @@
       getall                    extract all captured substrings
   /g  global                    global matching
       jitstack=<n>              set size of JIT stack
-      jitverify                 verify JIT usage
       mark                      show mark values
       match_limit=>n>           set a match limit
       memory                    show memory usage
@@ -842,6 +844,10 @@
 until it finds the minimum values for each parameter that allow
 \fBpcre2_match()\fP to complete without error.
 .P
+If JIT is being used, only the match limit is relevant. If DFA matching is 
+being used, neither limit is relevant, and this modifier is ignored (with a 
+warning message).
+.P
 The \fImatch_limit\fP number is a measure of the amount of backtracking
 that takes place, and learning the minimum value can be instructive. For most
 simple matches, the number is quite small, but for patterns with very large
@@ -1153,6 +1159,6 @@
 .rs
 .sp
 .nf
-Last updated: 10 October 2014
+Last updated: 11 October 2014
 Copyright (c) 1997-2014 University of Cambridge.
 .fi


Modified: code/trunk/src/pcre2test.c
===================================================================
--- code/trunk/src/pcre2test.c    2014-10-10 17:29:08 UTC (rev 104)
+++ code/trunk/src/pcre2test.c    2014-10-11 15:56:25 UTC (rev 105)
@@ -448,7 +448,7 @@
   { "info",                MOD_PAT,  MOD_CTL, CTL_INFO,                  PO(control) },
   { "jit",                 MOD_PAT,  MOD_IND, 7,                         PO(jit) },
   { "jitstack",            MOD_DAT,  MOD_INT, 0,                         DO(jitstack) },
-  { "jitverify",           MOD_PND,  MOD_CTL, CTL_JITVERIFY,             PO(control) },
+  { "jitverify",           MOD_PAT,  MOD_CTL, CTL_JITVERIFY,             PO(control) },
   { "locale",              MOD_PAT,  MOD_STR, 0,                         PO(locale) },
   { "mark",                MOD_PNDP, MOD_CTL, CTL_MARK,                  PO(control) },
   { "match_limit",         MOD_CTM,  MOD_INT, 0,                         MO(match_limit) },
@@ -2632,7 +2632,7 @@
   pp = p;
   while (pp < ep && *pp != '=') pp++;
   index = scan_modifiers(p, pp - p);
-
+  
   /* If the first modifier is unrecognized, try to interpret it as a sequence
   of single-character abbreviated modifiers. None of these modifiers have any
   associated data. They just set options or control bits. */
@@ -2709,7 +2709,7 @@


/* These on/off types have no data. */

-  else if (*pp != ',' && *pp != '\n' && *pp != 0)
+  else if (*pp != ',' && *pp != '\n' && *pp != ' ' && *pp != 0)
     {
     fprintf(outfile, "** Unrecognized modifier '%.*s'\n", (int)(ep-p), p);
     return FALSE;
@@ -2855,7 +2855,7 @@
     break;
     }


-  if (*pp != ',' && *pp != '\n' && *pp != 0)
+  if (*pp != ',' && *pp != '\n' && *pp != ' ' && *pp != 0)
     {
     fprintf(outfile, "** Comma expected after modifier item '%s'\n", m->name);
     return FALSE;
@@ -3328,22 +3328,16 @@


fprintf(outfile, "Subject length lower bound = %d\n", minlength);

-/* FIXME: tidy this up */
-
   if (pat_patctl.jit != 0 && (pat_patctl.control & CTL_JITVERIFY) != 0)
     {
-    size_t jitsize;
-    if (pattern_info(PCRE2_INFO_JITSIZE, &jitsize, FALSE) == 0)
-      {
-      if (jitsize > 0)
-        fprintf(outfile, "JIT compilation was successful\n");
-      else
+    if (FLD(compiled_code, executable_jit) != NULL)    
+      fprintf(outfile, "JIT compilation was successful\n");
+    else
 #ifdef SUPPORT_JIT
-        fprintf(outfile, "JIT compilation was not successful\n");
+      fprintf(outfile, "JIT compilation was not successful\n");
 #else
-        fprintf(outfile, "JIT support is not available in this version of PCRE2\n");
+      fprintf(outfile, "JIT support is not available in this version of PCRE2\n");
 #endif
-      }
     }
   }


@@ -3382,6 +3376,8 @@
 else if (strncmp((char *)buffer, "#pattern", 8) == 0 && isspace(buffer[8]))
   {
   (void)decode_modifiers(buffer + 8, CTX_DEFPAT, &def_patctl, NULL);
+  if (def_patctl.jit == 0 && (def_patctl.control & CTL_JITVERIFY) != 0)
+    def_patctl.jit = 7; 
   }
 else if (strncmp((char *)buffer, "#perltest", 9) == 0 && isspace(buffer[9]))
   {
@@ -3467,6 +3463,9 @@
 /* Look for modifiers and options after the final delimiter. */


if (!decode_modifiers(p, CTX_PAT, &pat_patctl, NULL)) return PR_SKIP;
+
+if (pat_patctl.jit == 0 && (pat_patctl.control & CTL_JITVERIFY) != 0)
+ pat_patctl.jit = 7;
utf = (pat_patctl.options & PCRE2_UTF) != 0;

/* Now copy the pattern to pbuffer8 for use in 8-bit testing and for reflecting
@@ -4385,7 +4384,10 @@
dat_datctl.control &= ~CTL_FINDLIMITS;
}

-if ((dat_datctl.control & CTL_ALLUSEDTEXT) != 0 && 
+/* ALLUSEDTEXT is not supported with JIT, but JIT is not used with DFA 
+matching, even if the JIT compiler was used. */ 
+  
+if ((dat_datctl.control & (CTL_ALLUSEDTEXT|CTL_DFA)) == CTL_ALLUSEDTEXT && 
     FLD(compiled_code, executable_jit) != NULL)
   {
   fprintf(outfile, "** Showing all consulted text is not supported by JIT: ignored\n");
@@ -4427,7 +4429,7 @@
 /* When no JIT stack is assigned, we must ensure that there is a JIT callback
 if we want to verify that JIT was actually used. */


-if ((dat_datctl.control & CTL_JITVERIFY) != 0 && jit_stack == NULL)
+if ((pat_patctl.control & CTL_JITVERIFY) != 0 && jit_stack == NULL)
    {
    PCRE2_JIT_STACK_ASSIGN(compiled_code, jit_callback, NULL);
    }
@@ -4502,13 +4504,15 @@
         (double)CLOCKS_PER_SEC);
     }


- /* Find the match and recursion limits if requested. */
+ /* Find the match and recursion limits if requested. The recursion limit
+ is not relevant for JIT. */

   if ((dat_datctl.control & CTL_FINDLIMITS) != 0)
     {
-    (void)check_match_limit(pp, ulen, PCRE2_ERROR_MATCHLIMIT, "match");
-    capcount = check_match_limit(pp, ulen, PCRE2_ERROR_RECURSIONLIMIT,
-      "recursion");
+    capcount = check_match_limit(pp, ulen, PCRE2_ERROR_MATCHLIMIT, "match");
+    if (FLD(compiled_code, executable_jit) == NULL)   
+      (void)check_match_limit(pp, ulen, PCRE2_ERROR_RECURSIONLIMIT,
+        "recursion");
     }


   /* Otherwise just run a single match, setting up a callout if required (the
@@ -4565,10 +4569,7 @@
     {
     int i;
     uint8_t *nptr;
-    BOOL showallused;
-    PCRE2_SIZE leftchar = FLD(match_data, leftchar);
-    PCRE2_SIZE rightchar = FLD(match_data, rightchar);
-
+    
     /* This is a check against a lunatic return value. */


     if (capcount > (int)dat_datctl.oveccount)
@@ -4635,38 +4636,60 @@
         continue;
         }


-      /* For the whole matched string, if ALLUSEDTEXT is set, and if the
-      leftmost consulted character is before the start of the match or the
-      rightmost consulted character is past the end of the match, we want to
-      show all consulted characters, and indicate which were lookarounds. */
-
-      showallused = i == 0 && (dat_datctl.control & CTL_ALLUSEDTEXT) != 0 &&
-        (leftchar < start || rightchar > end);
-      if (showallused)
+      /* When JIT is not being used, ALLUSEDTEXT may be set. (It if is set with 
+      JIT, it is disabled above, with a comment.) When the match is done by the 
+      interpreter, leftchar and rightchar are available, and if ALLUSEDTEXT is
+      set, and if the leftmost consulted character is before the start of the
+      match or the rightmost consulted character is past the end of the match,
+      we want to show all consulted characters for the main matched string, and
+      indicate which were lookarounds. */
+      
+      if (i == 0)
         {
-        PCHARS(lleft, pp, leftchar, start - leftchar, utf, outfile);
-        PCHARS(lmiddle, pp, start, end - start, utf, outfile);
-        PCHARS(lright, pp, end, rightchar - end, utf, outfile);
+        BOOL showallused;
+        PCRE2_SIZE leftchar, rightchar;
+         
+        if ((dat_datctl.control & CTL_ALLUSEDTEXT) != 0)
+          {
+          leftchar = FLD(match_data, leftchar);
+          rightchar = FLD(match_data, rightchar);
+          showallused = i == 0 && (leftchar < start || rightchar > end);
+          }
+        else showallused = FALSE;   
+     
+        if (showallused)
+          {
+          PCHARS(lleft, pp, leftchar, start - leftchar, utf, outfile);
+          PCHARS(lmiddle, pp, start, end - start, utf, outfile);
+          PCHARS(lright, pp, end, rightchar - end, utf, outfile);
+          }
+        else
+          {
+          PCHARSV(pp, start, end - start, utf, outfile);
+          }
+     
+        if ((pat_patctl.control & CTL_JITVERIFY) != 0 && jit_was_used)
+          fprintf(outfile, " (JIT)");
+     
+        if (showallused)
+          {
+          PCRE2_SIZE j;
+          fprintf(outfile, "\n    ");
+          for (j = 0; j < lleft; j++) fprintf(outfile, "<");
+          for (j = 0; j < lmiddle; j++) fprintf(outfile, " ");
+          for (j = 0; j < lright; j++) fprintf(outfile, ">");
+          }
         }
+            
+      /* Not the main matched string. Just show it unadorned. */  
+
       else
         {
         PCHARSV(pp, start, end - start, utf, outfile);
         }
-
-      if ((pat_patctl.control & CTL_JITVERIFY) != 0 && jit_was_used)
-        fprintf(outfile, " (JIT)");
+ 
       fprintf(outfile, "\n");
-
-      if (showallused)
-        {
-        PCRE2_SIZE j;
-        fprintf(outfile, "    ");
-        for (j = 0; j < lleft; j++) fprintf(outfile, "<");
-        for (j = 0; j < lmiddle; j++) fprintf(outfile, " ");
-        for (j = 0; j < lright; j++) fprintf(outfile, ">");
-        fprintf(outfile, "\n");
-        }
-
+       
       /* Note: don't use the start/end variables here because we want to
       show the text from what is reported as the end. */


@@ -4851,25 +4874,20 @@
       }
     }    /* End of handling a successful match */


- /* There was a partial match. If the bumpalong point is not the same as
- the first inspected character, show the offset explicitly. */
+ /* There was a partial match. The value of ovector[0] is the bumpalong point,
+ not any \K point that might exist. */

   else if (capcount == PCRE2_ERROR_PARTIAL)
     {
-    PCRE2_SIZE leftchar = FLD(match_data, leftchar);
     fprintf(outfile, "Partial match");
-    if (leftchar != FLD(match_data, startchar))
-      fprintf(outfile, " at offset %d", (int)FLD(match_data, startchar));
-
     if ((dat_datctl.control & CTL_MARK) != 0 &&
          TESTFLD(match_data, mark, !=, NULL))
       {
       fprintf(outfile, ", mark=");
       PCHARSV(CASTFLD(void *, match_data, mark), 0, -1, utf, outfile);
       }
-
     fprintf(outfile, ": ");
-    PCHARSV(pp, leftchar, ulen - leftchar, utf, outfile);
+    PCHARSV(pp, ovector[0], ulen - ovector[0], utf, outfile);
     if ((pat_patctl.control & CTL_JITVERIFY) != 0 && jit_was_used)
       fprintf(outfile, " (JIT)");
     fprintf(outfile, "\n");


Modified: code/trunk/testdata/testinput16
===================================================================
--- code/trunk/testdata/testinput16    2014-10-10 17:29:08 UTC (rev 104)
+++ code/trunk/testdata/testinput16    2014-10-11 15:56:25 UTC (rev 105)
@@ -1,23 +1,18 @@
-# This test is run only when JIT support is available. It checks for a
-# successful and an unsuccessful JIT compile, and a couple of things that are
-# different with JIT.
+# This test is run only when JIT support is available. It checks JIT complete
+# and partial modes, and things that are different with JIT.


-/abc/I,jit
+#pattern jitverify

-/(?(?C1)(?=a)a)/I,jit
+# JIT does not support this pattern (callout at start of condition).

/(?(?C1)(?=a)a)/I

-/a*/I
+# Check that an infinite recursion loop is caught.

-/(?(R)a*(?1)|((?R))b)/jit
+/(?(R)a*(?1)|((?R))b)/
     aaaabcde


-# Test various compile modes
-
-#pattern jit,jitverify
-
-/abcd/
+/abcd/I
     abcd
     xyz


@@ -27,12 +22,6 @@
     ab\=ph
     xyz


-/abcd/
-    abcd
-    ab\=ps
-    ab\=ph
-    xyz
-
 /abcd/jit=1
     abcd
     ab\=ps
@@ -83,5 +72,66 @@


 /^12345678abcd/m
     12345678abcd
+    
+# Limits tests that give different output with JIT. 


-# End of testinput15
+/(a+)*zz/I
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\=find_limits
+  aaaaaaaaaaaaaz\=find_limits
+
+!((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)!I
+   /* this is a C style comment */\=find_limits
+
+/^(?>a)++/
+    aa\=find_limits
+    aaaaaaaaa\=find_limits
+    
+/(a)(?1)++/
+    aa\=find_limits
+    aaaaaaaaa\=find_limits
+
+/a(?:.)*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+    
+/a(?:.(*THEN))*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+
+/a(?:.(*THEN:ABC))*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+
+/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/
+     aabbccddee\=find_limits
+
+/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/
+     aabbccddee\=find_limits
+
+/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/
+     aabbccddee\=find_limits
+
+/(a+)*zz/
+    aaaaaaaaaaaaaz
+    aaaaaaaaaaaaaz\=match_limit=3000
+
+/(*LIMIT_MATCH=3000)(a+)*zz/I
+    aaaaaaaaaaaaaz
+    aaaaaaaaaaaaaz\=match_limit=60000
+
+/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I
+    aaaaaaaaaaaaaz
+
+/(*LIMIT_MATCH=60000)(a+)*zz/I
+    aaaaaaaaaaaaaz
+    aaaaaaaaaaaaaz\=match_limit=3000
+
+# These three have infinitely nested recursions. 
+    
+/((?2))((?1))/
+    abc
+
+/((?(R2)a+|(?1)b))/
+    aaaabcde
+
+/(?(R)a*(?1)|((?R))b)/
+    aaaabcde
+    
+# End of testinput16


Modified: code/trunk/testdata/testoutput16
===================================================================
--- code/trunk/testdata/testoutput16    2014-10-10 17:29:08 UTC (rev 104)
+++ code/trunk/testdata/testoutput16    2014-10-11 15:56:25 UTC (rev 105)
@@ -1,52 +1,28 @@
-# This test is run only when JIT support is available. It checks for a
-# successful and an unsuccessful JIT compile, and a couple of things that are
-# different with JIT.
+# This test is run only when JIT support is available. It checks JIT complete
+# and partial modes, and things that are different with JIT.


-/abc/I,jit
-Capturing subpattern count = 0
-No options
-First code unit = 'a'
-Need char = 'c'
-Subject length lower bound = 3
-No starting char list
-JIT study was successful
+#pattern jitverify

-/(?(?C1)(?=a)a)/I,jit
-Capturing subpattern count = 0
-May match empty string
-No options
-No first code unit
-No last code unit
-Study returned NULL
-JIT study was not successful
+# JIT does not support this pattern (callout at start of condition).

/(?(?C1)(?=a)a)/I
Capturing subpattern count = 0
May match empty string
-No options
-No first code unit
-No last code unit
-Subject length lower bound = -1
-No starting char list
-JIT study was not successful
+Subject length lower bound = 0
+JIT compilation was not successful

-/a*/I
-Capturing subpattern count = 0
-May match empty string
-No options
-No first code unit
-No last code unit
-Study returned NULL
+# Check that an infinite recursion loop is caught.

-/(?(R)a*(?1)|((?R))b)/S+
+/(?(R)a*(?1)|((?R))b)/
     aaaabcde
-Error -27 (JIT stack limit reached)
+Failed: error -44: JIT stack limit reached


-# Test various compile modes
-
-#pattern jit,jitverify
-
-/abcd/
+/abcd/I
+Capturing subpattern count = 0
+First code unit = 'a'
+Last code unit = 'd'
+Subject length lower bound = 4
+JIT compilation was successful
     abcd
  0: abcd (JIT)
     xyz
@@ -55,41 +31,31 @@
 /abcd/
     abcd
  0: abcd (JIT)
-    ab\P
+    ab\=ps
 Partial match: ab (JIT)
-    ab\P\P
+    ab\=ph
 Partial match: ab (JIT)
     xyz
 No match (JIT)


-/abcd/
-    abcd
- 0: abcd (JIT)
-    ab\P
-Partial match: ab (JIT)
-    ab\P\P
-Partial match: ab (JIT)
-    xyz
-No match (JIT)
-
 /abcd/jit=1
     abcd
  0: abcd (JIT)
-    ab\P
+    ab\=ps
 Partial match: ab
-    ab\P\P
+    ab\=ph
 Partial match: ab
     xyz
 No match (JIT)
-    xyz\P
+    xyz\=ps
 No match


 /abcd/jit=2
     abcd
  0: abcd
-    ab\P
+    ab\=ps
 Partial match: ab (JIT)
-    ab\P\P
+    ab\=ph
 Partial match: ab
     xyz
 No match
@@ -97,9 +63,9 @@
 /abcd/jit=3
     abcd
  0: abcd (JIT)
-    ab\P
+    ab\=ps
 Partial match: ab (JIT)
-    ab\P\P
+    ab\=ph
 Partial match: ab
     xyz
 No match (JIT)
@@ -107,9 +73,9 @@
 /abcd/jit=4
     abcd
  0: abcd
-    ab\P
+    ab\=ps
 Partial match: ab
-    ab\P\P
+    ab\=ph
 Partial match: ab (JIT)
     xyz
 No match
@@ -117,9 +83,9 @@
 /abcd/jit=5
     abcd
  0: abcd (JIT)
-    ab\P
+    ab\=ps
 Partial match: ab
-    ab\P\P
+    ab\=ph
 Partial match: ab (JIT)
     xyz
 No match (JIT)
@@ -127,9 +93,9 @@
 /abcd/jit=6
     abcd
  0: abcd
-    ab\P
+    ab\=ps
 Partial match: ab (JIT)
-    ab\P\P
+    ab\=ph
 Partial match: ab (JIT)
     xyz
 No match
@@ -137,21 +103,19 @@
 /abcd/jit=7
     abcd
  0: abcd (JIT)
-    ab\P
+    ab\=ps
 Partial match: ab (JIT)
-    ab\P\P
+    ab\=ph
 Partial match: ab (JIT)
     xyz
 No match (JIT)


/abcd/I,jit=2
Capturing subpattern count = 0
-No options
First code unit = 'a'
Last code unit = 'd'
Subject length lower bound = 4
-No starting char list
-JIT study was successful
+JIT compilation was successful

 /(*NO_START_OPT)a(*:m)b/mark
     a
@@ -160,5 +124,141 @@
 /^12345678abcd/m
     12345678abcd
  0: 12345678abcd (JIT)
+    
+# Limits tests that give different output with JIT. 


-# End of testinput15
+/(a+)*zz/I
+Capturing subpattern count = 1
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+JIT compilation was successful
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\=find_limits
+Minimum match limit = 3
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazz (JIT)
+ 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+  aaaaaaaaaaaaaz\=find_limits
+Minimum match limit = 16384
+No match (JIT)
+
+!((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)!I
+Capturing subpattern count = 1
+May match empty string
+Subject length lower bound = 0
+JIT compilation was successful
+   /* this is a C style comment */\=find_limits
+Minimum match limit = 2
+ 0: /* this is a C style comment */ (JIT)
+ 1: /* this is a C style comment */
+
+/^(?>a)++/
+    aa\=find_limits
+Minimum match limit = 2
+ 0: aa (JIT)
+    aaaaaaaaa\=find_limits
+Minimum match limit = 2
+ 0: aaaaaaaaa (JIT)
+    
+/(a)(?1)++/
+    aa\=find_limits
+Minimum match limit = 2
+ 0: aa (JIT)
+ 1: a
+    aaaaaaaaa\=find_limits
+Minimum match limit = 2
+ 0: aaaaaaaaa (JIT)
+ 1: a
+
+/a(?:.)*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+Minimum match limit = 1
+ 0: abbbbbbbbbbbbbbbbbbbbba (JIT)
+    
+/a(?:.(*THEN))*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+Minimum match limit = 1
+ 0: abbbbbbbbbbbbbbbbbbbbba (JIT)
+
+/a(?:.(*THEN:ABC))*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+Minimum match limit = 1
+ 0: abbbbbbbbbbbbbbbbbbbbba (JIT)
+
+/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/
+     aabbccddee\=find_limits
+Minimum match limit = 6
+ 0: aabbccddee (JIT)
+
+/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/
+     aabbccddee\=find_limits
+Minimum match limit = 6
+ 0: aabbccddee (JIT)
+ 1: aa
+ 2: bb
+ 3: cc
+ 4: dd
+ 5: ee
+
+/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/
+     aabbccddee\=find_limits
+Minimum match limit = 6
+ 0: aabbccddee (JIT)
+ 1: aa
+ 2: cc
+ 3: ee
+
+/(a+)*zz/
+    aaaaaaaaaaaaaz
+No match (JIT)
+    aaaaaaaaaaaaaz\=match_limit=3000
+Failed: error -45: match limit exceeded
+
+/(*LIMIT_MATCH=3000)(a+)*zz/I
+Capturing subpattern count = 1
+Match limit = 3000
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+JIT compilation was successful
+    aaaaaaaaaaaaaz
+Failed: error -45: match limit exceeded
+    aaaaaaaaaaaaaz\=match_limit=60000
+Failed: error -45: match limit exceeded
+
+/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I
+Capturing subpattern count = 1
+Match limit = 3000
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+JIT compilation was successful
+    aaaaaaaaaaaaaz
+Failed: error -45: match limit exceeded
+
+/(*LIMIT_MATCH=60000)(a+)*zz/I
+Capturing subpattern count = 1
+Match limit = 60000
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+JIT compilation was successful
+    aaaaaaaaaaaaaz
+No match (JIT)
+    aaaaaaaaaaaaaz\=match_limit=3000
+Failed: error -45: match limit exceeded
+
+# These three have infinitely nested recursions. 
+    
+/((?2))((?1))/
+    abc
+Failed: error -44: JIT stack limit reached
+
+/((?(R2)a+|(?1)b))/
+    aaaabcde
+Failed: error -44: JIT stack limit reached
+
+/(?(R)a*(?1)|((?R))b)/
+    aaaabcde
+Failed: error -44: JIT stack limit reached
+    
+# End of testinput16


Modified: code/trunk/testdata/testoutput2
===================================================================
--- code/trunk/testdata/testoutput2    2014-10-10 17:29:08 UTC (rev 104)
+++ code/trunk/testdata/testoutput2    2014-10-11 15:56:25 UTC (rev 105)
@@ -9286,17 +9286,17 @@
     xyzabc123pqr 
  0: 123
     xyzabc12\=ps
-Partial match at offset 6: abc12
+Partial match: 12
     xyzabc12\=ph
-Partial match at offset 6: abc12
+Partial match: 12


 /\babc\b/
     +++abc+++
  0: abc
     +++ab\=ps
-Partial match at offset 3: +ab
+Partial match: ab
     +++ab\=ph
-Partial match at offset 3: +ab
+Partial match: ab


/(?&word)(?&element)(?(DEFINE)(?<element><[^m][^>]>[^<])(?<word>\w*+))/B
------------------------------------------------------------------
@@ -10324,7 +10324,7 @@

 /(?<=abc)def/
     abc\=ph
-Partial match at offset 3: abc
+Partial match: 


 /abc$/
     abc
@@ -11877,9 +11877,9 @@


 /(?<=123)(*MARK:xx)abc/mark
     xxxx123a\=ph
-Partial match at offset 7, mark=xx: 123a
+Partial match, mark=xx: a
     xxxx123a\=ps
-Partial match at offset 7, mark=xx: 123a
+Partial match, mark=xx: a


 /123\Kabc/
     xxxx123a\=ph


Modified: code/trunk/testdata/testoutput6
===================================================================
(Binary files differ)