Make srand() return "0 but true" for 0, for backwards compatible behaviour.
authorNicholas Clark <nick@ccl4.org>
Wed, 28 Jul 2010 10:01:51 +0000 (11:01 +0100)
committerNicholas Clark <nick@ccl4.org>
Wed, 28 Jul 2010 10:01:51 +0000 (11:01 +0100)
pp.c
t/op/srand.t

diff --git a/pp.c b/pp.c
index ec585ab..2dfca4c 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -2954,7 +2954,14 @@ PP(pp_srand)
     const UV anum = (MAXARG < 1) ? seed() : POPu;
     (void)seedDrand01((Rand_seed_t)anum);
     PL_srand_called = TRUE;
-    XPUSHu(anum);
+    if (anum)
+       XPUSHu(anum);
+    else {
+       /* Historically srand always returned true. We can avoid breaking
+          that like this:  */
+       sv_setpvs(TARG, "0 but true");
+       XPUSHTARG;
+    }
     RETURN;
 }
 
index 34fa9af..3d49126 100644 (file)
@@ -10,7 +10,7 @@ BEGIN {
 use strict;
 
 require "test.pl";
-plan(tests => 5);
+plan(tests => 9);
 
 # Generate a load of random numbers.
 # int() avoids possible floating point error.
@@ -61,3 +61,21 @@ ok( !eq_array(\@first_run, \@second_run), 'srand() called automatically');
 # check srand's return value
 my $seed = srand(1764);
 is( $seed, 1764, "return value" );
+
+$seed = srand(0);
+ok( $seed, "true return value for srand(0)");
+cmp_ok( $seed, '==', 0, "numeric 0 return value for srand(0)");
+
+{
+    my @warnings;
+    my $b;
+    {
+       local $SIG{__WARN__} = sub {
+           push @warnings, "@_";
+           warn @_;
+       };
+       $b = $seed + 0;
+    }
+    is( $b, 0, "Quacks like a zero");
+    is( "@warnings", "", "Does not warn");
+}