El método START de un objeto B::CV nos da el punto de
entrada en la ejecución. El método next de un objeto B::OP
proporciona el siguiente nodo a ejecutar.
pp2@nereida:~/src/perl/B$ cat -n bex2.pl
1 #!/usr/local/bin/perl -w
2 use strict;
3 use B;
4
5 my $s = sub {
6 my $a = shift;
7 print $a+1;
8 };
9
10 my $b = B::svref_2object($s);
11 my $op = $b->START;
12 my ($class, $name, $desc);
13 format STDOUT =
14 @<<<<<<<<<@|@<<<<<<<<<<<<@|@<<<<<<<<<<<<<<<<<<<<<<<<<
15 $class, '|', $name, '|', $desc
16 .
17 do {
18 ($class, $name, $desc) = (B::class($op), $op->name, $op->desc);
19 write;
20 } while $op = $op->next and !$op->isa("B::NULL");
Es necesario comprobar que $op no es un objeto B::NULL
ya que el puntero next es un puntero C que B
deja disponible sin envoltorio alguno.
La ejecución produce la secuencia de operaciones en orden de ejecución:
pp2@nereida:~/src/perl/B$ bex2.pl | cat -n 1 COP | nextstate | next statement 2 PADOP | gv | glob value 3 UNOP | rv2av | array dereference 4 UNOP | shift | shift 5 OP | padsv | private variable 6 BINOP | sassign | scalar assignment 7 COP | nextstate | next statement 8 OP | pushmark | pushmark 9 OP | padsv | private variable 10 SVOP | const | constant item 11 BINOP | add | addition (+) 12 LISTOP | print | print 13 UNOP | leavesub | subroutine exit |
my $s = sub {
my $a = shift;
print $a+1;
};
|
Casiano Rodríguez León
