Skip to content

Commit a292342

Browse files
committed
ext/gmp: Refactor gmp_random_range() to use new ZPP specifier
1 parent d99c1f8 commit a292342

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
@@ -1747,68 +1747,27 @@ ZEND_FUNCTION(gmp_random_bits)
17471747
/* {{{ Gets a random number in the range min to max */
17481748
ZEND_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

Comments
 (0)