Strengthen weak refs when sorting in-place
authorDagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Wed, 30 Aug 2017 21:35:17 +0000 (22:35 +0100)
committerDagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Mon, 4 Sep 2017 09:12:04 +0000 (10:12 +0100)
It's conceptually an assignment, which should strengthen any weak refs.

Reported-by: Tom Molesworth <team@cpan.org>
pp_sort.c
t/op/sort.t

index ee1dc5d..5f39dba 100644 (file)
--- a/pp_sort.c
+++ b/pp_sort.c
@@ -1769,6 +1769,9 @@ PP(pp_sort)
                     base[i] = newSVsv(sv);
                 else
                     SvREFCNT_inc_simple_void_NN(sv);
+
+                if (SvWEAKREF(sv))
+                    sv_rvunweaken(sv);
             }
             av_clear(av);
             if (max > 0) {
index 96fad1c..21a30d7 100644 (file)
@@ -7,7 +7,7 @@ BEGIN {
     set_up_inc('../lib');
 }
 use warnings;
-plan(tests => 197);
+plan(tests => 198);
 
 # these shouldn't hang
 {
@@ -492,7 +492,18 @@ cmp_ok($x,'eq','123',q(optimized-away comparison block doesn't take any other ar
     @a = sort { $a <=> $b } @a;
     $$r = "z";
     is ("@a", "3 4 5", "RT #128340");
+}
 
+# in-place sorting of weak references
+SKIP: {
+    skip_if_miniperl("no dynamic loading on miniperl, no extension Scalar::Util", 1);
+    require Scalar::Util;
+    my @a = map { \(my $dummy = $_) } qw(c a d b);
+    my $r = $a[1];
+    Scalar::Util::weaken($a[1]);
+    @a = sort { $$a cmp $$b } @a;
+    undef $r;
+    ok defined $a[0] && ${$a[0]} eq 'a', "in-place sort strengthens weak references";
 }
 
 # Test optimisations of reversed sorts. As we now guarantee stability by