Bytecode.pm revision 1
2N/A# Copyright (c) 2003 Enache Adrian. All rights reserved. 2N/A# This module is free software; you can redistribute and/or modify 2N/A# it under the same terms as Perl itself. 2N/A################################################# 2N/A################################################# 2N/A # my $pmrootix = $hv->PMROOT->ix; # XXX 2N/A # asm "xhv_pmroot", $pmrootix; # XXX 2N/A next if $i =
not $i;
2N/A################################################# 2N/A # asm "xio_flags", ord($io->IoFLAGS) & ~32; # XXX XXX while (
my($k,$v) =
each %
stash) {
###################################################### # trick for /$a/o in pp_regcomp # change #18774 made my life hard # not needed if no pseudohashes # deal with sort / formline }
elsif ($
name eq 'formline') {
# asm "op_seq", -1; XXX don't allocate OPs piece by piece # my $pmnextix = $op->pmnext->ix; # XXX }
elsif ($
op->
name eq 'pushre') {
$
rrop =
"op_pmreplrootpo";
$
rrop =
"op_pmreplrootgv";
# asm "op_pmnext", $pmnextix; # XXX return unless my $
pv = $
op->
pv;
asm "op_pv_tr",
join ',',
length($
pv)/
2,
unpack(
"s*", $
pv);
defined($
ix) ? $
ix :
do {
while ($_ =
pop @
cloop) {
################################################# next unless $_->
FILE eq $
0;
asm "push_begin", $_->
ix;
next unless $_->
FILE eq $
0;
# XXX BEGIN { goto A while 1; A: } next unless $
op->
name eq 'require' ||
# this kludge needed for tests asm "push_begin", $_->
ix;
next unless $_->
FILE eq $
0;
next unless $_->
FILE eq $
0;
*
asm =
sub {
print " @_\n" };
*
nice =
sub ($) {
print "\n@_\n" };
$
head =
"#! $^X\nuse ByteLoader $ByteLoader::VERSION;\n";
open STDOUT,
">$1" or die "open $1: $!";
$
scan =
length($
1) ? $
1 : $
0;
# this is here for the testsuite bwarn "Ignoring '$_' option";
/^
#\s*line\s+\d+\s+("?)(.*)\1/ and $files{$2} = 1; bwarn "keeping the syntax tree: \"goto\" op found";
bwarn "cannot rescan '$scan'";
B::Bytecode - Perl compiler's bytecode backend Compiles a Perl script into a bytecode format that could be loaded later by the ByteLoader module and executed as a regular Perl script. $ perl -MO=Bytecode,-H,-ohi -e 'print "hi!\n"' Save all the BEGIN blocks. Normally only BEGIN blocks that C<require> other files (ex. C<use Foo;>) are saved. prepend a C<use ByteLoader VERSION;> line to the produced bytecode. keep the syntax tree - it is stripped by default. put the bytecode in <outfile> instead of dumping it to STDOUT. scan the script for C<# line ..> directives and for <goto LABEL> expressions. When gotos are found keep the syntax tree. C<BEGIN { goto A: while 1; A: }> won't even compile. C<?...?> and C<reset> do not work as expected. variables in C<(?{ ... })> constructs are not properly scoped. scripts that use source filters will fail miserably. There are also undocumented bugs and options. THIS CODE IS HIGHLY EXPERIMENTAL. USE AT YOUR OWN RISK. Originally written by Malcolm Beattie <mbeattie@sable.ox.ac.uk> and modified by Benjamin Stuhl <sho_pi@hotmail.com>. Rewritten by Enache Adrian <enache@rdslink.ro>, 2003 a.d.