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