@@ -267,21 +267,6 @@ static inline void gmp_zval_unary_op(zval *return_value, zval *a_arg, gmp_unary_
267267static 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- }
285270static 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 */
11641149ZEND_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 */
11971189ZEND_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 */
12311229ZEND_FUNCTION (gmp_mod )
0 commit comments