@@ -271,21 +271,6 @@ static inline void gmp_zval_unary_op(zval *return_value, zval *a_arg, gmp_unary_
271
271
static void gmp_mpz_tdiv_q_ui (mpz_ptr a , mpz_srcptr b , gmp_ulong c ) {
272
272
mpz_tdiv_q_ui (a , b , c );
273
273
}
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
- }
289
274
static void gmp_mpz_mod_ui (mpz_ptr a , mpz_srcptr b , gmp_ulong c ) {
290
275
mpz_mod_ui (a , b , c );
291
276
}
@@ -1164,72 +1149,85 @@ ZEND_FUNCTION(gmp_div_qr)
1164
1149
}
1165
1150
}
1166
1151
1167
- /* {{{ Divide a by b, returns reminder only */
1152
+ /* Divide a by b, returns reminder only */
1168
1153
ZEND_FUNCTION (gmp_div_r )
1169
1154
{
1170
- zval * a_arg , * b_arg ;
1155
+ mpz_ptr gmpnum_a , gmpnum_b , gmpnum_result ;
1171
1156
zend_long round = GMP_ROUND_ZERO ;
1172
1157
1173
1158
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 )
1176
1161
Z_PARAM_OPTIONAL
1177
1162
Z_PARAM_LONG (round )
1178
1163
ZEND_PARSE_PARAMETERS_END ();
1179
1164
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" );
1195
1167
RETURN_THROWS ();
1196
1168
}
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
+ }
1197
1190
}
1198
- /* }}} */
1199
1191
1200
- /* {{{ Divide a by b, returns quotient only */
1192
+ /* Divide a by b, returns quotient only */
1201
1193
ZEND_FUNCTION (gmp_div_q )
1202
1194
{
1203
- zval * a_arg , * b_arg ;
1195
+ mpz_ptr gmpnum_a , gmpnum_b , gmpnum_result ;
1204
1196
zend_long round = GMP_ROUND_ZERO ;
1205
1197
1206
1198
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 )
1209
1201
Z_PARAM_OPTIONAL
1210
1202
Z_PARAM_LONG (round )
1211
1203
ZEND_PARSE_PARAMETERS_END ();
1212
1204
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" );
1228
1207
RETURN_THROWS ();
1229
1208
}
1230
1209
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
+ }
1231
1230
}
1232
- /* }}} */
1233
1231
1234
1232
/* {{{ Computes a modulo b */
1235
1233
ZEND_FUNCTION (gmp_mod )
0 commit comments