@@ -271,21 +271,6 @@ static inline void gmp_zval_unary_op(zval *return_value, zval *a_arg, gmp_unary_
271271static 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- }
289274static 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 */
11681153ZEND_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 */
12011193ZEND_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 */
12351233ZEND_FUNCTION (gmp_mod )
0 commit comments