X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FB%2FB%2FDebug.pm;h=8b34a1d8af022e2c7e2abde8772f7f8fd6ad4736;hb=bb7c595be2e30a806b95ad83e9d3613aeb95c384;hp=1327591e7f26ef33f6fe444c13687ae504bb2957;hpb=c03c28449e79a2a6287a0aa1cdd5d6637750d5c3;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/B/B/Debug.pm b/ext/B/B/Debug.pm index 1327591..8b34a1d 100644 --- a/ext/B/B/Debug.pm +++ b/ext/B/B/Debug.pm @@ -1,4 +1,7 @@ package B::Debug; + +our $VERSION = '1.02'; + use strict; use B qw(peekop class walkoptree walkoptree_exec main_start main_root cstring sv_undef); @@ -8,14 +11,25 @@ my %done_gv; sub B::OP::debug { my ($op) = @_; - printf <<'EOT', class($op), $$op, ${$op->next}, ${$op->sibling}, $op->ppaddr, $op->targ, $op->type, $op->seq, $op->flags, $op->private; + printf <<'EOT', class($op), $$op, ${$op->next}, ${$op->sibling}, $op->ppaddr, $op->targ, $op->type; %s (0x%lx) op_next 0x%x op_sibling 0x%x op_ppaddr %s op_targ %d op_type %d +EOT + if ($] > 5.009) { + printf <<'EOT', $op->opt, $op->static; + op_opt %d + op_static %d +EOT + } else { + printf <<'EOT', $op->seq; op_seq %d +EOT + } + printf <<'EOT', $op->flags, $op->private; op_flags %d op_private %d EOT @@ -33,6 +47,16 @@ sub B::BINOP::debug { printf "\top_last\t\t0x%x\n", ${$op->last}; } +sub B::LOOP::debug { + my ($op) = @_; + $op->B::BINOP::debug(); + printf <<'EOT', ${$op->redoop}, ${$op->nextop}, ${$op->lastop}; + op_redoop 0x%x + op_nextop 0x%x + op_lastop 0x%x +EOT +} + sub B::LOGOP::debug { my ($op) = @_; $op->B::UNOP::debug(); @@ -59,7 +83,8 @@ sub B::PMOP::debug { sub B::COP::debug { my ($op) = @_; $op->B::OP::debug(); - printf <<'EOT', $op->label, $op->stashpv, $op->file, $op->seq, $op->arybase, $op->line, ${$op->warnings}; + my $cop_io = class($op->io) eq 'SPECIAL' ? '' : $op->io->as_string; + printf <<'EOT', $op->label, $op->stashpv, $op->file, $op->cop_seq, $op->arybase, $op->line, ${$op->warnings}, cstring($cop_io); cop_label %s cop_stashpv %s cop_file %s @@ -67,6 +92,7 @@ sub B::COP::debug { cop_arybase %d cop_line %d cop_warnings 0x%x + cop_io %s EOT } @@ -80,7 +106,7 @@ sub B::SVOP::debug { sub B::PVOP::debug { my ($op) = @_; $op->B::OP::debug(); - printf "\top_pv\t\t0x%x\n", $op->pv; + printf "\top_pv\t\t%s\n", cstring($op->pv); } sub B::PADOP::debug { @@ -89,12 +115,6 @@ sub B::PADOP::debug { printf "\top_padix\t\t%ld\n", $op->padix; } -sub B::CVOP::debug { - my ($op) = @_; - $op->B::OP::debug(); - printf "\top_cv\t\t0x%x\n", ${$op->cv}; -} - sub B::NULL::debug { my ($sv) = @_; if ($$sv == ${sv_undef()}) { @@ -117,6 +137,15 @@ sub B::SV::debug { EOT } +sub B::RV::debug { + my ($rv) = @_; + B::SV::debug($rv); + printf <<'EOT', ${$rv->RV}; + RV 0x%x +EOT + $rv->RV->debug; +} + sub B::PV::debug { my ($sv) = @_; $sv->B::SV::debug(); @@ -176,15 +205,16 @@ sub B::CV::debug { my ($padlist) = $sv->PADLIST; my ($file) = $sv->FILE; my ($gv) = $sv->GV; - printf <<'EOT', $$stash, $$start, $$root, $$gv, $file, $sv->DEPTH, $padlist, ${$sv->OUTSIDE}; + printf <<'EOT', $$stash, $$start, $$root, $$gv, $file, $sv->DEPTH, $padlist, ${$sv->OUTSIDE}, $sv->OUTSIDE_SEQ; STASH 0x%x START 0x%x ROOT 0x%x GV 0x%x FILE %s DEPTH %d - PADLIST 0x%x + PADLIST 0x%x OUTSIDE 0x%x + OUTSIDE_SEQ %d EOT $start->debug if $start; $root->debug if $root; @@ -197,25 +227,27 @@ sub B::AV::debug { $av->B::SV::debug; my(@array) = $av->ARRAY; print "\tARRAY\t\t(", join(", ", map("0x" . $$_, @array)), ")\n"; - printf <<'EOT', scalar(@array), $av->MAX, $av->OFF, $av->AvFLAGS; - FILL %d + printf <<'EOT', scalar(@array), $av->MAX, $av->OFF; + FILL %d MAX %d OFF %d +EOT + printf <<'EOT', $av->AvFLAGS if $] < 5.009; AvFLAGS %d EOT } - + sub B::GV::debug { my ($gv) = @_; if ($done_gv{$$gv}++) { - printf "GV %s::%s\n", $gv->STASH->NAME, $gv->NAME; + printf "GV %s::%s\n", $gv->STASH->NAME, $gv->SAFENAME; return; } my ($sv) = $gv->SV; my ($av) = $gv->AV; my ($cv) = $gv->CV; $gv->B::SV::debug; - printf <<'EOT', $gv->NAME, $gv->STASH->NAME, $gv->STASH, $$sv, $gv->GvREFCNT, $gv->FORM, $$av, ${$gv->HV}, ${$gv->EGV}, $$cv, $gv->CVGEN, $gv->LINE, $gv->FILE, $gv->GvFLAGS; + printf <<'EOT', $gv->SAFENAME, $gv->STASH->NAME, $gv->STASH, $$sv, $gv->GvREFCNT, $gv->FORM, $$av, ${$gv->HV}, ${$gv->EGV}, $$cv, $gv->CVGEN, $gv->LINE, $gv->FILE, $gv->GvFLAGS; NAME %s STASH %s (0x%x) SV 0x%x