Skip to content

Commit 4c07065

Browse files
committed
Refactor gmp_fact()
1 parent 7a085fb commit 4c07065

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
@@ -1193,35 +1193,24 @@ ZEND_FUNCTION(gmp_abs)
11931193
ZEND_FUNCTION(gmp_fact)
11941194
{
11951195
zval *a_arg;
1196+
mpz_ptr gmpnum;
1197+
mpz_ptr gmpnum_result;
1198+
gmp_temp_t temp_a;
11961199

11971200
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &a_arg) == FAILURE){
11981201
RETURN_THROWS();
11991202
}
12001203

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

1224-
gmp_zval_unary_ui_op(return_value, a_arg, mpz_fac_ui);
1212+
INIT_GMP_RETVAL(gmpnum_result);
1213+
mpz_fac_ui(gmpnum_result, zval_get_long(a_arg));
12251214
}
12261215
/* }}} */
12271216

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)