@@ -1751,68 +1751,27 @@ ZEND_FUNCTION(gmp_random_bits)
17511751/* {{{ Gets a random number in the range min to max */
17521752ZEND_FUNCTION (gmp_random_range )
17531753{
1754- zval * min_arg , * max_arg ;
1755- mpz_ptr gmpnum_max , gmpnum_result ;
1756- mpz_t gmpnum_range ;
1757- gmp_temp_t temp_a , temp_b ;
1754+ mpz_ptr gmpnum_min , gmpnum_max , gmpnum_result ;
17581755
17591756 ZEND_PARSE_PARAMETERS_START (2 , 2 )
1760- Z_PARAM_ZVAL ( min_arg )
1761- Z_PARAM_ZVAL ( max_arg )
1757+ GMP_Z_PARAM_INTO_MPZ_PTR ( gmpnum_min )
1758+ GMP_Z_PARAM_INTO_MPZ_PTR ( gmpnum_max )
17621759 ZEND_PARSE_PARAMETERS_END ();
17631760
17641761 gmp_init_random ();
1762+ if (mpz_cmp (gmpnum_max , gmpnum_min ) <= 0 ) {
1763+ zend_argument_value_error (1 , "must be less than argument #2 ($maximum)" );
1764+ RETURN_THROWS ();
1765+ }
17651766
1766- FETCH_GMP_ZVAL (gmpnum_max , max_arg , temp_a , 2 );
1767-
1768- if (Z_TYPE_P (min_arg ) == IS_LONG && Z_LVAL_P (min_arg ) >= 0 ) {
1769- if (mpz_cmp_ui (gmpnum_max , Z_LVAL_P (min_arg )) <= 0 ) {
1770- FREE_GMP_TEMP (temp_a );
1771- zend_argument_value_error (1 , "must be less than argument #2 ($maximum)" );
1772- RETURN_THROWS ();
1773- }
1774-
1775- INIT_GMP_RETVAL (gmpnum_result );
1776- mpz_init (gmpnum_range );
1777-
1778- if (Z_LVAL_P (min_arg ) != 0 ) {
1779- mpz_sub_ui (gmpnum_range , gmpnum_max , Z_LVAL_P (min_arg ) - 1 );
1780- } else {
1781- mpz_add_ui (gmpnum_range , gmpnum_max , 1 );
1782- }
1783-
1784- mpz_urandomm (gmpnum_result , GMPG (rand_state ), gmpnum_range );
1785-
1786- if (Z_LVAL_P (min_arg ) != 0 ) {
1787- mpz_add_ui (gmpnum_result , gmpnum_result , Z_LVAL_P (min_arg ));
1788- }
1789-
1790- mpz_clear (gmpnum_range );
1791- FREE_GMP_TEMP (temp_a );
1792- } else {
1793- mpz_ptr gmpnum_min ;
1794-
1795- FETCH_GMP_ZVAL_DEP (gmpnum_min , min_arg , temp_b , temp_a , 1 );
1796-
1797- if (mpz_cmp (gmpnum_max , gmpnum_min ) <= 0 ) {
1798- FREE_GMP_TEMP (temp_b );
1799- FREE_GMP_TEMP (temp_a );
1800- zend_argument_value_error (1 , "must be less than argument #2 ($maximum)" );
1801- RETURN_THROWS ();
1802- }
1803-
1804- INIT_GMP_RETVAL (gmpnum_result );
1805- mpz_init (gmpnum_range );
1806-
1807- mpz_sub (gmpnum_range , gmpnum_max , gmpnum_min );
1808- mpz_add_ui (gmpnum_range , gmpnum_range , 1 );
1809- mpz_urandomm (gmpnum_result , GMPG (rand_state ), gmpnum_range );
1810- mpz_add (gmpnum_result , gmpnum_result , gmpnum_min );
1767+ INIT_GMP_RETVAL (gmpnum_result );
18111768
1812- mpz_clear (gmpnum_range );
1813- FREE_GMP_TEMP (temp_b );
1814- FREE_GMP_TEMP (temp_a );
1815- }
1769+ /* Use available 3rd ZPP slot for range num to prevent allocation and freeing */
1770+ mpz_ptr gmpnum_range = GMPG (zpp_arg [2 ]);
1771+ mpz_sub (gmpnum_range , gmpnum_max , gmpnum_min );
1772+ mpz_add_ui (gmpnum_range , gmpnum_range , 1 );
1773+ mpz_urandomm (gmpnum_result , GMPG (rand_state ), gmpnum_range );
1774+ mpz_add (gmpnum_result , gmpnum_result , gmpnum_min );
18161775}
18171776/* }}} */
18181777
0 commit comments