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/