Skip to content

Commit 53fe3e9

Browse files
committed
ext/gmp: Refactor gmp_div_(q|r)() to use new ZPP specifier
1 parent d7e13f6 commit 53fe3e9

File tree

4 files changed

+56
-58
lines changed

4 files changed

+56
-58
lines changed

ext/gmp/gmp.c

Lines changed: 53 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -267,21 +267,6 @@ static inline void gmp_zval_unary_op(zval *return_value, zval *a_arg, gmp_unary_
267267
static void gmp_mpz_tdiv_q_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
268268
mpz_tdiv_q_ui(a, b, c);
269269
}
270-
static void gmp_mpz_tdiv_r_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
271-
mpz_tdiv_r_ui(a, b, c);
272-
}
273-
static void gmp_mpz_fdiv_q_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
274-
mpz_fdiv_q_ui(a, b, c);
275-
}
276-
static void gmp_mpz_fdiv_r_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
277-
mpz_fdiv_r_ui(a, b, c);
278-
}
279-
static void gmp_mpz_cdiv_r_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
280-
mpz_cdiv_r_ui(a, b, c);
281-
}
282-
static void gmp_mpz_cdiv_q_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
283-
mpz_cdiv_q_ui(a, b, c);
284-
}
285270
static void gmp_mpz_mod_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
286271
mpz_mod_ui(a, b, c);
287272
}
@@ -1160,72 +1145,85 @@ ZEND_FUNCTION(gmp_div_qr)
11601145
}
11611146
}
11621147

1163-
/* {{{ Divide a by b, returns reminder only */
1148+
/* Divide a by b, returns reminder only */
11641149
ZEND_FUNCTION(gmp_div_r)
11651150
{
1166-
zval *a_arg, *b_arg;
1151+
mpz_ptr gmpnum_a, gmpnum_b, gmpnum_result;
11671152
zend_long round = GMP_ROUND_ZERO;
11681153

11691154
ZEND_PARSE_PARAMETERS_START(2, 3)
1170-
Z_PARAM_ZVAL(a_arg)
1171-
Z_PARAM_ZVAL(b_arg)
1155+
GMP_Z_PARAM_INTO_MPZ_PTR(gmpnum_a)
1156+
GMP_Z_PARAM_INTO_MPZ_PTR(gmpnum_b)
11721157
Z_PARAM_OPTIONAL
11731158
Z_PARAM_LONG(round)
11741159
ZEND_PARSE_PARAMETERS_END();
11751160

1176-
switch (round) {
1177-
case GMP_ROUND_ZERO:
1178-
gmp_zval_binary_ui_op(
1179-
return_value, a_arg, b_arg, mpz_tdiv_r, gmp_mpz_tdiv_r_ui, 1, /* is_operator */ false);
1180-
break;
1181-
case GMP_ROUND_PLUSINF:
1182-
gmp_zval_binary_ui_op(
1183-
return_value, a_arg, b_arg, mpz_cdiv_r, gmp_mpz_cdiv_r_ui, 1, /* is_operator */ false);
1184-
break;
1185-
case GMP_ROUND_MINUSINF:
1186-
gmp_zval_binary_ui_op(
1187-
return_value, a_arg, b_arg, mpz_fdiv_r, gmp_mpz_fdiv_r_ui, 1, /* is_operator */ false);
1188-
break;
1189-
default:
1190-
zend_argument_value_error(3, "must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF");
1161+
if (mpz_cmp_ui(gmpnum_b, 0) == 0) {
1162+
zend_argument_error(zend_ce_division_by_zero_error, 2, "Division by zero");
11911163
RETURN_THROWS();
11921164
}
1165+
1166+
switch (round) {
1167+
case GMP_ROUND_ZERO: {
1168+
INIT_GMP_RETVAL(gmpnum_result);
1169+
mpz_tdiv_r(gmpnum_result, gmpnum_a, gmpnum_b);
1170+
return;
1171+
}
1172+
case GMP_ROUND_PLUSINF: {
1173+
INIT_GMP_RETVAL(gmpnum_result);
1174+
mpz_cdiv_r(gmpnum_result, gmpnum_a, gmpnum_b);
1175+
return;
1176+
}
1177+
case GMP_ROUND_MINUSINF: {
1178+
INIT_GMP_RETVAL(gmpnum_result);
1179+
mpz_fdiv_r(gmpnum_result, gmpnum_a, gmpnum_b);
1180+
return;
1181+
}
1182+
default:
1183+
zend_argument_value_error(3, "must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF");
1184+
RETURN_THROWS();
1185+
}
11931186
}
1194-
/* }}} */
11951187

1196-
/* {{{ Divide a by b, returns quotient only */
1188+
/* Divide a by b, returns quotient only */
11971189
ZEND_FUNCTION(gmp_div_q)
11981190
{
1199-
zval *a_arg, *b_arg;
1191+
mpz_ptr gmpnum_a, gmpnum_b, gmpnum_result;
12001192
zend_long round = GMP_ROUND_ZERO;
12011193

12021194
ZEND_PARSE_PARAMETERS_START(2, 3)
1203-
Z_PARAM_ZVAL(a_arg)
1204-
Z_PARAM_ZVAL(b_arg)
1195+
GMP_Z_PARAM_INTO_MPZ_PTR(gmpnum_a)
1196+
GMP_Z_PARAM_INTO_MPZ_PTR(gmpnum_b)
12051197
Z_PARAM_OPTIONAL
12061198
Z_PARAM_LONG(round)
12071199
ZEND_PARSE_PARAMETERS_END();
12081200

1209-
switch (round) {
1210-
case GMP_ROUND_ZERO:
1211-
gmp_zval_binary_ui_op(
1212-
return_value, a_arg, b_arg, mpz_tdiv_q, gmp_mpz_tdiv_q_ui, 1, /* is_operator */ false);
1213-
break;
1214-
case GMP_ROUND_PLUSINF:
1215-
gmp_zval_binary_ui_op(
1216-
return_value, a_arg, b_arg, mpz_cdiv_q, gmp_mpz_cdiv_q_ui, 1, /* is_operator */ false);
1217-
break;
1218-
case GMP_ROUND_MINUSINF:
1219-
gmp_zval_binary_ui_op(
1220-
return_value, a_arg, b_arg, mpz_fdiv_q, gmp_mpz_fdiv_q_ui, 1, /* is_operator */ false);
1221-
break;
1222-
default:
1223-
zend_argument_value_error(3, "must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF");
1201+
if (mpz_cmp_ui(gmpnum_b, 0) == 0) {
1202+
zend_argument_error(zend_ce_division_by_zero_error, 2, "Division by zero");
12241203
RETURN_THROWS();
12251204
}
12261205

1206+
switch (round) {
1207+
case GMP_ROUND_ZERO: {
1208+
INIT_GMP_RETVAL(gmpnum_result);
1209+
mpz_tdiv_q(gmpnum_result, gmpnum_a, gmpnum_b);
1210+
return;
1211+
}
1212+
case GMP_ROUND_PLUSINF: {
1213+
INIT_GMP_RETVAL(gmpnum_result);
1214+
mpz_cdiv_q(gmpnum_result, gmpnum_a, gmpnum_b);
1215+
return;
1216+
}
1217+
case GMP_ROUND_MINUSINF: {
1218+
INIT_GMP_RETVAL(gmpnum_result);
1219+
mpz_fdiv_q(gmpnum_result, gmpnum_a, gmpnum_b);
1220+
return;
1221+
}
1222+
default:
1223+
zend_argument_value_error(3, "must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF");
1224+
RETURN_THROWS();
1225+
}
12271226
}
1228-
/* }}} */
12291227

12301228
/* {{{ Computes a modulo b */
12311229
ZEND_FUNCTION(gmp_mod)

ext/gmp/tests/bug32773.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ try {
2222
--EXPECT--
2323
10 + 0 = 10
2424
10 + "0" = 10
25-
Division by zero
25+
gmp_div(): Argument #2 ($num2) Division by zero
2626
gmp_div_qr(): Argument #2 ($num2) Division by zero

ext/gmp/tests/gmp_div_q.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ object(GMP)#1 (1) {
4646
["num"]=>
4747
string(1) "0"
4848
}
49-
Division by zero
49+
gmp_div_q(): Argument #2 ($num2) Division by zero
5050
object(GMP)#2 (1) {
5151
["num"]=>
5252
string(1) "0"

ext/gmp/tests/gmp_div_r.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ object(GMP)#1 (1) {
4646
["num"]=>
4747
string(1) "0"
4848
}
49-
Division by zero
49+
gmp_div_r(): Argument #2 ($num2) Division by zero
5050
object(GMP)#3 (1) {
5151
["num"]=>
5252
string(5) "12653"

0 commit comments

Comments
 (0)