Skip to content

Commit de27681

Browse files
committed
Refactor gmp_fact()
1 parent 42afdad commit de27681

File tree

2 files changed

+32
-40
lines changed

2 files changed

+32
-40
lines changed

ext/gmp/gmp.c

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,35 +1197,24 @@ ZEND_FUNCTION(gmp_abs)
11971197
ZEND_FUNCTION(gmp_fact)
11981198
{
11991199
zval *a_arg;
1200+
mpz_ptr gmpnum;
1201+
mpz_ptr gmpnum_result;
1202+
gmp_temp_t temp_a;
12001203

12011204
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &a_arg) == FAILURE){
12021205
RETURN_THROWS();
12031206
}
12041207

1205-
if (IS_GMP(a_arg)) {
1206-
mpz_ptr gmpnum_tmp = GET_GMP_FROM_ZVAL(a_arg);
1207-
if (mpz_sgn(gmpnum_tmp) < 0) {
1208-
zend_argument_value_error(1, "must be greater than or equal to 0");
1209-
RETURN_THROWS();
1210-
}
1211-
} else {
1212-
/* Use convert_to_number first to detect getting non-integer */
1213-
convert_scalar_to_number(a_arg);
1214-
if (Z_TYPE_P(a_arg) != IS_LONG) {
1215-
convert_to_long(a_arg);
1216-
if (Z_LVAL_P(a_arg) >= 0) {
1217-
/* Only warn if we'll make it past the non-negative check */
1218-
// TODO: promote? Also I don't get this
1219-
php_error_docref(NULL, E_WARNING, "Number has to be an integer");
1220-
}
1221-
}
1222-
if (Z_LVAL_P(a_arg) < 0) {
1223-
zend_argument_value_error(1, "must be greater than or equal to 0");
1224-
RETURN_THROWS();
1225-
}
1208+
FETCH_GMP_ZVAL(gmpnum, a_arg, temp_a, 1);
1209+
FREE_GMP_TEMP(temp_a);
1210+
1211+
if (mpz_sgn(gmpnum) < 0) {
1212+
zend_argument_value_error(1, "must be greater than or equal to 0");
1213+
RETURN_THROWS();
12261214
}
12271215

1228-
gmp_zval_unary_ui_op(return_value, a_arg, mpz_fac_ui);
1216+
INIT_GMP_RETVAL(gmpnum_result);
1217+
mpz_fac_ui(gmpnum_result, zval_get_long(a_arg));
12291218
}
12301219
/* }}} */
12311220

ext/gmp/tests/gmp_fact.phpt

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ gmp_fact() basic tests
66
<?php
77

88
var_dump(gmp_strval(gmp_fact(0)));
9-
var_dump(gmp_strval(gmp_fact("")));
9+
try {
10+
var_dump(gmp_strval(gmp_fact("")));
11+
} catch (\TypeError $e) {
12+
echo $e->getMessage() . \PHP_EOL;
13+
}
1014
var_dump(gmp_strval(gmp_fact("0")));
1115
try {
1216
var_dump(gmp_strval(gmp_fact("-1")));
@@ -18,7 +22,13 @@ try {
1822
} catch (\ValueError $e) {
1923
echo $e->getMessage() . \PHP_EOL;
2024
}
21-
var_dump(gmp_strval(gmp_fact(1.1)));
25+
26+
try {
27+
var_dump(gmp_strval(gmp_fact(1.1)));
28+
} catch (\TypeError $e) {
29+
echo $e->getMessage() . \PHP_EOL;
30+
}
31+
2232
var_dump(gmp_strval(gmp_fact(20)));
2333
var_dump(gmp_strval(gmp_fact("50")));
2434
var_dump(gmp_strval(gmp_fact("10")));
@@ -33,33 +43,26 @@ try {
3343
echo $e->getMessage() . \PHP_EOL;
3444
}
3545

36-
var_dump(gmp_fact(array()));
37-
var_dump(gmp_strval(gmp_fact(array())));
46+
try {
47+
var_dump(gmp_fact(array()));
48+
} catch (\TypeError $e) {
49+
echo $e->getMessage() . \PHP_EOL;
50+
}
3851

3952
echo "Done\n";
4053
?>
41-
--EXPECTF--
42-
string(1) "1"
54+
--EXPECT--
4355
string(1) "1"
56+
gmp_fact(): Argument #1 ($a) must be an integer string in base 10
4457
string(1) "1"
4558
gmp_fact(): Argument #1 ($a) must be greater than or equal to 0
4659
gmp_fact(): Argument #1 ($a) must be greater than or equal to 0
47-
48-
Warning: gmp_fact(): Number has to be an integer in %s on line %d
49-
string(1) "1"
60+
gmp_fact(): Argument #1 ($a) must be of type bool|int|string|GMP, float given
5061
string(19) "2432902008176640000"
5162
string(65) "30414093201713378043612608166064768844377641568960512000000000000"
5263
string(7) "3628800"
5364
string(1) "1"
5465
string(9) "479001600"
5566
gmp_fact(): Argument #1 ($a) must be greater than or equal to 0
56-
57-
Warning: gmp_fact(): Number has to be an integer in %s on line %d
58-
object(GMP)#%d (1) {
59-
["num"]=>
60-
string(1) "1"
61-
}
62-
63-
Warning: gmp_fact(): Number has to be an integer in %s on line %d
64-
string(1) "1"
67+
gmp_fact(): Argument #1 ($a) must be of type bool|int|string|GMP, array given
6568
Done

0 commit comments

Comments
 (0)