&CORE::rand()
authorFather Chrysostomos <sprout@cpan.org>
Fri, 26 Aug 2011 17:12:01 +0000 (10:12 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 27 Aug 2011 01:21:46 +0000 (18:21 -0700)
This commit allows &CORE::rand to be called through references and
via ampersand syntax.  pp_rand is modified to take into account the
nulls pushed on to the stack in pp_coreargs, which happens because
pp_coreargs has no other way to tell rand how many arguments it’s
actually getting.  See commit 0163043a for details.

gv.c
pp.c
t/op/coresubs.t

diff --git a/gv.c b/gv.c
index ab47c56..91d4cff 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -1357,7 +1357,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
            case KEY_keys:
            case KEY_lstat:
            case KEY_pop:
-           case KEY_push: case KEY_rand: case KEY_read:
+           case KEY_push: case KEY_read:
            case KEY_recv: case KEY_reset:
            case KEY_select: case KEY_send:
            case KEY_setpgrp: case KEY_shift: case KEY_sleep:
diff --git a/pp.c b/pp.c
index 78b1271..fe2c4ab 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -2813,6 +2813,9 @@ PP(pp_rand)
     NV value;
     if (MAXARG < 1)
        value = 1.0;
+    else if (!TOPs) {
+       value = 1.0; (void)POPs;
+    }
     else
        value = POPn;
     if (value == 0.0)
index dd32f87..f21ba76 100644 (file)
@@ -487,6 +487,13 @@ lis [&mypack("H*", '5065726c')], ['Perl'], '&pack in list context';
 
 test_proto 'pipe';
 test_proto 'quotemeta', '$', '\$';
+
+test_proto 'rand';
+$tests += 3;
+like &CORE::rand, qr/^0[.\d]*\z/, '&rand';
+unlike join(" ", &CORE::rand), qr/ /, '&rand in list context';
+&cmp_ok(&CORE::rand(78), qw '< 78', '&rand with 2 args');
+
 test_proto 'readdir';
 
 test_proto 'readline';