@@ -275,11 +275,6 @@ static void gmp_mpz_mod_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
275
275
mpz_mod_ui (a , b , c );
276
276
}
277
277
278
- /* Binary operations */
279
- #define gmp_binary_op (op ) _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, NULL, 0)
280
- #define gmp_binary_ui_op_no_zero (op , uop ) \
281
- _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, uop, 1)
282
-
283
278
static void gmp_free_object_storage (zend_object * obj ) /* {{{ */
284
279
{
285
280
gmp_object * intern = GET_GMP_OBJECT_FROM_OBJ (obj );
@@ -878,21 +873,6 @@ static inline void gmp_zval_binary_ui_op(zval *return_value, zval *a_arg, zval *
878
873
}
879
874
/* }}} */
880
875
881
- /* {{{ _gmp_binary_ui_op */
882
- static inline void _gmp_binary_ui_op (INTERNAL_FUNCTION_PARAMETERS , gmp_binary_op_t gmp_op , gmp_binary_ui_op_t gmp_ui_op , int check_b_zero )
883
- {
884
- zval * a_arg , * b_arg ;
885
-
886
- ZEND_PARSE_PARAMETERS_START (2 , 2 )
887
- Z_PARAM_ZVAL (a_arg )
888
- Z_PARAM_ZVAL (b_arg )
889
- ZEND_PARSE_PARAMETERS_END ();
890
-
891
- gmp_zval_binary_ui_op (
892
- return_value , a_arg , b_arg , gmp_op , gmp_ui_op , check_b_zero , /* is_operator */ false );
893
- }
894
- /* }}} */
895
-
896
876
/* Unary operations */
897
877
898
878
/* {{{ gmp_zval_unary_op */
@@ -1232,14 +1212,40 @@ ZEND_FUNCTION(gmp_div_q)
1232
1212
/* {{{ Computes a modulo b */
1233
1213
ZEND_FUNCTION (gmp_mod )
1234
1214
{
1235
- gmp_binary_ui_op_no_zero (mpz_mod , gmp_mpz_mod_ui );
1215
+ mpz_ptr gmpnum_a , gmpnum_b , gmpnum_result ;
1216
+
1217
+ ZEND_PARSE_PARAMETERS_START (2 , 2 )
1218
+ GMP_Z_PARAM_INTO_MPZ_PTR (gmpnum_a )
1219
+ GMP_Z_PARAM_INTO_MPZ_PTR (gmpnum_b )
1220
+ ZEND_PARSE_PARAMETERS_END ();
1221
+
1222
+ if (mpz_cmp_ui (gmpnum_b , 0 ) == 0 ) {
1223
+ zend_argument_error (zend_ce_division_by_zero_error , 2 , "Modulo by zero" );
1224
+ RETURN_THROWS ();
1225
+ }
1226
+
1227
+ INIT_GMP_RETVAL (gmpnum_result );
1228
+ mpz_mod (gmpnum_result , gmpnum_a , gmpnum_b );
1236
1229
}
1237
1230
/* }}} */
1238
1231
1239
1232
/* {{{ Divide a by b using exact division algorithm */
1240
1233
ZEND_FUNCTION (gmp_divexact )
1241
1234
{
1242
- gmp_binary_ui_op_no_zero (mpz_divexact , NULL );
1235
+ mpz_ptr gmpnum_a , gmpnum_b , gmpnum_result ;
1236
+
1237
+ ZEND_PARSE_PARAMETERS_START (2 , 2 )
1238
+ GMP_Z_PARAM_INTO_MPZ_PTR (gmpnum_a )
1239
+ GMP_Z_PARAM_INTO_MPZ_PTR (gmpnum_b )
1240
+ ZEND_PARSE_PARAMETERS_END ();
1241
+
1242
+ if (mpz_cmp_ui (gmpnum_b , 0 ) == 0 ) {
1243
+ zend_argument_error (zend_ce_division_by_zero_error , 2 , "Division by zero" );
1244
+ RETURN_THROWS ();
1245
+ }
1246
+
1247
+ INIT_GMP_RETVAL (gmpnum_result );
1248
+ mpz_divexact (gmpnum_result , gmpnum_a , gmpnum_b );
1243
1249
}
1244
1250
/* }}} */
1245
1251
0 commit comments