From 7e344b0b7b877fcf203ab29f56e417993fb4cb11 Mon Sep 17 00:00:00 2001 From: usa Date: Thu, 16 Oct 2014 07:35:51 +0000 Subject: * regcomp.c, regexec.c: Optimization should be disabled not only for /(?<=x).*/ but also for /(?!x).*/. (merge r47598 partially. [Bug #9728]) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@47976 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- regcomp.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'regcomp.c') diff --git a/regcomp.c b/regcomp.c index 705e0faad7..b4264a40bd 100644 --- a/regcomp.c +++ b/regcomp.c @@ -4495,6 +4495,9 @@ concat_opt_anc_info(OptAncInfo* to, OptAncInfo* left, OptAncInfo* right, if (right_len == 0) { to->right_anchor |= left->right_anchor; } + else { + to->right_anchor |= (left->right_anchor & ANCHOR_PREC_READ_NOT); + } } static int @@ -5068,7 +5071,8 @@ optimize_node_left(Node* node, NodeOptInfo* opt, OptEnv* env) case ANCHOR_END_BUF: case ANCHOR_SEMI_END_BUF: case ANCHOR_END_LINE: - case ANCHOR_LOOK_BEHIND: /* just for (?<=x).* */ + case ANCHOR_LOOK_BEHIND: /* just for (?<=x).* */ + case ANCHOR_PREC_READ_NOT: /* just for (?!x).* */ add_opt_anc_info(&opt->anc, NANCHOR(node)->type); break; @@ -5091,7 +5095,6 @@ optimize_node_left(Node* node, NodeOptInfo* opt, OptEnv* env) } break; - case ANCHOR_PREC_READ_NOT: case ANCHOR_LOOK_BEHIND_NOT: break; } @@ -5357,7 +5360,8 @@ set_optimize_info_from_tree(Node* node, regex_t* reg, ScanEnv* scan_env) ANCHOR_BEGIN_POSITION | ANCHOR_ANYCHAR_STAR | ANCHOR_ANYCHAR_STAR_ML | ANCHOR_LOOK_BEHIND); - reg->anchor |= opt.anc.right_anchor & (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF); + reg->anchor |= opt.anc.right_anchor & (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF | + ANCHOR_PREC_READ_NOT); if (reg->anchor & (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF)) { reg->anchor_dmin = opt.len.min; -- cgit v1.2.3