Skip to content

Commit 376c148

Browse files
committed
ext/gmp: Refactor gmp_random_range() to use new ZPP specifier
1 parent 3964efd commit 376c148

File tree

1 file changed

+14
-55
lines changed

1 file changed

+14
-55
lines changed

ext/gmp/gmp.c

Lines changed: 14 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,68 +1751,27 @@ ZEND_FUNCTION(gmp_random_bits)
17511751
/* {{{ Gets a random number in the range min to max */
17521752
ZEND_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

Comments
 (0)