This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Tests for #85026
[perl5.git] / t / op / hash-rt85026.t
1 #!/usr/bin/perl -w
2
3 BEGIN {
4   chdir 't';
5   @INC = '../lib';
6   require './test.pl';
7   skip_all_without_dynamic_extension("Devel::Peek");
8 }
9
10 use strict;
11 use Devel::Peek;
12 use File::Temp qw(tempdir);
13
14 my %hash = map +($_ => 1), ("a".."z");
15
16 my $tmp_dir = tempdir(CLEANUP => 1);
17
18 sub riter {
19     local *OLDERR;
20     open(OLDERR, ">&STDERR") || die "Can't dup STDERR: $!";
21     open(STDERR, ">", "$tmp_dir/dump") ||
22         die "Could not open '$tmp_dir/dump' for write: $^E";
23     Dump(\%hash);
24     open(STDERR, ">&OLDERR") || die "Can't dup OLDERR: $!";
25     open(my $fh, "<", "$tmp_dir/dump") ||
26         die "Could not open '$tmp_dir/dump' for read: $^E";
27     local $/;
28     my $dump = <$fh>;
29     my ($riter) = $dump =~ /^\s*RITER\s*=\s*(\d+)/m or
30         die "No plain RITER in dump '$dump'";
31     return $riter;
32 }
33
34 my @riters;
35 while (my $key = each %hash) {
36     push @{$riters[riter()]}, $key;
37 }
38
39 my ($first_key, $second_key);
40 my $riter = 0;
41 for my $chain (@riters) {
42     if ($chain && @$chain >= 2) {
43         $first_key  = $chain->[0];
44         $second_key = $chain->[1];
45         last;
46     }
47     $riter++;
48 }
49 $first_key ||
50     skip_all "No 2 element chains; need a different initial HASH";
51 $| = 1;
52
53 plan(1);
54
55 # Ok all preparation is done
56 diag <<"EOF"
57 Found keys '$first_key' and '$second_key' on chain $riter
58 Will now iterato to key '$first_key' then delete '$first_key' and '$second_key'.
59 EOF
60 ;
61 1 until $first_key eq each %hash;
62 delete $hash{$first_key};
63 delete $hash{$second_key};
64
65 diag "Now iterating into freed memory\n";
66 1 for each %hash;
67 ok(1, "Survived!");