Change 25396 by [EMAIL PROTECTED] on 2005/09/12 22:33:56
Integrate:
[ 24201]
Add a macro PERL_DEBUG_COW, for aggressive compile time tests of
Copy-On-Write related source changes.
Fix the problem this revealed.
[ 24998]
Fix sv_dec of undefined PVs to (a) not downgrade to NV
(b) give -1, rather than +1
[ 25102]
sv_dec is supposed to go *down*, m'kay.
Affected files ...
... //depot/maint-5.8/perl/sv.c#137 integrate
... //depot/maint-5.8/perl/sv.h#38 edit
... //depot/maint-5.8/perl/t/op/inc.t#3 integrate
Differences ...
==== //depot/maint-5.8/perl/sv.c#137 (text) ====
Index: perl/sv.c
--- perl/sv.c#136~25394~ Mon Sep 12 14:21:39 2005
+++ perl/sv.c Mon Sep 12 15:33:56 2005
@@ -6676,7 +6676,7 @@
}
else {
(void)SvIOK_only_UV(sv);
- SvUV_set(sv, SvUVX(sv) + 1);
+ SvUV_set(sv, SvUVX(sv) - 1);
}
} else {
if (SvIVX(sv) == IV_MIN)
@@ -6694,10 +6694,10 @@
return;
}
if (!(flags & SVp_POK)) {
- if ((flags & SVTYPEMASK) < SVt_PVNV)
- sv_upgrade(sv, SVt_NV);
- SvNVX(sv) = -1.0;
- (void)SvNOK_only(sv);
+ if ((flags & SVTYPEMASK) < SVt_PVIV)
+ sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
+ SvIV_set(sv, -1);
+ (void)SvIOK_only(sv);
return;
}
#ifdef PERL_PRESERVE_IVUV
==== //depot/maint-5.8/perl/sv.h#38 (text) ====
Index: perl/sv.h
--- perl/sv.h#37~25394~ Mon Sep 12 14:21:39 2005
+++ perl/sv.h Mon Sep 12 15:33:56 2005
@@ -740,17 +740,18 @@
#define SvRVx(sv) SvRV(sv)
#define SvIVX(sv) ((XPVIV*) SvANY(sv))->xiv_iv
-#define SvIVXx(sv) SvIVX(sv)
#define SvUVX(sv) ((XPVUV*) SvANY(sv))->xuv_uv
-#define SvUVXx(sv) SvUVX(sv)
#define SvNVX(sv) ((XPVNV*)SvANY(sv))->xnv_nv
-#define SvNVXx(sv) SvNVX(sv)
#define SvPVX(sv) ((XPV*) SvANY(sv))->xpv_pv
-#define SvPVXx(sv) SvPVX(sv)
#define SvCUR(sv) ((XPV*) SvANY(sv))->xpv_cur
#define SvLEN(sv) ((XPV*) SvANY(sv))->xpv_len
-#define SvLENx(sv) SvLEN(sv)
#define SvEND(sv)(((XPV*) SvANY(sv))->xpv_pv + ((XPV*)SvANY(sv))->xpv_cur)
+
+#define SvIVXx(sv) SvIVX(sv)
+#define SvUVXx(sv) SvUVX(sv)
+#define SvNVXx(sv) SvNVX(sv)
+#define SvPVXx(sv) SvPVX(sv)
+#define SvLENx(sv) SvLEN(sv)
#define SvENDx(sv) ((PL_Sv = (sv)), SvEND(PL_Sv))
#define SvMAGIC(sv) ((XPVMG*) SvANY(sv))->xmg_magic
#define SvSTASH(sv) ((XPVMG*) SvANY(sv))->xmg_stash
@@ -768,7 +769,7 @@
(((XPVIV*) SvANY(sv))->xiv_iv = (val)); } STMT_END
#define SvNV_set(sv, val) \
STMT_START { assert(SvTYPE(sv) == SVt_NV || SvTYPE(sv) >= SVt_PVNV); \
- (SvNVX(sv) = (val)); } STMT_END
+ (((XPVNV*)SvANY(sv))->xnv_nv = (val)); } STMT_END
/* assert(SvTYPE(sv) >= SVt_PV); */
#define SvPV_set(sv, val) \
STMT_START { \
==== //depot/maint-5.8/perl/t/op/inc.t#3 (xtext) ====
Index: perl/t/op/inc.t
--- perl/t/op/inc.t#2~19029~ Wed Mar 19 07:42:44 2003
+++ perl/t/op/inc.t Mon Sep 12 15:33:56 2005
@@ -2,7 +2,7 @@
# use strict;
-print "1..26\n";
+print "1..32\n";
my $test = 1;
@@ -157,3 +157,31 @@
}
check_same (\%orig, \%postdec);
+
+{
+ no warnings 'uninitialized';
+ my $x, $y;
+ eval {
+ $y ="$x\n";
+ ++$x;
+ };
+ ok($x == 1, $x);
+ ok($@ eq '', $@);
+
+ my $p, $q;
+ eval {
+ $q ="$p\n";
+ --$p;
+ };
+ ok($p == -1, $p);
+ ok($@ eq '', $@);
+}
+
+$a = 2147483648;
+$c=--$a;
+ok ($a == 2147483647, $a);
+
+
+$a = 2147483648;
+$c=$a--;
+ok ($a == 2147483647, $a);
End of Patch.