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.
-
Re: $x != ~~$x for some $x (APR#315)
by Gurusamy Sarathy