[rt #103222] make Internals::SvREFCNT set/get consistent
authorTony Cook <tony@develop-help.com>
Mon, 14 Nov 2011 08:30:17 +0000 (19:30 +1100)
committerTony Cook <tony@develop-help.com>
Mon, 14 Nov 2011 08:30:17 +0000 (19:30 +1100)
lib/Internals.t
universal.c

index b0d5bda..d6c2367 100644 (file)
@@ -7,7 +7,7 @@ BEGIN {
     }
 }
 
-use Test::More tests => 74;
+use Test::More tests => 76;
 
 my $ro_err = qr/^Modification of a read-only value attempted/;
 
@@ -163,3 +163,7 @@ is(  Internals::SvREFCNT($foo[2]), 1 );
 is(  Internals::SvREFCNT(%foo), 1 );
 is(  Internals::SvREFCNT($foo{foo}), 1 );
 
+is(  Internals::SvREFCNT($foo, 2), 2, "update ref count");
+is(  Internals::SvREFCNT($foo), 2, "check we got the stored value");
+
+Internals::SvREFCNT($foo, 1 );
index d623a67..0599e67 100644 (file)
@@ -927,8 +927,8 @@ XS(XS_Internals_SvREFCNT)   /* This is dangerous stuff. */
         XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */
     else if (items == 2) {
          /* I hope you really know what you are doing. */
-        SvREFCNT(sv) = SvIV(ST(1));
-        XSRETURN_IV(SvREFCNT(sv));
+        SvREFCNT(sv) = SvIV(ST(1)) + 1; /* we free one ref on exit */
+        XSRETURN_IV(SvREFCNT(sv) - 1);
     }
     XSRETURN_UNDEF; /* Can't happen. */
 }