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