@@ -1751,68 +1751,27 @@ ZEND_FUNCTION(gmp_random_bits)
1751
1751
/* {{{ Gets a random number in the range min to max */
1752
1752
ZEND_FUNCTION (gmp_random_range )
1753
1753
{
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 ;
1758
1755
1759
1756
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 )
1762
1759
ZEND_PARSE_PARAMETERS_END ();
1763
1760
1764
1761
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
+ }
1765
1766
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 );
1811
1768
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 );
1816
1775
}
1817
1776
/* }}} */
1818
1777
0 commit comments