Linux cpanel2.daytoncreative.net 2.6.32-754.29.2.el6.x86_64 #1 SMP Tue May 12 17:39:04 UTC 2020 x86_64
Apache/2.4.43 (cPanel) OpenSSL/1.1.1g mod_bwlimited/1.4
Server IP : 70.62.220.67 & Your IP : 216.73.216.193
Domains :
Cant Read [ /etc/named.conf ]
User : michaelgreg
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
var /
log /
perl-5.20.2 /
t /
op /
Delete
Unzip
Name
Size
Permission
Date
Action
64bitint.t
8.14
KB
-r--r--r--
2014-12-27 11:49
alarm.t
1.5
KB
-r--r--r--
2014-12-27 11:49
anonsub.t
1.7
KB
-r--r--r--
2014-12-27 11:49
append.t
1.58
KB
-r--r--r--
2014-12-27 11:49
args.t
2.12
KB
-r--r--r--
2014-12-27 11:49
array.t
12.32
KB
-r--r--r--
2014-12-27 11:49
array_base.t
720
B
-r--r--r--
2014-12-27 11:49
assignwarn.t
1.52
KB
-r--r--r--
2014-12-27 11:49
attrhand.t
1.01
KB
-r--r--r--
2014-12-27 11:49
attrproto.t
6.55
KB
-r--r--r--
2014-12-27 11:49
attrs.t
10.73
KB
-r--r--r--
2014-12-27 11:49
auto.t
2.36
KB
-r--r--r--
2014-12-27 11:49
avhv.t
4.04
KB
-r--r--r--
2014-12-27 11:49
bless.t
4.12
KB
-r--r--r--
2014-12-27 11:49
blocks.t
2.95
KB
-r--r--r--
2014-12-27 11:49
bop.t
12.82
KB
-r--r--r--
2014-12-27 11:49
caller.pl
3.75
KB
-r--r--r--
2014-12-27 11:49
caller.t
8.14
KB
-r--r--r--
2014-12-27 11:49
chars.t
1.73
KB
-r--r--r--
2014-12-27 11:49
chdir.t
6.68
KB
-r--r--r--
2014-12-27 11:49
chop.t
7.67
KB
-r--r--r--
2014-12-27 11:49
chr.t
2.48
KB
-r--r--r--
2014-12-27 11:49
closure.t
19.6
KB
-r--r--r--
2014-12-27 11:49
closure_test.pl
327
B
-r--r--r--
2014-12-27 11:49
concat2.t
1.41
KB
-r--r--r--
2014-12-27 11:49
cond.t
282
B
-r--r--r--
2014-12-27 11:49
context.t
404
B
-r--r--r--
2014-12-27 11:49
coreamp.t
29.17
KB
-r--r--r--
2014-12-27 11:49
coresubs.t
4.87
KB
-r--r--r--
2014-12-27 11:49
cproto.t
3.6
KB
-r--r--r--
2014-12-27 11:49
crypt.t
1.17
KB
-r--r--r--
2014-12-27 11:49
current_sub.t
1.71
KB
-r--r--r--
2014-12-27 11:49
dbm.t
1.54
KB
-r--r--r--
2014-12-27 11:49
defined.t
551
B
-r--r--r--
2014-12-27 11:49
defins.t
4.84
KB
-r--r--r--
2014-12-27 11:49
delete.t
2.93
KB
-r--r--r--
2014-12-27 11:49
die.t
1.99
KB
-r--r--r--
2014-12-27 11:49
die_except.t
1.57
KB
-r--r--r--
2014-12-27 11:49
die_exit.t
1.9
KB
-r--r--r--
2014-12-27 11:49
die_keeperr.t
1.57
KB
-r--r--r--
2014-12-27 11:49
die_unwind.t
1.69
KB
-r--r--r--
2014-12-27 11:49
do.t
8.35
KB
-r--r--r--
2014-12-27 11:49
dor.t
2.64
KB
-r--r--r--
2014-12-27 11:49
each.t
7.09
KB
-r--r--r--
2014-12-27 11:49
each_array.t
5.48
KB
-r--r--r--
2014-12-27 11:49
eval.t
13.92
KB
-r--r--r--
2014-12-27 11:49
evalbytes.t
989
B
-r--r--r--
2014-12-27 11:49
exec.t
4.36
KB
-r--r--r--
2014-12-27 11:49
exists_sub.t
2.09
KB
-r--r--r--
2014-12-27 11:49
exp.t
1.47
KB
-r--r--r--
2014-12-27 11:49
fh.t
790
B
-r--r--r--
2014-12-27 11:49
filehandle.t
564
B
-r--r--r--
2014-12-27 11:49
filetest.t
11.97
KB
-r--r--r--
2014-12-27 11:49
filetest_stack_ok.t
1.12
KB
-r--r--r--
2014-12-27 11:49
filetest_t.t
1.18
KB
-r--r--r--
2014-12-27 11:49
flip.t
868
B
-r--r--r--
2014-12-27 11:49
for.t
12.77
KB
-r--r--r--
2014-12-27 11:49
fork.t
8.8
KB
-r--r--r--
2014-12-27 11:49
fresh_perl_utf8.t
411
B
-r--r--r--
2014-12-27 11:49
getpid.t
1.61
KB
-r--r--r--
2014-12-27 11:49
getppid.t
3.13
KB
-r--r--r--
2014-12-27 11:49
glob.t
4.22
KB
-r--r--r--
2014-12-27 11:49
gmagic.t
5.97
KB
-r--r--r--
2014-12-27 11:49
goto.t
14.85
KB
-r--r--r--
2014-12-27 11:49
goto_xs.t
2.98
KB
-r--r--r--
2014-12-27 11:49
grent.t
4.46
KB
-r--r--r--
2014-12-27 11:49
grep.t
6.66
KB
-r--r--r--
2014-12-27 11:49
groups.t
11.15
KB
-r--r--r--
2014-12-27 11:49
gv.t
30.15
KB
-r--r--r--
2014-12-27 11:49
hash-rt85026.t
1.57
KB
-r--r--r--
2014-12-27 11:49
hash.t
6.02
KB
-r--r--r--
2014-12-27 11:49
hashassign.t
18.85
KB
-r--r--r--
2014-12-27 11:49
hashwarn.t
2.05
KB
-r--r--r--
2014-12-27 11:49
heredoc.t
2.29
KB
-r--r--r--
2014-12-27 11:49
inc.t
6.72
KB
-r--r--r--
2014-12-27 11:49
inccode-tie.t
338
B
-r--r--r--
2014-12-27 11:49
inccode.t
11.19
KB
-r--r--r--
2014-12-27 11:49
incfilter.t
7.33
KB
-r--r--r--
2014-12-27 11:49
index.t
6.81
KB
-r--r--r--
2014-12-27 11:49
index_thr.t
56
B
-r--r--r--
2014-12-27 11:49
int.t
1.72
KB
-r--r--r--
2014-12-27 11:49
join.t
3.2
KB
-r--r--r--
2014-12-27 11:49
kill0.t
3.18
KB
-r--r--r--
2014-12-27 11:49
kill0_child
596
B
-r--r--r--
2014-12-27 11:49
kvaslice.t
4.66
KB
-r--r--r--
2014-12-27 11:49
kvhslice.t
5.44
KB
-r--r--r--
2014-12-27 11:49
lc.t
11.8
KB
-r--r--r--
2014-12-27 11:49
leaky-magic.t
3.43
KB
-r--r--r--
2014-12-27 11:49
length.t
5.03
KB
-r--r--r--
2014-12-27 11:49
lex.t
2.33
KB
-r--r--r--
2014-12-27 11:49
lex_assign.t
7.17
KB
-r--r--r--
2014-12-27 11:49
lexsub.t
19.62
KB
-r--r--r--
2014-12-27 12:24
lfs.t
6.2
KB
-r--r--r--
2014-12-27 11:49
list.t
5.31
KB
-r--r--r--
2014-12-27 11:52
local.t
17.11
KB
-r--r--r--
2014-12-27 11:49
localref.t
2.73
KB
-r--r--r--
2014-12-27 11:49
lock.t
465
B
-r--r--r--
2014-12-27 11:49
loopctl.t
17.88
KB
-r--r--r--
2014-12-27 11:49
lop.t
1.2
KB
-r--r--r--
2014-12-27 11:49
magic-27839.t
622
B
-r--r--r--
2014-12-27 11:49
magic.t
21.81
KB
-r--r--r--
2014-12-27 11:49
method.t
18.91
KB
-r--r--r--
2014-12-27 11:49
mkdir.t
1.25
KB
-r--r--r--
2014-12-27 11:49
my.t
4.29
KB
-r--r--r--
2014-12-27 11:49
my_stash.t
769
B
-r--r--r--
2014-12-27 11:49
mydef.t
5.51
KB
-r--r--r--
2014-12-27 11:49
negate.t
4.3
KB
-r--r--r--
2014-12-27 11:49
not.t
3.15
KB
-r--r--r--
2014-12-27 11:49
numconvert.t
8.33
KB
-r--r--r--
2014-12-27 11:49
oct.t
3.58
KB
-r--r--r--
2014-12-27 11:49
or.t
1.79
KB
-r--r--r--
2014-12-27 11:49
ord.t
2.48
KB
-r--r--r--
2014-12-27 11:49
overload_integer.t
506
B
-r--r--r--
2014-12-27 11:49
override.t
4.33
KB
-r--r--r--
2014-12-27 11:49
pack.t
65.34
KB
-r--r--r--
2014-12-27 11:49
packagev.t
5.97
KB
-r--r--r--
2014-12-27 11:49
pos.t
3.59
KB
-r--r--r--
2014-12-27 11:49
postfixderef.t
11.97
KB
-r--r--r--
2014-12-27 11:49
pow.t
2.34
KB
-r--r--r--
2014-12-27 11:49
print.t
692
B
-r--r--r--
2014-12-27 11:49
protowarn.t
1.35
KB
-r--r--r--
2014-12-27 11:49
push.t
3.03
KB
-r--r--r--
2014-12-27 11:49
pwent.t
6.63
KB
-r--r--r--
2014-12-27 11:49
qr.t
2.32
KB
-r--r--r--
2014-12-27 11:49
quotemeta.t
5.61
KB
-r--r--r--
2014-12-27 11:49
rand.t
8.31
KB
-r--r--r--
2014-12-27 11:49
range.t
9.25
KB
-r--r--r--
2014-12-27 11:49
read.t
2.28
KB
-r--r--r--
2014-12-27 11:49
readdir.t
2.09
KB
-r--r--r--
2014-12-27 11:49
readline.t
7.19
KB
-r--r--r--
2014-12-27 11:49
recurse.t
2.73
KB
-r--r--r--
2014-12-27 11:49
ref.t
22.74
KB
-r--r--r--
2014-12-27 11:49
repeat.t
4.8
KB
-r--r--r--
2014-12-27 11:49
require_37033.t
1.18
KB
-r--r--r--
2014-12-27 11:49
require_errors.t
3.68
KB
-r--r--r--
2014-12-27 11:49
reset.t
5.41
KB
-r--r--r--
2014-12-27 11:49
reverse.t
3.01
KB
-r--r--r--
2014-12-27 11:49
rt119311.t
5.58
KB
-r--r--r--
2014-12-27 11:49
runlevel.t
5.28
KB
-r--r--r--
2014-12-27 11:49
select.t
1.03
KB
-r--r--r--
2014-12-27 11:49
setpgrpstack.t
378
B
-r--r--r--
2014-12-27 11:49
sigdispatch.t
4.33
KB
-r--r--r--
2014-12-27 11:49
signatures.t
41.02
KB
-r--r--r--
2014-12-27 11:49
sigsystem.t
1.36
KB
-r--r--r--
2014-12-27 11:49
sleep.t
468
B
-r--r--r--
2014-12-27 11:49
smartkve.t
18.26
KB
-r--r--r--
2014-12-27 11:49
smartmatch.t
10.34
KB
-r--r--r--
2014-12-27 11:49
sort.t
28.4
KB
-r--r--r--
2015-01-10 13:17
splice.t
3.38
KB
-r--r--r--
2014-12-27 11:49
split.t
13.1
KB
-r--r--r--
2014-12-27 11:49
split_unicode.t
2.4
KB
-r--r--r--
2014-12-27 11:49
sprintf.t
28.5
KB
-r--r--r--
2014-12-27 11:49
sprintf2.t
5.49
KB
-r--r--r--
2014-12-27 11:49
srand.t
1.87
KB
-r--r--r--
2014-12-27 11:49
sselect.t
2.67
KB
-r--r--r--
2014-12-27 11:49
stash.t
9.01
KB
-r--r--r--
2014-12-27 11:49
stat.t
17.51
KB
-r--r--r--
2014-12-27 11:49
state.t
9.72
KB
-r--r--r--
2014-12-27 12:15
study.t
2.99
KB
-r--r--r--
2014-12-27 11:49
studytied.t
1.29
KB
-r--r--r--
2014-12-27 11:49
sub.t
6.54
KB
-r--r--r--
2014-12-27 11:49
sub_lval.t
24.2
KB
-r--r--r--
2014-12-27 11:49
substr.t
20.53
KB
-r--r--r--
2014-12-27 11:49
substr_thr.t
56
B
-r--r--r--
2014-12-27 11:49
svleak.pl
6
B
-r--r--r--
2014-12-27 11:49
svleak.t
15.93
KB
-r--r--r--
2015-01-10 12:06
switch.t
28.06
KB
-r--r--r--
2014-12-27 11:49
symbolcache.t
1.06
KB
-r--r--r--
2014-12-27 11:49
sysio.t
5
KB
-r--r--r--
2014-12-27 11:49
taint.t
66.84
KB
-r--r--r--
2014-12-27 12:32
threads-dirh.t
3.47
KB
-r--r--r--
2014-12-27 11:49
threads.t
9.3
KB
-r--r--r--
2014-12-27 11:49
threads_create.pl
42
B
-r--r--r--
2014-12-27 11:49
tie.t
28.34
KB
-r--r--r--
2014-12-27 11:49
tie_fetch_count.t
11.49
KB
-r--r--r--
2014-12-27 11:49
tiearray.t
4.53
KB
-r--r--r--
2014-12-27 11:49
tiehandle.t
5.27
KB
-r--r--r--
2014-12-27 11:49
time.t
7.86
KB
-r--r--r--
2015-01-17 11:51
time_loop.t
378
B
-r--r--r--
2014-12-27 11:49
tr.t
12.99
KB
-r--r--r--
2014-12-27 11:49
undef.t
3.15
KB
-r--r--r--
2014-12-27 11:49
universal.t
8.32
KB
-r--r--r--
2014-12-27 11:49
unlink.t
1.02
KB
-r--r--r--
2014-12-27 11:49
unshift.t
3.17
KB
-r--r--r--
2014-12-27 11:49
upgrade.t
1.15
KB
-r--r--r--
2014-12-27 11:49
utf8cache.t
3.83
KB
-r--r--r--
2014-12-27 11:49
utf8decode.t
7.59
KB
-r--r--r--
2014-12-27 11:49
utf8magic.t
808
B
-r--r--r--
2014-12-27 11:49
utfhash.t
5.33
KB
-r--r--r--
2014-12-27 11:49
utftaint.t
4.46
KB
-r--r--r--
2014-12-27 11:49
vec.t
2.87
KB
-r--r--r--
2014-12-27 11:49
ver.t
8.39
KB
-r--r--r--
2014-12-27 11:49
waitpid.t
973
B
-r--r--r--
2014-12-27 11:49
wantarray.t
874
B
-r--r--r--
2014-12-27 11:49
warn.t
4.15
KB
-r--r--r--
2014-12-27 11:49
while.t
3.81
KB
-r--r--r--
2014-12-27 11:49
write.t
39.99
KB
-r--r--r--
2015-01-24 15:03
yadayada.t
1.67
KB
-r--r--r--
2015-01-15 22:12
Save
Rename
#!./perl # -*- Mode: Perl -*- # closure.t: # Original written by Ulrich Pfeifer on 2 Jan 1997. # Greatly extended by Tom Phoenix <rootbeer@teleport.com> on 28 Jan 1997. # # Run with -debug for debugging output. BEGIN { chdir 't' if -d 't'; @INC = '../lib'; require './test.pl'; } use Config; my $i = 1; sub foo { $i = shift if @_; $i } # no closure is(foo, 1); foo(2); is(foo, 2); # closure: lexical outside sub my $foo = sub {$i = shift if @_; $i }; my $bar = sub {$i = shift if @_; $i }; is(&$foo(), 2); &$foo(3); is(&$foo(), 3); # did the lexical change? is(foo, 3, 'lexical changed'); is($i, 3, 'lexical changed'); # did the second closure notice? is(&$bar(), 3, 'second closure noticed'); # closure: lexical inside sub sub bar { my $i = shift; sub { $i = shift if @_; $i } } $foo = bar(4); $bar = bar(5); is(&$foo(), 4); &$foo(6); is(&$foo(), 6); is(&$bar(), 5); # nested closures sub bizz { my $i = 7; if (@_) { my $i = shift; sub {$i = shift if @_; $i }; } else { my $i = $i; sub {$i = shift if @_; $i }; } } $foo = bizz(); $bar = bizz(); is(&$foo(), 7); &$foo(8); is(&$foo(), 8); is(&$bar(), 7); $foo = bizz(9); $bar = bizz(10); is(&$foo(11)-1, &$bar()); my @foo; for (qw(0 1 2 3 4)) { my $i = $_; $foo[$_] = sub {$i = shift if @_; $i }; } is(&{$foo[0]}(), 0); is(&{$foo[1]}(), 1); is(&{$foo[2]}(), 2); is(&{$foo[3]}(), 3); is(&{$foo[4]}(), 4); for (0 .. 4) { &{$foo[$_]}(4-$_); } is(&{$foo[0]}(), 4); is(&{$foo[1]}(), 3); is(&{$foo[2]}(), 2); is(&{$foo[3]}(), 1); is(&{$foo[4]}(), 0); sub barf { my @foo; for (qw(0 1 2 3 4)) { my $i = $_; $foo[$_] = sub {$i = shift if @_; $i }; } @foo; } @foo = barf(); is(&{$foo[0]}(), 0); is(&{$foo[1]}(), 1); is(&{$foo[2]}(), 2); is(&{$foo[3]}(), 3); is(&{$foo[4]}(), 4); for (0 .. 4) { &{$foo[$_]}(4-$_); } is(&{$foo[0]}(), 4); is(&{$foo[1]}(), 3); is(&{$foo[2]}(), 2); is(&{$foo[3]}(), 1); is(&{$foo[4]}(), 0); # test if closures get created in optimized for loops my %foo; for my $n ('A'..'E') { $foo{$n} = sub { $n eq $_[0] }; } ok(&{$foo{A}}('A')); ok(&{$foo{B}}('B')); ok(&{$foo{C}}('C')); ok(&{$foo{D}}('D')); ok(&{$foo{E}}('E')); for my $n (0..4) { $foo[$n] = sub { $n == $_[0] }; } ok(&{$foo[0]}(0)); ok(&{$foo[1]}(1)); ok(&{$foo[2]}(2)); ok(&{$foo[3]}(3)); ok(&{$foo[4]}(4)); for my $n (0..4) { $foo[$n] = sub { # no intervening reference to $n here sub { $n == $_[0] } }; } ok($foo[0]->()->(0)); ok($foo[1]->()->(1)); ok($foo[2]->()->(2)); ok($foo[3]->()->(3)); ok($foo[4]->()->(4)); { my $w; $w = sub { my ($i) = @_; is($i, 10); sub { $w }; }; $w->(10); } # Additional tests by Tom Phoenix <rootbeer@teleport.com>. { use strict; use vars qw!$test!; my($debugging, %expected, $inner_type, $where_declared, $within); my($nc_attempt, $call_outer, $call_inner, $undef_outer); my($code, $inner_sub_test, $expected, $line, $errors, $output); my(@inners, $sub_test, $pid); $debugging = 1 if defined($ARGV[0]) and $ARGV[0] eq '-debug'; # The expected values for these tests %expected = ( 'global_scalar' => 1001, 'global_array' => 2101, 'global_hash' => 3004, 'fs_scalar' => 4001, 'fs_array' => 5101, 'fs_hash' => 6004, 'sub_scalar' => 7001, 'sub_array' => 8101, 'sub_hash' => 9004, 'foreach' => 10011, ); # Our innermost sub is either named or anonymous for $inner_type (qw!named anon!) { # And it may be declared at filescope, within a named # sub, or within an anon sub for $where_declared (qw!filescope in_named in_anon!) { # And that, in turn, may be within a foreach loop, # a naked block, or another named sub for $within (qw!foreach naked other_sub!) { my $test = curr_test(); # Here are a number of variables which show what's # going on, in a way. $nc_attempt = 0+ # Named closure attempted ( ($inner_type eq 'named') || ($within eq 'other_sub') ) ; $call_inner = 0+ # Need to call &inner ( ($inner_type eq 'anon') && ($within eq 'other_sub') ) ; $call_outer = 0+ # Need to call &outer or &$outer ( ($inner_type eq 'anon') && ($within ne 'other_sub') ) ; $undef_outer = 0+ # $outer is created but unused ( ($where_declared eq 'in_anon') && (not $call_outer) ) ; $code = "# This is a test script built by t/op/closure.t\n\n"; print <<"DEBUG_INFO" if $debugging; # inner_type: $inner_type # where_declared: $where_declared # within: $within # nc_attempt: $nc_attempt # call_inner: $call_inner # call_outer: $call_outer # undef_outer: $undef_outer DEBUG_INFO $code .= <<"END_MARK_ONE"; BEGIN { \$SIG{__WARN__} = sub { my \$msg = \$_[0]; END_MARK_ONE $code .= <<"END_MARK_TWO" if $nc_attempt; return if index(\$msg, 'will not stay shared') != -1; return if index(\$msg, 'is not available') != -1; END_MARK_TWO $code .= <<"END_MARK_THREE"; # Backwhack a lot! print "not ok: got unexpected warning \$msg\\n"; } } require './test.pl'; curr_test($test); # some of the variables which the closure will access \$global_scalar = 1000; \@global_array = (2000, 2100, 2200, 2300); %global_hash = 3000..3009; my \$fs_scalar = 4000; my \@fs_array = (5000, 5100, 5200, 5300); my %fs_hash = 6000..6009; END_MARK_THREE if ($where_declared eq 'filescope') { # Nothing here } elsif ($where_declared eq 'in_named') { $code .= <<'END'; sub outer { my $sub_scalar = 7000; my @sub_array = (8000, 8100, 8200, 8300); my %sub_hash = 9000..9009; END # } } elsif ($where_declared eq 'in_anon') { $code .= <<'END'; $outer = sub { my $sub_scalar = 7000; my @sub_array = (8000, 8100, 8200, 8300); my %sub_hash = 9000..9009; END # } } else { die "What was $where_declared?" } if ($within eq 'foreach') { $code .= " my \$foreach = 12000; my \@list = (10000, 10010); foreach \$foreach (\@list) { " # } } elsif ($within eq 'naked') { $code .= " { # naked block\n" # } } elsif ($within eq 'other_sub') { $code .= " sub inner_sub {\n" # } } else { die "What was $within?" } $sub_test = $test; @inners = ( qw!global_scalar global_array global_hash! , qw!fs_scalar fs_array fs_hash! ); push @inners, 'foreach' if $within eq 'foreach'; if ($where_declared ne 'filescope') { push @inners, qw!sub_scalar sub_array sub_hash!; } for $inner_sub_test (@inners) { if ($inner_type eq 'named') { $code .= " sub named_$sub_test " } elsif ($inner_type eq 'anon') { $code .= " \$anon_$sub_test = sub " } else { die "What was $inner_type?" } # Now to write the body of the test sub if ($inner_sub_test eq 'global_scalar') { $code .= '{ ++$global_scalar }' } elsif ($inner_sub_test eq 'fs_scalar') { $code .= '{ ++$fs_scalar }' } elsif ($inner_sub_test eq 'sub_scalar') { $code .= '{ ++$sub_scalar }' } elsif ($inner_sub_test eq 'global_array') { $code .= '{ ++$global_array[1] }' } elsif ($inner_sub_test eq 'fs_array') { $code .= '{ ++$fs_array[1] }' } elsif ($inner_sub_test eq 'sub_array') { $code .= '{ ++$sub_array[1] }' } elsif ($inner_sub_test eq 'global_hash') { $code .= '{ ++$global_hash{3002} }' } elsif ($inner_sub_test eq 'fs_hash') { $code .= '{ ++$fs_hash{6002} }' } elsif ($inner_sub_test eq 'sub_hash') { $code .= '{ ++$sub_hash{9002} }' } elsif ($inner_sub_test eq 'foreach') { $code .= '{ ++$foreach }' } else { die "What was $inner_sub_test?" } # Close up if ($inner_type eq 'anon') { $code .= ';' } $code .= "\n"; $sub_test++; # sub name sequence number } # End of foreach $inner_sub_test # Close up $within block # { $code .= " }\n\n"; # Close up $where_declared block if ($where_declared eq 'in_named') { # { $code .= "}\n\n"; } elsif ($where_declared eq 'in_anon') { # { $code .= "};\n\n"; } # We may need to do something with the sub we just made... $code .= "undef \$outer;\n" if $undef_outer; $code .= "&inner_sub;\n" if $call_inner; if ($call_outer) { if ($where_declared eq 'in_named') { $code .= "&outer;\n\n"; } elsif ($where_declared eq 'in_anon') { $code .= "&\$outer;\n\n" } } # Now, we can actually prep to run the tests. for $inner_sub_test (@inners) { $expected = $expected{$inner_sub_test} or die "expected $inner_sub_test missing"; # Named closures won't access the expected vars if ( $nc_attempt and substr($inner_sub_test, 0, 4) eq "sub_" ) { $expected = 1; } # If you make a sub within a foreach loop, # what happens if it tries to access the # foreach index variable? If it's a named # sub, it gets the var from "outside" the loop, # but if it's anon, it gets the value to which # the index variable is aliased. # # Of course, if the value was set only # within another sub which was never called, # the value has not been set yet. # if ($inner_sub_test eq 'foreach') { if ($inner_type eq 'named') { if ($call_outer || ($where_declared eq 'filescope')) { $expected = 12001 } else { $expected = 1 } } } # Here's the test: my $desc = "$inner_type $where_declared $within $inner_sub_test"; if ($inner_type eq 'anon') { $code .= "is(&\$anon_$test, $expected, '$desc');\n" } else { $code .= "is(&named_$test, $expected, '$desc');\n" } $test++; } if ($Config{d_fork} and $^O ne 'VMS' and $^O ne 'MSWin32' and $^O ne 'NetWare') { # Fork off a new perl to run the tests. # (This is so we can catch spurious warnings.) $| = 1; print ""; $| = 0; # flush output before forking pipe READ, WRITE or die "Can't make pipe: $!"; pipe READ2, WRITE2 or die "Can't make second pipe: $!"; die "Can't fork: $!" unless defined($pid = open PERL, "|-"); unless ($pid) { # Child process here. We're going to send errors back # through the extra pipe. close READ; close READ2; open STDOUT, ">&WRITE" or die "Can't redirect STDOUT: $!"; open STDERR, ">&WRITE2" or die "Can't redirect STDERR: $!"; exec which_perl(), '-w', '-' or die "Can't exec perl: $!"; } else { # Parent process here. close WRITE; close WRITE2; print PERL $code; close PERL; { local $/; $output = join '', <READ>; $errors = join '', <READ2>; } close READ; close READ2; } } else { # No fork(). Do it the hard way. my $cmdfile = tempfile(); my $errfile = tempfile(); open CMD, ">$cmdfile"; print CMD $code; close CMD; my $cmd = which_perl(); $cmd .= " -w $cmdfile 2>$errfile"; if ($^O eq 'VMS' or $^O eq 'MSWin32' or $^O eq 'NetWare') { # Use pipe instead of system so we don't inherit STD* from # this process, and then foul our pipe back to parent by # redirecting output in the child. open PERL,"$cmd |" or die "Can't open pipe: $!\n"; { local $/; $output = join '', <PERL> } close PERL; } else { my $outfile = tempfile(); system "$cmd >$outfile"; { local $/; open IN, $outfile; $output = <IN>; close IN } } if ($?) { printf "not ok: exited with error code %04X\n", $?; exit; } { local $/; open IN, $errfile; $errors = <IN>; close IN } } print $output; curr_test($test); print STDERR $errors; # This has the side effect of alerting *our* test.pl to the state of # what has just been passed to STDOUT, so that if anything there has # failed, our test.pl will print a diagnostic and exit uncleanly. unlike($output, qr/not ok/, 'All good'); is($errors, '', 'STDERR is silent'); if ($debugging && ($errors || $? || ($output =~ /not ok/))) { my $lnum = 0; for $line (split '\n', $code) { printf "%3d: %s\n", ++$lnum, $line; } } is($?, 0, 'exited cleanly') or diag(sprintf "Error code $? = 0x%X", $?); print '#', "-" x 30, "\n" if $debugging; } # End of foreach $within } # End of foreach $where_declared } # End of foreach $inner_type } # The following dumps core with perl <= 5.8.0 (bugid 9535) ... BEGIN { $vanishing_pad = sub { eval $_[0] } } $some_var = 123; is($vanishing_pad->('$some_var'), 123, 'RT #9535'); # ... and here's another coredump variant - this time we explicitly # delete the sub rather than using a BEGIN ... sub deleteme { $a = sub { eval '$newvar' } } deleteme(); *deleteme = sub {}; # delete the sub $newvar = 123; # realloc the SV of the freed CV is($a->(), 123, 'RT #9535'); # ... and a further coredump variant - the fixup of the anon sub's # CvOUTSIDE pointer when the middle eval is freed, wasn't good enough to # survive the outer eval also being freed. $x = 123; $a = eval q( eval q[ sub { eval '$x' } ] ); @a = ('\1\1\1\1\1\1\1') x 100; # realloc recently-freed CVs is($a->(), 123, 'RT #9535'); # this coredumped on <= 5.8.0 because evaling the closure caused # an SvFAKE to be added to the outer anon's pad, which was then grown. my $outer; sub { my $x; $x = eval 'sub { $outer }'; $x->(); $a = [ 99 ]; $x->(); }->(); pass(); # [perl #17605] found that an empty block called in scalar context # can lead to stack corruption { my $x = "foooobar"; $x =~ s/o//eg; is($x, 'fbar', 'RT #17605'); } # DAPM 24-Nov-02 # SvFAKE lexicals should be visible thoughout a function. # On <= 5.8.0, the third test failed, eg bugid #18286 { my $x = 1; sub fake { is(sub {eval'$x'}->(), 1, 'RT #18286'); { $x; is(sub {eval'$x'}->(), 1, 'RT #18286'); } is(sub {eval'$x'}->(), 1, 'RT #18286'); } } fake(); { $x = 1; my $x = 2; sub tmp { sub { eval '$x' } } my $a = tmp(); undef &tmp; is($a->(), 2, "undefining a sub shouldn't alter visibility of outer lexicals"); } # handy class: $x = Watch->new(\$foo,'bar') # causes 'bar' to be appended to $foo when $x is destroyed sub Watch::new { bless [ $_[1], $_[2] ], $_[0] } sub Watch::DESTROY { ${$_[0][0]} .= $_[0][1] } # bugid 1028: # nested anon subs (and associated lexicals) not freed early enough sub linger { my $x = Watch->new($_[0], '2'); sub { $x; my $y; sub { $y; }; }; } { my $watch = '1'; linger(\$watch); is($watch, '12', 'RT #1028'); } # bugid 10085 # obj not freed early enough sub linger2 { my $obj = Watch->new($_[0], '2'); sub { sub { $obj } }; } { my $watch = '1'; linger2(\$watch); is($watch, 12, 'RT #10085'); } # bugid 16302 - named subs didn't capture lexicals on behalf of inner subs { my $x = 1; sub f16302 { sub { is($x, 1, 'RT #16302'); }->(); } } f16302(); # The presence of an eval should turn cloneless anon subs into clonable # subs - otherwise the CvOUTSIDE of that sub may be wrong { my %a; for my $x (7,11) { $a{$x} = sub { $x=$x; sub { eval '$x' } }; } is($a{7}->()->() + $a{11}->()->(), 18); } { # bugid #23265 - this used to coredump during destruction of PL_maincv # and its children fresh_perl_is(<< '__EOF__', "yxx\n", {stderr => 1}, 'RT #23265'); print sub {$_[0]->(@_)} -> ( sub { $_[1] ? $_[0]->($_[0], $_[1] - 1) . sub {"x"}->() : "y" }, 2 ) , "\n" ; __EOF__ } { # bugid #24914 = used to coredump restoring PL_comppad in the # savestack, due to the early freeing of the anon closure fresh_perl_is('sub d {die} my $f; $f = sub {my $x=1; $f = 0; d}; eval{$f->()}; print qq(ok\n)', "ok\n", {stderr => 1}, 'RT #24914'); } # After newsub is redefined outside the BEGIN, its CvOUTSIDE should point # to main rather than BEGIN, and BEGIN should be freed. { my $flag = 0; sub X::DESTROY { $flag = 1 } { my $x; BEGIN {$x = \&newsub } sub newsub {}; $x = bless {}, 'X'; } is($flag, 1); } sub f { my $x; format ff = @ $r = \$x . } { fileno ff; write ff; my $r1 = $r; write ff; my $r2 = $r; isnt($r1, $r2, "don't copy a stale lexical; create a fresh undef one instead"); } # [perl #63540] Don’t treat sub { if(){.....}; "constant" } as a constant BEGIN { my $x = 7; *baz = sub() { if($x){ () = "tralala"; blonk() }; 0 } } { my $blonk_was_called; *blonk = sub { ++$blonk_was_called }; my $ret = baz(); is($ret, 0, 'RT #63540'); is($blonk_was_called, 1, 'RT #63540'); } # test PL_cv_has_eval. Any anon sub that could conceivably contain an # eval, should be marked as cloneable { my @s; push @s, sub { eval '1' } for 1,2; isnt($s[0], $s[1], "cloneable with eval"); @s = (); push @s, sub { use re 'eval'; my $x; s/$x/1/; } for 1,2; isnt($s[0], $s[1], "cloneable with use re eval"); @s = (); push @s, sub { s/1/1/ee; } for 1,2; isnt($s[0], $s[1], "cloneable with //ee"); } # [perl #89544] { sub trace::DESTROY { push @trace::trace, "destroyed"; } my $outer2 = sub { my $a = bless \my $dummy, trace::; my $outer = sub { my $b; my $inner = sub { undef $b; }; $a; $inner }; $outer->() }; my $inner = $outer2->(); is "@trace::trace", "destroyed", 'closures only close over named variables, not entire subs'; } # [perl #113812] Closure prototypes with no CvOUTSIDE (crash caused by the # fix for #89544) do "./op/closure_test.pl" or die $@||$!; is $closure_test::s2->()(), '10 cubes', 'cloning closure proto with no CvOUTSIDE'; # Also brought up in #113812: Even when being cloned, a closure prototype # might have its CvOUTSIDE pointing to the wrong thing. { package main::113812; $s1 = sub { my $x = 3; $s2 = sub { $x; $s3 = sub { $x }; }; }; $s1->(); undef &$s1; # frees $s2’s prototype, causing the $s3 proto to have its # CvOUTSIDE point to $s1 ::is $s2->()(), 3, 'cloning closure proto whose CvOUTSIDE has changed'; } # This should never emit two different values: # print $x, "\n"; # print sub { $x }->(), "\n"; # This test case started to do just that in commit 33894c1aa3e # (5.10.1/5.12.0): sub mosquito { my $x if @_; return if @_; $x = 17; is sub { $x }->(), $x, 'closing over stale var in 2nd sub call'; } mosquito(1); mosquito; # And this case in commit adf8f095c588 (5.14): sub anything { my $x; sub gnat { $x = 3; is sub { $x }->(), $x, 'closing over stale var before 1st sub call'; } } gnat(); # [perl #114018] Similar to the above, but with string eval sub staleval { my $x if @_; return if @_; $x = 3; is eval '$x', $x, 'eval closing over stale var in active sub'; return # } staleval 1; staleval; # [perl #114888] # Test that closure creation localises PL_comppad_name properly. Usually # at compile time a BEGIN block will localise PL_comppad_name for use, so # pp_anoncode can mess with it without any visible effects. # But inside a source filter, it affects the directly enclosing compila- # tion scope. SKIP: { skip_if_miniperl("no XS on miniperl (for source filters)"); fresh_perl_is <<' [perl #114888]', "ok\n", {stderr=>1}, use strict; BEGIN { package Foo; use Filter::Util::Call; sub import { filter_add( sub { my $status = filter_read(); sub { $status }; $status; })} Foo->import } my $x = "ok\n"; # stores $x in the wrong padnamelist print $x; # cannot find it - strict violation [perl #114888] 'closures in source filters do not interfere with pad names'; } done_testing();