Skip to content

Commit 2d517f6

Browse files
committed
Fix function signature mismatches in GMP
This is fairly annoying. Add adapter functions for cases where we are discarding a return value. Some of the issues are legitimate in that we were previously truncating some unsigned long return values to int implicitly, though I doubt it makes a difference in practice. This fixes -Wcast-function-type warnings.
1 parent 4d5ad3f commit 2d517f6

File tree

1 file changed

+88
-46
lines changed

1 file changed

+88
-46
lines changed

ext/gmp/gmp.c

Lines changed: 88 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -186,26 +186,49 @@ static void gmp_cmp(zval *return_value, zval *a_arg, zval *b_arg);
186186
* include parameter parsing.
187187
*/
188188
typedef void (*gmp_unary_op_t)(mpz_ptr, mpz_srcptr);
189-
typedef int (*gmp_unary_opl_t)(mpz_srcptr);
189+
typedef mp_bitcnt_t (*gmp_unary_opl_t)(mpz_srcptr);
190190

191191
typedef void (*gmp_unary_ui_op_t)(mpz_ptr, gmp_ulong);
192192

193193
typedef void (*gmp_binary_op_t)(mpz_ptr, mpz_srcptr, mpz_srcptr);
194-
typedef int (*gmp_binary_opl_t)(mpz_srcptr, mpz_srcptr);
195194

196195
typedef void (*gmp_binary_ui_op_t)(mpz_ptr, mpz_srcptr, gmp_ulong);
197196
typedef void (*gmp_binary_op2_t)(mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr);
198-
typedef void (*gmp_binary_ui_op2_t)(mpz_ptr, mpz_ptr, mpz_srcptr, gmp_ulong);
197+
typedef gmp_ulong (*gmp_binary_ui_op2_t)(mpz_ptr, mpz_ptr, mpz_srcptr, gmp_ulong);
199198

200199
static inline void gmp_zval_binary_ui_op(zval *return_value, zval *a_arg, zval *b_arg, gmp_binary_op_t gmp_op, gmp_binary_ui_op_t gmp_ui_op, int check_b_zero);
201200
static inline void gmp_zval_binary_ui_op2(zval *return_value, zval *a_arg, zval *b_arg, gmp_binary_op2_t gmp_op, gmp_binary_ui_op2_t gmp_ui_op, int check_b_zero);
202201
static inline void gmp_zval_unary_op(zval *return_value, zval *a_arg, gmp_unary_op_t gmp_op);
203202
static inline void gmp_zval_unary_ui_op(zval *return_value, zval *a_arg, gmp_unary_ui_op_t gmp_op);
204203

204+
static void gmp_mpz_tdiv_q_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
205+
mpz_tdiv_q_ui(a, b, c);
206+
}
207+
static void gmp_mpz_tdiv_r_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
208+
mpz_tdiv_r_ui(a, b, c);
209+
}
210+
static void gmp_mpz_fdiv_q_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
211+
mpz_fdiv_q_ui(a, b, c);
212+
}
213+
static void gmp_mpz_fdiv_r_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
214+
mpz_fdiv_r_ui(a, b, c);
215+
}
216+
static void gmp_mpz_cdiv_r_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
217+
mpz_cdiv_r_ui(a, b, c);
218+
}
219+
static void gmp_mpz_cdiv_q_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
220+
mpz_cdiv_q_ui(a, b, c);
221+
}
222+
static void gmp_mpz_mod_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
223+
mpz_mod_ui(a, b, c);
224+
}
225+
static void gmp_mpz_gcd_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) {
226+
mpz_gcd_ui(a, b, c);
227+
}
228+
205229
/* Binary operations */
206230
#define gmp_binary_ui_op(op, uop) _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, uop, 0)
207231
#define gmp_binary_op(op) _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, NULL, 0)
208-
#define gmp_binary_opl(op) _gmp_binary_opl(INTERNAL_FUNCTION_PARAM_PASSTHRU, op)
209232
#define gmp_binary_ui_op_no_zero(op, uop) \
210233
_gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, uop, 1)
211234

@@ -328,8 +351,7 @@ static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zva
328351

329352
#define DO_BINARY_UI_OP_EX(op, uop, check_b_zero) \
330353
gmp_zval_binary_ui_op( \
331-
result, op1, op2, op, (gmp_binary_ui_op_t) uop, \
332-
check_b_zero \
354+
result, op1, op2, op, uop, check_b_zero \
333355
); \
334356
return SUCCESS;
335357

@@ -353,9 +375,9 @@ static int gmp_do_operation_ex(zend_uchar opcode, zval *result, zval *op1, zval
353375
shift_operator_helper(mpz_pow_ui, result, op1, op2);
354376
return SUCCESS;
355377
case ZEND_DIV:
356-
DO_BINARY_UI_OP_EX(mpz_tdiv_q, mpz_tdiv_q_ui, 1);
378+
DO_BINARY_UI_OP_EX(mpz_tdiv_q, gmp_mpz_tdiv_q_ui, 1);
357379
case ZEND_MOD:
358-
DO_BINARY_UI_OP_EX(mpz_mod, mpz_mod_ui, 1);
380+
DO_BINARY_UI_OP_EX(mpz_mod, gmp_mpz_mod_ui, 1);
359381
case ZEND_SL:
360382
shift_operator_helper(mpz_mul_2exp, result, op1, op2);
361383
return SUCCESS;
@@ -836,28 +858,6 @@ static inline void _gmp_unary_opl(INTERNAL_FUNCTION_PARAMETERS, gmp_unary_opl_t
836858
}
837859
/* }}} */
838860

839-
/* {{{ _gmp_binary_opl
840-
*/
841-
static inline void _gmp_binary_opl(INTERNAL_FUNCTION_PARAMETERS, gmp_binary_opl_t gmp_op)
842-
{
843-
zval *a_arg, *b_arg;
844-
mpz_ptr gmpnum_a, gmpnum_b;
845-
gmp_temp_t temp_a, temp_b;
846-
847-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz", &a_arg, &b_arg) == FAILURE){
848-
RETURN_THROWS();
849-
}
850-
851-
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
852-
FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a);
853-
854-
RETVAL_LONG(gmp_op(gmpnum_a, gmpnum_b));
855-
856-
FREE_GMP_TEMP(temp_a);
857-
FREE_GMP_TEMP(temp_b);
858-
}
859-
/* }}} */
860-
861861
/* {{{ proto GMP gmp_init(mixed number [, int base])
862862
Initializes GMP number */
863863
ZEND_FUNCTION(gmp_init)
@@ -1077,13 +1077,13 @@ ZEND_FUNCTION(gmp_div_qr)
10771077

10781078
switch (round) {
10791079
case GMP_ROUND_ZERO:
1080-
gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_tdiv_qr, (gmp_binary_ui_op2_t) mpz_tdiv_qr_ui, 1);
1080+
gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_tdiv_qr, mpz_tdiv_qr_ui, 1);
10811081
break;
10821082
case GMP_ROUND_PLUSINF:
1083-
gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_cdiv_qr, (gmp_binary_ui_op2_t) mpz_cdiv_qr_ui, 1);
1083+
gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_cdiv_qr, mpz_cdiv_qr_ui, 1);
10841084
break;
10851085
case GMP_ROUND_MINUSINF:
1086-
gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_fdiv_qr, (gmp_binary_ui_op2_t) mpz_fdiv_qr_ui, 1);
1086+
gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_fdiv_qr, mpz_fdiv_qr_ui, 1);
10871087
break;
10881088
default:
10891089
php_error_docref(NULL, E_WARNING, "Invalid rounding mode");
@@ -1105,13 +1105,13 @@ ZEND_FUNCTION(gmp_div_r)
11051105

11061106
switch (round) {
11071107
case GMP_ROUND_ZERO:
1108-
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_tdiv_r, (gmp_binary_ui_op_t) mpz_tdiv_r_ui, 1);
1108+
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_tdiv_r, gmp_mpz_tdiv_r_ui, 1);
11091109
break;
11101110
case GMP_ROUND_PLUSINF:
1111-
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_cdiv_r, (gmp_binary_ui_op_t) mpz_cdiv_r_ui, 1);
1111+
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_cdiv_r, gmp_mpz_cdiv_r_ui, 1);
11121112
break;
11131113
case GMP_ROUND_MINUSINF:
1114-
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_fdiv_r, (gmp_binary_ui_op_t) mpz_fdiv_r_ui, 1);
1114+
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_fdiv_r, gmp_mpz_fdiv_r_ui, 1);
11151115
break;
11161116
default:
11171117
php_error_docref(NULL, E_WARNING, "Invalid rounding mode");
@@ -1133,13 +1133,13 @@ ZEND_FUNCTION(gmp_div_q)
11331133

11341134
switch (round) {
11351135
case GMP_ROUND_ZERO:
1136-
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_tdiv_q, (gmp_binary_ui_op_t) mpz_tdiv_q_ui, 1);
1136+
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_tdiv_q, gmp_mpz_tdiv_q_ui, 1);
11371137
break;
11381138
case GMP_ROUND_PLUSINF:
1139-
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_cdiv_q, (gmp_binary_ui_op_t) mpz_cdiv_q_ui, 1);
1139+
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_cdiv_q, gmp_mpz_cdiv_q_ui, 1);
11401140
break;
11411141
case GMP_ROUND_MINUSINF:
1142-
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_fdiv_q, (gmp_binary_ui_op_t) mpz_fdiv_q_ui, 1);
1142+
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_fdiv_q, gmp_mpz_fdiv_q_ui, 1);
11431143
break;
11441144
default:
11451145
php_error_docref(NULL, E_WARNING, "Invalid rounding mode");
@@ -1153,7 +1153,7 @@ ZEND_FUNCTION(gmp_div_q)
11531153
Computes a modulo b */
11541154
ZEND_FUNCTION(gmp_mod)
11551155
{
1156-
gmp_binary_ui_op_no_zero(mpz_mod, (gmp_binary_ui_op_t) mpz_mod_ui);
1156+
gmp_binary_ui_op_no_zero(mpz_mod, gmp_mpz_mod_ui);
11571157
}
11581158
/* }}} */
11591159

@@ -1529,15 +1529,15 @@ ZEND_FUNCTION(gmp_prob_prime)
15291529
Computes greatest common denominator (gcd) of a and b */
15301530
ZEND_FUNCTION(gmp_gcd)
15311531
{
1532-
gmp_binary_ui_op(mpz_gcd, (gmp_binary_ui_op_t) mpz_gcd_ui);
1532+
gmp_binary_ui_op(mpz_gcd, gmp_mpz_gcd_ui);
15331533
}
15341534
/* }}} */
15351535

15361536
/* {{{ proto GMP gmp_lcm(mixed a, mixed b)
15371537
Computes least common multiple (lcm) of a and b */
15381538
ZEND_FUNCTION(gmp_lcm)
15391539
{
1540-
gmp_binary_ui_op(mpz_lcm, (gmp_binary_ui_op_t) mpz_lcm_ui);
1540+
gmp_binary_ui_op(mpz_lcm, mpz_lcm_ui);
15411541
}
15421542
/* }}} */
15431543

@@ -1603,15 +1603,43 @@ ZEND_FUNCTION(gmp_invert)
16031603
Computes Jacobi symbol */
16041604
ZEND_FUNCTION(gmp_jacobi)
16051605
{
1606-
gmp_binary_opl(mpz_jacobi);
1606+
zval *a_arg, *b_arg;
1607+
mpz_ptr gmpnum_a, gmpnum_b;
1608+
gmp_temp_t temp_a, temp_b;
1609+
1610+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz", &a_arg, &b_arg) == FAILURE){
1611+
RETURN_THROWS();
1612+
}
1613+
1614+
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
1615+
FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a);
1616+
1617+
RETVAL_LONG(mpz_jacobi(gmpnum_a, gmpnum_b));
1618+
1619+
FREE_GMP_TEMP(temp_a);
1620+
FREE_GMP_TEMP(temp_b);
16071621
}
16081622
/* }}} */
16091623

16101624
/* {{{ proto int gmp_legendre(mixed a, mixed b)
16111625
Computes Legendre symbol */
16121626
ZEND_FUNCTION(gmp_legendre)
16131627
{
1614-
gmp_binary_opl(mpz_legendre);
1628+
zval *a_arg, *b_arg;
1629+
mpz_ptr gmpnum_a, gmpnum_b;
1630+
gmp_temp_t temp_a, temp_b;
1631+
1632+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz", &a_arg, &b_arg) == FAILURE){
1633+
RETURN_THROWS();
1634+
}
1635+
1636+
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
1637+
FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a);
1638+
1639+
RETVAL_LONG(mpz_legendre(gmpnum_a, gmpnum_b));
1640+
1641+
FREE_GMP_TEMP(temp_a);
1642+
FREE_GMP_TEMP(temp_b);
16151643
}
16161644
/* }}} */
16171645

@@ -1946,15 +1974,29 @@ ZEND_FUNCTION(gmp_testbit)
19461974
Calculates the population count of a */
19471975
ZEND_FUNCTION(gmp_popcount)
19481976
{
1949-
gmp_unary_opl((gmp_unary_opl_t) mpz_popcount);
1977+
gmp_unary_opl(mpz_popcount);
19501978
}
19511979
/* }}} */
19521980

19531981
/* {{{ proto int gmp_hamdist(mixed a, mixed b)
19541982
Calculates hamming distance between a and b */
19551983
ZEND_FUNCTION(gmp_hamdist)
19561984
{
1957-
gmp_binary_opl((gmp_binary_opl_t) mpz_hamdist);
1985+
zval *a_arg, *b_arg;
1986+
mpz_ptr gmpnum_a, gmpnum_b;
1987+
gmp_temp_t temp_a, temp_b;
1988+
1989+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz", &a_arg, &b_arg) == FAILURE){
1990+
RETURN_THROWS();
1991+
}
1992+
1993+
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
1994+
FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a);
1995+
1996+
RETVAL_LONG(mpz_hamdist(gmpnum_a, gmpnum_b));
1997+
1998+
FREE_GMP_TEMP(temp_a);
1999+
FREE_GMP_TEMP(temp_b);
19582000
}
19592001
/* }}} */
19602002

0 commit comments

Comments
 (0)