djantzen has asked for the wisdom of the Perl Monks concerning the following question:
Hi All, I'm confused about a namespace issue when using Safe. According to the documentation, code executed within a Safe compartment believes that it resides in package main, when in fact it is in a special namespace of $Safe::Root0 (or another name of your choosing). Now, using B::Deparse::coderef2text will return a bare block where the first statement is a package statement reflecting the package in which the code was originally compiled. Something like:
{ package Foo; print "Hello World\n"; }
When running this B::Deparse'd code through Safe::reval, I'd expect the code then to execute within Safe::Root0::Foo. However, as the below example shows, the code thinks it is in package main, as the documentation of Safe says code ought to. Does this mean that package statements in Safe::reval'd strings are wholly ignored, thereby making it pointless to remove them, or is the code actually in Safe::Root0::Foo but believes it's in main?
Output: "PACKAGE is main"Package Foo; sub new { my $class = shift; my $this = bless {}, $class; $this->_init(); return $this; } sub _init { my $cpt = new Safe(); my $s = sub {eval q/print "PACKAGE is ",__PACKAGE__,"\n"/; }; # explicitly permit use of 'eval' $cpt->permit('entereval'); my $deparse = B::Deparse->new(); # prepend 'sub' so we have an anonymous sub later my $code_str = 'sub '.$deparse->coderef2text($s); # Seems to have no effect on behavior to remove package statements # $code_str =~ s/package \w+\;//g; print "DEPARSED $code_str\n"; my $result = $cpt->reval($parsed); die $@ if $@; $result->(); }
Many thanks, fever
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Safe, namespaces, B::Deparse
by diotalevi (Canon) on Oct 31, 2002 at 10:13 UTC | |
by djantzen (Priest) on Oct 31, 2002 at 10:36 UTC | |
by diotalevi (Canon) on Oct 31, 2002 at 13:30 UTC | |
by djantzen (Priest) on Oct 31, 2002 at 22:36 UTC |