Skip to content

Commit 8e9b944

Browse files
committed
ext/gmp: Refactor gmp_div_(q|r)() to use new ZPP specifier
1 parent 1f5ba59 commit 8e9b944

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
@@ -271,21 +271,6 @@ static inline void gmp_zval_unary_op(zval *return_value, zval *a_arg, gmp_unary_
271271
static void gmp_mpz_tdiv_q_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
272272
mpz_tdiv_q_ui(a, b, c);
273273
}
274-
static void gmp_mpz_tdiv_r_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
275-
mpz_tdiv_r_ui(a, b, c);
276-
}
277-
static void gmp_mpz_fdiv_q_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
278-
mpz_fdiv_q_ui(a, b, c);
279-
}
280-
static void gmp_mpz_fdiv_r_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
281-
mpz_fdiv_r_ui(a, b, c);
282-
}
283-
static void gmp_mpz_cdiv_r_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
284-
mpz_cdiv_r_ui(a, b, c);
285-
}
286-
static void gmp_mpz_cdiv_q_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
287-
mpz_cdiv_q_ui(a, b, c);
288-
}
289274
static void gmp_mpz_mod_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
290275
mpz_mod_ui(a, b, c);
291276
}
@@ -1164,72 +1149,85 @@ ZEND_FUNCTION(gmp_div_qr)
11641149
}
11651150
}
11661151

1167-
/* {{{ Divide a by b, returns reminder only */
1152+
/* Divide a by b, returns reminder only */
11681153
ZEND_FUNCTION(gmp_div_r)
11691154
{
1170-
zval *a_arg, *b_arg;
1155+
mpz_ptr gmpnum_a, gmpnum_b, gmpnum_result;
11711156
zend_long round = GMP_ROUND_ZERO;
11721157

11731158
ZEND_PARSE_PARAMETERS_START(2, 3)
1174-
Z_PARAM_ZVAL(a_arg)
1175-
Z_PARAM_ZVAL(b_arg)
1159+
GMP_Z_PARAM_INTO_MPZ_PTR(gmpnum_a)
1160+
GMP_Z_PARAM_INTO_MPZ_PTR(gmpnum_b)
11761161
Z_PARAM_OPTIONAL
11771162
Z_PARAM_LONG(round)
11781163
ZEND_PARSE_PARAMETERS_END();
11791164

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

1200-
/* {{{ Divide a by b, returns quotient only */
1192+
/* Divide a by b, returns quotient only */
12011193
ZEND_FUNCTION(gmp_div_q)
12021194
{
1203-
zval *a_arg, *b_arg;
1195+
mpz_ptr gmpnum_a, gmpnum_b, gmpnum_result;
12041196
zend_long round = GMP_ROUND_ZERO;
12051197

12061198
ZEND_PARSE_PARAMETERS_START(2, 3)
1207-
Z_PARAM_ZVAL(a_arg)
1208-
Z_PARAM_ZVAL(b_arg)
1199+
GMP_Z_PARAM_INTO_MPZ_PTR(gmpnum_a)
1200+
GMP_Z_PARAM_INTO_MPZ_PTR(gmpnum_b)
12091201
Z_PARAM_OPTIONAL
12101202
Z_PARAM_LONG(round)
12111203
ZEND_PARSE_PARAMETERS_END();
12121204

1213-
switch (round) {
1214-
case GMP_ROUND_ZERO:
1215-
gmp_zval_binary_ui_op(
1216-
return_value, a_arg, b_arg, mpz_tdiv_q, gmp_mpz_tdiv_q_ui, 1, /* is_operator */ false);
1217-
break;
1218-
case GMP_ROUND_PLUSINF:
1219-
gmp_zval_binary_ui_op(
1220-
return_value, a_arg, b_arg, mpz_cdiv_q, gmp_mpz_cdiv_q_ui, 1, /* is_operator */ false);
1221-
break;
1222-
case GMP_ROUND_MINUSINF:
1223-
gmp_zval_binary_ui_op(
1224-
return_value, a_arg, b_arg, mpz_fdiv_q, gmp_mpz_fdiv_q_ui, 1, /* is_operator */ false);
1225-
break;
1226-
default:
1227-
zend_argument_value_error(3, "must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF");
1205+
if (mpz_cmp_ui(gmpnum_b, 0) == 0) {
1206+
zend_argument_error(zend_ce_division_by_zero_error, 2, "Division by zero");
12281207
RETURN_THROWS();
12291208
}
12301209

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

12341232
/* {{{ Computes a modulo b */
12351233
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)