App-EvalServerAdvanced
view release on metacpan or search on metacpan
lib/App/EvalServerAdvanced/Sandbox/Plugin/Perlbot.pm view on Meta::CPAN
package App::EvalServerAdvanced::Sandbox::Plugin::Perlbot;
use strict;
use warnings;
use Moo::Role;
use Data::Dumper;
use B::Deparse;
use Perl::Tidy;
use PerlIO;
do {my $temp; open(my $fh, ">", \$temp); close($fh)};
sub deparse_perl_code {
my( $class, $lang, $code ) = @_;
my $sub;
{
no strict; no warnings; no charnames;
$sub = eval "use $]; package botdeparse; sub{ $code\n }; use namespace::autoclean;";
}
if( $@ ) { die $@ }
my %methods = (map {$_ => botdeparse->can($_)} grep {botdeparse->can($_)} keys {%botdeparse::}->%*);
my $dp = B::Deparse->new("-p", "-q", "-x7", "-d");
no warnings;
local *B::Deparse::declare_hints = sub { '' };
my @out;
my $clean_out = sub {
my $ret = shift;
$ret =~ s/\{//;
$ret =~ s/package (?:\w+(?:::)?)+;//;
$ret =~ s/no warnings;//;
$ret =~ s/\s+/ /g;
$ret =~ s/\s*\}\s*$//;
$ret =~ s/no feature ':all';//;
$ret =~ s/use feature [^;]+;//;
$ret =~ s/^\(\)//g;
$ret =~ s/^\s+|\s+$//g;
return $ret;
};
for my $sub (grep {!/^(can|DOES|isa)$/} keys %methods) {
my $ret = $clean_out->($dp->coderef2text($methods{$sub}));
push @out, "sub $sub {$ret} ";
}
my $ret = $dp->coderef2text($sub);
$ret = $clean_out->($ret);
push @out, $ret;
my $fullout = join(' ', @out);
my $hide = do {package hiderr; sub print{}; bless {}};
my $tidy_out="";
eval {
my $foo = "$fullout";
Perl::Tidy::perltidy(source => \$foo, destination => \$tidy_out, errorfile => $hide, logfile => $hide);
};
$tidy_out = $fullout if ($@);
print STDOUT $tidy_out;
}
#-----------------------------------------------------------------------------
# Evaluate the actual code
#-----------------------------------------------------------------------------
sub run_perl {
my( $class, $lang, $code ) = @_;
my $outbuffer = "";
open(my $stdh, ">", \$outbuffer);
select($stdh);
$|++;
local $@;
( run in 1.622 second using v1.01-cache-2.11-cpan-39bf76dae61 )