develooper Front page | perl.perl5.porters | Postings from May 2001

Re: [20010521.003] - [PATCH] sv.c: sv_dup_inc(SvRV(sstr)) wasn't checking SvWEAKREF

Thread Next
From:
Richard Soderberg
Date:
May 24, 2001 06:41
Subject:
Re: [20010521.003] - [PATCH] sv.c: sv_dup_inc(SvRV(sstr)) wasn't checking SvWEAKREF
Message ID:
NAEKLNAAHLMBPMPNBMLEKEPHDEAA.rs@crystalflame.net
Artur noted that weakened refs were getting incremented refcnts.  Looks like
we forgot to tell sv.c about weakrefs.  Here's a patch.  It looks like my
mailer is trying it's damndest to break the tabs in this, too.  I'd like to
know how cleanly this applies, and if you have to use the attachment.

R.

--- sv.c.10175	Thu May 24 06:30:00 2001
+++ sv.c	Thu May 24 06:23:26 2001
@@ -7980,14 +7980,18 @@
 	break;
     case SVt_RV:
 	SvANY(dstr)	= new_XRV();
-	SvRV(dstr)	= sv_dup_inc(SvRV(sstr));
+	SvRV(dstr)	= SvWEAKREF(sv_dup(SvRV(sstr)))
+			? sv_dup_inc(SvRV(sstr))
+			: sv_dup(SvRV(sstr));
 	break;
     case SVt_PV:
 	SvANY(dstr)	= new_XPV();
 	SvCUR(dstr)	= SvCUR(sstr);
 	SvLEN(dstr)	= SvLEN(sstr);
 	if (SvROK(sstr))
-	    SvRV(dstr)	= sv_dup_inc(SvRV(sstr));
+	    SvRV(dstr)	= SvWEAKREF(sv_dup(SvRV(sstr)))
+			? sv_dup_inc(SvRV(sstr))
+			: sv_dup(SvRV(sstr));
 	else if (SvPVX(sstr) && SvLEN(sstr))
 	    SvPVX(dstr)	= SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
 	else
@@ -7999,7 +8003,9 @@
 	SvLEN(dstr)	= SvLEN(sstr);
 	SvIVX(dstr)	= SvIVX(sstr);
 	if (SvROK(sstr))
-	    SvRV(dstr)	= sv_dup_inc(SvRV(sstr));
+	    SvRV(dstr)	= SvWEAKREF(sv_dup(SvRV(sstr)))
+			? sv_dup_inc(SvRV(sstr))
+			: sv_dup(SvRV(sstr));
 	else if (SvPVX(sstr) && SvLEN(sstr))
 	    SvPVX(dstr)	= SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
 	else
@@ -8012,7 +8018,9 @@
 	SvIVX(dstr)	= SvIVX(sstr);
 	SvNVX(dstr)	= SvNVX(sstr);
 	if (SvROK(sstr))
-	    SvRV(dstr)	= sv_dup_inc(SvRV(sstr));
+	    SvRV(dstr)	= SvWEAKREF(sv_dup(SvRV(sstr)))
+			? sv_dup_inc(SvRV(sstr))
+			: sv_dup(SvRV(sstr));
 	else if (SvPVX(sstr) && SvLEN(sstr))
 	    SvPVX(dstr)	= SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
 	else
@@ -8027,7 +8035,9 @@
 	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr));
 	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr));
 	if (SvROK(sstr))
-	    SvRV(dstr)	= sv_dup_inc(SvRV(sstr));
+	    SvRV(dstr)	= SvWEAKREF(sv_dup(SvRV(sstr)))
+			? sv_dup_inc(SvRV(sstr))
+			: sv_dup(SvRV(sstr));
 	else if (SvPVX(sstr) && SvLEN(sstr))
 	    SvPVX(dstr)	= SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
 	else
@@ -8042,7 +8052,9 @@
 	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr));
 	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr));
 	if (SvROK(sstr))
-	    SvRV(dstr)	= sv_dup_inc(SvRV(sstr));
+	    SvRV(dstr)	= SvWEAKREF(sv_dup(SvRV(sstr)))
+			? sv_dup_inc(SvRV(sstr))
+			: sv_dup(SvRV(sstr));
 	else if (SvPVX(sstr) && SvLEN(sstr))
 	    SvPVX(dstr)	= SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
 	else
@@ -8060,7 +8072,9 @@
 	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr));
 	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr));
 	if (SvROK(sstr))
-	    SvRV(dstr)	= sv_dup_inc(SvRV(sstr));
+	    SvRV(dstr)	= SvWEAKREF(sv_dup(SvRV(sstr)))
+			? sv_dup_inc(SvRV(sstr))
+			: sv_dup(SvRV(sstr));
 	else if (SvPVX(sstr) && SvLEN(sstr))
 	    SvPVX(dstr)	= SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
 	else
@@ -8091,7 +8105,9 @@
 	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr));
 	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr));
 	if (SvROK(sstr))
-	    SvRV(dstr)	= sv_dup_inc(SvRV(sstr));
+	    SvRV(dstr)	= SvWEAKREF(sv_dup(SvRV(sstr)))
+			? sv_dup_inc(SvRV(sstr))
+			: sv_dup(SvRV(sstr));
 	else if (SvPVX(sstr) && SvLEN(sstr))
 	    SvPVX(dstr)	= SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
 	else
@@ -8112,7 +8128,9 @@
 	SvMAGIC(dstr)	= mg_dup(SvMAGIC(sstr));
 	SvSTASH(dstr)	= hv_dup_inc(SvSTASH(sstr));
 	if (SvROK(sstr))
-	    SvRV(dstr)	= sv_dup_inc(SvRV(sstr));
+	    SvRV(dstr)	= SvWEAKREF(sv_dup(SvRV(sstr)))
+			? sv_dup_inc(SvRV(sstr))
+			: sv_dup(SvRV(sstr));
 	else if (SvPVX(sstr) && SvLEN(sstr))
 	    SvPVX(dstr)	= SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
 	else



Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About