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