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
-
Re: [20010521.003] - [PATCH] sv.c: sv_dup_inc(SvRV(sstr)) wasn't checking SvWEAKREF
by Richard Soderberg