develooper Front page | perl.perl5.porters | Postings from April 2000

Re: $x != ~~$x for some $x (APR#315)

From:
Gurusamy Sarathy
Date:
April 28, 2000 12:42
Subject:
Re: $x != ~~$x for some $x (APR#315)
Message ID:
200004281941.MAA13639@molotok.activestate.com
On Wed, 19 Apr 2000 11:18:27 PDT, hatch@hadron.org wrote:
>Full_Name: Don Hatch
>Version: ActivePerl 613
>OS: Windows NT 4.0 SP 4 or lower
>Submission from: (NULL) (63.36.209.25)
>
>
>#!/usr/local/bin/perl -w
>
>#
># Script to demonstrate bug in perl 5.6: "$x != ~~$x for some $x".
># Prints "Success." when run using ActivePerl 5.005_03 build 522 for Windows.
># Prints "Failure." when run using ActivePerl 5.6.0 build 613 for Windows.
>#
>
>use strict;
>
>sub FirstElement($)
>{
>    my ($arrayRef) = @_;
>    return $arrayRef->[0];
>}
>
>main:
>{
>    my @array = (~0,~1,~2,~3);
>    print "array == (@array)\n";    # don't remove this line!
>    my $x = FirstElement(\@array);
>
>    print "  x == ",   $x, "\n";
>    print "~~x == ", ~~$x, "\n";
>    print "(x==~~x) == ", $x==~~$x, "\n";
>
>    $x == ~~$x or die "Failure.\n";
>    print "Success.\n";
>}

Here's a fix for this problem.


Sarathy
gsar@activestate.com
-----------------------------------8<-----------------------------------
Change 6002 by gsar@auger on 2000/04/28 19:34:16

	destructive sv_setsv() can lose UV-ness from source, causing
	numeric promotions/comparisons to fail to do the right thing

Affected files ...

... //depot/perl/sv.c#229 edit

Differences ...

==== //depot/perl/sv.c#229 (text) ====
Index: perl/sv.c
--- perl/sv.c.~1~	Fri Apr 28 12:34:21 2000
+++ perl/sv.c	Fri Apr 28 12:34:21 2000
@@ -2724,7 +2724,7 @@
 	if (sflags & SVp_IOK) {
 	    (void)SvIOK_on(dstr);
 	    SvIVX(dstr) = SvIVX(sstr);
-	    if (SvIsUV(sstr))
+	    if (sflags & SVf_IVisUV)
 		SvIsUV_on(dstr);
 	}
 	if (SvAMAGIC(sstr)) {
@@ -2762,7 +2762,7 @@
 		SvUTF8_off(dstr);
 
 	    SvTEMP_off(dstr);
-	    (void)SvOK_off(sstr);
+	    (void)SvOK_off(sstr);		/* NOTE: nukes most SvFLAGS on sstr */
 	    SvPV_set(sstr, Nullch);
 	    SvLEN_set(sstr, 0);
 	    SvCUR_set(sstr, 0);
@@ -2787,25 +2787,25 @@
 	if (sflags & SVp_IOK) {
 	    (void)SvIOK_on(dstr);
 	    SvIVX(dstr) = SvIVX(sstr);
-	    if (SvIsUV(sstr))
+	    if (sflags & SVf_IVisUV)
 		SvIsUV_on(dstr);
 	}
     }
     else if (sflags & SVp_NOK) {
 	SvNVX(dstr) = SvNVX(sstr);
 	(void)SvNOK_only(dstr);
-	if (SvIOK(sstr)) {
+	if (sflags & SVf_IOK) {
 	    (void)SvIOK_on(dstr);
 	    SvIVX(dstr) = SvIVX(sstr);
 	    /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
-	    if (SvIsUV(sstr))
+	    if (sflags & SVf_IVisUV)
 		SvIsUV_on(dstr);
 	}
     }
     else if (sflags & SVp_IOK) {
 	(void)SvIOK_only(dstr);
 	SvIVX(dstr) = SvIVX(sstr);
-	if (SvIsUV(sstr))
+	if (sflags & SVf_IVisUV)
 	    SvIsUV_on(dstr);
     }
     else {
End of Patch.



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