eval {
package DB;
@ret = &$sub(@args);
};
####
package Devel::TobyLite;
use strict;
use warnings;
use Time::HiRes ();
our $IN_TRACE = 0;
sub DB::DB {}
sub DB::sub {
goto &$DB::sub if $IN_TRACE;
my $start;
my $sub = $DB::sub;
{
local $IN_TRACE = 1;
print STDERR ">> entering $sub\n";
$start = Time::HiRes::time;
}
my (@ret, $ret);
#package DB {
if (wantarray) {
no strict "refs";
eval { package DB; @ret = &$sub; };
}
elsif (defined wantarray) {
no strict "refs";
eval { package DB; $ret = &$sub; };
}
else {
no strict "refs";
eval { package DB; &$sub; };
}
#}
{
local $IN_TRACE = 1;
my $end = Time::HiRes::time();
print STDERR "<< leaving $sub ", $end - $start, "\n";
die +(caller), $@, "@_" if $@;
}
if (wantarray) {
@ret;
}
else {
$ret;
}
}
1;
####
$ ./perl -Ilib -I.. -d:TobyLite -e 'sub x { print qq(ok\n); } sub z { x() } z()'
>> entering UNIVERSAL::import
<< leaving UNIVERSAL::import 1.40666961669922e-05
>> entering main::z
>> entering main::x
ok
<< leaving main::x 3.29017639160156e-05
<< leaving main::z 8.48770141601562e-05