Now I understand I missed to tell you this fundamental detail before,
sorry.

> 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.

>     # foo.plx
>     BEGIN {
>         print "foo\n";
>     }
>     print "bar\n";
> 
> $ bleadperl foo.plx
> foo
> bar
> $ perlcc foo.plx
> $ ./a.out 
> bar
> 
> The result from the compiled program should be the same as the
> original.  For some reason the BEGIN block is getting dropped when the
> program is compiled.  That's a bug.
It is not a bug that the BEGIN blocks are dropped. It is a B::C bug
induced by the perl design that it can't deal gracefully with code in
BEGIN blocks that print()s, or does other things to the "environment"
( OS, screen, disks, %ENV ), or that initializes data structures outside the scope of 
perl ( this includes interpreter-local data using MY_CXT ( Opcode.pm ), or creating a 
SV holding a pointer to an external data structure, or dup()s filehandles ( 
Test::Builder ) [1] ). The only solution to these problems is something like 
B::Script ( mentioned in april-june on p5p ).

Regards
Mattia

[1] try searching perlcc.PL for Test::Builder...

Reply via email to