package b_dump_strings; use B qw(minus_c save_BEGINs peekop class walkoptree walkoptree_exec main_start main_root cstring sv_undef); BEGIN { open OUT, ">$ENV{OUTFILE}" } sub B::CV::debug { my ($sv) = @_; B::walkoptree_exec($sv->START, "debug"); } sub B::OP::debug { my ($op) = @_; # print "OP ", class($op), " ", $op->name, "\n"; eval { if ($op->name eq 'entersub') { $op2 = $op->first->first or return; if ($op2->name eq 'pushmark') { my $s = $op2->sibling->sv->PV; my $l; for ($l = $op2->sibling; ${$l->sibling}; $l = $l->sibling) {} $s =~ s/"/\\"/g; if ($l->first->sv->NAME eq '_') { print OUT qq($::pkg N("$s")\n); } } } }; } sub B::RV::debug { my ($op) = @_; $op->RV->debug; } sub B::SVOP::debug { my ($op) = @_; $op->sv->debug; } sub B::PV::debug { my ($sv) = @_; # print "STRING ", $sv->PV, "\n"; } sub B::IV::debug { my ($sv) = @_; # printf "IV\t%d\n", $sv->IV; } sub B::NV::debug { my ($sv) = @_; # printf "NV\t%s\n", $sv->NV; } sub B::PVIV::debug { my ($sv) = @_; # printf "IV\t%d\n", $sv->IV; } sub B::PVNV::debug { my ($sv) = @_; # printf "NV\t%s\n", $sv->NV; } sub B::AV::debug { my ($av) = @_; # print "ARRAY\n"; } sub B::GV::debug { my ($gv) = @_; # printf "GV %s::%s\n", $gv->STASH->NAME, $gv->SAFENAME; } sub B::NULL::debug { # print "NUL\n"; } sub B::SPECIAL::debug {} sub B::SV::debug { die "SV"; } sub B::BM::debug { die "BM"; } sub B::PVLV::debug { die "PVLV"; } sub B::GV::pgv { my ($gv) = @_; # print $gv->NAME, "\n"; $gv->SV->debug; $gv->HV->debug; $gv->AV->debug; $gv->CV->debug; } sub search { foreach my $pkg (grep { /^[a-z]/ && !/^(diagnostics|strict|attributes|main)/ } grep { /\w+::$/ } keys %main::) { $::pkg = $pkg; foreach (keys %{$main::{$pkg}}) { print STDERR "$pkg $_ XXXXX\n"; local *f = *{$main::{$pkg}{$_}}; B::svref_2object(\*f)->pgv; } } print STDERR "DONE\n"; } CHECK { search() } INIT { exit 0 } #use lib qw(. /home/pixel/gi/perl-install); ##use commands; #require '/tmp/t.pl'; #search(); 1;