develooper Front page | perl.perl5.porters | Postings from November 2008

[perl #7021] perl_clone breaks refcnt on weaken

Thread Previous
From:
Steve Peters via RT
Date:
November 25, 2008 11:13
Subject:
[perl #7021] perl_clone breaks refcnt on weaken
Message ID:
rt-3.6.HEAD-10965-1227621669-1352.7021-15-0@perl.org
On Thu May 24 01:58:01 2001, RT_System wrote:
> --- 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(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(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(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(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(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(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(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(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(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


Thanks!  This change was applied with change #10199 (really).

Steve Peters



Thread Previous


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