merge changes#1423,1465 from maintbranch; checkin two missed files
[p5sagit/p5-mst-13.2.git] / t / op / local.t
CommitLineData
a687059c 1#!./perl
2
79072805 3# $RCSfile: local.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:04 $
a687059c 4
be6c24e0 5print "1..58\n";
a687059c 6
eec2d3df 7$ENV{PERL_DESTRUCT_LEVEL} = 0; # XXX known to leaks scalars
8
a687059c 9sub foo {
10 local($a, $b) = @_;
11 local($c, $d);
12 $c = "ok 3\n";
13 $d = "ok 4\n";
14 { local($a,$c) = ("ok 9\n", "ok 10\n"); ($x, $y) = ($a, $c); }
15 print $a, $b;
16 $c . $d;
17}
18
19$a = "ok 5\n";
20$b = "ok 6\n";
21$c = "ok 7\n";
22$d = "ok 8\n";
23
93a17b20 24print &foo("ok 1\n","ok 2\n");
a687059c 25
26print $a,$b,$c,$d,$x,$y;
27
28# same thing, only with arrays and associative arrays
29
30sub foo2 {
31 local($a, @b) = @_;
32 local(@c, %d);
33 @c = "ok 13\n";
34 $d{''} = "ok 14\n";
35 { local($a,@c) = ("ok 19\n", "ok 20\n"); ($x, $y) = ($a, @c); }
36 print $a, @b;
37 $c[0] . $d{''};
38}
39
40$a = "ok 15\n";
41@b = "ok 16\n";
42@c = "ok 17\n";
43$d{''} = "ok 18\n";
44
93a17b20 45print &foo2("ok 11\n","ok 12\n");
a687059c 46
47print $a,@b,@c,%d,$x,$y;
706a304b 48
49eval 'local($$e)';
50print +($@ =~ /Can't localize through a reference/) ? "" : "not ", "ok 21\n";
51
52eval 'local(@$e)';
53print +($@ =~ /Can't localize through a reference/) ? "" : "not ", "ok 22\n";
54
55eval 'local(%$e)';
56print +($@ =~ /Can't localize through a reference/) ? "" : "not ", "ok 23\n";
85aff577 57
161b7d16 58# Array and hash elements
59
60@a = ('a', 'b', 'c');
61{
62 local($a[1]) = 'foo';
63 local($a[2]) = $a[2];
2bb40b7f 64 print +($a[1] eq 'foo') ? "" : "not ", "ok 24\n";
65 print +($a[2] eq 'c') ? "" : "not ", "ok 25\n";
161b7d16 66 undef @a;
67}
2bb40b7f 68print +($a[1] eq 'b') ? "" : "not ", "ok 26\n";
69print +($a[2] eq 'c') ? "" : "not ", "ok 27\n";
70print +(!defined $a[0]) ? "" : "not ", "ok 28\n";
161b7d16 71
72@a = ('a', 'b', 'c');
73{
74 local($a[1]) = "X";
75 shift @a;
76}
2bb40b7f 77print +($a[0].$a[1] eq "Xb") ? "" : "not ", "ok 29\n";
161b7d16 78
79%h = ('a' => 1, 'b' => 2, 'c' => 3);
80{
81 local($h{'a'}) = 'foo';
82 local($h{'b'}) = $h{'b'};
2bb40b7f 83 print +($h{'a'} eq 'foo') ? "" : "not ", "ok 30\n";
84 print +($h{'b'} == 2) ? "" : "not ", "ok 31\n";
161b7d16 85 local($h{'c'});
86 delete $h{'c'};
87}
2bb40b7f 88print +($h{'a'} == 1) ? "" : "not ", "ok 32\n";
89print +($h{'b'} == 2) ? "" : "not ", "ok 33\n";
90print +($h{'c'} == 3) ? "" : "not ", "ok 34\n";
91
92# check for scope leakage
93$a = 'outer';
94if (1) { local $a = 'inner' }
95print +($a eq 'outer') ? "" : "not ", "ok 35\n";
96
97# see if localization works when scope unwinds
98local $m = 5;
99eval {
100 for $m (6) {
101 local $m = 7;
102 die "bye";
103 }
104};
105print $m == 5 ? "" : "not ", "ok 36\n";
4e4c362e 106
107# see if localization works on tied arrays
108{
109 package TA;
110 sub TIEARRAY { bless [], $_[0] }
111 sub STORE { print "# STORE [@_]\n"; $_[0]->[$_[1]] = $_[2] }
112 sub FETCH { my $v = $_[0]->[$_[1]]; print "# FETCH [@_=$v]\n"; $v }
113 sub CLEAR { print "# CLEAR [@_]\n"; @{$_[0]} = (); }
114 sub FETCHSIZE { scalar(@{$_[0]}) }
115 sub SHIFT { shift (@{$_[0]}) }
116 sub EXTEND {}
117}
118
119tie @a, 'TA';
120@a = ('a', 'b', 'c');
121{
122 local($a[1]) = 'foo';
be6c24e0 123 local($a[2]) = $a[2];
4e4c362e 124 print +($a[1] eq 'foo') ? "" : "not ", "ok 37\n";
be6c24e0 125 print +($a[2] eq 'c') ? "" : "not ", "ok 38\n";
4e4c362e 126 @a = ();
127}
128print +($a[1] eq 'b') ? "" : "not ", "ok 39\n";
129print +($a[2] eq 'c') ? "" : "not ", "ok 40\n";
130print +(!defined $a[0]) ? "" : "not ", "ok 41\n";
131
132{
133 package TH;
134 sub TIEHASH { bless {}, $_[0] }
135 sub STORE { print "# STORE [@_]\n"; $_[0]->{$_[1]} = $_[2] }
136 sub FETCH { my $v = $_[0]->{$_[1]}; print "# FETCH [@_=$v]\n"; $v }
137 sub DELETE { print "# DELETE [@_]\n"; delete $_[0]->{$_[1]}; }
138 sub CLEAR { print "# CLEAR [@_]\n"; %{$_[0]} = (); }
139}
140
141# see if localization works on tied hashes
142tie %h, 'TH';
143%h = ('a' => 1, 'b' => 2, 'c' => 3);
144
145{
146 local($h{'a'}) = 'foo';
be6c24e0 147 local($h{'b'}) = $h{'b'};
4e4c362e 148 print +($h{'a'} eq 'foo') ? "" : "not ", "ok 42\n";
be6c24e0 149 print +($h{'b'} == 2) ? "" : "not ", "ok 43\n";
4e4c362e 150 local($h{'c'});
151 delete $h{'c'};
152}
153print +($h{'a'} == 1) ? "" : "not ", "ok 44\n";
154print +($h{'b'} == 2) ? "" : "not ", "ok 45\n";
155print +($h{'c'} == 3) ? "" : "not ", "ok 46\n";
156
157@a = ('a', 'b', 'c');
158{
159 local($a[1]) = "X";
160 shift @a;
161}
162print +($a[0].$a[1] eq "Xb") ? "" : "not ", "ok 47\n";
163
be6c24e0 164# now try the same for %SIG
165
166$SIG{TERM} = 'foo';
167$SIG{INT} = \&foo;
168$SIG{__WARN__} = $SIG{INT};
169{
170 local($SIG{TERM}) = $SIG{TERM};
171 local($SIG{INT}) = $SIG{INT};
172 local($SIG{__WARN__}) = $SIG{__WARN__};
173 print +($SIG{TERM} eq 'main::foo') ? "" : "not ", "ok 48\n";
174 print +($SIG{INT} eq \&foo) ? "" : "not ", "ok 49\n";
175 print +($SIG{__WARN__} eq \&foo) ? "" : "not ", "ok 50\n";
176 local($SIG{INT});
177 delete $SIG{__WARN__};
178}
179print +($SIG{TERM} eq 'main::foo') ? "" : "not ", "ok 51\n";
180print +($SIG{INT} eq \&foo) ? "" : "not ", "ok 52\n";
181print +($SIG{__WARN__} eq \&foo) ? "" : "not ", "ok 53\n";
182
183# and for %ENV
184
185$ENV{_X_} = 'a';
186$ENV{_Y_} = 'b';
187$ENV{_Z_} = 'c';
188{
189 local($ENV{_X_}) = 'foo';
190 local($ENV{_Y_}) = $ENV{_Y_};
191 print +($ENV{_X_} eq 'foo') ? "" : "not ", "ok 54\n";
192 print +($ENV{_Y_} eq 'b') ? "" : "not ", "ok 55\n";
193 local($ENV{_Z_});
194 delete $ENV{_Z_};
195}
196print +($ENV{_X_} eq 'a') ? "" : "not ", "ok 56\n";
197print +($ENV{_Y_} eq 'b') ? "" : "not ", "ok 57\n";
198print +($ENV{_Z_} eq 'c') ? "" : "not ", "ok 58\n";
199