summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@cpan.org>2000-03-11 10:08:47 +0000
committerGurusamy Sarathy <gsar@cpan.org>2000-03-11 10:08:47 +0000
commit96776eda41a10f1802094966189301751fcdd558 (patch)
tree53055a37fcdc55960e408805abc2c8e014874b1b
parent48a26b3aff3d4a22b7cc3f3ba0bb5977d168a801 (diff)
downloadperl-96776eda41a10f1802094966189301751fcdd558.tar.gz
fix optimizer bug in /^(?p{"a"})b/ (from Ilya Zakharevich)
p4raw-id: //depot/perl@5644
-rw-r--r--regcomp.c3
-rwxr-xr-xt/op/pat.t4
2 files changed, 6 insertions, 1 deletions
diff --git a/regcomp.c b/regcomp.c
index 9fbb3df20e..13fa36c201 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -1222,7 +1222,7 @@ S_study_chunk(pTHX_ regnode **scanp, I32 *deltap, regnode *last, scan_data_t *da
if (data)
data->flags |= SF_HAS_EVAL;
}
- else if (OP(scan) == LOGICAL && scan->flags == 2) { /* Embedded */
+ else if (OP(scan) == LOGICAL && scan->flags == 2) { /* Embedded follows */
if (flags & SCF_DO_SUBSTR) {
scan_commit(data);
data->longest = &(data->longest_float);
@@ -1230,6 +1230,7 @@ S_study_chunk(pTHX_ regnode **scanp, I32 *deltap, regnode *last, scan_data_t *da
is_inf = is_inf_internal = 1;
if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
cl_anything(data->start_class);
+ flags &= ~SCF_DO_STCLASS;
}
/* Else: zero-length, ignore. */
scan = regnext(scan);
diff --git a/t/op/pat.t b/t/op/pat.t
index 103e6132b5..7f20185e93 100755
--- a/t/op/pat.t
+++ b/t/op/pat.t
@@ -369,6 +369,10 @@ print "# ans='@ans'\n# expect='$expect'\nnot " if "@ans" ne $expect;
print "ok $test\n";
$test++;
+print "not " unless "abc" =~ /^(??{"a"})b/;
+print "ok $test\n";
+$test++;
+
my $matched;
$matched = qr/\((?:(?>[^()]+)|(??{$matched}))*\)/;