On Mon, Mar 10, 2003 at 05:56:17AM +0000, hv@crypt.org wrote:
> David Dyck <david.dyck@fluke.com> wrote:
> :The following code using Parse::RecDescent does
> :an infinite loop with perl5.9.0 (presuming with 5.8.1)
> :but finishes fine with perl5.8.0. I haven't simplified
> :this as much as I could yet, the grammar comes
> :from derived from Inline::C::ParseRecDescent, where
> :I first saw the problem in its make test.
>
> Here's another step of simplification:
>
> #!/usr/bin/perl -w
> use strict;
>
> sub get_parser {
> require Parse::RecDescent;
> $main::RD_HINT++;
> Parse::RecDescent->new(grammar())
> }
>
>
> sub grammar {
> <<'END';
> code: 'x' { '...' }
> END
> }
>
> BEGIN { $::RD_TRACE = 1; }
>
> get_parser()->code('x');
> get_parser()->code('x');
> __END__
The infinite loop happens in re_intuit_start. It always 'goto restart'
at line 648 in regexec.c.
s = fbm_instr( ...
at line 622 return NULL; which itself isn't that amazing since its
'bigend' argument happens to lag behind 'big' ( see util.c:426 )
It's caused by this:
/* we may be pointing at the wrong string */
if (s && RX_MATCH_COPIED(prog))
s = prog->subbeg + (s - SvPVX(sv))
(regexec.c:546)
Removing those lines stops cures that infinite loop;
They're there since
Change 18533 by hv@hv-crypt.org on 2003/01/21 02:15:29
Subject: Re: [perl #17757] s///g fails when using English & study in 5.8.0
Hoping this helps,
Regards
Adi