Devel-EvalContext
view release on metacpan or search on metacpan
lib/Devel/EvalContext.pm view on Meta::CPAN
package Devel::EvalContext;
{ package main; sub Devel::EvalContext::_hygenic_eval { eval $_[0] } }
use strict;
use warnings;
use PadWalker qw(peek_sub);
use Carp;
use Data::Alias qw(alias);
use B ();
our $VERSION = "0.09";
our $TRACING = 0;
# public interface needs:
#
# create an empty context
# create an empty context from here (is this possible?)
# clone a context
# evaluate in a context and get new context
# inspect hints and variables
# global vars allowing bits to talk without using closures or lexicals
our $_new_context;
sub _warn {
warn @_ if $TRACING;
}
sub _warnblock {
_warn " | $_\n" for split /\n/, $_[0];
}
sub _warndump {
require YAML;
_warnblock(YAML::Dump($_[0]));
}
sub _magic_code {
qq{
#line 1 "_magic_code"
sub {
$_[0]
#line 3 "_magic_code"
eval \$_[0];
}
};
}
sub _save_context {
my $evalcv = delete $_new_context->{evalcv};
_warn "saving context for ", $evalcv->object_2svref, "\n";
$_new_context->{saved}++; # this confirms that the code has been compiled
# should I do my own pp version?
my $v = peek_sub $evalcv->object_2svref;
$_new_context->{vars} = {};
while (my ($key, $val) = each %$v) {
next if $key =~ /^.__repl_/;
_warn " processing: $key => $val\n";
$_new_context->{vars}{$key} = $val;
}
# save hints
# hrm I'm getting the wrong values
$_new_context->{hints}->{'$^H'} = $^H & ~(256);
$_new_context->{hints}->{'%^H'} = \%^H;
( run in 1.741 second using v1.01-cache-2.11-cpan-56fb94df46f )