[前][次][番号順一覧][スレッド一覧]

ruby-changes:17923

From: naruse <ko1@a...>
Date: Fri, 26 Nov 2010 12:28:54 +0900 (JST)
Subject: [ruby-changes:17923] Ruby:r29939 (trunk): * regcomp.c (setup_tree): restart setup_tree() for a node whose

naruse	2010-11-26 12:28:48 +0900 (Fri, 26 Nov 2010)

  New Revision: 29939

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29939

  Log:
    * regcomp.c (setup_tree): restart setup_tree() for a node whose
      AnchorNode's type is ANCHOR_PREC_BEHIND or ANCHOR_PREC_BEHIND_NOT
      and divide_look_behind_alternatives() divided it to NT_ALT or
      NT_LIST. [ruby-core:33370]

  Modified files:
    trunk/ChangeLog
    trunk/regcomp.c
    trunk/test/ruby/test_regexp.rb

Index: regcomp.c
===================================================================
--- regcomp.c	(revision 29938)
+++ regcomp.c	(revision 29939)
@@ -3692,6 +3692,7 @@
   int type;
   int r = 0;
 
+restart:
   type = NTYPE(node);
   switch (type) {
   case NT_LIST:
@@ -3906,6 +3907,7 @@
 	  if (r > 0) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;
 	  r = setup_look_behind(node, reg, env);
 	  if (r != 0) return r;
+	  if (NTYPE(node) != NT_ANCHOR) goto restart;
 	  r = setup_tree(an->target, reg, state, env);
 	}
 	break;
@@ -3918,6 +3920,7 @@
 	  if (r > 0) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;
 	  r = setup_look_behind(node, reg, env);
 	  if (r != 0) return r;
+	  if (NTYPE(node) != NT_ANCHOR) goto restart;
 	  r = setup_tree(an->target, reg, (state | IN_NOT), env);
 	}
 	break;
@@ -5351,6 +5354,15 @@
   r = onig_parse_make_tree(&root, pattern, pattern_end, reg, &scan_env);
   if (r != 0) goto err;
 
+#ifdef ONIG_DEBUG_PARSE_TREE
+# if 0
+  fprintf(stderr, "ORIGINAL PARSE TREE:\n");
+  if (!onig_is_prelude()) {
+    print_tree(stderr, root);
+  }
+# endif
+#endif
+
 #ifdef USE_NAMED_GROUP
   /* mixed use named group and no-named group */
   if (scan_env.num_named > 0 &&
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 29938)
+++ ChangeLog	(revision 29939)
@@ -1,3 +1,10 @@
+Fri Nov 26 12:12:50 2010  NARUSE, Yui  <naruse@r...>
+
+	* regcomp.c (setup_tree): restart setup_tree() for a node whose
+	  AnchorNode's type is ANCHOR_PREC_BEHIND or ANCHOR_PREC_BEHIND_NOT
+	  and divide_look_behind_alternatives() divided it to NT_ALT or
+	  NT_LIST. [ruby-core:33370]
+
 Fri Nov 26 11:40:11 2010  NAKAMURA Usaku  <usa@r...>
 
 	* vm_dump.c (dump_thread): get only required rights of the target
Index: test/ruby/test_regexp.rb
===================================================================
--- test/ruby/test_regexp.rb	(revision 29938)
+++ test/ruby/test_regexp.rb	(revision 29939)
@@ -583,6 +583,9 @@
     failcheck('(?<!.*)')
     check(/(?<=A|B.)C/, [%w(C AC), %w(C BXC)], %w(C BC))
     check(/(?<!A|B.)C/, [%w(C C), %w(C BC)], %w(AC BXC))
+
+    assert_not_match(/(?<!aa|b)c/i, "Aac")
+    assert_not_match(/(?<!b|aa)c/i, "Aac")
   end
 
   def test_parse_kg

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]