> On Sun, Jan 13, 2002 at 07:39:52PM +0100, Mattia Barbon wrote:
> > > perlcc seems to be dropping BEGIN blocks entirely, that's the problem.
> >
> > No, that's correct. Explanation: if I have a module Foo
> > ----
> > package Foo;
> > 
> > $x = 1;
> > print "AAA";
> > 
> > sub a { $x }
> > 
> > 1;
> > ----
> > and a main program foo.pl
> > ----
> > BEGIN { # think use Foo;, expanded for clarity
> >     require Foo;
> > }
> > 
> > print Foo::a();
> > ----
> > perl -MO=C foo.pl
> > calls B::C::compile _after_ it ran the BEGIN blocks; this means that the 
> > optree in Foo that initializes $x, and does "print AAA" has already been 
> > freed. So, even if B::C could save BEGIN blocks, this is not a good 
> > idea, for quite a lot of reasons.
I didn't write what I meant, sorry, see below

> $ bleadperl -MO=-qq,Deparse foo.plx
> sub BEGIN {
>     print "foo\n";
> }
> print "bar\n";
> 
> If B::Deparse can save BEGIN blocks, B::C can.
I didn't mean that I can't write code to make B::C save BEGIN blocks
( it'd require <10 lines, probably ), I did mean that doing so would
not be a god idea: _I am
saving the state of the program after those blocks were ran_ and
they will be run _another time_ at runtime, and this is not correct:
( for example use lib 'a'; would put 'a' into @INC twice, once
( correctly ) at compile time, and another time ( incorrectly ) at runtime ). In this 
case this is not harmful, but you get the idea.

Regards
Mattia



Reply via email to