Allow appending on a PerlIO::Scalar
[p5sagit/p5-mst-13.2.git] / t / lib / u-weak.t
CommitLineData
f4a2945e 1BEGIN {
2 chdir 't' if -d 't';
3 @INC = '../lib';
6b05f64e 4 require Config; import Config;
5 if ($Config{extensions} !~ /\bList\/Util\b/) {
6 print "1..0 # Skip: List::Util was not built\n";
7 exit 0;
8 }
f4a2945e 9}
10
11BEGIN {
12 $|=1;
13 require Scalar::Util;
14 if (grep { /weaken/ } @Scalar::Util::EXPORT_FAIL) {
15 print("1..0\n");
16 exit;
17 }
18
19 $DEBUG = 0;
20
21 if ($DEBUG && eval { require Devel::Peek } ) {
22 Devel::Peek->import('Dump');
23 }
24 else {
25 *Dump = sub {};
26 }
27}
28
29use Scalar::Util qw(weaken isweak);
30print "1..17\n";
31
32######################### End of black magic.
33
34$cnt = 0;
35
36sub ok {
37 ++$cnt;
38 if($_[0]) { print "ok $cnt\n"; } else {print "not ok $cnt\n"; }
39}
40
41$| = 1;
42
43if(1) {
44
45my ($y,$z);
46
47#
48# Case 1: two references, one is weakened, the other is then undef'ed.
49#
50
51{
52 my $x = "foo";
53 $y = \$x;
54 $z = \$x;
55}
56print "# START:\n";
57Dump($y); Dump($z);
58
59ok( $y ne "" and $z ne "" );
60weaken($y);
61
62print "# WEAK:\n";
63Dump($y); Dump($z);
64
65ok( $y ne "" and $z ne "" );
66undef($z);
67
68print "# UNDZ:\n";
69Dump($y); Dump($z);
70
71ok( not (defined($y) and defined($z)) );
72undef($y);
73
74print "# UNDY:\n";
75Dump($y); Dump($z);
76
77ok( not (defined($y) and defined($z)) );
78
79print "# FIN:\n";
80Dump($y); Dump($z);
81
82# exit(0);
83
84# }
85# {
86
87#
88# Case 2: one reference, which is weakened
89#
90
91# kill 5,$$;
92
93print "# CASE 2:\n";
94
95{
96 my $x = "foo";
97 $y = \$x;
98}
99
100ok( $y ne "" );
101print "# BW: \n";
102Dump($y);
103weaken($y);
104print "# AW: \n";
105Dump($y);
106ok( not defined $y );
107
108print "# EXITBLOCK\n";
109}
110
111# exit(0);
112
113#
114# Case 3: a circular structure
115#
116
117# kill 5, $$;
118
119$flag = 0;
120{
121 my $y = bless {}, Dest;
122 Dump($y);
123 print "# 1: $y\n";
124 $y->{Self} = $y;
125 Dump($y);
126 print "# 2: $y\n";
127 $y->{Flag} = \$flag;
128 print "# 3: $y\n";
129 weaken($y->{Self});
130 print "# WKED\n";
131 ok( $y ne "" );
132 print "# VALS: HASH ",$y," SELF ",\$y->{Self}," Y ",\$y,
133 " FLAG: ",\$y->{Flag},"\n";
134 print "# VPRINT\n";
135}
136print "# OUT $flag\n";
137ok( $flag == 1 );
138
139print "# AFTER\n";
140
141undef $flag;
142
143print "# FLAGU\n";
144
145#
146# Case 4: a more complicated circular structure
147#
148
149$flag = 0;
150{
151 my $y = bless {}, Dest;
152 my $x = bless {}, Dest;
153 $x->{Ref} = $y;
154 $y->{Ref} = $x;
155 $x->{Flag} = \$flag;
156 $y->{Flag} = \$flag;
157 weaken($x->{Ref});
158}
159ok( $flag == 2 );
160
161#
162# Case 5: deleting a weakref before the other one
163#
164
165{
166 my $x = "foo";
167 $y = \$x;
168 $z = \$x;
169}
170
171print "# CASE5\n";
172Dump($y);
173
174weaken($y);
175Dump($y);
176undef($y);
177
178ok( not defined $y);
179ok($z ne "");
180
181
182#
183# Case 6: test isweakref
184#
185
186$a = 5;
187ok(!isweak($a));
188$b = \$a;
189ok(!isweak($b));
190weaken($b);
191ok(isweak($b));
192$b = \$a;
193ok(!isweak($b));
194
195$x = {};
196weaken($x->{Y} = \$a);
197ok(isweak($x->{Y}));
198ok(!isweak($x->{Z}));
199
200
201package Dest;
202
203sub DESTROY {
204 print "# INCFLAG\n";
205 ${$_[0]{Flag}} ++;
206}