1
0
mirror of https://github.com/php/php-src.git synced 2026-03-25 16:52:18 +01:00

Make mode selection part of mt_srand()

The mode of operation is intrinsically linked to seeding, so this makes a lot of sense
This commit is contained in:
Leigh
2016-07-07 15:14:06 +01:00
parent bb1f8228ed
commit 69e7d8dcd5
6 changed files with 17 additions and 34 deletions

View File

@@ -1886,6 +1886,7 @@ ZEND_END_ARG_INFO()
/* {{{ mt_rand.c */
ZEND_BEGIN_ARG_INFO_EX(arginfo_mt_srand, 0, 0, 0)
ZEND_ARG_INFO(0, seed)
ZEND_ARG_INFO(0, mode)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_mt_rand, 0, 0, 0)
@@ -1895,10 +1896,6 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_mt_getrandmax, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_mt_rand_mode, 0, 0, 1)
ZEND_ARG_INFO(0, mode)
ZEND_END_ARG_INFO()
/* }}} */
/* {{{ random.c */
ZEND_BEGIN_ARG_INFO_EX(arginfo_random_bytes, 0, 0, 0)
@@ -2858,7 +2855,6 @@ const zend_function_entry basic_functions[] = { /* {{{ */
PHP_FE(mt_rand, arginfo_mt_rand)
PHP_FE(mt_srand, arginfo_mt_srand)
PHP_FE(mt_getrandmax, arginfo_mt_getrandmax)
PHP_FE(mt_rand_mode, arginfo_mt_rand_mode)
PHP_FE(random_bytes, arginfo_random_bytes)
PHP_FE(random_int, arginfo_random_int)

View File

@@ -189,13 +189,22 @@ PHPAPI uint32_t php_mt_rand(void)
PHP_FUNCTION(mt_srand)
{
zend_long seed = 0;
zend_long mode = MT_RAND_MT19937;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &seed) == FAILURE)
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ll", &seed, &mode) == FAILURE)
return;
if (ZEND_NUM_ARGS() == 0)
seed = GENERATE_SEED();
switch (mode) {
case MT_RAND_PHP:
BG(mt_rand_mode) = MT_RAND_PHP;
break;
default:
BG(mt_rand_mode) = MT_RAND_MT19937;
}
php_mt_srand(seed);
}
/* }}} */
@@ -283,25 +292,6 @@ PHP_FUNCTION(mt_getrandmax)
}
/* }}} */
/* {{{ proto int mt_rand_mode(int)
Switch mt_rand between standard and legacy modes */
PHP_FUNCTION(mt_rand_mode)
{
zend_long mode;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &mode) == FAILURE) {
return;
}
switch (mode) {
case MT_RAND_PHP:
BG(mt_rand_mode) = MT_RAND_PHP;
break;
default:
BG(mt_rand_mode) = MT_RAND_MT19937;
}
}
/* }}} */
PHP_MINIT_FUNCTION(mt_rand)
{
REGISTER_LONG_CONSTANT("MT_RAND_MT19937", MT_RAND_MT19937, CONST_CS | CONST_PERSISTENT);

View File

@@ -51,7 +51,6 @@ PHP_FUNCTION(getrandmax);
PHP_FUNCTION(mt_srand);
PHP_FUNCTION(mt_rand);
PHP_FUNCTION(mt_getrandmax);
PHP_FUNCTION(mt_rand_mode);
PHP_FUNCTION(abs);
PHP_FUNCTION(ceil);
PHP_FUNCTION(floor);

View File

@@ -3,8 +3,7 @@ Test mt_rand() output
--FILE--
<?php
mt_rand_mode(MT_RAND_PHP);
mt_srand(12345678);
mt_srand(12345678, MT_RAND_PHP);
for ($i=0; $i<16; $i++) {
echo mt_rand().PHP_EOL;
@@ -18,8 +17,7 @@ for ($i=0; $i<1024; $i++) {
echo $x.PHP_EOL;
echo PHP_EOL;
mt_rand_mode(MT_RAND_MT19937);
mt_srand(12345678);
mt_srand(12345678 /*, MT_RAND_MT19937 */);
for ($i=0; $i<16; $i++) {
echo mt_rand().PHP_EOL;

View File

@@ -2,12 +2,12 @@
Test mt_srand() - wrong params test mt_srand()
--FILE--
<?php
var_dump(mt_srand(500, true));
var_dump(mt_srand(500, 0, true));
var_dump(mt_srand("fivehundred"));
var_dump(mt_srand("500ABC"));
?>
--EXPECTF--
Warning: mt_srand() expects at most 1 parameter, 2 given in %s on line 2
Warning: mt_srand() expects at most 2 parameters, 3 given in %s on line 2
NULL
Warning: mt_srand() expects parameter 1 to be integer, string given in %s on line 3

View File

@@ -13,7 +13,7 @@ Test srand() function : error conditions - incorrect number of args
echo "*** Testing srand() : error conditions ***\n";
var_dump(srand(500, true));
var_dump(srand(500, 0, true));
var_dump(srand("fivehundred"));
var_dump(srand("500ABC"));
?>
@@ -21,7 +21,7 @@ var_dump(srand("500ABC"));
--EXPECTF--
*** Testing srand() : error conditions ***
Warning: srand() expects at most 1 parameter, 2 given in %s on line %d
Warning: srand() expects at most 2 parameters, 3 given in %s on line %d
NULL
Warning: srand() expects parameter 1 to be integer, string given in %s on line %d