On Fri, 7 Mar 2003 at 21:32 -0800, David Dyck <[EMAIL PROTECTED]> wrote:
> On Mon, 3 Mar 2003 at 06:02 -0000, [EMAIL PROTECTED] wrote:
>
> > The simplest I had with Inline was:
> > BEGIN {
> > require Inline;
> > Inline->import(qw/ Config DIRECTORY _Inline_test /);
> > Inline->import('C', 'void true() { }');
> > Inline->import('C', 'void true2() { }');
> > }
> >
> > .. and I'm guessing that it is Inline itself that is requiring the
> > BEGIN; I don't know whether it is also intrinsic to the bug.
>
>
> Thanks, I've been using this trying different ways to simplify it,
> but it is interesting that adding
> BEGIN { $::RD_TRACE = 1; }
> before trying to parse true and true2 shows that the whole C
> grammar in
> Inline::C::ParseRecDescent
> is processed twice, I would think that it should only be
> passed to Parse::RecDescent->new once, since it the grammar isn't
> changed.
When I apply this patch (that I think is an optimization to Inline::C::ParseRecDescent)
I can get make test in Inline::C to pass, but I think that if we apply something
like this, then it will hide a bug in perl 5.8.1 and 5.9.0, which isn't good.
I'm still hoping that this information will trigger some ideas
on how to make a stand alone (non Inline) test case.
Any takers?
--- Inline-0.44/C/lib/Inline/C/ParseRecDescent.pm Mon Nov 4 13:39:09 2002
+++ Inline-0.44-3/C/lib/Inline/C/ParseRecDescent.pm Sat Mar 8 20:13:22 2003
@@ -9,6 +9,7 @@
}
}
+our $parser;
sub get_parser {
my $o = shift;
eval { require Parse::RecDescent };
@@ -17,7 +18,11 @@
$@
END
$main::RD_HINT++;
- Parse::RecDescent->new(grammar())
+ if ($parser) {
+ delete $parser->{data} if exists $parser->{data};
+ return $parser;
+ }
+ $parser = Parse::RecDescent->new(grammar());
}
sub grammar {