From 74e6c22ccf9faabfbda1dfab7264ce46e6ad4872 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 21 Jul 2020 15:03:55 +0100 Subject: [PATCH 01/14] ValueError in GMP --- ext/gmp/gmp.c | 107 +++++++++++++++-------------- ext/gmp/gmp.stub.php | 12 ++-- ext/gmp/gmp_arginfo.h | 14 ++-- ext/gmp/tests/bug50283.phpt | 43 +++++++----- ext/gmp/tests/gmp_binomial.phpt | 13 ++-- ext/gmp/tests/gmp_clrbit.phpt | 21 +++--- ext/gmp/tests/gmp_div_q.phpt | 10 +-- ext/gmp/tests/gmp_div_qr.phpt | 10 +-- ext/gmp/tests/gmp_div_r.phpt | 10 +-- ext/gmp/tests/gmp_export.phpt | 42 ++++++----- ext/gmp/tests/gmp_fact.phpt | 30 ++++---- ext/gmp/tests/gmp_import.phpt | 72 +++++++++++-------- ext/gmp/tests/gmp_init.phpt | 10 +-- ext/gmp/tests/gmp_pown.phpt | 32 +++++---- ext/gmp/tests/gmp_random_bits.phpt | 21 +++--- ext/gmp/tests/gmp_remroot.phpt | 21 +++--- ext/gmp/tests/gmp_root.phpt | 21 +++--- ext/gmp/tests/gmp_scan0.phpt | 10 ++- ext/gmp/tests/gmp_scan1.phpt | 10 ++- ext/gmp/tests/gmp_setbit.phpt | 12 ++-- ext/gmp/tests/gmp_sqrt.phpt | 30 +++++--- ext/gmp/tests/gmp_sqrtrem.phpt | 26 ++++--- ext/gmp/tests/gmp_strval.phpt | 50 ++++++++------ ext/gmp/tests/gmp_testbit.phpt | 23 ++++--- 24 files changed, 380 insertions(+), 270 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index ceaf49b8bc464..bbabde5f9ee48 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -157,6 +157,7 @@ if (IS_GMP(zval)) { \ gmpnumber = temp.num; \ } +/* TODO convert RETURN_FALSE */ #define FETCH_GMP_ZVAL(gmpnumber, zval, temp) \ if (IS_GMP(zval)) { \ gmpnumber = GET_GMP_FROM_ZVAL(zval); \ @@ -864,8 +865,8 @@ ZEND_FUNCTION(gmp_init) } if (base && (base < 2 || base > GMP_MAX_BASE)) { - php_error_docref(NULL, E_WARNING, "Bad base for conversion: " ZEND_LONG_FMT " (should be between 2 and %d)", base, GMP_MAX_BASE); - RETURN_FALSE; + zend_argument_value_error(2, "must be between 2 and %d", GMP_MAX_BASE); + RETURN_THROWS(); } INIT_GMP_RETVAL(gmpnumber); @@ -879,8 +880,8 @@ ZEND_FUNCTION(gmp_init) int gmp_import_export_validate(zend_long size, zend_long options, int *order, int *endian) { if (size < 1) { - php_error_docref(NULL, E_WARNING, - "Word size must be positive, " ZEND_LONG_FMT " given", size); + /* size argument is in second position */ + zend_argument_value_error(2, "must be greater than or equal to 1"); return FAILURE; } @@ -893,8 +894,8 @@ int gmp_import_export_validate(zend_long size, zend_long options, int *order, in *order = 1; break; default: - php_error_docref(NULL, E_WARNING, - "Invalid options: Conflicting word orders"); + /* options argument is in second position */ + zend_argument_value_error(3, "has conflicting word orders"); return FAILURE; } @@ -910,8 +911,8 @@ int gmp_import_export_validate(zend_long size, zend_long options, int *order, in *endian = 0; break; default: - php_error_docref(NULL, E_WARNING, - "Invalid options: Conflicting word endianness"); + /* options argument is in second position */ + zend_argument_value_error(3, "has conflicting word endianness"); return FAILURE; } @@ -933,13 +934,12 @@ ZEND_FUNCTION(gmp_import) } if (gmp_import_export_validate(size, options, &order, &endian) == FAILURE) { - RETURN_FALSE; + RETURN_THROWS(); } if ((data_len % size) != 0) { - php_error_docref(NULL, E_WARNING, - "Input length must be a multiple of word size"); - RETURN_FALSE; + zend_argument_value_error(1, "must be a multiple of word size"); + RETURN_THROWS(); } INIT_GMP_RETVAL(gmpnumber); @@ -963,7 +963,7 @@ ZEND_FUNCTION(gmp_export) } if (gmp_import_export_validate(size, options, &order, &endian) == FAILURE) { - RETURN_FALSE; + RETURN_THROWS(); } FETCH_GMP_ZVAL(gmpnumber, gmpnumber_arg, temp_a); @@ -1017,8 +1017,8 @@ ZEND_FUNCTION(gmp_strval) /* Although the maximum base in general in GMP is 62, mpz_get_str() * is explicitly limited to -36 when dealing with negative bases. */ if ((base < 2 && base > -2) || base > GMP_MAX_BASE || base < -36) { - php_error_docref(NULL, E_WARNING, "Bad base for conversion: " ZEND_LONG_FMT " (should be between 2 and %d or -2 and -36)", base, GMP_MAX_BASE); - RETURN_FALSE; + zend_argument_value_error(2, "must be between 2 and %d or -2 and -36", GMP_MAX_BASE); + RETURN_THROWS(); } FETCH_GMP_ZVAL(gmpnum, gmpnumber_arg, temp_a); @@ -1071,8 +1071,8 @@ ZEND_FUNCTION(gmp_div_qr) gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_fdiv_qr, mpz_fdiv_qr_ui, 1); break; default: - php_error_docref(NULL, E_WARNING, "Invalid rounding mode"); - RETURN_FALSE; + zend_argument_value_error(3, "must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF"); + RETURN_THROWS(); } } /* }}} */ @@ -1098,8 +1098,8 @@ ZEND_FUNCTION(gmp_div_r) gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_fdiv_r, gmp_mpz_fdiv_r_ui, 1); break; default: - php_error_docref(NULL, E_WARNING, "Invalid rounding mode"); - RETURN_FALSE; + zend_argument_value_error(3, "must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF"); + RETURN_THROWS(); } } /* }}} */ @@ -1125,8 +1125,8 @@ ZEND_FUNCTION(gmp_div_q) gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_fdiv_q, gmp_mpz_fdiv_q_ui, 1); break; default: - php_error_docref(NULL, E_WARNING, "Invalid rounding mode"); - RETURN_FALSE; + zend_argument_value_error(3, "must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF"); + RETURN_THROWS(); } } @@ -1172,8 +1172,8 @@ ZEND_FUNCTION(gmp_fact) if (IS_GMP(a_arg)) { mpz_ptr gmpnum_tmp = GET_GMP_FROM_ZVAL(a_arg); if (mpz_sgn(gmpnum_tmp) < 0) { - php_error_docref(NULL, E_WARNING, "Number has to be greater than or equal to 0"); - RETURN_FALSE; + zend_argument_value_error(1, "must be greater than or equal to 0"); + RETURN_THROWS(); } } else { /* Use convert_to_number first to detect getting non-integer */ @@ -1182,12 +1182,13 @@ ZEND_FUNCTION(gmp_fact) convert_to_long(a_arg); if (Z_LVAL_P(a_arg) >= 0) { /* Only warn if we'll make it past the non-negative check */ + // TODO: promote? Also I don't get this php_error_docref(NULL, E_WARNING, "Number has to be an integer"); } } if (Z_LVAL_P(a_arg) < 0) { - php_error_docref(NULL, E_WARNING, "Number has to be greater than or equal to 0"); - RETURN_FALSE; + zend_argument_value_error(1, "must be greater than or equal to 0"); + RETURN_THROWS(); } } @@ -1207,8 +1208,8 @@ ZEND_FUNCTION(gmp_binomial) } if (k < 0) { - php_error_docref(NULL, E_WARNING, "k cannot be negative"); - RETURN_FALSE; + zend_argument_value_error(2, "must be greater than or equal to 0"); + RETURN_THROWS(); } INIT_GMP_RETVAL(gmpnum_result); @@ -1274,20 +1275,20 @@ ZEND_FUNCTION(gmp_powm) } else { FETCH_GMP_ZVAL_DEP(gmpnum_exp, exp_arg, temp_exp, temp_base); if (mpz_sgn(gmpnum_exp) < 0) { - php_error_docref(NULL, E_WARNING, "Second parameter cannot be less than 0"); + zend_argument_value_error(2, "must be greater than or equal to 0"); FREE_GMP_TEMP(temp_base); FREE_GMP_TEMP(temp_exp); - RETURN_FALSE; + RETURN_THROWS(); } } FETCH_GMP_ZVAL_DEP_DEP(gmpnum_mod, mod_arg, temp_mod, temp_exp, temp_base); if (!mpz_cmp_ui(gmpnum_mod, 0)) { - php_error_docref(NULL, E_WARNING, "Modulus may not be zero"); + zend_argument_value_error(3, "must not be 0"); FREE_GMP_TEMP(temp_base); FREE_GMP_TEMP(temp_exp); FREE_GMP_TEMP(temp_mod); - RETURN_FALSE; + RETURN_THROWS(); } INIT_GMP_RETVAL(gmpnum_result); @@ -1317,9 +1318,9 @@ ZEND_FUNCTION(gmp_sqrt) FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); if (mpz_sgn(gmpnum_a) < 0) { - php_error_docref(NULL, E_WARNING, "Number has to be greater than or equal to 0"); + zend_argument_value_error(1, "must be greater than or equal to 0"); FREE_GMP_TEMP(temp_a); - RETURN_FALSE; + RETURN_THROWS(); } INIT_GMP_RETVAL(gmpnum_result); @@ -1343,9 +1344,9 @@ ZEND_FUNCTION(gmp_sqrtrem) FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); if (mpz_sgn(gmpnum_a) < 0) { - php_error_docref(NULL, E_WARNING, "Number has to be greater than or equal to 0"); + zend_argument_value_error(1, "must be greater than or equal to 0"); FREE_GMP_TEMP(temp_a); - RETURN_FALSE; + RETURN_THROWS(); } gmp_create(&result1, &gmpnum_result1); @@ -1373,8 +1374,8 @@ ZEND_FUNCTION(gmp_root) } if (nth <= 0) { - php_error_docref(NULL, E_WARNING, "The root must be positive"); - RETURN_FALSE; + zend_argument_value_error(2, "must be greater than or equal to 1"); + RETURN_THROWS(); } FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); @@ -1405,8 +1406,8 @@ ZEND_FUNCTION(gmp_rootrem) } if (nth <= 0) { - php_error_docref(NULL, E_WARNING, "The root must be positive"); - RETURN_FALSE; + zend_argument_value_error(2, "must be greater than or equal to 1"); + RETURN_THROWS(); } FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); @@ -1730,8 +1731,8 @@ ZEND_FUNCTION(gmp_random_bits) } if (bits <= 0) { - php_error_docref(NULL, E_WARNING, "The number of bits must be positive"); - RETURN_FALSE; + zend_argument_value_error(1, "must be greater than or equal to 1"); + RETURN_THROWS(); } INIT_GMP_RETVAL(gmpnum_result); @@ -1856,12 +1857,12 @@ ZEND_FUNCTION(gmp_setbit) } if (index < 0) { - php_error_docref(NULL, E_WARNING, "Index must be greater than or equal to zero"); - RETURN_FALSE; + zend_argument_value_error(2, "must be greater than or equal to zero"); + RETURN_THROWS(); } if (index / GMP_NUMB_BITS >= INT_MAX) { - php_error_docref(NULL, E_WARNING, "Index must be less than %d * %d", INT_MAX, GMP_NUMB_BITS); - RETURN_FALSE; + zend_argument_value_error(2, "must be less than %d * %d", INT_MAX, GMP_NUMB_BITS); + RETURN_THROWS(); } gmpnum_a = GET_GMP_FROM_ZVAL(a_arg); @@ -1886,8 +1887,8 @@ ZEND_FUNCTION(gmp_clrbit) } if (index < 0) { - php_error_docref(NULL, E_WARNING, "Index must be greater than or equal to zero"); - RETURN_FALSE; + zend_argument_value_error(2, "must be greater than or equal to zero"); + RETURN_THROWS(); } gmpnum_a = GET_GMP_FROM_ZVAL(a_arg); @@ -1908,8 +1909,8 @@ ZEND_FUNCTION(gmp_testbit) } if (index < 0) { - php_error_docref(NULL, E_WARNING, "Index must be greater than or equal to zero"); - RETURN_FALSE; + zend_argument_value_error(2, "must be greater than or equal to zero"); + RETURN_THROWS(); } FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); @@ -1959,8 +1960,8 @@ ZEND_FUNCTION(gmp_scan0) } if (start < 0) { - php_error_docref(NULL, E_WARNING, "Starting index must be greater than or equal to zero"); - RETURN_FALSE; + zend_argument_value_error(2, "must be greater than or equal to zero"); + RETURN_THROWS(); } FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); @@ -1983,8 +1984,8 @@ ZEND_FUNCTION(gmp_scan1) } if (start < 0) { - php_error_docref(NULL, E_WARNING, "Starting index must be greater than or equal to zero"); - RETURN_FALSE; + zend_argument_value_error(2, "must be greater than or equal to zero"); + RETURN_THROWS(); } FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); diff --git a/ext/gmp/gmp.stub.php b/ext/gmp/gmp.stub.php index d7d6b57667991..29dba8d5a4fcb 100644 --- a/ext/gmp/gmp.stub.php +++ b/ext/gmp/gmp.stub.php @@ -9,10 +9,10 @@ class GMP /** @param int|bool|string $number */ function gmp_init($number, int $base = 0): GMP|false {} -function gmp_import(string $data, int $word_size = 1, int $options = GMP_MSW_FIRST | GMP_NATIVE_ENDIAN): GMP|false {} +function gmp_import(string $data, int $word_size = 1, int $options = GMP_MSW_FIRST | GMP_NATIVE_ENDIAN): GMP {} /** @param GMP|int|bool|string $gmpnumber */ -function gmp_export($gmpnumber, int $word_size = 1, int $options = GMP_MSW_FIRST | GMP_NATIVE_ENDIAN): string|false {} +function gmp_export($gmpnumber, int $word_size = 1, int $options = GMP_MSW_FIRST | GMP_NATIVE_ENDIAN): string {} /** @param GMP|int|bool|string $gmpnumber */ function gmp_intval($gmpnumber): int {} @@ -169,7 +169,7 @@ function gmp_sign($a): int|false {} /** @param GMP|int|bool|string $seed */ function gmp_random_seed($seed): ?bool {} -function gmp_random_bits(int $bits): GMP|false {} +function gmp_random_bits(int $bits): GMP {} /** * @param GMP|int|bool|string $min @@ -198,9 +198,9 @@ function gmp_com($a): GMP|false {} */ function gmp_xor($a, $b): GMP|false {} -function gmp_setbit(GMP $a, int $index, bool $set_clear = true): ?bool {} +function gmp_setbit(GMP $a, int $index, bool $set_clear = true): void {} -function gmp_clrbit(GMP $a, int $index): ?bool {} +function gmp_clrbit(GMP $a, int $index): void {} /** @param GMP|int|bool|string $a */ function gmp_testbit($a, int $index): bool {} @@ -224,4 +224,4 @@ function gmp_hamdist($a, $b): int|false {} function gmp_nextprime($a): GMP|false {} /** @param GMP|int|bool|string $a */ -function gmp_binomial($a, int $b): GMP|false {} +function gmp_binomial($a, int $b): GMP {} diff --git a/ext/gmp/gmp_arginfo.h b/ext/gmp/gmp_arginfo.h index 1c5903bb96d91..ade10e8bf181c 100644 --- a/ext/gmp/gmp_arginfo.h +++ b/ext/gmp/gmp_arginfo.h @@ -1,18 +1,18 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 4b5e54ee34a3cb6471d5a3c30c50e218a80347c0 */ + * Stub hash: 06749fca2bc6bdcef104f2c6cc69fe12e6e534fd */ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_init, 0, 1, GMP, MAY_BE_FALSE) ZEND_ARG_INFO(0, number) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, base, IS_LONG, 0, "0") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_import, 0, 1, GMP, MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_import, 0, 1, GMP, 0) ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, word_size, IS_LONG, 0, "1") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_LONG, 0, "GMP_MSW_FIRST | GMP_NATIVE_ENDIAN") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gmp_export, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_export, 0, 1, IS_STRING, 0) ZEND_ARG_INFO(0, gmpnumber) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, word_size, IS_LONG, 0, "1") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_LONG, 0, "GMP_MSW_FIRST | GMP_NATIVE_ENDIAN") @@ -132,7 +132,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_random_seed, 0, 1, _IS_BOOL, ZEND_ARG_INFO(0, seed) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_random_bits, 0, 1, GMP, MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_random_bits, 0, 1, GMP, 0) ZEND_ARG_TYPE_INFO(0, bits, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -149,13 +149,13 @@ ZEND_END_ARG_INFO() #define arginfo_gmp_xor arginfo_gmp_add -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_setbit, 0, 2, _IS_BOOL, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_setbit, 0, 2, IS_VOID, 0) ZEND_ARG_OBJ_INFO(0, a, GMP, 0) ZEND_ARG_TYPE_INFO(0, index, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, set_clear, _IS_BOOL, 0, "true") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_clrbit, 0, 2, _IS_BOOL, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_clrbit, 0, 2, IS_VOID, 0) ZEND_ARG_OBJ_INFO(0, a, GMP, 0) ZEND_ARG_TYPE_INFO(0, index, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -178,7 +178,7 @@ ZEND_END_ARG_INFO() #define arginfo_gmp_nextprime arginfo_gmp_neg -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_binomial, 0, 2, GMP, MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_binomial, 0, 2, GMP, 0) ZEND_ARG_INFO(0, a) ZEND_ARG_TYPE_INFO(0, b, IS_LONG, 0) ZEND_END_ARG_INFO() diff --git a/ext/gmp/tests/bug50283.phpt b/ext/gmp/tests/bug50283.phpt index 561cd3d68c697..1e640a7912c79 100644 --- a/ext/gmp/tests/bug50283.phpt +++ b/ext/gmp/tests/bug50283.phpt @@ -7,30 +7,37 @@ Feature Request #50283 (allow base in gmp_strval to use full range: 2 to 62, and $a = gmp_init("0x41682179fbf5"); printf("Decimal: %s, -36-based: %s\n", gmp_strval($a), gmp_strval($a,-36)); printf("Decimal: %s, 36-based: %s\n", gmp_strval($a), gmp_strval($a,36)); -printf("Decimal: %s, -1-based: %s\n", gmp_strval($a), gmp_strval($a,-1)); -printf("Decimal: %s, 1-based: %s\n", gmp_strval($a), gmp_strval($a,1)); -printf("Decimal: %s, -37-based: %s\n", gmp_strval($a), gmp_strval($a,-37)); +try { + printf("Decimal: %s, -1-based: %s\n", gmp_strval($a), gmp_strval($a,-1)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + printf("Decimal: %s, 1-based: %s\n", gmp_strval($a), gmp_strval($a,1)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + printf("Decimal: %s, -37-based: %s\n", gmp_strval($a), gmp_strval($a,-37)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} printf("Decimal: %s, 37-based: %s\n", gmp_strval($a), gmp_strval($a,37)); printf("Decimal: %s, 62-based: %s\n", gmp_strval($a), gmp_strval($a,62)); -printf("Decimal: %s, 63-based: %s\n\n", gmp_strval($a), gmp_strval($a,63)); +try { + printf("Decimal: %s, 63-based: %s\n\n", gmp_strval($a), gmp_strval($a,63)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} printf("Base 32 and 62-based: %s\n", gmp_strval(gmp_init("gh82179fbf5", 32), 62)); ?> ---EXPECTF-- +--EXPECT-- Decimal: 71915494046709, -36-based: PHPISCOOL Decimal: 71915494046709, 36-based: phpiscool - -Warning: gmp_strval(): Bad base for conversion: -1 (should be between 2 and %d or -2 and -%d) in %s on line 5 -Decimal: 71915494046709, -1-based: - -Warning: gmp_strval(): Bad base for conversion: 1 (should be between 2 and %d or -2 and -%d) in %s on line 6 -Decimal: 71915494046709, 1-based: - -Warning: gmp_strval(): Bad base for conversion: -37 (should be between 2 and %d or -2 and -%d) in %s on line 7 -Decimal: 71915494046709, -37-based: +gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 +gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 +gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 Decimal: 71915494046709, 37-based: KHKATELJF Decimal: 71915494046709, 62-based: KQ6yq741 - -Warning: gmp_strval(): Bad base for conversion: 63 (should be between 2 and %d or -2 and -%d) in %s on line 10 -Decimal: 71915494046709, 63-based: - +gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 Base 32 and 62-based: 1NHkAcdIiD diff --git a/ext/gmp/tests/gmp_binomial.phpt b/ext/gmp/tests/gmp_binomial.phpt index 85b956f390221..b6db19c35cc7c 100644 --- a/ext/gmp/tests/gmp_binomial.phpt +++ b/ext/gmp/tests/gmp_binomial.phpt @@ -20,10 +20,13 @@ var_dump(gmp_binomial(1, 1)); var_dump(gmp_binomial(-1, 5)); // == -(1 + 5 - 1 over 5) var_dump(gmp_binomial(-2, 6)); // == (2 + 6 - 1 over 6) -var_dump(gmp_binomial(5, -2)); - +try { + var_dump(gmp_binomial(5, -2)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} ?> ---EXPECTF-- +--EXPECT-- object(GMP)#1 (1) { ["num"]=> string(3) "252" @@ -64,6 +67,4 @@ object(GMP)#2 (1) { ["num"]=> string(1) "7" } - -Warning: gmp_binomial(): k cannot be negative in %s on line %d -bool(false) +gmp_binomial(): Argument #2 ($b) must be greater than or equal to 0 diff --git a/ext/gmp/tests/gmp_clrbit.phpt b/ext/gmp/tests/gmp_clrbit.phpt index 491ef79bfc8a9..24a46bd554292 100644 --- a/ext/gmp/tests/gmp_clrbit.phpt +++ b/ext/gmp/tests/gmp_clrbit.phpt @@ -10,11 +10,19 @@ gmp_clrbit($n, 0); var_dump(gmp_strval($n)); $n = gmp_init(-1); -var_dump(gmp_clrbit($n, -1)); +try { + gmp_clrbit($n, -1); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_strval($n)); $n = gmp_init("1000000"); -gmp_clrbit($n, -1); +try { + gmp_clrbit($n, -1); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_strval($n)); $n = gmp_init("1000000"); @@ -36,14 +44,11 @@ try { echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(1) "0" - -Warning: gmp_clrbit(): Index must be greater than or equal to zero in %s on line %d -bool(false) +gmp_clrbit(): Argument #2 ($index) must be greater than or equal to zero string(2) "-1" - -Warning: gmp_clrbit(): Index must be greater than or equal to zero in %s on line %d +gmp_clrbit(): Argument #2 ($index) must be greater than or equal to zero string(7) "1000000" string(7) "1000000" string(30) "238462734628347239571822592658" diff --git a/ext/gmp/tests/gmp_div_q.phpt b/ext/gmp/tests/gmp_div_q.phpt index 9fd94efdac897..27646a98c12b1 100644 --- a/ext/gmp/tests/gmp_div_q.phpt +++ b/ext/gmp/tests/gmp_div_q.phpt @@ -8,7 +8,11 @@ gmp_div_q() tests var_dump(gmp_div_q(0,1)); var_dump(gmp_div_q(1,0)); var_dump(gmp_div_q(12653,23482734)); -var_dump(gmp_div_q(12653,23482734, 10)); +try { + var_dump(gmp_div_q(12653,23482734, 10)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_div_q(1123123,123)); var_dump(gmp_div_q(1123123,123, 1)); var_dump(gmp_div_q(1123123,123, 2)); @@ -35,9 +39,7 @@ object(GMP)#%d (1) { ["num"]=> string(1) "0" } - -Warning: gmp_div_q(): Invalid rounding mode %s on line %d -bool(false) +gmp_div_q(): Argument #3 ($round) must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF object(GMP)#%d (1) { ["num"]=> string(4) "9131" diff --git a/ext/gmp/tests/gmp_div_qr.phpt b/ext/gmp/tests/gmp_div_qr.phpt index 373beb570111c..9e5a7c4fdad52 100644 --- a/ext/gmp/tests/gmp_div_qr.phpt +++ b/ext/gmp/tests/gmp_div_qr.phpt @@ -9,7 +9,11 @@ var_dump(gmp_div_qr(0,1)); var_dump(gmp_div_qr(1,0)); var_dump(gmp_div_qr(gmp_init(1), gmp_init(0))); var_dump(gmp_div_qr(12653,23482734)); -var_dump(gmp_div_qr(12653,23482734, 10)); +try { + var_dump(gmp_div_qr(12653,23482734, 10)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_div_qr(1123123,123)); var_dump(gmp_div_qr(1123123,123, 1)); var_dump(gmp_div_qr(1123123,123, 2)); @@ -56,9 +60,7 @@ array(2) { string(5) "12653" } } - -Warning: gmp_div_qr(): Invalid rounding mode in %s on line %d -bool(false) +gmp_div_qr(): Argument #3 ($round) must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF array(2) { [0]=> object(GMP)#%d (1) { diff --git a/ext/gmp/tests/gmp_div_r.phpt b/ext/gmp/tests/gmp_div_r.phpt index 2b19ed1f48b26..ef9b72d33440b 100644 --- a/ext/gmp/tests/gmp_div_r.phpt +++ b/ext/gmp/tests/gmp_div_r.phpt @@ -8,7 +8,11 @@ gmp_div_r() tests var_dump($r = gmp_div_r(0,1)); var_dump($r = gmp_div_r(1,0)); var_dump($r = gmp_div_r(12653,23482734)); -var_dump($r = gmp_div_r(12653,23482734, 10)); +try { + var_dump($r = gmp_div_r(12653,23482734, 10)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump($r = gmp_div_r(1123123,123)); var_dump($r = gmp_div_r(1123123,123, 1)); var_dump($r = gmp_div_r(1123123,123, 2)); @@ -35,9 +39,7 @@ object(GMP)#%d (1) { ["num"]=> string(5) "12653" } - -Warning: gmp_div_r(): Invalid rounding mode in %s on line %d -bool(false) +gmp_div_r(): Argument #3 ($round) must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF object(GMP)#%d (1) { ["num"]=> string(2) "10" diff --git a/ext/gmp/tests/gmp_export.phpt b/ext/gmp/tests/gmp_export.phpt index bbc26d086cfd9..3c0bb91d9ec45 100644 --- a/ext/gmp/tests/gmp_export.phpt +++ b/ext/gmp/tests/gmp_export.phpt @@ -51,23 +51,31 @@ foreach ($export as $k => $test) { var_dump($passed); // Invalid word sizes -var_dump(gmp_export(123, -1)); -var_dump(gmp_export(123, 0)); +try { + var_dump(gmp_export(123, -1)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_export(123, 0)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} // Invalid options -var_dump(gmp_export(123, 1, GMP_MSW_FIRST | GMP_LSW_FIRST)); -var_dump(gmp_export(123, 1, GMP_BIG_ENDIAN | GMP_LITTLE_ENDIAN)); ---EXPECTF-- +try { + var_dump(gmp_export(123, 1, GMP_MSW_FIRST | GMP_LSW_FIRST)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_export(123, 1, GMP_BIG_ENDIAN | GMP_LITTLE_ENDIAN)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +--EXPECT-- bool(true) - -Warning: gmp_export(): Word size must be positive, -1 given in %s on line %d -bool(false) - -Warning: gmp_export(): Word size must be positive, 0 given in %s on line %d -bool(false) - -Warning: gmp_export(): Invalid options: Conflicting word orders in %s on line %d -bool(false) - -Warning: gmp_export(): Invalid options: Conflicting word endianness in %s on line %d -bool(false) +gmp_export(): Argument #2 ($word_size) must be greater than or equal to 1 +gmp_export(): Argument #2 ($word_size) must be greater than or equal to 1 +gmp_export(): Argument #3 ($options) has conflicting word orders +gmp_export(): Argument #3 ($options) has conflicting word endianness diff --git a/ext/gmp/tests/gmp_fact.phpt b/ext/gmp/tests/gmp_fact.phpt index d861fae40ede1..837b87139a986 100644 --- a/ext/gmp/tests/gmp_fact.phpt +++ b/ext/gmp/tests/gmp_fact.phpt @@ -8,8 +8,16 @@ gmp_fact() basic tests var_dump(gmp_strval(gmp_fact(0))); var_dump(gmp_strval(gmp_fact(""))); var_dump(gmp_strval(gmp_fact("0"))); -var_dump(gmp_strval(gmp_fact("-1"))); -var_dump(gmp_strval(gmp_fact(-1))); +try { + var_dump(gmp_strval(gmp_fact("-1"))); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_strval(gmp_fact(-1))); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_strval(gmp_fact(1.1))); var_dump(gmp_strval(gmp_fact(20))); var_dump(gmp_strval(gmp_fact("50"))); @@ -19,7 +27,11 @@ var_dump(gmp_strval(gmp_fact("0000"))); $n = gmp_init(12); var_dump(gmp_strval(gmp_fact($n))); $n = gmp_init(-10); -var_dump(gmp_strval(gmp_fact($n))); +try { + var_dump(gmp_strval(gmp_fact($n))); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_fact(array())); var_dump(gmp_strval(gmp_fact(array()))); @@ -30,12 +42,8 @@ echo "Done\n"; string(1) "1" string(1) "1" string(1) "1" - -Warning: gmp_fact(): Number has to be greater than or equal to 0 in %s on line %d -string(1) "0" - -Warning: gmp_fact(): Number has to be greater than or equal to 0 in %s on line %d -string(1) "0" +gmp_fact(): Argument #1 ($a) must be greater than or equal to 0 +gmp_fact(): Argument #1 ($a) must be greater than or equal to 0 Warning: gmp_fact(): Number has to be an integer in %s on line %d string(1) "1" @@ -44,9 +52,7 @@ string(65) "30414093201713378043612608166064768844377641568960512000000000000" string(7) "3628800" string(1) "1" string(9) "479001600" - -Warning: gmp_fact(): Number has to be greater than or equal to 0 in %s on line %d -string(1) "0" +gmp_fact(): Argument #1 ($a) must be greater than or equal to 0 Warning: gmp_fact(): Number has to be an integer in %s on line %d object(GMP)#%d (1) { diff --git a/ext/gmp/tests/gmp_import.phpt b/ext/gmp/tests/gmp_import.phpt index b3c4e0154a60e..9b5bf75234d27 100644 --- a/ext/gmp/tests/gmp_import.phpt +++ b/ext/gmp/tests/gmp_import.phpt @@ -48,37 +48,51 @@ foreach ($import as $k => $test) { var_dump($passed); // Invalid word sizes -var_dump(gmp_import('a', -1)); -var_dump(gmp_import('a', 0)); +try { + var_dump(gmp_import('a', -1)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_import('a', 0)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} // Invalid data lengths -var_dump(gmp_import('a', 2)); -var_dump(gmp_import('aa', 3)); -var_dump(gmp_import(str_repeat('a', 100), 64)); +try { + var_dump(gmp_import('a', 2)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_import('aa', 3)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_import(str_repeat('a', 100), 64)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} // Invalid options -var_dump(gmp_import('a', 1, GMP_MSW_FIRST | GMP_LSW_FIRST)); -var_dump(gmp_import('a', 1, GMP_BIG_ENDIAN | GMP_LITTLE_ENDIAN)); ---EXPECTF-- +try { + var_dump(gmp_import('a', 1, GMP_MSW_FIRST | GMP_LSW_FIRST)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_import('a', 1, GMP_BIG_ENDIAN | GMP_LITTLE_ENDIAN)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +--EXPECT-- bool(true) - -Warning: gmp_import(): Word size must be positive, -1 given in %s on line %d -bool(false) - -Warning: gmp_import(): Word size must be positive, 0 given in %s on line %d -bool(false) - -Warning: gmp_import(): Input length must be a multiple of word size in %s on line %d -bool(false) - -Warning: gmp_import(): Input length must be a multiple of word size in %s on line %d -bool(false) - -Warning: gmp_import(): Input length must be a multiple of word size in %s on line %d -bool(false) - -Warning: gmp_import(): Invalid options: Conflicting word orders in %s on line %d -bool(false) - -Warning: gmp_import(): Invalid options: Conflicting word endianness in %s on line %d -bool(false) +gmp_import(): Argument #2 ($word_size) must be greater than or equal to 1 +gmp_import(): Argument #2 ($word_size) must be greater than or equal to 1 +gmp_import(): Argument #1 ($data) must be a multiple of word size +gmp_import(): Argument #1 ($data) must be a multiple of word size +gmp_import(): Argument #1 ($data) must be a multiple of word size +gmp_import(): Argument #3 ($options) has conflicting word orders +gmp_import(): Argument #3 ($options) has conflicting word endianness diff --git a/ext/gmp/tests/gmp_init.phpt b/ext/gmp/tests/gmp_init.phpt index 7da7c8e55eb7c..26e1bb664c265 100644 --- a/ext/gmp/tests/gmp_init.phpt +++ b/ext/gmp/tests/gmp_init.phpt @@ -7,7 +7,11 @@ gmp_init() basic tests var_dump(gmp_init("98765678")); var_dump(gmp_strval(gmp_init("98765678"))); -var_dump(gmp_init(1,-1)); +try { + var_dump(gmp_init(1,-1)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_init("",36)); var_dump(gmp_init("foo",3)); var_dump(gmp_strval(gmp_init("993247326237679187178",3))); @@ -20,9 +24,7 @@ object(GMP)#%d (1) { string(8) "98765678" } string(8) "98765678" - -Warning: gmp_init(): Bad base for conversion: -1 (should be between 2 and %d) in %s on line %d -bool(false) +gmp_init(): Argument #2 ($base) must be between 2 and 62 Warning: gmp_init(): Unable to convert variable to GMP - string is not an integer in %s on line %d bool(false) diff --git a/ext/gmp/tests/gmp_pown.phpt b/ext/gmp/tests/gmp_pown.phpt index 9a5b5deb11298..3e38657fd835f 100644 --- a/ext/gmp/tests/gmp_pown.phpt +++ b/ext/gmp/tests/gmp_pown.phpt @@ -19,16 +19,28 @@ var_dump(gmp_strval(gmp_powm($n,$e,1000))); $m = gmp_init(900); var_dump(gmp_strval(gmp_powm($n,$e,$m))); -var_dump(gmp_powm(5, 11, 0)); -var_dump(gmp_powm(5, "11", gmp_init(0))); +try { + var_dump(gmp_powm(5, 11, 0)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_powm(5, "11", gmp_init(0))); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_powm(array(),$e,$m)); var_dump(gmp_powm($n,array(),$m)); var_dump(gmp_powm($n,$e,array())); var_dump(gmp_powm(array(),array(),array())); -$n = gmp_init("-5"); -var_dump(gmp_powm(10, $n, 10)); +try { + $n = gmp_init("-5"); + var_dump(gmp_powm(10, $n, 10)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} $n = gmp_init("0"); var_dump(gmp_powm(10, $n, 10)); @@ -45,12 +57,8 @@ string(3) "533" string(3) "331" string(3) "171" string(3) "371" - -Warning: gmp_powm(): Modulus may not be zero in %s on line %d -bool(false) - -Warning: gmp_powm(): Modulus may not be zero in %s on line %d -bool(false) +gmp_powm(): Argument #3 ($mod) must not be 0 +gmp_powm(): Argument #3 ($mod) must not be 0 Warning: gmp_powm(): Unable to convert variable to GMP - wrong type in %s on line %d bool(false) @@ -63,9 +71,7 @@ bool(false) Warning: gmp_powm(): Unable to convert variable to GMP - wrong type in %s on line %d bool(false) - -Warning: gmp_powm(): Second parameter cannot be less than 0 in %s on line %d -bool(false) +gmp_powm(): Argument #2 ($exp) must be greater than or equal to 0 object(GMP)#%d (1) { ["num"]=> string(1) "1" diff --git a/ext/gmp/tests/gmp_random_bits.phpt b/ext/gmp/tests/gmp_random_bits.phpt index 1d6df7283153a..9c2f5be2e5372 100644 --- a/ext/gmp/tests/gmp_random_bits.phpt +++ b/ext/gmp/tests/gmp_random_bits.phpt @@ -5,8 +5,16 @@ gmp_random_bits() basic tests --FILE-- getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_random_bits(-1)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} // If these error the test fails. gmp_random_bits(1); @@ -32,10 +40,7 @@ while (1) { echo "Done\n"; ?> ---EXPECTF-- -Warning: gmp_random_bits(): The number of bits must be positive in %s on line %d -bool(false) - -Warning: gmp_random_bits(): The number of bits must be positive in %s on line %d -bool(false) +--EXPECT-- +gmp_random_bits(): Argument #1 ($bits) must be greater than or equal to 1 +gmp_random_bits(): Argument #1 ($bits) must be greater than or equal to 1 Done diff --git a/ext/gmp/tests/gmp_remroot.phpt b/ext/gmp/tests/gmp_remroot.phpt index 1316d7651c719..b7bf5f131bec5 100644 --- a/ext/gmp/tests/gmp_remroot.phpt +++ b/ext/gmp/tests/gmp_remroot.phpt @@ -14,8 +14,17 @@ var_dump(gmp_rootrem(100, 4)); var_dump(gmp_rootrem(-100, 4)); var_dump(gmp_rootrem(0, 3)); -var_dump(gmp_rootrem(100, 0)); -var_dump(gmp_rootrem(100, -3)); + +try { + var_dump(gmp_rootrem(100, 0)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_rootrem(100, -3)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} ?> --EXPECTF-- @@ -94,9 +103,5 @@ array(2) { string(1) "0" } } - -Warning: gmp_rootrem(): The root must be positive in %s on line %d -bool(false) - -Warning: gmp_rootrem(): The root must be positive in %s on line %d -bool(false) +gmp_rootrem(): Argument #2 ($nth) must be greater than or equal to 1 +gmp_rootrem(): Argument #2 ($nth) must be greater than or equal to 1 diff --git a/ext/gmp/tests/gmp_root.phpt b/ext/gmp/tests/gmp_root.phpt index 47c1fcc608157..ecdb80b1416a6 100644 --- a/ext/gmp/tests/gmp_root.phpt +++ b/ext/gmp/tests/gmp_root.phpt @@ -14,8 +14,17 @@ var_dump(gmp_root(100, 4)); var_dump(gmp_root(-100, 4)); var_dump(gmp_root(0, 3)); -var_dump(gmp_root(100, 0)); -var_dump(gmp_root(100, -3)); + +try { + var_dump(gmp_root(100, 0)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_root(100, -3)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} ?> --EXPECTF-- @@ -46,9 +55,5 @@ object(GMP)#%d (1) { ["num"]=> string(1) "0" } - -Warning: gmp_root(): The root must be positive in %s on line %d -bool(false) - -Warning: gmp_root(): The root must be positive in %s on line %d -bool(false) +gmp_root(): Argument #2 ($nth) must be greater than or equal to 1 +gmp_root(): Argument #2 ($nth) must be greater than or equal to 1 diff --git a/ext/gmp/tests/gmp_scan0.phpt b/ext/gmp/tests/gmp_scan0.phpt index c06f91f7dda63..3cd17e31abb9e 100644 --- a/ext/gmp/tests/gmp_scan0.phpt +++ b/ext/gmp/tests/gmp_scan0.phpt @@ -5,7 +5,12 @@ gmp_scan0() basic tests --FILE-- getMessage() . \PHP_EOL; +} + var_dump(gmp_scan0("434234", 1)); var_dump(gmp_scan0(4096, 0)); var_dump(gmp_scan0("1000000000", 5)); @@ -19,8 +24,7 @@ var_dump(gmp_scan0(array(), 200)); echo "Done\n"; ?> --EXPECTF-- -Warning: gmp_scan0(): Starting index must be greater than or equal to zero in %s on line %d -bool(false) +gmp_scan0(): Argument #2 ($start) must be greater than or equal to zero int(2) int(0) int(5) diff --git a/ext/gmp/tests/gmp_scan1.phpt b/ext/gmp/tests/gmp_scan1.phpt index 43a2fdfa1baea..825a51642dba2 100644 --- a/ext/gmp/tests/gmp_scan1.phpt +++ b/ext/gmp/tests/gmp_scan1.phpt @@ -5,7 +5,12 @@ gmp_scan1() basic tests --FILE-- getMessage() . \PHP_EOL; +} + var_dump(gmp_scan1("434234", 1)); var_dump(gmp_scan1(4096, 0)); var_dump(gmp_scan1("1000000000", 5)); @@ -19,8 +24,7 @@ var_dump(gmp_scan1(array(), 200)); echo "Done\n"; ?> --EXPECTF-- -Warning: gmp_scan1(): Starting index must be greater than or equal to zero in %s on line %d -bool(false) +gmp_scan1(): Argument #2 ($start) must be greater than or equal to zero int(1) int(12) int(9) diff --git a/ext/gmp/tests/gmp_setbit.phpt b/ext/gmp/tests/gmp_setbit.phpt index b883060e5425b..e3b0f1a03f3ba 100644 --- a/ext/gmp/tests/gmp_setbit.phpt +++ b/ext/gmp/tests/gmp_setbit.phpt @@ -10,7 +10,11 @@ gmp_setbit($n, 10, -1); var_dump(gmp_strval($n)); $n = gmp_init(5); -var_dump(gmp_setbit($n, -20, 0)); +try { + gmp_setbit($n, -20, 0); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_strval($n)); $n = gmp_init(5); @@ -46,11 +50,9 @@ try { echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(2) "-1" - -Warning: gmp_setbit(): Index must be greater than or equal to zero in %s on line %d -bool(false) +gmp_setbit(): Argument #2 ($index) must be greater than or equal to zero string(1) "5" string(1) "1" string(1) "7" diff --git a/ext/gmp/tests/gmp_sqrt.phpt b/ext/gmp/tests/gmp_sqrt.phpt index 03c460b79a932..6022c85bbf575 100644 --- a/ext/gmp/tests/gmp_sqrt.phpt +++ b/ext/gmp/tests/gmp_sqrt.phpt @@ -5,8 +5,17 @@ gmp_sqrt() basic tests --FILE-- getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_strval(gmp_sqrt("-2"))); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} + var_dump(gmp_strval(gmp_sqrt("0"))); var_dump(gmp_strval(gmp_sqrt("2"))); var_dump(gmp_strval(gmp_sqrt("144"))); @@ -14,7 +23,11 @@ var_dump(gmp_strval(gmp_sqrt("144"))); $n = gmp_init(0); var_dump(gmp_strval(gmp_sqrt($n))); $n = gmp_init(-144); -var_dump(gmp_strval(gmp_sqrt($n))); +try { + var_dump(gmp_strval(gmp_sqrt($n))); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} $n = gmp_init(777); var_dump(gmp_strval(gmp_sqrt($n))); @@ -23,18 +36,13 @@ var_dump(gmp_sqrt(array())); echo "Done\n"; ?> --EXPECTF-- -Warning: gmp_sqrt(): Number has to be greater than or equal to 0 in %s on line %d -string(1) "0" - -Warning: gmp_sqrt(): Number has to be greater than or equal to 0 in %s on line %d -string(1) "0" +gmp_sqrt(): Argument #1 ($a) must be greater than or equal to 0 +gmp_sqrt(): Argument #1 ($a) must be greater than or equal to 0 string(1) "0" string(1) "1" string(2) "12" string(1) "0" - -Warning: gmp_sqrt(): Number has to be greater than or equal to 0 in %s on line %d -string(1) "0" +gmp_sqrt(): Argument #1 ($a) must be greater than or equal to 0 string(2) "27" Warning: gmp_sqrt(): Unable to convert variable to GMP - wrong type in %s on line %d diff --git a/ext/gmp/tests/gmp_sqrtrem.phpt b/ext/gmp/tests/gmp_sqrtrem.phpt index c19969158e363..5c13d5524197e 100644 --- a/ext/gmp/tests/gmp_sqrtrem.phpt +++ b/ext/gmp/tests/gmp_sqrtrem.phpt @@ -5,8 +5,12 @@ gmp_sqrtrem() basic tests --FILE-- getMessage() . \PHP_EOL; +} $r = gmp_sqrtrem("0"); var_dump(gmp_strval($r[0])); @@ -40,10 +44,13 @@ $r = gmp_sqrtrem("1000001"); var_dump(gmp_strval($r[0])); var_dump(gmp_strval($r[1])); - -$n = gmp_init(-1); -$r = gmp_sqrtrem($n); -var_dump($r); +try { + $n = gmp_init(-1); + $r = gmp_sqrtrem($n); + var_dump($r); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} $n = gmp_init(1000001); $r = gmp_sqrtrem($n); @@ -55,8 +62,7 @@ var_dump(gmp_sqrtrem(array())); echo "Done\n"; ?> --EXPECTF-- -Warning: gmp_sqrtrem(): Number has to be greater than or equal to 0 in %s on line %d -bool(false) +gmp_sqrtrem(): Argument #1 ($a) must be greater than or equal to 0 string(1) "0" string(1) "0" string(1) "1" @@ -73,9 +79,7 @@ string(4) "1000" string(1) "0" string(4) "1000" string(1) "1" - -Warning: gmp_sqrtrem(): Number has to be greater than or equal to 0 in %s on line %d -bool(false) +gmp_sqrtrem(): Argument #1 ($a) must be greater than or equal to 0 string(4) "1000" string(1) "1" diff --git a/ext/gmp/tests/gmp_strval.phpt b/ext/gmp/tests/gmp_strval.phpt index b349d31699c9a..53214ca8a27ba 100644 --- a/ext/gmp/tests/gmp_strval.phpt +++ b/ext/gmp/tests/gmp_strval.phpt @@ -6,21 +6,41 @@ gmp_strval() tests getMessage() . \PHP_EOL; +} $fp = fopen(__FILE__, "r"); var_dump(gmp_strval($fp)); $g = gmp_init("9765456"); var_dump(gmp_strval($g)); -var_dump(gmp_strval($g, -1)); -var_dump(gmp_strval($g, 100000)); +try { + var_dump(gmp_strval($g, -1)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_strval($g, 100000)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_strval($g, 10)); $g = gmp_init("-3373333"); var_dump(gmp_strval($g)); -var_dump(gmp_strval($g, -1)); -var_dump(gmp_strval($g, 100000)); +try { + var_dump(gmp_strval($g, -1)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_strval($g, 100000)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_strval($g, 10)); var_dump(gmp_strval(array(1,2))); @@ -31,27 +51,17 @@ echo "Done\n"; --EXPECTF-- Warning: gmp_strval(): Unable to convert variable to GMP - string is not an integer in %s on line %d bool(false) - -Warning: gmp_strval(): Bad base for conversion: -1 (should be between 2 and %d or -2 and -%d) in %s on line %d -bool(false) +gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 Warning: gmp_strval(): Unable to convert variable to GMP - wrong type in %s on line %d bool(false) string(7) "9765456" - -Warning: gmp_strval(): Bad base for conversion: -1 (should be between 2 and %d or -2 and -%d) in %s on line %d -bool(false) - -Warning: gmp_strval(): Bad base for conversion: 100000 (should be between 2 and %d or -2 and -%d) in %s on line %d -bool(false) +gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 +gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 string(7) "9765456" string(8) "-3373333" - -Warning: gmp_strval(): Bad base for conversion: -1 (should be between 2 and %d or -2 and -%d) in %s on line %d -bool(false) - -Warning: gmp_strval(): Bad base for conversion: 100000 (should be between 2 and %d or -2 and -%d) in %s on line %d -bool(false) +gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 +gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 string(8) "-3373333" Warning: gmp_strval(): Unable to convert variable to GMP - wrong type in %s on line %d diff --git a/ext/gmp/tests/gmp_testbit.phpt b/ext/gmp/tests/gmp_testbit.phpt index f18af5d44da21..47234a621492f 100644 --- a/ext/gmp/tests/gmp_testbit.phpt +++ b/ext/gmp/tests/gmp_testbit.phpt @@ -6,14 +6,24 @@ gmp_testbit() basic tests getMessage() . \PHP_EOL; +} + var_dump(gmp_testbit($n, 0)); var_dump(gmp_testbit($n, 1)); var_dump(gmp_testbit($n, 100)); $n = gmp_init(-1); var_dump(gmp_testbit($n, 1)); -var_dump(gmp_testbit($n, -1)); +try { + var_dump(gmp_testbit($n, -1)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} $n = gmp_init("1000000"); var_dump(gmp_testbit($n, 1)); @@ -37,16 +47,13 @@ var_dump(gmp_strval($n)); echo "Done\n"; ?> ---EXPECTF-- -Warning: gmp_testbit(): Index must be greater than or equal to zero in %s on line %d -bool(false) +--EXPECT-- +gmp_testbit(): Argument #2 ($index) must be greater than or equal to zero bool(false) bool(false) bool(false) bool(true) - -Warning: gmp_testbit(): Index must be greater than or equal to zero in %s on line %d -bool(false) +gmp_testbit(): Argument #2 ($index) must be greater than or equal to zero bool(false) bool(true) string(7) "1000002" From f4c95f164569b7aa9ec20abc4d6eaea604c9fb19 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 21 Jul 2020 17:02:43 +0100 Subject: [PATCH 02/14] TypeError in GMP ext --- ext/gmp/gmp.c | 142 ++++++++++++++------------ ext/gmp/gmp.stub.php | 62 +++++------ ext/gmp/gmp_arginfo.h | 37 ++++--- ext/gmp/tests/003.phpt | 11 +- ext/gmp/tests/bug66872.phpt | 11 +- ext/gmp/tests/gmp_abs.phpt | 55 ++++++---- ext/gmp/tests/gmp_and.phpt | 44 +++++--- ext/gmp/tests/gmp_cmp.phpt | 12 ++- ext/gmp/tests/gmp_com.phpt | 20 ++-- ext/gmp/tests/gmp_div_q.phpt | 20 ++-- ext/gmp/tests/gmp_div_qr.phpt | 20 ++-- ext/gmp/tests/gmp_div_r.phpt | 20 ++-- ext/gmp/tests/gmp_gcdext.phpt | 22 ++-- ext/gmp/tests/gmp_hamdist.phpt | 32 +++--- ext/gmp/tests/gmp_init.phpt | 35 ++++--- ext/gmp/tests/gmp_invert.phpt | 32 +++--- ext/gmp/tests/gmp_jacobi.phpt | 32 +++--- ext/gmp/tests/gmp_legendre.phpt | 32 +++--- ext/gmp/tests/gmp_mod.phpt | 19 ++-- ext/gmp/tests/gmp_neg.phpt | 24 +++-- ext/gmp/tests/gmp_nextprime.phpt | 38 ++++--- ext/gmp/tests/gmp_or.phpt | 43 +++++--- ext/gmp/tests/gmp_perfect_square.phpt | 12 ++- ext/gmp/tests/gmp_popcount.phpt | 13 ++- ext/gmp/tests/gmp_pow.phpt | 13 ++- ext/gmp/tests/gmp_pown.phpt | 56 +++++----- ext/gmp/tests/gmp_prob_prime.phpt | 12 ++- ext/gmp/tests/gmp_random_seed.phpt | 12 ++- ext/gmp/tests/gmp_scan0.phpt | 12 ++- ext/gmp/tests/gmp_scan1.phpt | 12 ++- ext/gmp/tests/gmp_sign.phpt | 35 ++++--- ext/gmp/tests/gmp_sqrt.phpt | 12 ++- ext/gmp/tests/gmp_sqrtrem.phpt | 12 ++- ext/gmp/tests/gmp_strval.phpt | 41 +++++--- ext/gmp/tests/gmp_sub.phpt | 52 ++++++---- ext/gmp/tests/gmp_xor.phpt | 43 +++++--- ext/gmp/tests/overloading.phpt | 10 +- 37 files changed, 651 insertions(+), 459 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index bbabde5f9ee48..0ccbd63049bc1 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -109,7 +109,7 @@ typedef struct _gmp_temp { * gmp_temp_t. This temporary value needs to be freed lateron using the * FREE_GMP_TEMP macro. * - * If the conversion to a gmp number fails, the macros return false. + * If the conversion to a gmp number fails, the macros RETURN_THROWS() due to TypeError. * The _DEP / _DEP_DEP variants additionally free the temporary values * passed in the last / last two arguments. * @@ -126,47 +126,46 @@ typedef struct _gmp_temp { mpz_clear(temp.num); \ } -#define FETCH_GMP_ZVAL_DEP_DEP(gmpnumber, zval, temp, dep1, dep2) \ +#define FETCH_GMP_ZVAL_DEP_DEP(gmpnumber, zval, temp, dep1, dep2, arg_pos) \ if (IS_GMP(zval)) { \ gmpnumber = GET_GMP_FROM_ZVAL(zval); \ temp.is_used = 0; \ } else { \ mpz_init(temp.num); \ - if (convert_to_gmp(temp.num, zval, 0) == FAILURE) { \ + if (convert_to_gmp(temp.num, zval, 0, arg_pos) == FAILURE) { \ mpz_clear(temp.num); \ FREE_GMP_TEMP(dep1); \ FREE_GMP_TEMP(dep2); \ - RETURN_FALSE; \ + RETURN_THROWS(); \ } \ temp.is_used = 1; \ gmpnumber = temp.num; \ } -#define FETCH_GMP_ZVAL_DEP(gmpnumber, zval, temp, dep) \ +#define FETCH_GMP_ZVAL_DEP(gmpnumber, zval, temp, dep, arg_pos) \ if (IS_GMP(zval)) { \ gmpnumber = GET_GMP_FROM_ZVAL(zval); \ temp.is_used = 0; \ } else { \ mpz_init(temp.num); \ - if (convert_to_gmp(temp.num, zval, 0) == FAILURE) { \ + if (convert_to_gmp(temp.num, zval, 0, arg_pos) == FAILURE) { \ mpz_clear(temp.num); \ FREE_GMP_TEMP(dep); \ - RETURN_FALSE; \ + RETURN_THROWS(); \ } \ temp.is_used = 1; \ gmpnumber = temp.num; \ } -/* TODO convert RETURN_FALSE */ -#define FETCH_GMP_ZVAL(gmpnumber, zval, temp) \ +#define FETCH_GMP_ZVAL(gmpnumber, zval, temp, arg_pos) \ if (IS_GMP(zval)) { \ gmpnumber = GET_GMP_FROM_ZVAL(zval); \ temp.is_used = 0; \ } else { \ mpz_init(temp.num); \ - if (convert_to_gmp(temp.num, zval, 0) == FAILURE) { \ + if (convert_to_gmp(temp.num, zval, 0, arg_pos) == FAILURE) { \ mpz_clear(temp.num); \ - RETURN_FALSE; \ + RETURN_THROWS(); \ } \ temp.is_used = 1; \ gmpnumber = temp.num; \ @@ -176,7 +175,7 @@ if (IS_GMP(zval)) { \ gmp_create(return_value, &gmpnumber) static void gmp_strval(zval *result, mpz_t gmpnum, int base); -static int convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base); +static int convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base, uint32_t arg_pos); static void gmp_cmp(zval *return_value, zval *a_arg, zval *b_arg); /* @@ -346,7 +345,7 @@ static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zva mpz_ptr gmpnum_op, gmpnum_result; gmp_temp_t temp; - FETCH_GMP_ZVAL(gmpnum_op, op1, temp); + FETCH_GMP_ZVAL(gmpnum_op, op1, temp, 1); INIT_GMP_RETVAL(gmpnum_result); op(gmpnum_result, gmpnum_op, (gmp_ulong) shift); FREE_GMP_TEMP(temp); @@ -480,7 +479,7 @@ static int gmp_unserialize(zval *object, zend_class_entry *ce, const unsigned ch zv = var_tmp_var(&unserialize_data); if (!php_var_unserialize(zv, &p, max, &unserialize_data) || Z_TYPE_P(zv) != IS_STRING - || convert_to_gmp(gmpnum, zv, 10) == FAILURE + || convert_to_gmp(gmpnum, zv, 10, 0) == FAILURE ) { zend_throw_exception(NULL, "Could not unserialize number", 0); goto exit; @@ -584,7 +583,7 @@ ZEND_MODULE_INFO_D(gmp) /* {{{ convert_to_gmp * Convert zval to be gmp number */ -static int convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base) +static int convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base, uint32_t arg_pos) { switch (Z_TYPE_P(val)) { case IS_LONG: @@ -610,16 +609,34 @@ static int convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base) ret = mpz_set_str(gmpnumber, (skip_lead ? &numstr[2] : numstr), (int) base); if (-1 == ret) { - php_error_docref(NULL, E_WARNING, - "Unable to convert variable to GMP - string is not an integer"); + /* Try to guess base for better error message */ + if (base == 0) { + if (numstr[0] == '0' || ((numstr[0] == '+' || numstr[0] == '-') && numstr[1] == '0')) { + base = 8; + } else { /* Default to base 10 */ + base = 10; + } + } + + /* if unserializing */ + if (arg_pos == 0) { + php_error_docref(NULL, E_WARNING, + "Cannot convert variable to GMP, string is not an integer in base " ZEND_LONG_FMT, base); + return FAILURE; + } + zend_argument_type_error(arg_pos, "must be an integer string in base " ZEND_LONG_FMT, base); return FAILURE; } return SUCCESS; } default: - php_error_docref(NULL, E_WARNING, - "Unable to convert variable to GMP - wrong type"); + /* if unserializing */ + if (arg_pos == 0) { + php_error_docref(NULL, E_WARNING, "Cannot convert variable of type %s to GMP", zend_zval_type_name(val)); + return FAILURE; + } + zend_argument_type_error(arg_pos, "must be of type bool|int|string|GMP, %s given", zend_zval_type_name(val)); return FAILURE; } } @@ -663,13 +680,13 @@ static void gmp_cmp(zval *return_value, zval *a_arg, zval *b_arg) /* {{{ */ zend_bool use_si = 0; zend_long res; - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); if (Z_TYPE_P(b_arg) == IS_LONG) { use_si = 1; temp_b.is_used = 0; } else { - FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a); + FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a, 2); } if (use_si) { @@ -693,13 +710,13 @@ static inline void gmp_zval_binary_ui_op(zval *return_value, zval *a_arg, zval * mpz_ptr gmpnum_a, gmpnum_b, gmpnum_result; gmp_temp_t temp_a, temp_b; - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); if (gmp_ui_op && Z_TYPE_P(b_arg) == IS_LONG && Z_LVAL_P(b_arg) >= 0) { gmpnum_b = NULL; temp_b.is_used = 0; } else { - FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a); + FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a, 2); } if (check_b_zero) { @@ -740,13 +757,13 @@ static inline void gmp_zval_binary_ui_op2(zval *return_value, zval *a_arg, zval gmp_temp_t temp_a, temp_b; zval result1, result2; - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); if (gmp_ui_op && Z_TYPE_P(b_arg) == IS_LONG && Z_LVAL_P(b_arg) >= 0) { gmpnum_b = NULL; temp_b.is_used = 0; } else { - FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a); + FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a, 2); } if (check_b_zero) { @@ -804,7 +821,7 @@ static inline void gmp_zval_unary_op(zval *return_value, zval *a_arg, gmp_unary_ mpz_ptr gmpnum_a, gmpnum_result; gmp_temp_t temp_a; - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); INIT_GMP_RETVAL(gmpnum_result); gmp_op(gmpnum_result, gmpnum_a); @@ -847,7 +864,7 @@ static inline void _gmp_unary_opl(INTERNAL_FUNCTION_PARAMETERS, gmp_unary_opl_t RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); RETVAL_LONG(gmp_op(gmpnum_a)); FREE_GMP_TEMP(temp_a); } @@ -870,9 +887,8 @@ ZEND_FUNCTION(gmp_init) } INIT_GMP_RETVAL(gmpnumber); - if (convert_to_gmp(gmpnumber, number_arg, base) == FAILURE) { - zval_ptr_dtor(return_value); - RETURN_FALSE; + if (convert_to_gmp(gmpnumber, number_arg, base, 1) == FAILURE) { + RETURN_THROWS(); } } /* }}} */ @@ -966,7 +982,7 @@ ZEND_FUNCTION(gmp_export) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnumber, gmpnumber_arg, temp_a); + FETCH_GMP_ZVAL(gmpnumber, gmpnumber_arg, temp_a, 1); if (mpz_sgn(gmpnumber) == 0) { RETURN_EMPTY_STRING(); @@ -1021,7 +1037,7 @@ ZEND_FUNCTION(gmp_strval) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum, gmpnumber_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum, gmpnumber_arg, temp_a, 1); gmp_strval(return_value, gmpnum, (int)base); @@ -1218,7 +1234,7 @@ ZEND_FUNCTION(gmp_binomial) } else { mpz_ptr gmpnum_n; gmp_temp_t temp_n; - FETCH_GMP_ZVAL(gmpnum_n, n_arg, temp_n); + FETCH_GMP_ZVAL(gmpnum_n, n_arg, temp_n, 1); mpz_bin_ui(gmpnum_result, gmpnum_n, (gmp_ulong) k); FREE_GMP_TEMP(temp_n); } @@ -1247,7 +1263,7 @@ ZEND_FUNCTION(gmp_pow) mpz_ui_pow_ui(gmpnum_result, Z_LVAL_P(base_arg), exp); } else { mpz_ptr gmpnum_base; - FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base); + FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base, 1); INIT_GMP_RETVAL(gmpnum_result); mpz_pow_ui(gmpnum_result, gmpnum_base, exp); FREE_GMP_TEMP(temp_base); @@ -1267,13 +1283,13 @@ ZEND_FUNCTION(gmp_powm) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base); + FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base, 1); if (Z_TYPE_P(exp_arg) == IS_LONG && Z_LVAL_P(exp_arg) >= 0) { use_ui = 1; temp_exp.is_used = 0; } else { - FETCH_GMP_ZVAL_DEP(gmpnum_exp, exp_arg, temp_exp, temp_base); + FETCH_GMP_ZVAL_DEP(gmpnum_exp, exp_arg, temp_exp, temp_base, 2); if (mpz_sgn(gmpnum_exp) < 0) { zend_argument_value_error(2, "must be greater than or equal to 0"); FREE_GMP_TEMP(temp_base); @@ -1281,7 +1297,7 @@ ZEND_FUNCTION(gmp_powm) RETURN_THROWS(); } } - FETCH_GMP_ZVAL_DEP_DEP(gmpnum_mod, mod_arg, temp_mod, temp_exp, temp_base); + FETCH_GMP_ZVAL_DEP_DEP(gmpnum_mod, mod_arg, temp_mod, temp_exp, temp_base, 3); if (!mpz_cmp_ui(gmpnum_mod, 0)) { zend_argument_value_error(3, "must not be 0"); @@ -1315,7 +1331,7 @@ ZEND_FUNCTION(gmp_sqrt) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); if (mpz_sgn(gmpnum_a) < 0) { zend_argument_value_error(1, "must be greater than or equal to 0"); @@ -1341,7 +1357,7 @@ ZEND_FUNCTION(gmp_sqrtrem) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); if (mpz_sgn(gmpnum_a) < 0) { zend_argument_value_error(1, "must be greater than or equal to 0"); @@ -1378,7 +1394,7 @@ ZEND_FUNCTION(gmp_root) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); if (nth % 2 == 0 && mpz_sgn(gmpnum_a) < 0) { php_error_docref(NULL, E_WARNING, "Can't take even root of negative number"); @@ -1410,7 +1426,7 @@ ZEND_FUNCTION(gmp_rootrem) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); if (nth % 2 == 0 && mpz_sgn(gmpnum_a) < 0) { php_error_docref(NULL, E_WARNING, "Can't take even root of negative number"); @@ -1450,7 +1466,7 @@ ZEND_FUNCTION(gmp_perfect_square) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); RETVAL_BOOL((mpz_perfect_square_p(gmpnum_a) != 0)); FREE_GMP_TEMP(temp_a); @@ -1468,7 +1484,7 @@ ZEND_FUNCTION(gmp_perfect_power) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); RETVAL_BOOL((mpz_perfect_power_p(gmpnum_a) != 0)); FREE_GMP_TEMP(temp_a); @@ -1487,7 +1503,7 @@ ZEND_FUNCTION(gmp_prob_prime) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, gmpnumber_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, gmpnumber_arg, temp_a, 1); RETVAL_LONG(mpz_probab_prime_p(gmpnum_a, (int)reps)); FREE_GMP_TEMP(temp_a); @@ -1520,8 +1536,8 @@ ZEND_FUNCTION(gmp_gcdext) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); - FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); + FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a, 2); gmp_create(&result_g, &gmpnum_g); gmp_create(&result_s, &gmpnum_s); @@ -1550,8 +1566,8 @@ ZEND_FUNCTION(gmp_invert) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); - FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); + FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a, 2); INIT_GMP_RETVAL(gmpnum_result); res = mpz_invert(gmpnum_result, gmpnum_a, gmpnum_b); @@ -1575,8 +1591,8 @@ ZEND_FUNCTION(gmp_jacobi) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); - FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); + FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a, 2); RETVAL_LONG(mpz_jacobi(gmpnum_a, gmpnum_b)); @@ -1596,8 +1612,8 @@ ZEND_FUNCTION(gmp_legendre) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); - FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); + FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a, 2); RETVAL_LONG(mpz_legendre(gmpnum_a, gmpnum_b)); @@ -1623,14 +1639,14 @@ ZEND_FUNCTION(gmp_kronecker) use_a_si = 1; temp_a.is_used = 0; } else { - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); } if (Z_TYPE_P(b_arg) == IS_LONG) { use_b_si = 1; temp_b.is_used = 0; } else { - FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a); + FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a, 2); } if (use_a_si) { @@ -1674,7 +1690,7 @@ ZEND_FUNCTION(gmp_sign) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); RETVAL_LONG(mpz_sgn(gmpnum_a)); FREE_GMP_TEMP(temp_a); @@ -1711,7 +1727,7 @@ ZEND_FUNCTION(gmp_random_seed) else { mpz_ptr gmpnum_seed; - FETCH_GMP_ZVAL(gmpnum_seed, seed, temp_a); + FETCH_GMP_ZVAL(gmpnum_seed, seed, temp_a, 1); gmp_randseed(GMPG(rand_state), gmpnum_seed); @@ -1756,7 +1772,7 @@ ZEND_FUNCTION(gmp_random_range) gmp_init_random(); - FETCH_GMP_ZVAL(gmpnum_max, max_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_max, max_arg, temp_a, 2); if (Z_TYPE_P(min_arg) == IS_LONG && Z_LVAL_P(min_arg) >= 0) { if (mpz_cmp_ui(gmpnum_max, Z_LVAL_P(min_arg)) <= 0) { @@ -1785,7 +1801,7 @@ ZEND_FUNCTION(gmp_random_range) } else { mpz_ptr gmpnum_min; - FETCH_GMP_ZVAL_DEP(gmpnum_min, min_arg, temp_b, temp_a); + FETCH_GMP_ZVAL_DEP(gmpnum_min, min_arg, temp_b, temp_a, 1); if (mpz_cmp(gmpnum_max, gmpnum_min) <= 0) { FREE_GMP_TEMP(temp_b); @@ -1913,7 +1929,7 @@ ZEND_FUNCTION(gmp_testbit) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); RETVAL_BOOL(mpz_tstbit(gmpnum_a, index)); FREE_GMP_TEMP(temp_a); } @@ -1937,8 +1953,8 @@ ZEND_FUNCTION(gmp_hamdist) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); - FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); + FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a, 2); RETVAL_LONG(mpz_hamdist(gmpnum_a, gmpnum_b)); @@ -1964,7 +1980,7 @@ ZEND_FUNCTION(gmp_scan0) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); RETVAL_LONG(mpz_scan0(gmpnum_a, start)); FREE_GMP_TEMP(temp_a); @@ -1988,7 +2004,7 @@ ZEND_FUNCTION(gmp_scan1) RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); RETVAL_LONG(mpz_scan1(gmpnum_a, start)); FREE_GMP_TEMP(temp_a); diff --git a/ext/gmp/gmp.stub.php b/ext/gmp/gmp.stub.php index 29dba8d5a4fcb..42f3e6349eb55 100644 --- a/ext/gmp/gmp.stub.php +++ b/ext/gmp/gmp.stub.php @@ -7,7 +7,7 @@ class GMP } /** @param int|bool|string $number */ -function gmp_init($number, int $base = 0): GMP|false {} +function gmp_init($number, int $base = 0): GMP {} function gmp_import(string $data, int $word_size = 1, int $options = GMP_MSW_FIRST | GMP_NATIVE_ENDIAN): GMP {} @@ -18,25 +18,25 @@ function gmp_export($gmpnumber, int $word_size = 1, int $options = GMP_MSW_FIRST function gmp_intval($gmpnumber): int {} /** @param GMP|int|bool|string $gmpnumber */ -function gmp_strval($gmpnumber, int $base = 10): string|false {} +function gmp_strval($gmpnumber, int $base = 10): string {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_add($a, $b): GMP|false {} +function gmp_add($a, $b): GMP {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_sub($a, $b): GMP|false {} +function gmp_sub($a, $b): GMP {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_mul($a, $b): GMP|false {} +function gmp_mul($a, $b): GMP {} /** * @param GMP|int|bool|string $a @@ -76,19 +76,19 @@ function gmp_mod($a, $b): GMP|false {} function gmp_divexact($a, $b): GMP|false {} /** @param GMP|int|bool|string $a */ -function gmp_neg($a): GMP|false {} +function gmp_neg($a): GMP {} /** @param GMP|int|bool|string $a */ -function gmp_abs($a): GMP|false {} +function gmp_abs($a): GMP {} /** @param GMP|int $a */ -function gmp_fact($a): GMP|false {} +function gmp_fact($a): GMP {} /** @param GMP|int|bool|string $a */ -function gmp_sqrt($a): GMP|false {} +function gmp_sqrt($a): GMP {} /** @param GMP|int|bool|string $a */ -function gmp_sqrtrem($a): array|false {} +function gmp_sqrtrem($a): array {} /** @param GMP|int|bool|string $a */ function gmp_root($a, int $nth): GMP|false {} @@ -97,14 +97,14 @@ function gmp_root($a, int $nth): GMP|false {} function gmp_rootrem($a, int $nth): array|false {} /** @param GMP|int|bool|string $base */ -function gmp_pow($base, int $exp): GMP|false {} +function gmp_pow($base, int $exp): GMP {} /** * @param GMP|int|bool|string $base * @param GMP|int|bool|string $exp * @param GMP|int|bool|string $mod */ -function gmp_powm($base, $exp, $mod): GMP|false {} +function gmp_powm($base, $exp, $mod): GMP {} /** @param GMP|int|bool|string $a */ function gmp_perfect_square($a): bool {} @@ -113,25 +113,25 @@ function gmp_perfect_square($a): bool {} function gmp_perfect_power($a): bool {} /** @param GMP|int|bool|string $a */ -function gmp_prob_prime($a, int $reps = 10): int|false {} +function gmp_prob_prime($a, int $reps = 10): int {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_gcd($a, $b): GMP|false {} +function gmp_gcd($a, $b): GMP {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_gcdext($a, $b): array|false {} +function gmp_gcdext($a, $b): array {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_lcm($a, $b): GMP|false {} +function gmp_lcm($a, $b): GMP {} /** * @param GMP|int|bool|string $a @@ -143,31 +143,31 @@ function gmp_invert($a, $b): GMP|false {} * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_jacobi($a, $b): int|false {} +function gmp_jacobi($a, $b): int {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_legendre($a, $b): int|false {} +function gmp_legendre($a, $b): int {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_kronecker($a, $b): int|false {} +function gmp_kronecker($a, $b): int {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_cmp($a, $b): int|false {} +function gmp_cmp($a, $b): int {} /** @param GMP|int|bool|string $a */ -function gmp_sign($a): int|false {} +function gmp_sign($a): int {} /** @param GMP|int|bool|string $seed */ -function gmp_random_seed($seed): ?bool {} +function gmp_random_seed($seed): void {} function gmp_random_bits(int $bits): GMP {} @@ -181,22 +181,22 @@ function gmp_random_range($min, $max): GMP|false {} * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_and($a, $b): GMP|false {} +function gmp_and($a, $b): GMP {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_or($a, $b): GMP|false {} +function gmp_or($a, $b): GMP {} /** @param GMP|int|bool|string $a */ -function gmp_com($a): GMP|false {} +function gmp_com($a): GMP {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_xor($a, $b): GMP|false {} +function gmp_xor($a, $b): GMP {} function gmp_setbit(GMP $a, int $index, bool $set_clear = true): void {} @@ -206,22 +206,22 @@ function gmp_clrbit(GMP $a, int $index): void {} function gmp_testbit($a, int $index): bool {} /** @param GMP|int|bool|string $a */ -function gmp_scan0($a, int $start): int|false {} +function gmp_scan0($a, int $start): int {} /** @param GMP|int|bool|string $a */ -function gmp_scan1($a, int $start): int|false {} +function gmp_scan1($a, int $start): int {} /** @param GMP|int|bool|string $a */ -function gmp_popcount($a): int|false {} +function gmp_popcount($a): int {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_hamdist($a, $b): int|false {} +function gmp_hamdist($a, $b): int {} /** @param GMP|int|bool|string $a */ -function gmp_nextprime($a): GMP|false {} +function gmp_nextprime($a): GMP {} /** @param GMP|int|bool|string $a */ function gmp_binomial($a, int $b): GMP {} diff --git a/ext/gmp/gmp_arginfo.h b/ext/gmp/gmp_arginfo.h index ade10e8bf181c..3a3cae526edb3 100644 --- a/ext/gmp/gmp_arginfo.h +++ b/ext/gmp/gmp_arginfo.h @@ -1,7 +1,7 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 06749fca2bc6bdcef104f2c6cc69fe12e6e534fd */ + * Stub hash: b467c887efad8da11c353a60bc0adea5215aa781 */ -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_init, 0, 1, GMP, MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_init, 0, 1, GMP, 0) ZEND_ARG_INFO(0, number) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, base, IS_LONG, 0, "0") ZEND_END_ARG_INFO() @@ -22,12 +22,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_intval, 0, 1, IS_LONG, 0) ZEND_ARG_INFO(0, gmpnumber) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gmp_strval, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_strval, 0, 1, IS_STRING, 0) ZEND_ARG_INFO(0, gmpnumber) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, base, IS_LONG, 0, "10") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_add, 0, 2, GMP, MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_add, 0, 2, GMP, 0) ZEND_ARG_INFO(0, a) ZEND_ARG_INFO(0, b) ZEND_END_ARG_INFO() @@ -52,11 +52,14 @@ ZEND_END_ARG_INFO() #define arginfo_gmp_div arginfo_gmp_div_q -#define arginfo_gmp_mod arginfo_gmp_add +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_mod, 0, 2, GMP, MAY_BE_FALSE) + ZEND_ARG_INFO(0, a) + ZEND_ARG_INFO(0, b) +ZEND_END_ARG_INFO() -#define arginfo_gmp_divexact arginfo_gmp_add +#define arginfo_gmp_divexact arginfo_gmp_mod -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_neg, 0, 1, GMP, MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_neg, 0, 1, GMP, 0) ZEND_ARG_INFO(0, a) ZEND_END_ARG_INFO() @@ -66,7 +69,7 @@ ZEND_END_ARG_INFO() #define arginfo_gmp_sqrt arginfo_gmp_neg -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gmp_sqrtrem, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_sqrtrem, 0, 1, IS_ARRAY, 0) ZEND_ARG_INFO(0, a) ZEND_END_ARG_INFO() @@ -80,12 +83,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gmp_rootrem, 0, 2, MAY_BE_ARRAY| ZEND_ARG_TYPE_INFO(0, nth, IS_LONG, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_pow, 0, 2, GMP, MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_pow, 0, 2, GMP, 0) ZEND_ARG_INFO(0, base) ZEND_ARG_TYPE_INFO(0, exp, IS_LONG, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_powm, 0, 3, GMP, MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_powm, 0, 3, GMP, 0) ZEND_ARG_INFO(0, base) ZEND_ARG_INFO(0, exp) ZEND_ARG_INFO(0, mod) @@ -97,23 +100,23 @@ ZEND_END_ARG_INFO() #define arginfo_gmp_perfect_power arginfo_gmp_perfect_square -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gmp_prob_prime, 0, 1, MAY_BE_LONG|MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_prob_prime, 0, 1, IS_LONG, 0) ZEND_ARG_INFO(0, a) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, reps, IS_LONG, 0, "10") ZEND_END_ARG_INFO() #define arginfo_gmp_gcd arginfo_gmp_add -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gmp_gcdext, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_gcdext, 0, 2, IS_ARRAY, 0) ZEND_ARG_INFO(0, a) ZEND_ARG_INFO(0, b) ZEND_END_ARG_INFO() #define arginfo_gmp_lcm arginfo_gmp_add -#define arginfo_gmp_invert arginfo_gmp_add +#define arginfo_gmp_invert arginfo_gmp_mod -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gmp_jacobi, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_jacobi, 0, 2, IS_LONG, 0) ZEND_ARG_INFO(0, a) ZEND_ARG_INFO(0, b) ZEND_END_ARG_INFO() @@ -124,11 +127,11 @@ ZEND_END_ARG_INFO() #define arginfo_gmp_cmp arginfo_gmp_jacobi -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gmp_sign, 0, 1, MAY_BE_LONG|MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_sign, 0, 1, IS_LONG, 0) ZEND_ARG_INFO(0, a) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_random_seed, 0, 1, _IS_BOOL, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_random_seed, 0, 1, IS_VOID, 0) ZEND_ARG_INFO(0, seed) ZEND_END_ARG_INFO() @@ -165,7 +168,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_testbit, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, index, IS_LONG, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gmp_scan0, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_scan0, 0, 2, IS_LONG, 0) ZEND_ARG_INFO(0, a) ZEND_ARG_TYPE_INFO(0, start, IS_LONG, 0) ZEND_END_ARG_INFO() diff --git a/ext/gmp/tests/003.phpt b/ext/gmp/tests/003.phpt index 49b69c7d3addc..95ee45c2c5c1c 100644 --- a/ext/gmp/tests/003.phpt +++ b/ext/gmp/tests/003.phpt @@ -23,15 +23,19 @@ Check for number base recognition /* Hexadecimal */ $test[] = gmp_init("0x4d2"); $test[] = gmp_init("0x4d2", 16); - $test[] = gmp_init("4d2"); + try { + $test[] = gmp_init("4d2"); + } catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; + } $test[] = gmp_init("4d2", 16); for ($i = 0; $i < count($test); $i++) { printf("%s\n", gmp_strval($test[$i])); } ?> ---EXPECTF-- -Warning: gmp_init(): Unable to convert variable to GMP - string is not an integer in %s on line %d +--EXPECT-- +gmp_init(): Argument #1 ($number) must be an integer string in base 10 1234 1234 10011010010 @@ -44,5 +48,4 @@ Warning: gmp_init(): Unable to convert variable to GMP - string is not an intege 1234 1234 1234 -0 1234 diff --git a/ext/gmp/tests/bug66872.phpt b/ext/gmp/tests/bug66872.phpt index 434af30b81b41..0bbaaa9ab4dc3 100644 --- a/ext/gmp/tests/bug66872.phpt +++ b/ext/gmp/tests/bug66872.phpt @@ -5,9 +5,12 @@ Bug #66872: Crash when passing string to gmp_testbit --FILE-- getMessage() . \PHP_EOL; +} ?> ---EXPECTF-- -Warning: gmp_testbit(): Unable to convert variable to GMP - string is not an integer in %s on line %d -bool(false) +--EXPECT-- +gmp_testbit(): Argument #1 ($a) must be an integer string in base 10 diff --git a/ext/gmp/tests/gmp_abs.phpt b/ext/gmp/tests/gmp_abs.phpt index 236acc46842ba..ffc777e380c74 100644 --- a/ext/gmp/tests/gmp_abs.phpt +++ b/ext/gmp/tests/gmp_abs.phpt @@ -5,38 +5,53 @@ gmp_abs() basic tests --FILE-- getMessage() . \PHP_EOL; +} var_dump(gmp_strval(gmp_abs("0"))); var_dump(gmp_strval(gmp_abs(0))); -var_dump(gmp_strval(gmp_abs(-111111111111111111111))); +try { + var_dump(gmp_strval(gmp_abs(-111111111111111111111))); // This is a float +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_strval(gmp_abs("111111111111111111111"))); var_dump(gmp_strval(gmp_abs("-111111111111111111111"))); var_dump(gmp_strval(gmp_abs("0000"))); -var_dump(gmp_strval(gmp_abs("09876543"))); -var_dump(gmp_strval(gmp_abs("-099987654"))); -var_dump(gmp_abs(array())); +try { + // Base 8 + var_dump(gmp_strval(gmp_abs("09876543"))); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + // Base 8 + var_dump(gmp_strval(gmp_abs("-099987654"))); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} + + +try { + var_dump(gmp_abs(array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- -Warning: gmp_abs(): Unable to convert variable to GMP - string is not an integer in %s on line %d -string(1) "0" +--EXPECT-- +gmp_abs(): Argument #1 ($a) must be an integer string in base 10 string(1) "0" string(1) "0" - -Warning: gmp_abs(): Unable to convert variable to GMP - wrong type in %s on line %d -string(1) "0" +gmp_abs(): Argument #1 ($a) must be of type bool|int|string|GMP, float given string(21) "111111111111111111111" string(21) "111111111111111111111" string(1) "0" - -Warning: gmp_abs(): Unable to convert variable to GMP - string is not an integer in %s on line %d -string(1) "0" - -Warning: gmp_abs(): Unable to convert variable to GMP - string is not an integer in %s on line %d -string(1) "0" - -Warning: gmp_abs(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_abs(): Argument #1 ($a) must be an integer string in base 8 +gmp_abs(): Argument #1 ($a) must be an integer string in base 8 +gmp_abs(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_and.phpt b/ext/gmp/tests/gmp_and.phpt index b582a6b480f20..f1bbd0cde2c90 100644 --- a/ext/gmp/tests/gmp_and.phpt +++ b/ext/gmp/tests/gmp_and.phpt @@ -10,37 +10,47 @@ var_dump(gmp_strval(gmp_and(123123, 435234))); var_dump(gmp_strval(gmp_and(555, "2342341123"))); var_dump(gmp_strval(gmp_and(-1, 3333))); var_dump(gmp_strval(gmp_and(4545, -20))); -var_dump(gmp_strval(gmp_and("test", "no test"))); + +try { + var_dump(gmp_strval(gmp_and("test", "no test"))); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} $n = gmp_init("987657876543456"); var_dump(gmp_strval(gmp_and($n, "34332"))); $n1 = gmp_init("987657878765436543456"); var_dump(gmp_strval(gmp_and($n, $n1))); -var_dump(gmp_and(array(), 1)); -var_dump(gmp_and(1, array())); -var_dump(gmp_and(array(), array())); + +try { + var_dump(gmp_and(array(), 1)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_and(1, array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_and(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(6) "106502" string(5) "40994" string(3) "515" string(4) "3333" string(4) "4544" - -Warning: gmp_and(): Unable to convert variable to GMP - string is not an integer in %s on line %d -string(1) "0" +gmp_and(): Argument #1 ($a) must be an integer string in base 10 string(4) "1536" string(15) "424703623692768" - -Warning: gmp_and(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_and(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_and(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_and(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_and(): Argument #2 ($b) must be of type bool|int|string|GMP, array given +gmp_and(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_cmp.phpt b/ext/gmp/tests/gmp_cmp.phpt index 4748e7db877fb..b96d663e2e2a3 100644 --- a/ext/gmp/tests/gmp_cmp.phpt +++ b/ext/gmp/tests/gmp_cmp.phpt @@ -17,11 +17,15 @@ var_dump(gmp_cmp(0,$n) < 0); $n1 = gmp_init("827278512385463739"); var_dump(gmp_cmp($n1,$n)); -var_dump(gmp_cmp(array(),array())); +try { + var_dump(gmp_cmp(array(),array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- int(2) int(0) int(-1) @@ -30,7 +34,5 @@ int(1) int(-1) bool(true) int(0) - -Warning: gmp_cmp(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_cmp(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_com.phpt b/ext/gmp/tests/gmp_com.phpt index 97299dd064a80..71fc2e63cfae6 100644 --- a/ext/gmp/tests/gmp_com.phpt +++ b/ext/gmp/tests/gmp_com.phpt @@ -7,7 +7,11 @@ gmp_com() basic tests var_dump(gmp_strval(gmp_com(0))); var_dump(gmp_strval(gmp_com("0"))); -var_dump(gmp_strval(gmp_com("test"))); +try { + var_dump(gmp_strval(gmp_com("test"))); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_strval(gmp_com("2394876545678"))); var_dump(gmp_strval(gmp_com("-111"))); var_dump(gmp_strval(gmp_com(874653))); @@ -18,23 +22,23 @@ var_dump(gmp_strval(gmp_com($n))); $n = gmp_init("98765463337"); var_dump(gmp_strval(gmp_com($n))); -var_dump(gmp_strval(gmp_com(array()))); +try { + var_dump(gmp_strval(gmp_com(array()))); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> --EXPECTF-- string(2) "-1" string(2) "-1" - -Warning: gmp_com(): Unable to convert variable to GMP - string is not an integer in %s on line %d -string(1) "0" +gmp_com(): Argument #1 ($a) must be an integer string in base 10 string(14) "-2394876545679" string(3) "110" string(7) "-874654" string(4) "9875" string(9) "-98765468" string(12) "-98765463338" - -Warning: gmp_com(): Unable to convert variable to GMP - wrong type in %s on line %d -string(1) "0" +gmp_com(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_div_q.phpt b/ext/gmp/tests/gmp_div_q.phpt index 27646a98c12b1..cbdbb33a0b189 100644 --- a/ext/gmp/tests/gmp_div_q.phpt +++ b/ext/gmp/tests/gmp_div_q.phpt @@ -22,8 +22,16 @@ var_dump(gmp_div_q(1123123,123, GMP_ROUND_MINUSINF)); $fp = fopen(__FILE__, 'r'); -var_dump(gmp_div_q($fp, $fp)); -var_dump(gmp_div_q(array(), array())); +try { + var_dump(gmp_div_q($fp, $fp)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_div_q(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> @@ -64,10 +72,6 @@ object(GMP)#%d (1) { ["num"]=> string(4) "9131" } - -Warning: gmp_div_q(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_div_q(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_div_q(): Argument #1 ($a) must be of type bool|int|string|GMP, resource given +gmp_div_q(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_div_qr.phpt b/ext/gmp/tests/gmp_div_qr.phpt index 9e5a7c4fdad52..a9fb6b10029c6 100644 --- a/ext/gmp/tests/gmp_div_qr.phpt +++ b/ext/gmp/tests/gmp_div_qr.phpt @@ -24,8 +24,16 @@ var_dump(gmp_div_qr(1123123,123, GMP_ROUND_MINUSINF)); $fp = fopen(__FILE__, 'r'); -var_dump(gmp_div_qr($fp, $fp)); -var_dump(gmp_div_qr(array(), array())); +try { + var_dump(gmp_div_qr($fp, $fp)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_div_qr(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> @@ -145,10 +153,6 @@ array(2) { string(2) "10" } } - -Warning: gmp_div_qr(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_div_qr(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_div_qr(): Argument #1 ($a) must be of type bool|int|string|GMP, resource given +gmp_div_qr(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_div_r.phpt b/ext/gmp/tests/gmp_div_r.phpt index ef9b72d33440b..eaf2e404ad260 100644 --- a/ext/gmp/tests/gmp_div_r.phpt +++ b/ext/gmp/tests/gmp_div_r.phpt @@ -22,8 +22,16 @@ var_dump($r = gmp_div_r(1123123,123, GMP_ROUND_MINUSINF)); $fp = fopen(__FILE__, 'r'); -var_dump(gmp_div_r($fp, $fp)); -var_dump(gmp_div_r(array(), array())); +try { + var_dump(gmp_div_r($fp, $fp)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_div_r(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> @@ -64,10 +72,6 @@ object(GMP)#%d (1) { ["num"]=> string(2) "10" } - -Warning: gmp_div_r(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_div_r(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_div_r(): Argument #1 ($a) must be of type bool|int|string|GMP, resource given +gmp_div_r(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_gcdext.phpt b/ext/gmp/tests/gmp_gcdext.phpt index 9a923fcd4eb1c..bda068b856459 100644 --- a/ext/gmp/tests/gmp_gcdext.phpt +++ b/ext/gmp/tests/gmp_gcdext.phpt @@ -29,12 +29,20 @@ foreach ($a as $val) { var_dump(gmp_strval($check)); } -var_dump(gmp_gcdext($val[0],array())); -var_dump(gmp_gcdext(array(),array())); +try { + var_dump(gmp_gcdext($val[0], array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_gcdext(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(1) "3" string(1) "3" string(1) "1" @@ -55,10 +63,6 @@ string(1) "1" string(1) "1" string(3) "195" string(3) "195" - -Warning: gmp_gcdext(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_gcdext(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_gcdext(): Argument #2 ($b) must be of type bool|int|string|GMP, array given +gmp_gcdext(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_hamdist.phpt b/ext/gmp/tests/gmp_hamdist.phpt index 7057c5f32ac01..683c7a2b9684c 100644 --- a/ext/gmp/tests/gmp_hamdist.phpt +++ b/ext/gmp/tests/gmp_hamdist.phpt @@ -16,13 +16,25 @@ var_dump(gmp_hamdist($n, "8333765434567897654333334567")); var_dump(gmp_hamdist($n, $n)); var_dump(gmp_hamdist($n, $n1)); -var_dump(gmp_hamdist($n, array())); -var_dump(gmp_hamdist(array(), $n)); -var_dump(gmp_hamdist(array(), array())); +try { + var_dump(gmp_hamdist($n, array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_hamdist(array(), $n)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_hamdist(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- int(13) int(-1) int(36) @@ -30,13 +42,7 @@ int(-1) int(43) int(0) int(26) - -Warning: gmp_hamdist(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_hamdist(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_hamdist(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_hamdist(): Argument #2 ($b) must be of type bool|int|string|GMP, array given +gmp_hamdist(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_hamdist(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_init.phpt b/ext/gmp/tests/gmp_init.phpt index 26e1bb664c265..0c2125468da3b 100644 --- a/ext/gmp/tests/gmp_init.phpt +++ b/ext/gmp/tests/gmp_init.phpt @@ -12,26 +12,33 @@ try { } catch (\ValueError $e) { echo $e->getMessage() . \PHP_EOL; } -var_dump(gmp_init("",36)); -var_dump(gmp_init("foo",3)); -var_dump(gmp_strval(gmp_init("993247326237679187178",3))); + +try { + var_dump(gmp_init("",36)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_init("foo",3)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_strval(gmp_init("993247326237679187178",3))); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- -object(GMP)#%d (1) { +--EXPECT-- +object(GMP)#1 (1) { ["num"]=> string(8) "98765678" } string(8) "98765678" gmp_init(): Argument #2 ($base) must be between 2 and 62 - -Warning: gmp_init(): Unable to convert variable to GMP - string is not an integer in %s on line %d -bool(false) - -Warning: gmp_init(): Unable to convert variable to GMP - string is not an integer in %s on line %d -bool(false) - -Warning: gmp_init(): Unable to convert variable to GMP - string is not an integer in %s on line %d -string(1) "0" +gmp_init(): Argument #1 ($number) must be an integer string in base 36 +gmp_init(): Argument #1 ($number) must be an integer string in base 3 +gmp_init(): Argument #1 ($number) must be an integer string in base 3 Done diff --git a/ext/gmp/tests/gmp_invert.phpt b/ext/gmp/tests/gmp_invert.phpt index 40793afd5351d..fda56c9cdce09 100644 --- a/ext/gmp/tests/gmp_invert.phpt +++ b/ext/gmp/tests/gmp_invert.phpt @@ -19,13 +19,25 @@ $n1 = gmp_init("3498273496234234523451"); var_dump(gmp_strval(gmp_invert($n, $n1))); var_dump(gmp_strval(gmp_invert($n1, $n))); -var_dump(gmp_invert(array(), 1)); -var_dump(gmp_invert(1, array())); -var_dump(gmp_invert(array(), array())); +try { + var_dump(gmp_invert(array(), 1)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_invert(1, array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_invert(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(7) "2293131" string(1) "0" string(4) "5827" @@ -35,13 +47,7 @@ string(1) "0" string(1) "0" string(22) "3498273496234234523441" string(1) "1" - -Warning: gmp_invert(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_invert(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_invert(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_invert(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_invert(): Argument #2 ($b) must be of type bool|int|string|GMP, array given +gmp_invert(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_jacobi.phpt b/ext/gmp/tests/gmp_jacobi.phpt index adf3f6a0b2350..9d8a96cf0cf92 100644 --- a/ext/gmp/tests/gmp_jacobi.phpt +++ b/ext/gmp/tests/gmp_jacobi.phpt @@ -20,13 +20,25 @@ var_dump(gmp_strval(gmp_jacobi($n, $n1))); var_dump(gmp_strval(gmp_jacobi($n, 3))); var_dump(gmp_strval(gmp_jacobi(3, $n1))); -var_dump(gmp_jacobi(3, array())); -var_dump(gmp_jacobi(array(), 3)); -var_dump(gmp_jacobi(array(), array())); +try { + var_dump(gmp_jacobi(3, array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_jacobi(array(), 3)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_jacobi(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(1) "0" string(2) "-1" string(1) "0" @@ -44,13 +56,7 @@ string(1) "0" string(2) "-1" string(1) "0" string(2) "-1" - -Warning: gmp_jacobi(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_jacobi(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_jacobi(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_jacobi(): Argument #2 ($b) must be of type bool|int|string|GMP, array given +gmp_jacobi(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_jacobi(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_legendre.phpt b/ext/gmp/tests/gmp_legendre.phpt index ac51ad3da479d..58a034f69746a 100644 --- a/ext/gmp/tests/gmp_legendre.phpt +++ b/ext/gmp/tests/gmp_legendre.phpt @@ -20,13 +20,25 @@ var_dump(gmp_strval(gmp_legendre($n, $n1))); var_dump(gmp_strval(gmp_legendre($n, 3))); var_dump(gmp_strval(gmp_legendre(3, $n1))); -var_dump(gmp_legendre(3, array())); -var_dump(gmp_legendre(array(), 3)); -var_dump(gmp_legendre(array(), array())); +try { + var_dump(gmp_legendre(3, array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_legendre(array(), 3)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_legendre(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(1) "0" string(2) "-1" string(1) "0" @@ -44,13 +56,7 @@ string(1) "0" string(2) "-1" string(1) "0" string(2) "-1" - -Warning: gmp_legendre(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_legendre(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_legendre(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_legendre(): Argument #2 ($b) must be of type bool|int|string|GMP, array given +gmp_legendre(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_legendre(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_mod.phpt b/ext/gmp/tests/gmp_mod.phpt index 135c2ca11cb67..f4c8c21a592e2 100644 --- a/ext/gmp/tests/gmp_mod.phpt +++ b/ext/gmp/tests/gmp_mod.phpt @@ -5,12 +5,20 @@ gmp_mod tests() --FILE-- getMessage() . \PHP_EOL; +} var_dump(gmp_mod(0,1)); var_dump(gmp_mod(0,-1)); var_dump(gmp_mod(-1,0)); -var_dump(gmp_mod(array(), array())); +try { + var_dump(gmp_mod(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} $a = gmp_init("-100000000"); $b = gmp_init("353467"); @@ -20,8 +28,7 @@ var_dump(gmp_mod($a, $b)); echo "Done\n"; ?> --EXPECTF-- -Warning: gmp_mod(): Unable to convert variable to GMP - string is not an integer in %s on line %d -bool(false) +gmp_mod(): Argument #1 ($a) must be an integer string in base 10 object(GMP)#%d (1) { ["num"]=> string(1) "0" @@ -33,9 +40,7 @@ object(GMP)#%d (1) { Warning: gmp_mod(): Zero operand not allowed in %s on line %d bool(false) - -Warning: gmp_mod(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_mod(): Argument #1 ($a) must be of type bool|int|string|GMP, array given object(GMP)#%d (1) { ["num"]=> string(5) "31161" diff --git a/ext/gmp/tests/gmp_neg.phpt b/ext/gmp/tests/gmp_neg.phpt index 777de6910564d..4462acb1e92df 100644 --- a/ext/gmp/tests/gmp_neg.phpt +++ b/ext/gmp/tests/gmp_neg.phpt @@ -9,7 +9,13 @@ var_dump(gmp_intval(gmp_neg(0))); var_dump(gmp_intval(gmp_neg(1))); var_dump(gmp_intval(gmp_neg(-1))); var_dump(gmp_intval(gmp_neg("-1"))); -var_dump(gmp_intval(gmp_neg(""))); + +try { + var_dump(gmp_intval(gmp_neg(""))); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} + var_dump(gmp_intval(gmp_neg(0))); $n = gmp_init("0"); @@ -17,22 +23,22 @@ var_dump(gmp_intval(gmp_neg($n))); $n = gmp_init("12345678901234567890"); var_dump(gmp_strval(gmp_neg($n))); -var_dump(gmp_neg(array())); +try { + var_dump(gmp_neg(array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- int(0) int(-1) int(1) int(1) - -Warning: gmp_neg(): Unable to convert variable to GMP - string is not an integer in %s on line %d -int(0) +gmp_neg(): Argument #1 ($a) must be an integer string in base 10 int(0) int(0) string(21) "-12345678901234567890" - -Warning: gmp_neg(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_neg(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_nextprime.phpt b/ext/gmp/tests/gmp_nextprime.phpt index 87a295f62c890..d29bd85a8e534 100644 --- a/ext/gmp/tests/gmp_nextprime.phpt +++ b/ext/gmp/tests/gmp_nextprime.phpt @@ -16,28 +16,34 @@ $n = gmp_nextprime(1000); var_dump(gmp_strval($n)); $n = gmp_nextprime(100000); var_dump(gmp_strval($n)); -$n = gmp_nextprime(array()); -var_dump(gmp_strval($n)); -$n = gmp_nextprime(""); -var_dump(gmp_strval($n)); -$n = gmp_nextprime(new stdclass()); -var_dump(gmp_strval($n)); +try { + $n = gmp_nextprime(array()); + var_dump(gmp_strval($n)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + $n = gmp_nextprime(""); + var_dump(gmp_strval($n)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + $n = gmp_nextprime(new stdclass()); + var_dump(gmp_strval($n)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(1) "2" string(1) "2" string(1) "2" string(4) "1009" string(6) "100003" - -Warning: gmp_nextprime(): Unable to convert variable to GMP - wrong type in %s on line %d -string(1) "0" - -Warning: gmp_nextprime(): Unable to convert variable to GMP - string is not an integer in %s on line %d -string(1) "0" - -Warning: gmp_nextprime(): Unable to convert variable to GMP - wrong type in %s on line %d -string(1) "0" +gmp_nextprime(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_nextprime(): Argument #1 ($a) must be an integer string in base 10 +gmp_nextprime(): Argument #1 ($a) must be of type bool|int|string|GMP, stdClass given Done diff --git a/ext/gmp/tests/gmp_or.phpt b/ext/gmp/tests/gmp_or.phpt index affd6ae5b8232..4fb73dfcd6f1b 100644 --- a/ext/gmp/tests/gmp_or.phpt +++ b/ext/gmp/tests/gmp_or.phpt @@ -10,37 +10,46 @@ var_dump(gmp_strval(gmp_or(123123, 435234))); var_dump(gmp_strval(gmp_or(555, "2342341123"))); var_dump(gmp_strval(gmp_or(-1, 3333))); var_dump(gmp_strval(gmp_or(4545, -20))); -var_dump(gmp_strval(gmp_or("test", "no test"))); + +try { + var_dump(gmp_strval(gmp_or("test", "no test"))); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} $n = gmp_init("987657876543456"); var_dump(gmp_strval(gmp_or($n, "34332"))); $n1 = gmp_init("987657878765436543456"); var_dump(gmp_strval(gmp_or($n, $n1))); -var_dump(gmp_or(array(), 1)); -var_dump(gmp_or(1, array())); -var_dump(gmp_or(array(), array())); +try { + var_dump(gmp_or(array(), 1)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_or(1, array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_or(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(7) "2226831" string(6) "517363" string(10) "2342341163" string(2) "-1" string(3) "-19" - -Warning: gmp_or(): Unable to convert variable to GMP - string is not an integer in %s on line %d -string(1) "0" +gmp_or(): Argument #1 ($a) must be an integer string in base 10 string(15) "987657876576252" string(21) "987658441719689394144" - -Warning: gmp_or(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_or(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_or(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_or(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_or(): Argument #2 ($b) must be of type bool|int|string|GMP, array given +gmp_or(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_perfect_square.phpt b/ext/gmp/tests/gmp_perfect_square.phpt index b47791037843d..b41616c194bbe 100644 --- a/ext/gmp/tests/gmp_perfect_square.phpt +++ b/ext/gmp/tests/gmp_perfect_square.phpt @@ -21,11 +21,15 @@ var_dump(gmp_perfect_square($n)); $n = gmp_init(-5); var_dump(gmp_perfect_square($n)); -var_dump(gmp_perfect_square(array())); +try { + var_dump(gmp_perfect_square(array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- bool(true) bool(true) bool(false) @@ -37,7 +41,5 @@ bool(false) bool(false) bool(true) bool(false) - -Warning: gmp_perfect_square(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_perfect_square(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_popcount.phpt b/ext/gmp/tests/gmp_popcount.phpt index 76dc2a89c0c56..ff8483896f652 100644 --- a/ext/gmp/tests/gmp_popcount.phpt +++ b/ext/gmp/tests/gmp_popcount.phpt @@ -12,18 +12,21 @@ var_dump(gmp_popcount("52638927634234")); var_dump(gmp_popcount("-23476123423433")); $n = gmp_init("9876546789222"); var_dump(gmp_popcount($n)); -var_dump(gmp_popcount(array())); + +try { + var_dump(gmp_popcount(array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- int(-1) int(0) int(10) int(31) int(-1) int(20) - -Warning: gmp_popcount(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_popcount(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_pow.phpt b/ext/gmp/tests/gmp_pow.phpt index 523150765dc9f..5c18a80dd8df9 100644 --- a/ext/gmp/tests/gmp_pow.phpt +++ b/ext/gmp/tests/gmp_pow.phpt @@ -34,11 +34,16 @@ try { } catch (TypeError $e) { echo $e->getMessage(), "\n"; } -var_dump(gmp_pow(array(),10)); + +try { + var_dump(gmp_pow(array(),10)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(4) "1024" string(4) "1024" string(5) "-2048" @@ -52,7 +57,5 @@ gmp_pow(): Argument #2 ($exp) must be greater than or equal to 0 string(14) "10240000000000" string(14) "10240000000000" gmp_pow(): Argument #2 ($exp) must be of type int, array given - -Warning: gmp_pow(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_pow(): Argument #1 ($base) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_pown.phpt b/ext/gmp/tests/gmp_pown.phpt index 3e38657fd835f..34af9c1eb60e8 100644 --- a/ext/gmp/tests/gmp_pown.phpt +++ b/ext/gmp/tests/gmp_pown.phpt @@ -21,25 +21,41 @@ var_dump(gmp_strval(gmp_powm($n,$e,$m))); try { var_dump(gmp_powm(5, 11, 0)); -} catch (\ValueError $e) { - echo $e->getMessage() . \PHP_EOL; +} catch (\ValueError $error) { + echo $error->getMessage() . \PHP_EOL; } try { var_dump(gmp_powm(5, "11", gmp_init(0))); -} catch (\ValueError $e) { - echo $e->getMessage() . \PHP_EOL; +} catch (\ValueError $error) { + echo $error->getMessage() . \PHP_EOL; } -var_dump(gmp_powm(array(),$e,$m)); -var_dump(gmp_powm($n,array(),$m)); -var_dump(gmp_powm($n,$e,array())); -var_dump(gmp_powm(array(),array(),array())); +try { + var_dump(gmp_powm(array(),$e,$m)); +} catch (\TypeError $error) { + echo $error->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_powm($n,array(),$m)); +} catch (\TypeError $error) { + echo $error->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_powm($n,$error,array())); +} catch (\TypeError $error) { + echo $error->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_powm(array(),array(),array())); +} catch (\TypeError $error) { + echo $error->getMessage() . \PHP_EOL; +} try { $n = gmp_init("-5"); var_dump(gmp_powm(10, $n, 10)); -} catch (\ValueError $e) { - echo $e->getMessage() . \PHP_EOL; +} catch (\ValueError $error) { + echo $error->getMessage() . \PHP_EOL; } $n = gmp_init("0"); @@ -47,7 +63,7 @@ var_dump(gmp_powm(10, $n, 10)); echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(1) "0" string(1) "5" string(1) "5" @@ -59,20 +75,12 @@ string(3) "171" string(3) "371" gmp_powm(): Argument #3 ($mod) must not be 0 gmp_powm(): Argument #3 ($mod) must not be 0 - -Warning: gmp_powm(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_powm(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_powm(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_powm(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_powm(): Argument #1 ($base) must be of type bool|int|string|GMP, array given +gmp_powm(): Argument #2 ($exp) must be of type bool|int|string|GMP, array given +gmp_powm(): Argument #2 ($exp) must be of type bool|int|string|GMP, TypeError given +gmp_powm(): Argument #1 ($base) must be of type bool|int|string|GMP, array given gmp_powm(): Argument #2 ($exp) must be greater than or equal to 0 -object(GMP)#%d (1) { +object(GMP)#6 (1) { ["num"]=> string(1) "1" } diff --git a/ext/gmp/tests/gmp_prob_prime.phpt b/ext/gmp/tests/gmp_prob_prime.phpt index 3b05a0215fbca..ee197b6b0f1f9 100644 --- a/ext/gmp/tests/gmp_prob_prime.phpt +++ b/ext/gmp/tests/gmp_prob_prime.phpt @@ -28,11 +28,15 @@ var_dump(gmp_prob_prime($n)); $n = gmp_init(0); var_dump(gmp_prob_prime($n)); -var_dump(gmp_prob_prime(array())); +try { + var_dump(gmp_prob_prime(array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- int(0) int(2) int(2) @@ -71,7 +75,5 @@ int(0) int(0) int(0) int(0) - -Warning: gmp_prob_prime(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_prob_prime(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_random_seed.phpt b/ext/gmp/tests/gmp_random_seed.phpt index 80f49ee32c496..6e71f27894165 100644 --- a/ext/gmp/tests/gmp_random_seed.phpt +++ b/ext/gmp/tests/gmp_random_seed.phpt @@ -106,12 +106,16 @@ var_dump(gmp_strval(gmp_random_range(-10000, 0))); // standard non conversion error -var_dump(gmp_random_seed('not a number')); +try { + var_dump(gmp_random_seed('not a number')); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- NULL string(3) "107" string(30) "576055025228722307492589900056" @@ -168,7 +172,5 @@ string(301) "7240560133683902061389868703829443708354917824328579773726122219756 string(4) "9636" string(5) "-9848" string(5) "-9648" - -Warning: gmp_random_seed(): Unable to convert variable to GMP - string is not an integer in %s on line %d -bool(false) +gmp_random_seed(): Argument #1 ($seed) must be an integer string in base 10 Done diff --git a/ext/gmp/tests/gmp_scan0.phpt b/ext/gmp/tests/gmp_scan0.phpt index 3cd17e31abb9e..1a184929f0d06 100644 --- a/ext/gmp/tests/gmp_scan0.phpt +++ b/ext/gmp/tests/gmp_scan0.phpt @@ -19,18 +19,20 @@ var_dump(gmp_scan0("1000000000", 200)); $n = gmp_init("24234527465274"); var_dump(gmp_scan0($n, 10)); -var_dump(gmp_scan0(array(), 200)); +try { + var_dump(gmp_scan0(array(), 200)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- gmp_scan0(): Argument #2 ($start) must be greater than or equal to zero int(2) int(0) int(5) int(200) int(13) - -Warning: gmp_scan0(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_scan0(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_scan1.phpt b/ext/gmp/tests/gmp_scan1.phpt index 825a51642dba2..ace9db10eac0c 100644 --- a/ext/gmp/tests/gmp_scan1.phpt +++ b/ext/gmp/tests/gmp_scan1.phpt @@ -19,18 +19,20 @@ var_dump(gmp_scan1("1000000000", 200)); $n = gmp_init("24234527465274"); var_dump(gmp_scan1($n, 10)); -var_dump(gmp_scan1(array(), 200)); +try { + var_dump(gmp_scan1(array(), 200)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- gmp_scan1(): Argument #2 ($start) must be greater than or equal to zero int(1) int(12) int(9) int(-1) int(10) - -Warning: gmp_scan1(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_scan1(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_sign.phpt b/ext/gmp/tests/gmp_sign.phpt index ac01845395fe1..d0c5a2e141e85 100644 --- a/ext/gmp/tests/gmp_sign.phpt +++ b/ext/gmp/tests/gmp_sign.phpt @@ -10,26 +10,33 @@ var_dump(gmp_sign(1)); var_dump(gmp_sign(0)); var_dump(gmp_sign("123718235123123")); var_dump(gmp_sign("-34535345345")); -var_dump(gmp_sign("+34534573457345")); -$n = gmp_init("098909878976786545"); -var_dump(gmp_sign($n)); -var_dump(gmp_sign(array())); + +try { + var_dump(gmp_sign("+34534573457345")); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + $n = gmp_init("098909878976786545"); + var_dump(gmp_sign($n)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_sign(array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- int(-1) int(1) int(0) int(1) int(-1) - -Warning: gmp_sign(): Unable to convert variable to GMP - string is not an integer in %s on line %d -bool(false) - -Warning: gmp_init(): Unable to convert variable to GMP - string is not an integer in %s on line %d -int(0) - -Warning: gmp_sign(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_sign(): Argument #1 ($a) must be an integer string in base 10 +gmp_init(): Argument #1 ($number) must be an integer string in base 8 +gmp_sign(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_sqrt.phpt b/ext/gmp/tests/gmp_sqrt.phpt index 6022c85bbf575..67472dd955edd 100644 --- a/ext/gmp/tests/gmp_sqrt.phpt +++ b/ext/gmp/tests/gmp_sqrt.phpt @@ -31,11 +31,15 @@ try { $n = gmp_init(777); var_dump(gmp_strval(gmp_sqrt($n))); -var_dump(gmp_sqrt(array())); +try { + var_dump(gmp_sqrt(array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- gmp_sqrt(): Argument #1 ($a) must be greater than or equal to 0 gmp_sqrt(): Argument #1 ($a) must be greater than or equal to 0 string(1) "0" @@ -44,7 +48,5 @@ string(2) "12" string(1) "0" gmp_sqrt(): Argument #1 ($a) must be greater than or equal to 0 string(2) "27" - -Warning: gmp_sqrt(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_sqrt(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_sqrtrem.phpt b/ext/gmp/tests/gmp_sqrtrem.phpt index 5c13d5524197e..3ec545913b08d 100644 --- a/ext/gmp/tests/gmp_sqrtrem.phpt +++ b/ext/gmp/tests/gmp_sqrtrem.phpt @@ -57,11 +57,15 @@ $r = gmp_sqrtrem($n); var_dump(gmp_strval($r[0])); var_dump(gmp_strval($r[1])); -var_dump(gmp_sqrtrem(array())); +try { + var_dump(gmp_sqrtrem(array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- gmp_sqrtrem(): Argument #1 ($a) must be greater than or equal to 0 string(1) "0" string(1) "0" @@ -82,7 +86,5 @@ string(1) "1" gmp_sqrtrem(): Argument #1 ($a) must be greater than or equal to 0 string(4) "1000" string(1) "1" - -Warning: gmp_sqrtrem(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_sqrtrem(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/gmp_strval.phpt b/ext/gmp/tests/gmp_strval.phpt index 53214ca8a27ba..3ee8dee409b61 100644 --- a/ext/gmp/tests/gmp_strval.phpt +++ b/ext/gmp/tests/gmp_strval.phpt @@ -5,7 +5,11 @@ gmp_strval() tests --FILE-- getMessage() . \PHP_EOL; +} try { var_dump(gmp_strval("", -1)); } catch (\ValueError $e) { @@ -13,7 +17,11 @@ try { } $fp = fopen(__FILE__, "r"); -var_dump(gmp_strval($fp)); +try { + var_dump(gmp_strval($fp)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} $g = gmp_init("9765456"); var_dump(gmp_strval($g)); @@ -43,18 +51,23 @@ try { } var_dump(gmp_strval($g, 10)); -var_dump(gmp_strval(array(1,2))); -var_dump(gmp_strval(new stdclass)); +try { + var_dump(gmp_strval(array(1,2))); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_strval(new stdclass)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- -Warning: gmp_strval(): Unable to convert variable to GMP - string is not an integer in %s on line %d -bool(false) +--EXPECT-- +gmp_strval(): Argument #1 ($gmpnumber) must be an integer string in base 10 gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 - -Warning: gmp_strval(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_strval(): Argument #1 ($gmpnumber) must be of type bool|int|string|GMP, resource given string(7) "9765456" gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 @@ -63,10 +76,6 @@ string(8) "-3373333" gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 string(8) "-3373333" - -Warning: gmp_strval(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_strval(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_strval(): Argument #1 ($gmpnumber) must be of type bool|int|string|GMP, array given +gmp_strval(): Argument #1 ($gmpnumber) must be of type bool|int|string|GMP, stdClass given Done diff --git a/ext/gmp/tests/gmp_sub.phpt b/ext/gmp/tests/gmp_sub.phpt index b8dce49774e04..613078caa8a67 100644 --- a/ext/gmp/tests/gmp_sub.phpt +++ b/ext/gmp/tests/gmp_sub.phpt @@ -5,42 +5,50 @@ gmp_sub() tests --FILE-- getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_sub(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump($g = gmp_sub(10000, 10001)); var_dump(gmp_strval($g)); var_dump($g = gmp_sub(10000, -1)); var_dump(gmp_strval($g)); -var_dump($g = gmp_sub(10000, new stdclass)); -var_dump(gmp_strval($g)); -var_dump($g = gmp_sub(new stdclass, 100)); -var_dump(gmp_strval($g)); + +try { + var_dump($g = gmp_sub(10000, new stdclass)); + var_dump(gmp_strval($g)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump($g = gmp_sub(new stdclass, 100)); + var_dump(gmp_strval($g)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- -Warning: gmp_sub(): Unable to convert variable to GMP - string is not an integer in %s on line %d -bool(false) - -Warning: gmp_sub(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) -object(GMP)#%d (1) { +--EXPECT-- +gmp_sub(): Argument #1 ($a) must be an integer string in base 10 +gmp_sub(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +object(GMP)#1 (1) { ["num"]=> string(2) "-1" } string(2) "-1" -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(5) "10001" } string(5) "10001" - -Warning: gmp_sub(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) -string(1) "0" - -Warning: gmp_sub(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) -string(1) "0" +gmp_sub(): Argument #2 ($b) must be of type bool|int|string|GMP, stdClass given +gmp_sub(): Argument #1 ($a) must be of type bool|int|string|GMP, stdClass given Done diff --git a/ext/gmp/tests/gmp_xor.phpt b/ext/gmp/tests/gmp_xor.phpt index cc508907aa023..ecb405dc99243 100644 --- a/ext/gmp/tests/gmp_xor.phpt +++ b/ext/gmp/tests/gmp_xor.phpt @@ -10,37 +10,46 @@ var_dump(gmp_strval(gmp_xor(123123, 435234))); var_dump(gmp_strval(gmp_xor(555, "2342341123"))); var_dump(gmp_strval(gmp_xor(-1, 3333))); var_dump(gmp_strval(gmp_xor(4545, -20))); -var_dump(gmp_strval(gmp_xor("test", "no test"))); + +try { + var_dump(gmp_strval(gmp_xor("test", "no test"))); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} $n = gmp_init("987657876543456"); var_dump(gmp_strval(gmp_xor($n, "34332"))); $n1 = gmp_init("987657878765436543456"); var_dump(gmp_strval(gmp_xor($n, $n1))); -var_dump(gmp_xor(array(), 1)); -var_dump(gmp_xor(1, array())); -var_dump(gmp_xor(array(), array())); +try { + var_dump(gmp_xor(array(), 1)); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_xor(1, array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_xor(array(), array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(7) "2120329" string(6) "476369" string(10) "2342340648" string(5) "-3334" string(5) "-4563" - -Warning: gmp_xor(): Unable to convert variable to GMP - string is not an integer in %s on line %d -string(1) "0" +gmp_xor(): Argument #1 ($a) must be an integer string in base 10 string(15) "987657876574716" string(21) "987658017016065701376" - -Warning: gmp_xor(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_xor(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) - -Warning: gmp_xor(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +gmp_xor(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_xor(): Argument #2 ($b) must be of type bool|int|string|GMP, array given +gmp_xor(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done diff --git a/ext/gmp/tests/overloading.phpt b/ext/gmp/tests/overloading.phpt index c38b1eaf821a9..1a94f2d226aea 100644 --- a/ext/gmp/tests/overloading.phpt +++ b/ext/gmp/tests/overloading.phpt @@ -86,7 +86,11 @@ var_dump($a <= 42); var_dump($a > 42); var_dump($a >= 42); -var_dump($a == new stdClass); +try { + var_dump($a == new stdClass); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} $a += 1; var_dump($a); @@ -274,9 +278,7 @@ bool(false) bool(true) bool(false) bool(true) - -Warning: main(): Unable to convert variable to GMP - wrong type in %s on line %d -bool(false) +main(): Argument #2 must be of type bool|int|string|GMP, stdClass given object(GMP)#%d (1) { ["num"]=> string(2) "43" From 9b360b4a739a99753d7c5b0690c8541fdf22ce52 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 21 Jul 2020 17:46:46 +0100 Subject: [PATCH 03/14] Division/Modulo by 0 error in GMP extension --- ext/gmp/gmp.c | 39 +++++++--- ext/gmp/gmp.stub.php | 14 ++-- ext/gmp/gmp_arginfo.h | 20 +++--- ext/gmp/tests/bug32773.phpt | 22 +++--- ext/gmp/tests/gmp_div_q.phpt | 30 ++++---- ext/gmp/tests/gmp_div_qr.phpt | 60 +++++++++------- ext/gmp/tests/gmp_div_r.phpt | 30 ++++---- ext/gmp/tests/gmp_divexact.phpt | 14 ++-- ext/gmp/tests/gmp_mod.phpt | 19 ++--- ext/gmp/tests/gmp_pown.phpt | 8 +-- ext/gmp/tests/gmp_random_range.phpt | 31 ++++---- ext/gmp/tests/overloading.phpt | 108 ++++++++++++++-------------- 12 files changed, 223 insertions(+), 172 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index 0ccbd63049bc1..aecd634d8ad05 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -356,13 +356,17 @@ static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zva gmp_zval_binary_ui_op( \ result, op1, op2, op, uop, check_b_zero \ ); \ + if (UNEXPECTED(EG(exception))) { return FAILURE; } \ return SUCCESS; #define DO_BINARY_UI_OP(op) DO_BINARY_UI_OP_EX(op, op ## _ui, 0) #define DO_BINARY_OP(op) DO_BINARY_UI_OP_EX(op, NULL, 0) -#define DO_UNARY_OP(op) \ +#define DO_UNARY_OP(op) \ gmp_zval_unary_op(result, op1, op); \ + if (UNEXPECTED(EG(exception))) { \ + return FAILURE; \ + } \ return SUCCESS; static int gmp_do_operation_ex(zend_uchar opcode, zval *result, zval *op1, zval *op2) /* {{{ */ @@ -380,7 +384,14 @@ static int gmp_do_operation_ex(zend_uchar opcode, zval *result, zval *op1, zval case ZEND_DIV: DO_BINARY_UI_OP_EX(mpz_tdiv_q, gmp_mpz_tdiv_q_ui, 1); case ZEND_MOD: - DO_BINARY_UI_OP_EX(mpz_mod, gmp_mpz_mod_ui, 1); + gmp_zval_binary_ui_op(result, op1, op2, mpz_mod, gmp_mpz_mod_ui, 1); + /* Free Division by zero error and rethrow a new modulo by zero one */ + if (UNEXPECTED(EG(exception) && EG(exception)->ce == zend_ce_division_by_zero_error)) { + zend_clear_exception(); + zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero"); + return FAILURE; + } + return SUCCESS; case ZEND_SL: shift_operator_helper(mpz_mul_2exp, result, op1, op2, opcode); return SUCCESS; @@ -728,10 +739,10 @@ static inline void gmp_zval_binary_ui_op(zval *return_value, zval *a_arg, zval * } if (b_is_zero) { - php_error_docref(NULL, E_WARNING, "Zero operand not allowed"); + zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero"); FREE_GMP_TEMP(temp_a); FREE_GMP_TEMP(temp_b); - RETURN_FALSE; + RETURN_THROWS(); } } @@ -775,10 +786,10 @@ static inline void gmp_zval_binary_ui_op2(zval *return_value, zval *a_arg, zval } if (b_is_zero) { - php_error_docref(NULL, E_WARNING, "Zero operand not allowed"); + zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero"); FREE_GMP_TEMP(temp_a); FREE_GMP_TEMP(temp_b); - RETURN_FALSE; + RETURN_THROWS(); } } @@ -1152,6 +1163,12 @@ ZEND_FUNCTION(gmp_div_q) ZEND_FUNCTION(gmp_mod) { gmp_binary_ui_op_no_zero(mpz_mod, gmp_mpz_mod_ui); + /* Clear division by zero and rethrow a modulo by zero exception */ + if (UNEXPECTED(EG(exception) && EG(exception)->ce == zend_ce_division_by_zero_error)) { + zend_clear_exception(); + zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero"); + RETURN_THROWS(); + } } /* }}} */ @@ -1300,7 +1317,7 @@ ZEND_FUNCTION(gmp_powm) FETCH_GMP_ZVAL_DEP_DEP(gmpnum_mod, mod_arg, temp_mod, temp_exp, temp_base, 3); if (!mpz_cmp_ui(gmpnum_mod, 0)) { - zend_argument_value_error(3, "must not be 0"); + zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero"); FREE_GMP_TEMP(temp_base); FREE_GMP_TEMP(temp_exp); FREE_GMP_TEMP(temp_mod); @@ -1777,8 +1794,8 @@ ZEND_FUNCTION(gmp_random_range) if (Z_TYPE_P(min_arg) == IS_LONG && Z_LVAL_P(min_arg) >= 0) { if (mpz_cmp_ui(gmpnum_max, Z_LVAL_P(min_arg)) <= 0) { FREE_GMP_TEMP(temp_a); - php_error_docref(NULL, E_WARNING, "The minimum value must be less than the maximum value"); - RETURN_FALSE; + zend_argument_value_error(1, "must be less than argument#2 ($maximum)"); + RETURN_THROWS(); } INIT_GMP_RETVAL(gmpnum_result); @@ -1806,8 +1823,8 @@ ZEND_FUNCTION(gmp_random_range) if (mpz_cmp(gmpnum_max, gmpnum_min) <= 0) { FREE_GMP_TEMP(temp_b); FREE_GMP_TEMP(temp_a); - php_error_docref(NULL, E_WARNING, "The minimum value must be less than the maximum value"); - RETURN_FALSE; + zend_argument_value_error(1, "must be less than argument#2 ($maximum)"); + RETURN_THROWS(); } INIT_GMP_RETVAL(gmpnum_result); diff --git a/ext/gmp/gmp.stub.php b/ext/gmp/gmp.stub.php index 42f3e6349eb55..898f08bb37fb4 100644 --- a/ext/gmp/gmp.stub.php +++ b/ext/gmp/gmp.stub.php @@ -42,38 +42,38 @@ function gmp_mul($a, $b): GMP {} * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_div_qr($a, $b, int $round = GMP_ROUND_ZERO): array|false {} +function gmp_div_qr($a, $b, int $round = GMP_ROUND_ZERO): array {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_div_q($a, $b, int $round = GMP_ROUND_ZERO): GMP|false {} +function gmp_div_q($a, $b, int $round = GMP_ROUND_ZERO): GMP {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_div_r($a, $b, int $round = GMP_ROUND_ZERO): GMP|false {} +function gmp_div_r($a, $b, int $round = GMP_ROUND_ZERO): GMP {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b * @alias gmp_div_q */ -function gmp_div($a, $b, int $round = GMP_ROUND_ZERO): GMP|false {} +function gmp_div($a, $b, int $round = GMP_ROUND_ZERO): GMP {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_mod($a, $b): GMP|false {} +function gmp_mod($a, $b): GMP {} /** * @param GMP|int|bool|string $a * @param GMP|int|bool|string $b */ -function gmp_divexact($a, $b): GMP|false {} +function gmp_divexact($a, $b): GMP {} /** @param GMP|int|bool|string $a */ function gmp_neg($a): GMP {} @@ -175,7 +175,7 @@ function gmp_random_bits(int $bits): GMP {} * @param GMP|int|bool|string $min * @param GMP|int|bool|string $max **/ -function gmp_random_range($min, $max): GMP|false {} +function gmp_random_range($min, $max): GMP {} /** * @param GMP|int|bool|string $a diff --git a/ext/gmp/gmp_arginfo.h b/ext/gmp/gmp_arginfo.h index 3a3cae526edb3..f7cd487de0f36 100644 --- a/ext/gmp/gmp_arginfo.h +++ b/ext/gmp/gmp_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: b467c887efad8da11c353a60bc0adea5215aa781 */ + * Stub hash: 3094dae32430922d11c7bdb3a4da0e2c0b47ac7e */ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_init, 0, 1, GMP, 0) ZEND_ARG_INFO(0, number) @@ -36,13 +36,13 @@ ZEND_END_ARG_INFO() #define arginfo_gmp_mul arginfo_gmp_add -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gmp_div_qr, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_div_qr, 0, 2, IS_ARRAY, 0) ZEND_ARG_INFO(0, a) ZEND_ARG_INFO(0, b) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, round, IS_LONG, 0, "GMP_ROUND_ZERO") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_div_q, 0, 2, GMP, MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_div_q, 0, 2, GMP, 0) ZEND_ARG_INFO(0, a) ZEND_ARG_INFO(0, b) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, round, IS_LONG, 0, "GMP_ROUND_ZERO") @@ -52,12 +52,9 @@ ZEND_END_ARG_INFO() #define arginfo_gmp_div arginfo_gmp_div_q -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_mod, 0, 2, GMP, MAY_BE_FALSE) - ZEND_ARG_INFO(0, a) - ZEND_ARG_INFO(0, b) -ZEND_END_ARG_INFO() +#define arginfo_gmp_mod arginfo_gmp_add -#define arginfo_gmp_divexact arginfo_gmp_mod +#define arginfo_gmp_divexact arginfo_gmp_add ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_neg, 0, 1, GMP, 0) ZEND_ARG_INFO(0, a) @@ -114,7 +111,10 @@ ZEND_END_ARG_INFO() #define arginfo_gmp_lcm arginfo_gmp_add -#define arginfo_gmp_invert arginfo_gmp_mod +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_invert, 0, 2, GMP, MAY_BE_FALSE) + ZEND_ARG_INFO(0, a) + ZEND_ARG_INFO(0, b) +ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_jacobi, 0, 2, IS_LONG, 0) ZEND_ARG_INFO(0, a) @@ -139,7 +139,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_random_bits, 0, 1, GMP, 0) ZEND_ARG_TYPE_INFO(0, bits, IS_LONG, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_random_range, 0, 2, GMP, MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_random_range, 0, 2, GMP, 0) ZEND_ARG_INFO(0, min) ZEND_ARG_INFO(0, max) ZEND_END_ARG_INFO() diff --git a/ext/gmp/tests/bug32773.phpt b/ext/gmp/tests/bug32773.phpt index efa293bbf26d2..6fd61e02a5cc8 100644 --- a/ext/gmp/tests/bug32773.phpt +++ b/ext/gmp/tests/bug32773.phpt @@ -7,16 +7,20 @@ Bug #32773 (binary GMP functions returns unexpected value, when second parameter echo '10 + 0 = ', gmp_strval(gmp_add(10, 0)), "\n"; echo '10 + "0" = ', gmp_strval(gmp_add(10, '0')), "\n"; -echo gmp_strval(gmp_div(10, 0))."\n"; -echo gmp_strval(gmp_div_qr(10, 0))."\n"; +try { + var_dump(gmp_div(10, 0)); +} catch (\DivisionByZeroError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_div_qr(10, 0)); +} catch (\DivisionByZeroError $e) { + echo $e->getMessage() . \PHP_EOL; +} ?> ---EXPECTF-- +--EXPECT-- 10 + 0 = 10 10 + "0" = 10 - -Warning: gmp_div(): Zero operand not allowed in %s on line %d -0 - -Warning: gmp_div_qr(): Zero operand not allowed in %s on line %d -0 +Division by zero +Division by zero diff --git a/ext/gmp/tests/gmp_div_q.phpt b/ext/gmp/tests/gmp_div_q.phpt index cbdbb33a0b189..d32653dfd8998 100644 --- a/ext/gmp/tests/gmp_div_q.phpt +++ b/ext/gmp/tests/gmp_div_q.phpt @@ -6,7 +6,13 @@ gmp_div_q() tests getMessage() . \PHP_EOL; +} + var_dump(gmp_div_q(12653,23482734)); try { var_dump(gmp_div_q(12653,23482734, 10)); @@ -35,40 +41,38 @@ try { echo "Done\n"; ?> ---EXPECTF-- -object(GMP)#%d (1) { +--EXPECT-- +object(GMP)#1 (1) { ["num"]=> string(1) "0" } - -Warning: gmp_div_q(): Zero operand not allowed in %s on line %d -bool(false) -object(GMP)#%d (1) { +Division by zero +object(GMP)#2 (1) { ["num"]=> string(1) "0" } gmp_div_q(): Argument #3 ($round) must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF -object(GMP)#%d (1) { +object(GMP)#1 (1) { ["num"]=> string(4) "9131" } -object(GMP)#%d (1) { +object(GMP)#1 (1) { ["num"]=> string(4) "9132" } -object(GMP)#%d (1) { +object(GMP)#1 (1) { ["num"]=> string(4) "9131" } -object(GMP)#%d (1) { +object(GMP)#1 (1) { ["num"]=> string(4) "9131" } -object(GMP)#%d (1) { +object(GMP)#1 (1) { ["num"]=> string(4) "9132" } -object(GMP)#%d (1) { +object(GMP)#1 (1) { ["num"]=> string(4) "9131" } diff --git a/ext/gmp/tests/gmp_div_qr.phpt b/ext/gmp/tests/gmp_div_qr.phpt index a9fb6b10029c6..7e05234cf8a2b 100644 --- a/ext/gmp/tests/gmp_div_qr.phpt +++ b/ext/gmp/tests/gmp_div_qr.phpt @@ -6,8 +6,18 @@ gmp_div_qr() tests getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_div_qr(gmp_init(1), gmp_init(0))); +} catch (\DivisionByZeroError $e) { + echo $e->getMessage() . \PHP_EOL; +} + var_dump(gmp_div_qr(12653,23482734)); try { var_dump(gmp_div_qr(12653,23482734, 10)); @@ -37,33 +47,29 @@ try { echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- array(2) { [0]=> - object(GMP)#%d (1) { + object(GMP)#1 (1) { ["num"]=> string(1) "0" } [1]=> - object(GMP)#%d (1) { + object(GMP)#2 (1) { ["num"]=> string(1) "0" } } - -Warning: gmp_div_qr(): Zero operand not allowed in %s on line %d -bool(false) - -Warning: gmp_div_qr(): Zero operand not allowed in %s on line %d -bool(false) +Division by zero +Division by zero array(2) { [0]=> - object(GMP)#%d (1) { + object(GMP)#2 (1) { ["num"]=> string(1) "0" } [1]=> - object(GMP)#%d (1) { + object(GMP)#5 (1) { ["num"]=> string(5) "12653" } @@ -71,84 +77,84 @@ array(2) { gmp_div_qr(): Argument #3 ($round) must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF array(2) { [0]=> - object(GMP)#%d (1) { + object(GMP)#4 (1) { ["num"]=> string(4) "9131" } [1]=> - object(GMP)#%d (1) { + object(GMP)#3 (1) { ["num"]=> string(2) "10" } } array(2) { [0]=> - object(GMP)#%d (1) { + object(GMP)#3 (1) { ["num"]=> string(4) "9132" } [1]=> - object(GMP)#%d (1) { + object(GMP)#4 (1) { ["num"]=> string(4) "-113" } } array(2) { [0]=> - object(GMP)#%d (1) { + object(GMP)#4 (1) { ["num"]=> string(4) "9131" } [1]=> - object(GMP)#%d (1) { + object(GMP)#3 (1) { ["num"]=> string(2) "10" } } array(2) { [0]=> - object(GMP)#%d (1) { + object(GMP)#1 (1) { ["num"]=> string(4) "9131" } [1]=> - object(GMP)#%d (1) { + object(GMP)#2 (1) { ["num"]=> string(2) "10" } } array(2) { [0]=> - object(GMP)#%d (1) { + object(GMP)#2 (1) { ["num"]=> string(4) "9131" } [1]=> - object(GMP)#%d (1) { + object(GMP)#1 (1) { ["num"]=> string(2) "10" } } array(2) { [0]=> - object(GMP)#%d (1) { + object(GMP)#1 (1) { ["num"]=> string(4) "9132" } [1]=> - object(GMP)#%d (1) { + object(GMP)#2 (1) { ["num"]=> string(4) "-113" } } array(2) { [0]=> - object(GMP)#%d (1) { + object(GMP)#2 (1) { ["num"]=> string(4) "9131" } [1]=> - object(GMP)#%d (1) { + object(GMP)#1 (1) { ["num"]=> string(2) "10" } diff --git a/ext/gmp/tests/gmp_div_r.phpt b/ext/gmp/tests/gmp_div_r.phpt index eaf2e404ad260..56b3d653ec3e6 100644 --- a/ext/gmp/tests/gmp_div_r.phpt +++ b/ext/gmp/tests/gmp_div_r.phpt @@ -6,7 +6,13 @@ gmp_div_r() tests getMessage() . \PHP_EOL; +} + var_dump($r = gmp_div_r(12653,23482734)); try { var_dump($r = gmp_div_r(12653,23482734, 10)); @@ -35,40 +41,38 @@ try { echo "Done\n"; ?> ---EXPECTF-- -object(GMP)#%d (1) { +--EXPECT-- +object(GMP)#1 (1) { ["num"]=> string(1) "0" } - -Warning: gmp_div_r(): Zero operand not allowed in %s on line %d -bool(false) -object(GMP)#%d (1) { +Division by zero +object(GMP)#3 (1) { ["num"]=> string(5) "12653" } gmp_div_r(): Argument #3 ($round) must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF -object(GMP)#%d (1) { +object(GMP)#2 (1) { ["num"]=> string(2) "10" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(4) "-113" } -object(GMP)#%d (1) { +object(GMP)#2 (1) { ["num"]=> string(2) "10" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "10" } -object(GMP)#%d (1) { +object(GMP)#2 (1) { ["num"]=> string(4) "-113" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "10" } diff --git a/ext/gmp/tests/gmp_divexact.phpt b/ext/gmp/tests/gmp_divexact.phpt index c6183cb734ef3..f148693ef3f39 100644 --- a/ext/gmp/tests/gmp_divexact.phpt +++ b/ext/gmp/tests/gmp_divexact.phpt @@ -13,8 +13,12 @@ if (!defined('GMP_VERSION') || version_compare("4.2.1", GMP_VERSION, ">=")) { $r = gmp_divexact("233", "23345555555555555555555555"); var_dump(gmp_strval($r)); -$r = gmp_divexact("233", "0"); -var_dump(gmp_strval($r)); +try { + $r = gmp_divexact("233", "0"); + var_dump(gmp_strval($r)); +} catch (\DivisionByZeroError $e) { + echo $e->getMessage() . \PHP_EOL; +} $r = gmp_divexact("100", "10"); var_dump(gmp_strval($r)); @@ -35,11 +39,9 @@ var_dump(gmp_strval($r)); echo "Done\n"; ?> ---EXPECTF-- -string(1) "0" - -Warning: gmp_divexact(): Zero operand not allowed in %s on line %d +--EXPECT-- string(1) "0" +Division by zero string(2) "10" string(3) "512" string(19) "5000000000000000000" diff --git a/ext/gmp/tests/gmp_mod.phpt b/ext/gmp/tests/gmp_mod.phpt index f4c8c21a592e2..9c18855a2c403 100644 --- a/ext/gmp/tests/gmp_mod.phpt +++ b/ext/gmp/tests/gmp_mod.phpt @@ -12,7 +12,12 @@ try { } var_dump(gmp_mod(0,1)); var_dump(gmp_mod(0,-1)); -var_dump(gmp_mod(-1,0)); + +try { + var_dump(gmp_mod(-1,0)); +} catch (\DivisionByZeroError $e) { + echo $e->getMessage() . \PHP_EOL; +} try { var_dump(gmp_mod(array(), array())); @@ -27,21 +32,19 @@ var_dump(gmp_mod($a, $b)); echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- gmp_mod(): Argument #1 ($a) must be an integer string in base 10 -object(GMP)#%d (1) { +object(GMP)#2 (1) { ["num"]=> string(1) "0" } -object(GMP)#%d (1) { +object(GMP)#2 (1) { ["num"]=> string(1) "0" } - -Warning: gmp_mod(): Zero operand not allowed in %s on line %d -bool(false) +Modulo by zero gmp_mod(): Argument #1 ($a) must be of type bool|int|string|GMP, array given -object(GMP)#%d (1) { +object(GMP)#4 (1) { ["num"]=> string(5) "31161" } diff --git a/ext/gmp/tests/gmp_pown.phpt b/ext/gmp/tests/gmp_pown.phpt index 34af9c1eb60e8..2f57f55efdc2b 100644 --- a/ext/gmp/tests/gmp_pown.phpt +++ b/ext/gmp/tests/gmp_pown.phpt @@ -21,12 +21,12 @@ var_dump(gmp_strval(gmp_powm($n,$e,$m))); try { var_dump(gmp_powm(5, 11, 0)); -} catch (\ValueError $error) { +} catch (\DivisionByZeroError $error) { echo $error->getMessage() . \PHP_EOL; } try { var_dump(gmp_powm(5, "11", gmp_init(0))); -} catch (\ValueError $error) { +} catch (\DivisionByZeroError $error) { echo $error->getMessage() . \PHP_EOL; } @@ -73,8 +73,8 @@ string(3) "533" string(3) "331" string(3) "171" string(3) "371" -gmp_powm(): Argument #3 ($mod) must not be 0 -gmp_powm(): Argument #3 ($mod) must not be 0 +Modulo by zero +Modulo by zero gmp_powm(): Argument #1 ($base) must be of type bool|int|string|GMP, array given gmp_powm(): Argument #2 ($exp) must be of type bool|int|string|GMP, array given gmp_powm(): Argument #2 ($exp) must be of type bool|int|string|GMP, TypeError given diff --git a/ext/gmp/tests/gmp_random_range.phpt b/ext/gmp/tests/gmp_random_range.phpt index 7ff6c546b40ed..908a4f392cbe1 100644 --- a/ext/gmp/tests/gmp_random_range.phpt +++ b/ext/gmp/tests/gmp_random_range.phpt @@ -9,10 +9,22 @@ $minusTen = gmp_init(-10); $plusTen = gmp_init(10); $zero = gmp_init(0); -var_dump(gmp_random_range(10, -10)); +try { + var_dump(gmp_random_range(10, -10)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} -var_dump(gmp_random_range($plusTen, $minusTen)); -var_dump(gmp_random_range($plusTen, $zero)); +try { + var_dump(gmp_random_range($plusTen, $minusTen)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(gmp_random_range($plusTen, $zero)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} // If these error the test fails. gmp_random_range(0, 10); @@ -61,13 +73,8 @@ while (1) { echo "Done\n"; ?> ---EXPECTF-- -Warning: gmp_random_range(): The minimum value must be less than the maximum value in %s on line %d -bool(false) - -Warning: gmp_random_range(): The minimum value must be less than the maximum value in %s on line %d -bool(false) - -Warning: gmp_random_range(): The minimum value must be less than the maximum value in %s on line %d -bool(false) +--EXPECT-- +gmp_random_range(): Argument #1 ($min) must be less than argument#2 ($maximum) +gmp_random_range(): Argument #1 ($min) must be less than argument#2 ($maximum) +gmp_random_range(): Argument #1 ($min) must be less than argument#2 ($maximum) Done diff --git a/ext/gmp/tests/overloading.phpt b/ext/gmp/tests/overloading.phpt index 1a94f2d226aea..a8c13a932f1ae 100644 --- a/ext/gmp/tests/overloading.phpt +++ b/ext/gmp/tests/overloading.phpt @@ -23,12 +23,20 @@ var_dump(42 * $b); var_dump($a / $b); var_dump($a / 17); var_dump(42 / $b); -var_dump($a / 0); +try { + var_dump($a / 0); +} catch (\DivisionByZeroError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump($a % $b); var_dump($a % 17); var_dump(42 % $b); -var_dump($a % 0); +try { + var_dump($a % 0); +} catch (\DivisionByZeroError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump($a ** $b); var_dump($a ** 17); @@ -115,152 +123,148 @@ $a .= '17'; var_dump($a); ?> ---EXPECTF-- -object(GMP)#%d (1) { +--EXPECT-- +object(GMP)#3 (1) { ["num"]=> string(2) "59" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "59" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "59" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "25" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "25" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "25" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(3) "714" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(3) "714" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(3) "714" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(1) "2" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(1) "2" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(1) "2" } - -Warning: main(): Zero operand not allowed in %s on line %d -bool(false) -object(GMP)#%d (1) { +Division by zero +object(GMP)#4 (1) { ["num"]=> string(1) "8" } -object(GMP)#%d (1) { +object(GMP)#4 (1) { ["num"]=> string(1) "8" } -object(GMP)#%d (1) { +object(GMP)#4 (1) { ["num"]=> string(1) "8" } - -Warning: main(): Zero operand not allowed in %s on line %d -bool(false) -object(GMP)#%d (1) { +Modulo by zero +object(GMP)#3 (1) { ["num"]=> string(28) "3937657486715347520027492352" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(28) "3937657486715347520027492352" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(28) "3937657486715347520027492352" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "59" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "59" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "59" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(1) "0" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(1) "0" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(1) "0" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "59" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "59" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "59" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(7) "5505024" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(7) "5505024" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(7) "5505024" } -object(GMP)#%d (1) { +object(GMP)#3 (1) { ["num"]=> string(2) "10" } -object(GMP)#%d (1) { +object(GMP)#5 (1) { ["num"]=> string(3) "-11" } Shift must be greater than or equal to 0 Shift must be greater than or equal to 0 -object(GMP)#%d (1) { +object(GMP)#5 (1) { ["num"]=> string(3) "-43" } -object(GMP)#%d (1) { +object(GMP)#5 (1) { ["num"]=> string(3) "-42" } -object(GMP)#%d (1) { +object(GMP)#5 (1) { ["num"]=> string(2) "42" } @@ -279,35 +283,35 @@ bool(true) bool(false) bool(true) main(): Argument #2 must be of type bool|int|string|GMP, stdClass given -object(GMP)#%d (1) { +object(GMP)#4 (1) { ["num"]=> string(2) "43" } -object(GMP)#%d (1) { +object(GMP)#1 (1) { ["num"]=> string(2) "42" } -object(GMP)#%d (1) { +object(GMP)#4 (1) { ["num"]=> string(2) "43" } -object(GMP)#%d (1) { +object(GMP)#4 (1) { ["num"]=> string(2) "43" } -object(GMP)#%d (1) { +object(GMP)#1 (1) { ["num"]=> string(2) "44" } -object(GMP)#%d (1) { +object(GMP)#4 (1) { ["num"]=> string(2) "43" } -object(GMP)#%d (1) { +object(GMP)#4 (1) { ["num"]=> string(2) "43" } -object(GMP)#%d (1) { +object(GMP)#1 (1) { ["num"]=> string(2) "42" } From 547e10131e39d6df0f48e86328793f757b97231f Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 21 Jul 2020 18:15:07 +0100 Subject: [PATCH 04/14] TODO Notes --- ext/gmp/gmp.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index aecd634d8ad05..8baf6649a4d5e 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -1414,6 +1414,7 @@ ZEND_FUNCTION(gmp_root) FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); if (nth % 2 == 0 && mpz_sgn(gmpnum_a) < 0) { + // Todo promote to ValueError? php_error_docref(NULL, E_WARNING, "Can't take even root of negative number"); FREE_GMP_TEMP(temp_a); RETURN_FALSE; @@ -1446,6 +1447,7 @@ ZEND_FUNCTION(gmp_rootrem) FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); if (nth % 2 == 0 && mpz_sgn(gmpnum_a) < 0) { + // Todo promote to ValueError? php_error_docref(NULL, E_WARNING, "Can't take even root of negative number"); FREE_GMP_TEMP(temp_a); RETURN_FALSE; @@ -1582,6 +1584,7 @@ ZEND_FUNCTION(gmp_invert) if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz", &a_arg, &b_arg) == FAILURE){ RETURN_THROWS(); } + // TODO Check b_arg is not 0 as behaviour is undefined for op2 = 0 for mpz_invert FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a, 2); @@ -1591,6 +1594,7 @@ ZEND_FUNCTION(gmp_invert) FREE_GMP_TEMP(temp_a); FREE_GMP_TEMP(temp_b); if (!res) { + // Should return 0 instead of false? A legit 0 value is impossible. zval_ptr_dtor(return_value); RETURN_FALSE; } From 14661a19c61fcd0edc5b555fe05bfa1c18ac11c4 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 21 Jul 2020 18:15:25 +0100 Subject: [PATCH 05/14] Refactor gmp_fact() --- ext/gmp/gmp.c | 33 +++++++++++-------------------- ext/gmp/tests/gmp_fact.phpt | 39 ++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index 8baf6649a4d5e..c7975ec6d07f8 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -1197,35 +1197,24 @@ ZEND_FUNCTION(gmp_abs) ZEND_FUNCTION(gmp_fact) { zval *a_arg; + mpz_ptr gmpnum; + mpz_ptr gmpnum_result; + gmp_temp_t temp_a; if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &a_arg) == FAILURE){ RETURN_THROWS(); } - if (IS_GMP(a_arg)) { - mpz_ptr gmpnum_tmp = GET_GMP_FROM_ZVAL(a_arg); - if (mpz_sgn(gmpnum_tmp) < 0) { - zend_argument_value_error(1, "must be greater than or equal to 0"); - RETURN_THROWS(); - } - } else { - /* Use convert_to_number first to detect getting non-integer */ - convert_scalar_to_number(a_arg); - if (Z_TYPE_P(a_arg) != IS_LONG) { - convert_to_long(a_arg); - if (Z_LVAL_P(a_arg) >= 0) { - /* Only warn if we'll make it past the non-negative check */ - // TODO: promote? Also I don't get this - php_error_docref(NULL, E_WARNING, "Number has to be an integer"); - } - } - if (Z_LVAL_P(a_arg) < 0) { - zend_argument_value_error(1, "must be greater than or equal to 0"); - RETURN_THROWS(); - } + FETCH_GMP_ZVAL(gmpnum, a_arg, temp_a, 1); + FREE_GMP_TEMP(temp_a); + + if (mpz_sgn(gmpnum) < 0) { + zend_argument_value_error(1, "must be greater than or equal to 0"); + RETURN_THROWS(); } - gmp_zval_unary_ui_op(return_value, a_arg, mpz_fac_ui); + INIT_GMP_RETVAL(gmpnum_result); + mpz_fac_ui(gmpnum_result, zval_get_long(a_arg)); } /* }}} */ diff --git a/ext/gmp/tests/gmp_fact.phpt b/ext/gmp/tests/gmp_fact.phpt index 837b87139a986..c8096760a0bd3 100644 --- a/ext/gmp/tests/gmp_fact.phpt +++ b/ext/gmp/tests/gmp_fact.phpt @@ -6,7 +6,11 @@ gmp_fact() basic tests getMessage() . \PHP_EOL; +} var_dump(gmp_strval(gmp_fact("0"))); try { var_dump(gmp_strval(gmp_fact("-1"))); @@ -18,7 +22,13 @@ try { } catch (\ValueError $e) { echo $e->getMessage() . \PHP_EOL; } -var_dump(gmp_strval(gmp_fact(1.1))); + +try { + var_dump(gmp_strval(gmp_fact(1.1))); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} + var_dump(gmp_strval(gmp_fact(20))); var_dump(gmp_strval(gmp_fact("50"))); var_dump(gmp_strval(gmp_fact("10"))); @@ -33,33 +43,26 @@ try { echo $e->getMessage() . \PHP_EOL; } -var_dump(gmp_fact(array())); -var_dump(gmp_strval(gmp_fact(array()))); +try { + var_dump(gmp_fact(array())); +} catch (\TypeError $e) { + echo $e->getMessage() . \PHP_EOL; +} echo "Done\n"; ?> ---EXPECTF-- -string(1) "1" +--EXPECT-- string(1) "1" +gmp_fact(): Argument #1 ($a) must be an integer string in base 10 string(1) "1" gmp_fact(): Argument #1 ($a) must be greater than or equal to 0 gmp_fact(): Argument #1 ($a) must be greater than or equal to 0 - -Warning: gmp_fact(): Number has to be an integer in %s on line %d -string(1) "1" +gmp_fact(): Argument #1 ($a) must be of type bool|int|string|GMP, float given string(19) "2432902008176640000" string(65) "30414093201713378043612608166064768844377641568960512000000000000" string(7) "3628800" string(1) "1" string(9) "479001600" gmp_fact(): Argument #1 ($a) must be greater than or equal to 0 - -Warning: gmp_fact(): Number has to be an integer in %s on line %d -object(GMP)#%d (1) { - ["num"]=> - string(1) "1" -} - -Warning: gmp_fact(): Number has to be an integer in %s on line %d -string(1) "1" +gmp_fact(): Argument #1 ($a) must be of type bool|int|string|GMP, array given Done From b78eb76ceda5a1b55538b6649e3178937b10bdb4 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 22 Jul 2020 13:22:35 +0100 Subject: [PATCH 06/14] Remove unused function --- ext/gmp/gmp.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index c7975ec6d07f8..a9db0001ba013 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -198,7 +198,6 @@ typedef gmp_ulong (*gmp_binary_ui_op2_t)(mpz_ptr, mpz_ptr, mpz_srcptr, gmp_ulong 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); 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); static inline void gmp_zval_unary_op(zval *return_value, zval *a_arg, gmp_unary_op_t gmp_op); -static inline void gmp_zval_unary_ui_op(zval *return_value, zval *a_arg, gmp_unary_ui_op_t gmp_op); static void gmp_mpz_tdiv_q_ui(mpz_ptr a, mpz_srcptr b, gmp_ulong c) { mpz_tdiv_q_ui(a, b, c); @@ -841,16 +840,6 @@ static inline void gmp_zval_unary_op(zval *return_value, zval *a_arg, gmp_unary_ } /* }}} */ -/* {{{ gmp_zval_unary_ui_op */ -static inline void gmp_zval_unary_ui_op(zval *return_value, zval *a_arg, gmp_unary_ui_op_t gmp_op) -{ - mpz_ptr gmpnum_result; - - INIT_GMP_RETVAL(gmpnum_result); - gmp_op(gmpnum_result, zval_get_long(a_arg)); -} -/* }}} */ - /* {{{ _gmp_unary_op */ static inline void _gmp_unary_op(INTERNAL_FUNCTION_PARAMETERS, gmp_unary_op_t gmp_op) { From 95ac94289d2173169f3e34d6487376db1618604d Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 31 Jul 2020 20:04:44 +0100 Subject: [PATCH 07/14] Review --- ext/gmp/gmp.c | 26 +++++++++++++------------- ext/gmp/tests/bug50283.phpt | 8 ++++---- ext/gmp/tests/gmp_abs.phpt | 4 ++-- ext/gmp/tests/gmp_and.phpt | 6 +++--- ext/gmp/tests/gmp_clrbit.phpt | 4 ++-- ext/gmp/tests/gmp_cmp.phpt | 2 +- ext/gmp/tests/gmp_com.phpt | 4 ++-- ext/gmp/tests/gmp_div_q.phpt | 4 ++-- ext/gmp/tests/gmp_div_qr.phpt | 4 ++-- ext/gmp/tests/gmp_div_r.phpt | 4 ++-- ext/gmp/tests/gmp_export.phpt | 4 ++-- ext/gmp/tests/gmp_fact.phpt | 4 ++-- ext/gmp/tests/gmp_gcdext.phpt | 4 ++-- ext/gmp/tests/gmp_hamdist.phpt | 6 +++--- ext/gmp/tests/gmp_import.phpt | 10 +++++----- ext/gmp/tests/gmp_invert.phpt | 6 +++--- ext/gmp/tests/gmp_jacobi.phpt | 6 +++--- ext/gmp/tests/gmp_legendre.phpt | 6 +++--- ext/gmp/tests/gmp_mod.phpt | 2 +- ext/gmp/tests/gmp_neg.phpt | 2 +- ext/gmp/tests/gmp_nextprime.phpt | 4 ++-- ext/gmp/tests/gmp_or.phpt | 6 +++--- ext/gmp/tests/gmp_perfect_square.phpt | 2 +- ext/gmp/tests/gmp_popcount.phpt | 2 +- ext/gmp/tests/gmp_pow.phpt | 2 +- ext/gmp/tests/gmp_pown.phpt | 8 ++++---- ext/gmp/tests/gmp_prob_prime.phpt | 2 +- ext/gmp/tests/gmp_random_range.phpt | 6 +++--- ext/gmp/tests/gmp_root.phpt | 4 ++-- ext/gmp/tests/gmp_scan0.phpt | 4 ++-- ext/gmp/tests/gmp_scan1.phpt | 4 ++-- ext/gmp/tests/gmp_setbit.phpt | 2 +- ext/gmp/tests/gmp_sign.phpt | 2 +- ext/gmp/tests/gmp_sqrt.phpt | 2 +- ext/gmp/tests/gmp_sqrtrem.phpt | 2 +- ext/gmp/tests/gmp_strval.phpt | 16 ++++++++-------- ext/gmp/tests/gmp_sub.phpt | 6 +++--- ext/gmp/tests/gmp_testbit.phpt | 4 ++-- ext/gmp/tests/gmp_xor.phpt | 6 +++--- ext/gmp/tests/overloading.phpt | 2 +- 40 files changed, 101 insertions(+), 101 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index a9db0001ba013..2c93e033e71e1 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -646,7 +646,7 @@ static int convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base, uint32_t a php_error_docref(NULL, E_WARNING, "Cannot convert variable of type %s to GMP", zend_zval_type_name(val)); return FAILURE; } - zend_argument_type_error(arg_pos, "must be of type bool|int|string|GMP, %s given", zend_zval_type_name(val)); + zend_argument_type_error(arg_pos, "must be of type GMP|string|int|bool, %s given", zend_zval_type_name(val)); return FAILURE; } } @@ -911,7 +911,7 @@ int gmp_import_export_validate(zend_long size, zend_long options, int *order, in break; default: /* options argument is in second position */ - zend_argument_value_error(3, "has conflicting word orders"); + zend_argument_value_error(3, "cannot use multiple word order options"); return FAILURE; } @@ -928,7 +928,7 @@ int gmp_import_export_validate(zend_long size, zend_long options, int *order, in break; default: /* options argument is in second position */ - zend_argument_value_error(3, "has conflicting word endianness"); + zend_argument_value_error(3, "cannot use multiple endian options"); return FAILURE; } @@ -954,7 +954,7 @@ ZEND_FUNCTION(gmp_import) } if ((data_len % size) != 0) { - zend_argument_value_error(1, "must be a multiple of word size"); + zend_argument_value_error(1, "must be a multiple of argument #2 ($word_size)"); RETURN_THROWS(); } @@ -1033,7 +1033,7 @@ ZEND_FUNCTION(gmp_strval) /* Although the maximum base in general in GMP is 62, mpz_get_str() * is explicitly limited to -36 when dealing with negative bases. */ if ((base < 2 && base > -2) || base > GMP_MAX_BASE || base < -36) { - zend_argument_value_error(2, "must be between 2 and %d or -2 and -36", GMP_MAX_BASE); + zend_argument_value_error(2, "must be between 2 and %d, or -2 and -36", GMP_MAX_BASE); RETURN_THROWS(); } @@ -1385,7 +1385,7 @@ ZEND_FUNCTION(gmp_root) } if (nth <= 0) { - zend_argument_value_error(2, "must be greater than or equal to 1"); + zend_argument_value_error(2, "must be greater than 0"); RETURN_THROWS(); } @@ -1776,7 +1776,7 @@ ZEND_FUNCTION(gmp_random_range) if (Z_TYPE_P(min_arg) == IS_LONG && Z_LVAL_P(min_arg) >= 0) { if (mpz_cmp_ui(gmpnum_max, Z_LVAL_P(min_arg)) <= 0) { FREE_GMP_TEMP(temp_a); - zend_argument_value_error(1, "must be less than argument#2 ($maximum)"); + zend_argument_value_error(1, "must be less than argument #2 ($maximum)"); RETURN_THROWS(); } @@ -1805,7 +1805,7 @@ ZEND_FUNCTION(gmp_random_range) if (mpz_cmp(gmpnum_max, gmpnum_min) <= 0) { FREE_GMP_TEMP(temp_b); FREE_GMP_TEMP(temp_a); - zend_argument_value_error(1, "must be less than argument#2 ($maximum)"); + zend_argument_value_error(1, "must be less than argument #2 ($maximum)"); RETURN_THROWS(); } @@ -1872,7 +1872,7 @@ ZEND_FUNCTION(gmp_setbit) } if (index < 0) { - zend_argument_value_error(2, "must be greater than or equal to zero"); + zend_argument_value_error(2, "must be greater than or equal to 0"); RETURN_THROWS(); } if (index / GMP_NUMB_BITS >= INT_MAX) { @@ -1902,7 +1902,7 @@ ZEND_FUNCTION(gmp_clrbit) } if (index < 0) { - zend_argument_value_error(2, "must be greater than or equal to zero"); + zend_argument_value_error(2, "must be greater than or equal to 0"); RETURN_THROWS(); } @@ -1924,7 +1924,7 @@ ZEND_FUNCTION(gmp_testbit) } if (index < 0) { - zend_argument_value_error(2, "must be greater than or equal to zero"); + zend_argument_value_error(2, "must be greater than or equal to 0"); RETURN_THROWS(); } @@ -1975,7 +1975,7 @@ ZEND_FUNCTION(gmp_scan0) } if (start < 0) { - zend_argument_value_error(2, "must be greater than or equal to zero"); + zend_argument_value_error(2, "must be greater than or equal to 0"); RETURN_THROWS(); } @@ -1999,7 +1999,7 @@ ZEND_FUNCTION(gmp_scan1) } if (start < 0) { - zend_argument_value_error(2, "must be greater than or equal to zero"); + zend_argument_value_error(2, "must be greater than or equal to 0"); RETURN_THROWS(); } diff --git a/ext/gmp/tests/bug50283.phpt b/ext/gmp/tests/bug50283.phpt index 1e640a7912c79..71e0f4fdba9ea 100644 --- a/ext/gmp/tests/bug50283.phpt +++ b/ext/gmp/tests/bug50283.phpt @@ -34,10 +34,10 @@ printf("Base 32 and 62-based: %s\n", gmp_strval(gmp_init("gh82179fbf5", 32), 62) --EXPECT-- Decimal: 71915494046709, -36-based: PHPISCOOL Decimal: 71915494046709, 36-based: phpiscool -gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 -gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 -gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 +gmp_strval(): Argument #2 ($base) must be between 2 and 62, or -2 and -36 +gmp_strval(): Argument #2 ($base) must be between 2 and 62, or -2 and -36 +gmp_strval(): Argument #2 ($base) must be between 2 and 62, or -2 and -36 Decimal: 71915494046709, 37-based: KHKATELJF Decimal: 71915494046709, 62-based: KQ6yq741 -gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 +gmp_strval(): Argument #2 ($base) must be between 2 and 62, or -2 and -36 Base 32 and 62-based: 1NHkAcdIiD diff --git a/ext/gmp/tests/gmp_abs.phpt b/ext/gmp/tests/gmp_abs.phpt index ffc777e380c74..c0268fdf0cc4b 100644 --- a/ext/gmp/tests/gmp_abs.phpt +++ b/ext/gmp/tests/gmp_abs.phpt @@ -47,11 +47,11 @@ echo "Done\n"; gmp_abs(): Argument #1 ($a) must be an integer string in base 10 string(1) "0" string(1) "0" -gmp_abs(): Argument #1 ($a) must be of type bool|int|string|GMP, float given +gmp_abs(): Argument #1 ($a) must be of type GMP|string|int|bool, float given string(21) "111111111111111111111" string(21) "111111111111111111111" string(1) "0" gmp_abs(): Argument #1 ($a) must be an integer string in base 8 gmp_abs(): Argument #1 ($a) must be an integer string in base 8 -gmp_abs(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_abs(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_and.phpt b/ext/gmp/tests/gmp_and.phpt index f1bbd0cde2c90..c1837fac26377 100644 --- a/ext/gmp/tests/gmp_and.phpt +++ b/ext/gmp/tests/gmp_and.phpt @@ -50,7 +50,7 @@ string(4) "4544" gmp_and(): Argument #1 ($a) must be an integer string in base 10 string(4) "1536" string(15) "424703623692768" -gmp_and(): Argument #1 ($a) must be of type bool|int|string|GMP, array given -gmp_and(): Argument #2 ($b) must be of type bool|int|string|GMP, array given -gmp_and(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_and(): Argument #1 ($a) must be of type GMP|string|int|bool, array given +gmp_and(): Argument #2 ($b) must be of type GMP|string|int|bool, array given +gmp_and(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_clrbit.phpt b/ext/gmp/tests/gmp_clrbit.phpt index 24a46bd554292..5dc0ff4dbb8d9 100644 --- a/ext/gmp/tests/gmp_clrbit.phpt +++ b/ext/gmp/tests/gmp_clrbit.phpt @@ -46,9 +46,9 @@ echo "Done\n"; ?> --EXPECT-- string(1) "0" -gmp_clrbit(): Argument #2 ($index) must be greater than or equal to zero +gmp_clrbit(): Argument #2 ($index) must be greater than or equal to 0 string(2) "-1" -gmp_clrbit(): Argument #2 ($index) must be greater than or equal to zero +gmp_clrbit(): Argument #2 ($index) must be greater than or equal to 0 string(7) "1000000" string(7) "1000000" string(30) "238462734628347239571822592658" diff --git a/ext/gmp/tests/gmp_cmp.phpt b/ext/gmp/tests/gmp_cmp.phpt index b96d663e2e2a3..98e3c9ec3e994 100644 --- a/ext/gmp/tests/gmp_cmp.phpt +++ b/ext/gmp/tests/gmp_cmp.phpt @@ -34,5 +34,5 @@ int(1) int(-1) bool(true) int(0) -gmp_cmp(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_cmp(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_com.phpt b/ext/gmp/tests/gmp_com.phpt index 71fc2e63cfae6..09100da96f139 100644 --- a/ext/gmp/tests/gmp_com.phpt +++ b/ext/gmp/tests/gmp_com.phpt @@ -30,7 +30,7 @@ try { echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(2) "-1" string(2) "-1" gmp_com(): Argument #1 ($a) must be an integer string in base 10 @@ -40,5 +40,5 @@ string(7) "-874654" string(4) "9875" string(9) "-98765468" string(12) "-98765463338" -gmp_com(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_com(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_div_q.phpt b/ext/gmp/tests/gmp_div_q.phpt index d32653dfd8998..c86eb952fe8fe 100644 --- a/ext/gmp/tests/gmp_div_q.phpt +++ b/ext/gmp/tests/gmp_div_q.phpt @@ -76,6 +76,6 @@ object(GMP)#1 (1) { ["num"]=> string(4) "9131" } -gmp_div_q(): Argument #1 ($a) must be of type bool|int|string|GMP, resource given -gmp_div_q(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_div_q(): Argument #1 ($a) must be of type GMP|string|int|bool, resource given +gmp_div_q(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_div_qr.phpt b/ext/gmp/tests/gmp_div_qr.phpt index 7e05234cf8a2b..7af729804e7aa 100644 --- a/ext/gmp/tests/gmp_div_qr.phpt +++ b/ext/gmp/tests/gmp_div_qr.phpt @@ -159,6 +159,6 @@ array(2) { string(2) "10" } } -gmp_div_qr(): Argument #1 ($a) must be of type bool|int|string|GMP, resource given -gmp_div_qr(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_div_qr(): Argument #1 ($a) must be of type GMP|string|int|bool, resource given +gmp_div_qr(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_div_r.phpt b/ext/gmp/tests/gmp_div_r.phpt index 56b3d653ec3e6..1cf1e66252f50 100644 --- a/ext/gmp/tests/gmp_div_r.phpt +++ b/ext/gmp/tests/gmp_div_r.phpt @@ -76,6 +76,6 @@ object(GMP)#3 (1) { ["num"]=> string(2) "10" } -gmp_div_r(): Argument #1 ($a) must be of type bool|int|string|GMP, resource given -gmp_div_r(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_div_r(): Argument #1 ($a) must be of type GMP|string|int|bool, resource given +gmp_div_r(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_export.phpt b/ext/gmp/tests/gmp_export.phpt index 3c0bb91d9ec45..b2fdde3d073ff 100644 --- a/ext/gmp/tests/gmp_export.phpt +++ b/ext/gmp/tests/gmp_export.phpt @@ -77,5 +77,5 @@ try { bool(true) gmp_export(): Argument #2 ($word_size) must be greater than or equal to 1 gmp_export(): Argument #2 ($word_size) must be greater than or equal to 1 -gmp_export(): Argument #3 ($options) has conflicting word orders -gmp_export(): Argument #3 ($options) has conflicting word endianness +gmp_export(): Argument #3 ($options) cannot use multiple word order options +gmp_export(): Argument #3 ($options) cannot use multiple endian options diff --git a/ext/gmp/tests/gmp_fact.phpt b/ext/gmp/tests/gmp_fact.phpt index c8096760a0bd3..4c75c0f06b651 100644 --- a/ext/gmp/tests/gmp_fact.phpt +++ b/ext/gmp/tests/gmp_fact.phpt @@ -57,12 +57,12 @@ gmp_fact(): Argument #1 ($a) must be an integer string in base 10 string(1) "1" gmp_fact(): Argument #1 ($a) must be greater than or equal to 0 gmp_fact(): Argument #1 ($a) must be greater than or equal to 0 -gmp_fact(): Argument #1 ($a) must be of type bool|int|string|GMP, float given +gmp_fact(): Argument #1 ($a) must be of type GMP|string|int|bool, float given string(19) "2432902008176640000" string(65) "30414093201713378043612608166064768844377641568960512000000000000" string(7) "3628800" string(1) "1" string(9) "479001600" gmp_fact(): Argument #1 ($a) must be greater than or equal to 0 -gmp_fact(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_fact(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_gcdext.phpt b/ext/gmp/tests/gmp_gcdext.phpt index bda068b856459..9619ff755759d 100644 --- a/ext/gmp/tests/gmp_gcdext.phpt +++ b/ext/gmp/tests/gmp_gcdext.phpt @@ -63,6 +63,6 @@ string(1) "1" string(1) "1" string(3) "195" string(3) "195" -gmp_gcdext(): Argument #2 ($b) must be of type bool|int|string|GMP, array given -gmp_gcdext(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_gcdext(): Argument #2 ($b) must be of type GMP|string|int|bool, array given +gmp_gcdext(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_hamdist.phpt b/ext/gmp/tests/gmp_hamdist.phpt index 683c7a2b9684c..ddaea9f0a4197 100644 --- a/ext/gmp/tests/gmp_hamdist.phpt +++ b/ext/gmp/tests/gmp_hamdist.phpt @@ -42,7 +42,7 @@ int(-1) int(43) int(0) int(26) -gmp_hamdist(): Argument #2 ($b) must be of type bool|int|string|GMP, array given -gmp_hamdist(): Argument #1 ($a) must be of type bool|int|string|GMP, array given -gmp_hamdist(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_hamdist(): Argument #2 ($b) must be of type GMP|string|int|bool, array given +gmp_hamdist(): Argument #1 ($a) must be of type GMP|string|int|bool, array given +gmp_hamdist(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_import.phpt b/ext/gmp/tests/gmp_import.phpt index 9b5bf75234d27..4dc3ecde887b6 100644 --- a/ext/gmp/tests/gmp_import.phpt +++ b/ext/gmp/tests/gmp_import.phpt @@ -91,8 +91,8 @@ try { bool(true) gmp_import(): Argument #2 ($word_size) must be greater than or equal to 1 gmp_import(): Argument #2 ($word_size) must be greater than or equal to 1 -gmp_import(): Argument #1 ($data) must be a multiple of word size -gmp_import(): Argument #1 ($data) must be a multiple of word size -gmp_import(): Argument #1 ($data) must be a multiple of word size -gmp_import(): Argument #3 ($options) has conflicting word orders -gmp_import(): Argument #3 ($options) has conflicting word endianness +gmp_import(): Argument #1 ($data) must be a multiple of argument #2 ($word_size) +gmp_import(): Argument #1 ($data) must be a multiple of argument #2 ($word_size) +gmp_import(): Argument #1 ($data) must be a multiple of argument #2 ($word_size) +gmp_import(): Argument #3 ($options) cannot use multiple word order options +gmp_import(): Argument #3 ($options) cannot use multiple endian options diff --git a/ext/gmp/tests/gmp_invert.phpt b/ext/gmp/tests/gmp_invert.phpt index fda56c9cdce09..f67bf3c2fdd4c 100644 --- a/ext/gmp/tests/gmp_invert.phpt +++ b/ext/gmp/tests/gmp_invert.phpt @@ -47,7 +47,7 @@ string(1) "0" string(1) "0" string(22) "3498273496234234523441" string(1) "1" -gmp_invert(): Argument #1 ($a) must be of type bool|int|string|GMP, array given -gmp_invert(): Argument #2 ($b) must be of type bool|int|string|GMP, array given -gmp_invert(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_invert(): Argument #1 ($a) must be of type GMP|string|int|bool, array given +gmp_invert(): Argument #2 ($b) must be of type GMP|string|int|bool, array given +gmp_invert(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_jacobi.phpt b/ext/gmp/tests/gmp_jacobi.phpt index 9d8a96cf0cf92..4f40a94828cf7 100644 --- a/ext/gmp/tests/gmp_jacobi.phpt +++ b/ext/gmp/tests/gmp_jacobi.phpt @@ -56,7 +56,7 @@ string(1) "0" string(2) "-1" string(1) "0" string(2) "-1" -gmp_jacobi(): Argument #2 ($b) must be of type bool|int|string|GMP, array given -gmp_jacobi(): Argument #1 ($a) must be of type bool|int|string|GMP, array given -gmp_jacobi(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_jacobi(): Argument #2 ($b) must be of type GMP|string|int|bool, array given +gmp_jacobi(): Argument #1 ($a) must be of type GMP|string|int|bool, array given +gmp_jacobi(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_legendre.phpt b/ext/gmp/tests/gmp_legendre.phpt index 58a034f69746a..e52686689e9ca 100644 --- a/ext/gmp/tests/gmp_legendre.phpt +++ b/ext/gmp/tests/gmp_legendre.phpt @@ -56,7 +56,7 @@ string(1) "0" string(2) "-1" string(1) "0" string(2) "-1" -gmp_legendre(): Argument #2 ($b) must be of type bool|int|string|GMP, array given -gmp_legendre(): Argument #1 ($a) must be of type bool|int|string|GMP, array given -gmp_legendre(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_legendre(): Argument #2 ($b) must be of type GMP|string|int|bool, array given +gmp_legendre(): Argument #1 ($a) must be of type GMP|string|int|bool, array given +gmp_legendre(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_mod.phpt b/ext/gmp/tests/gmp_mod.phpt index 9c18855a2c403..460deae34f261 100644 --- a/ext/gmp/tests/gmp_mod.phpt +++ b/ext/gmp/tests/gmp_mod.phpt @@ -43,7 +43,7 @@ object(GMP)#2 (1) { string(1) "0" } Modulo by zero -gmp_mod(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_mod(): Argument #1 ($a) must be of type GMP|string|int|bool, array given object(GMP)#4 (1) { ["num"]=> string(5) "31161" diff --git a/ext/gmp/tests/gmp_neg.phpt b/ext/gmp/tests/gmp_neg.phpt index 4462acb1e92df..fa98f5f21cd57 100644 --- a/ext/gmp/tests/gmp_neg.phpt +++ b/ext/gmp/tests/gmp_neg.phpt @@ -40,5 +40,5 @@ gmp_neg(): Argument #1 ($a) must be an integer string in base 10 int(0) int(0) string(21) "-12345678901234567890" -gmp_neg(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_neg(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_nextprime.phpt b/ext/gmp/tests/gmp_nextprime.phpt index d29bd85a8e534..3ebfde923d7e3 100644 --- a/ext/gmp/tests/gmp_nextprime.phpt +++ b/ext/gmp/tests/gmp_nextprime.phpt @@ -43,7 +43,7 @@ string(1) "2" string(1) "2" string(4) "1009" string(6) "100003" -gmp_nextprime(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_nextprime(): Argument #1 ($a) must be of type GMP|string|int|bool, array given gmp_nextprime(): Argument #1 ($a) must be an integer string in base 10 -gmp_nextprime(): Argument #1 ($a) must be of type bool|int|string|GMP, stdClass given +gmp_nextprime(): Argument #1 ($a) must be of type GMP|string|int|bool, stdClass given Done diff --git a/ext/gmp/tests/gmp_or.phpt b/ext/gmp/tests/gmp_or.phpt index 4fb73dfcd6f1b..5b9a4843e02dd 100644 --- a/ext/gmp/tests/gmp_or.phpt +++ b/ext/gmp/tests/gmp_or.phpt @@ -49,7 +49,7 @@ string(3) "-19" gmp_or(): Argument #1 ($a) must be an integer string in base 10 string(15) "987657876576252" string(21) "987658441719689394144" -gmp_or(): Argument #1 ($a) must be of type bool|int|string|GMP, array given -gmp_or(): Argument #2 ($b) must be of type bool|int|string|GMP, array given -gmp_or(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_or(): Argument #1 ($a) must be of type GMP|string|int|bool, array given +gmp_or(): Argument #2 ($b) must be of type GMP|string|int|bool, array given +gmp_or(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_perfect_square.phpt b/ext/gmp/tests/gmp_perfect_square.phpt index b41616c194bbe..933b2fe9f9c32 100644 --- a/ext/gmp/tests/gmp_perfect_square.phpt +++ b/ext/gmp/tests/gmp_perfect_square.phpt @@ -41,5 +41,5 @@ bool(false) bool(false) bool(true) bool(false) -gmp_perfect_square(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_perfect_square(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_popcount.phpt b/ext/gmp/tests/gmp_popcount.phpt index ff8483896f652..c38cb6f2b8d10 100644 --- a/ext/gmp/tests/gmp_popcount.phpt +++ b/ext/gmp/tests/gmp_popcount.phpt @@ -28,5 +28,5 @@ int(10) int(31) int(-1) int(20) -gmp_popcount(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_popcount(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_pow.phpt b/ext/gmp/tests/gmp_pow.phpt index 5c18a80dd8df9..b70226bb17e35 100644 --- a/ext/gmp/tests/gmp_pow.phpt +++ b/ext/gmp/tests/gmp_pow.phpt @@ -57,5 +57,5 @@ gmp_pow(): Argument #2 ($exp) must be greater than or equal to 0 string(14) "10240000000000" string(14) "10240000000000" gmp_pow(): Argument #2 ($exp) must be of type int, array given -gmp_pow(): Argument #1 ($base) must be of type bool|int|string|GMP, array given +gmp_pow(): Argument #1 ($base) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_pown.phpt b/ext/gmp/tests/gmp_pown.phpt index 2f57f55efdc2b..ae3316b1adcdf 100644 --- a/ext/gmp/tests/gmp_pown.phpt +++ b/ext/gmp/tests/gmp_pown.phpt @@ -75,10 +75,10 @@ string(3) "171" string(3) "371" Modulo by zero Modulo by zero -gmp_powm(): Argument #1 ($base) must be of type bool|int|string|GMP, array given -gmp_powm(): Argument #2 ($exp) must be of type bool|int|string|GMP, array given -gmp_powm(): Argument #2 ($exp) must be of type bool|int|string|GMP, TypeError given -gmp_powm(): Argument #1 ($base) must be of type bool|int|string|GMP, array given +gmp_powm(): Argument #1 ($base) must be of type GMP|string|int|bool, array given +gmp_powm(): Argument #2 ($exp) must be of type GMP|string|int|bool, array given +gmp_powm(): Argument #2 ($exp) must be of type GMP|string|int|bool, TypeError given +gmp_powm(): Argument #1 ($base) must be of type GMP|string|int|bool, array given gmp_powm(): Argument #2 ($exp) must be greater than or equal to 0 object(GMP)#6 (1) { ["num"]=> diff --git a/ext/gmp/tests/gmp_prob_prime.phpt b/ext/gmp/tests/gmp_prob_prime.phpt index ee197b6b0f1f9..15c7aaeaa554e 100644 --- a/ext/gmp/tests/gmp_prob_prime.phpt +++ b/ext/gmp/tests/gmp_prob_prime.phpt @@ -75,5 +75,5 @@ int(0) int(0) int(0) int(0) -gmp_prob_prime(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_prob_prime(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_random_range.phpt b/ext/gmp/tests/gmp_random_range.phpt index 908a4f392cbe1..bd5ee688f0a66 100644 --- a/ext/gmp/tests/gmp_random_range.phpt +++ b/ext/gmp/tests/gmp_random_range.phpt @@ -74,7 +74,7 @@ while (1) { echo "Done\n"; ?> --EXPECT-- -gmp_random_range(): Argument #1 ($min) must be less than argument#2 ($maximum) -gmp_random_range(): Argument #1 ($min) must be less than argument#2 ($maximum) -gmp_random_range(): Argument #1 ($min) must be less than argument#2 ($maximum) +gmp_random_range(): Argument #1 ($min) must be less than argument #2 ($maximum) +gmp_random_range(): Argument #1 ($min) must be less than argument #2 ($maximum) +gmp_random_range(): Argument #1 ($min) must be less than argument #2 ($maximum) Done diff --git a/ext/gmp/tests/gmp_root.phpt b/ext/gmp/tests/gmp_root.phpt index ecdb80b1416a6..646d365e135b1 100644 --- a/ext/gmp/tests/gmp_root.phpt +++ b/ext/gmp/tests/gmp_root.phpt @@ -55,5 +55,5 @@ object(GMP)#%d (1) { ["num"]=> string(1) "0" } -gmp_root(): Argument #2 ($nth) must be greater than or equal to 1 -gmp_root(): Argument #2 ($nth) must be greater than or equal to 1 +gmp_root(): Argument #2 ($nth) must be greater than 0 +gmp_root(): Argument #2 ($nth) must be greater than 0 diff --git a/ext/gmp/tests/gmp_scan0.phpt b/ext/gmp/tests/gmp_scan0.phpt index 1a184929f0d06..e7b37d48667c2 100644 --- a/ext/gmp/tests/gmp_scan0.phpt +++ b/ext/gmp/tests/gmp_scan0.phpt @@ -28,11 +28,11 @@ try { echo "Done\n"; ?> --EXPECT-- -gmp_scan0(): Argument #2 ($start) must be greater than or equal to zero +gmp_scan0(): Argument #2 ($start) must be greater than or equal to 0 int(2) int(0) int(5) int(200) int(13) -gmp_scan0(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_scan0(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_scan1.phpt b/ext/gmp/tests/gmp_scan1.phpt index ace9db10eac0c..9274a659f4b27 100644 --- a/ext/gmp/tests/gmp_scan1.phpt +++ b/ext/gmp/tests/gmp_scan1.phpt @@ -28,11 +28,11 @@ try { echo "Done\n"; ?> --EXPECT-- -gmp_scan1(): Argument #2 ($start) must be greater than or equal to zero +gmp_scan1(): Argument #2 ($start) must be greater than or equal to 0 int(1) int(12) int(9) int(-1) int(10) -gmp_scan1(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_scan1(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_setbit.phpt b/ext/gmp/tests/gmp_setbit.phpt index e3b0f1a03f3ba..02857c7e52ed9 100644 --- a/ext/gmp/tests/gmp_setbit.phpt +++ b/ext/gmp/tests/gmp_setbit.phpt @@ -52,7 +52,7 @@ echo "Done\n"; ?> --EXPECT-- string(2) "-1" -gmp_setbit(): Argument #2 ($index) must be greater than or equal to zero +gmp_setbit(): Argument #2 ($index) must be greater than or equal to 0 string(1) "5" string(1) "1" string(1) "7" diff --git a/ext/gmp/tests/gmp_sign.phpt b/ext/gmp/tests/gmp_sign.phpt index d0c5a2e141e85..51b6cbbb36a2f 100644 --- a/ext/gmp/tests/gmp_sign.phpt +++ b/ext/gmp/tests/gmp_sign.phpt @@ -38,5 +38,5 @@ int(1) int(-1) gmp_sign(): Argument #1 ($a) must be an integer string in base 10 gmp_init(): Argument #1 ($number) must be an integer string in base 8 -gmp_sign(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_sign(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_sqrt.phpt b/ext/gmp/tests/gmp_sqrt.phpt index 67472dd955edd..78fa806ba37b6 100644 --- a/ext/gmp/tests/gmp_sqrt.phpt +++ b/ext/gmp/tests/gmp_sqrt.phpt @@ -48,5 +48,5 @@ string(2) "12" string(1) "0" gmp_sqrt(): Argument #1 ($a) must be greater than or equal to 0 string(2) "27" -gmp_sqrt(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_sqrt(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_sqrtrem.phpt b/ext/gmp/tests/gmp_sqrtrem.phpt index 3ec545913b08d..819fe217c6077 100644 --- a/ext/gmp/tests/gmp_sqrtrem.phpt +++ b/ext/gmp/tests/gmp_sqrtrem.phpt @@ -86,5 +86,5 @@ string(1) "1" gmp_sqrtrem(): Argument #1 ($a) must be greater than or equal to 0 string(4) "1000" string(1) "1" -gmp_sqrtrem(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_sqrtrem(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_strval.phpt b/ext/gmp/tests/gmp_strval.phpt index 3ee8dee409b61..17963291e54bd 100644 --- a/ext/gmp/tests/gmp_strval.phpt +++ b/ext/gmp/tests/gmp_strval.phpt @@ -66,16 +66,16 @@ echo "Done\n"; ?> --EXPECT-- gmp_strval(): Argument #1 ($gmpnumber) must be an integer string in base 10 -gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 -gmp_strval(): Argument #1 ($gmpnumber) must be of type bool|int|string|GMP, resource given +gmp_strval(): Argument #2 ($base) must be between 2 and 62, or -2 and -36 +gmp_strval(): Argument #1 ($gmpnumber) must be of type GMP|string|int|bool, resource given string(7) "9765456" -gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 -gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 +gmp_strval(): Argument #2 ($base) must be between 2 and 62, or -2 and -36 +gmp_strval(): Argument #2 ($base) must be between 2 and 62, or -2 and -36 string(7) "9765456" string(8) "-3373333" -gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 -gmp_strval(): Argument #2 ($base) must be between 2 and 62 or -2 and -36 +gmp_strval(): Argument #2 ($base) must be between 2 and 62, or -2 and -36 +gmp_strval(): Argument #2 ($base) must be between 2 and 62, or -2 and -36 string(8) "-3373333" -gmp_strval(): Argument #1 ($gmpnumber) must be of type bool|int|string|GMP, array given -gmp_strval(): Argument #1 ($gmpnumber) must be of type bool|int|string|GMP, stdClass given +gmp_strval(): Argument #1 ($gmpnumber) must be of type GMP|string|int|bool, array given +gmp_strval(): Argument #1 ($gmpnumber) must be of type GMP|string|int|bool, stdClass given Done diff --git a/ext/gmp/tests/gmp_sub.phpt b/ext/gmp/tests/gmp_sub.phpt index 613078caa8a67..efcb3f6a8e0bb 100644 --- a/ext/gmp/tests/gmp_sub.phpt +++ b/ext/gmp/tests/gmp_sub.phpt @@ -38,7 +38,7 @@ echo "Done\n"; ?> --EXPECT-- gmp_sub(): Argument #1 ($a) must be an integer string in base 10 -gmp_sub(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_sub(): Argument #1 ($a) must be of type GMP|string|int|bool, array given object(GMP)#1 (1) { ["num"]=> string(2) "-1" @@ -49,6 +49,6 @@ object(GMP)#3 (1) { string(5) "10001" } string(5) "10001" -gmp_sub(): Argument #2 ($b) must be of type bool|int|string|GMP, stdClass given -gmp_sub(): Argument #1 ($a) must be of type bool|int|string|GMP, stdClass given +gmp_sub(): Argument #2 ($b) must be of type GMP|string|int|bool, stdClass given +gmp_sub(): Argument #1 ($a) must be of type GMP|string|int|bool, stdClass given Done diff --git a/ext/gmp/tests/gmp_testbit.phpt b/ext/gmp/tests/gmp_testbit.phpt index 47234a621492f..30fc054c6c798 100644 --- a/ext/gmp/tests/gmp_testbit.phpt +++ b/ext/gmp/tests/gmp_testbit.phpt @@ -48,12 +48,12 @@ var_dump(gmp_strval($n)); echo "Done\n"; ?> --EXPECT-- -gmp_testbit(): Argument #2 ($index) must be greater than or equal to zero +gmp_testbit(): Argument #2 ($index) must be greater than or equal to 0 bool(false) bool(false) bool(false) bool(true) -gmp_testbit(): Argument #2 ($index) must be greater than or equal to zero +gmp_testbit(): Argument #2 ($index) must be greater than or equal to 0 bool(false) bool(true) string(7) "1000002" diff --git a/ext/gmp/tests/gmp_xor.phpt b/ext/gmp/tests/gmp_xor.phpt index ecb405dc99243..d4aa0f6c1dd69 100644 --- a/ext/gmp/tests/gmp_xor.phpt +++ b/ext/gmp/tests/gmp_xor.phpt @@ -49,7 +49,7 @@ string(5) "-4563" gmp_xor(): Argument #1 ($a) must be an integer string in base 10 string(15) "987657876574716" string(21) "987658017016065701376" -gmp_xor(): Argument #1 ($a) must be of type bool|int|string|GMP, array given -gmp_xor(): Argument #2 ($b) must be of type bool|int|string|GMP, array given -gmp_xor(): Argument #1 ($a) must be of type bool|int|string|GMP, array given +gmp_xor(): Argument #1 ($a) must be of type GMP|string|int|bool, array given +gmp_xor(): Argument #2 ($b) must be of type GMP|string|int|bool, array given +gmp_xor(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/overloading.phpt b/ext/gmp/tests/overloading.phpt index a8c13a932f1ae..e0fa6deb17cdd 100644 --- a/ext/gmp/tests/overloading.phpt +++ b/ext/gmp/tests/overloading.phpt @@ -282,7 +282,7 @@ bool(false) bool(true) bool(false) bool(true) -main(): Argument #2 must be of type bool|int|string|GMP, stdClass given +main(): Argument #2 must be of type GMP|string|int|bool, stdClass given object(GMP)#4 (1) { ["num"]=> string(2) "43" From 0c0818b7b6a714f9e5ebe7b02c82b48ab7aa8ab6 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 4 Aug 2020 17:21:27 +0200 Subject: [PATCH 08/14] Emit correct exception directly --- ext/gmp/gmp.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index 2c93e033e71e1..b066c97a3bbf6 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -383,11 +383,8 @@ static int gmp_do_operation_ex(zend_uchar opcode, zval *result, zval *op1, zval case ZEND_DIV: DO_BINARY_UI_OP_EX(mpz_tdiv_q, gmp_mpz_tdiv_q_ui, 1); case ZEND_MOD: - gmp_zval_binary_ui_op(result, op1, op2, mpz_mod, gmp_mpz_mod_ui, 1); - /* Free Division by zero error and rethrow a new modulo by zero one */ - if (UNEXPECTED(EG(exception) && EG(exception)->ce == zend_ce_division_by_zero_error)) { - zend_clear_exception(); - zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero"); + DO_BINARY_UI_OP_EX(mpz_mod, gmp_mpz_mod_ui, 1); + if (UNEXPECTED(EG(exception))) { return FAILURE; } return SUCCESS; @@ -738,7 +735,11 @@ static inline void gmp_zval_binary_ui_op(zval *return_value, zval *a_arg, zval * } if (b_is_zero) { - zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero"); + if ((gmp_binary_op_t) mpz_mod == gmp_op) { + zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero"); + } else { + zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero"); + } FREE_GMP_TEMP(temp_a); FREE_GMP_TEMP(temp_b); RETURN_THROWS(); @@ -1154,8 +1155,9 @@ ZEND_FUNCTION(gmp_mod) gmp_binary_ui_op_no_zero(mpz_mod, gmp_mpz_mod_ui); /* Clear division by zero and rethrow a modulo by zero exception */ if (UNEXPECTED(EG(exception) && EG(exception)->ce == zend_ce_division_by_zero_error)) { + /* zend_clear_exception(); - zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero"); + zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");*/ RETURN_THROWS(); } } From 5151786d0306bfdddfa943ace66d3befcead51e3 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 4 Aug 2020 17:30:20 +0200 Subject: [PATCH 09/14] ValueError for even root of negative number --- ext/gmp/gmp.c | 10 ++++------ ext/gmp/gmp.stub.php | 4 ++-- ext/gmp/gmp_arginfo.h | 6 +++--- ext/gmp/tests/gmp_remroot.phpt | 10 ++++++---- ext/gmp/tests/gmp_root.phpt | 11 +++++++---- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index b066c97a3bbf6..a34153a8fb152 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -1394,10 +1394,9 @@ ZEND_FUNCTION(gmp_root) FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); if (nth % 2 == 0 && mpz_sgn(gmpnum_a) < 0) { - // Todo promote to ValueError? - php_error_docref(NULL, E_WARNING, "Can't take even root of negative number"); + zend_argument_value_error(2, "must be odd if argument #1 ($a) is negative"); FREE_GMP_TEMP(temp_a); - RETURN_FALSE; + RETURN_THROWS(); } INIT_GMP_RETVAL(gmpnum_result); @@ -1427,10 +1426,9 @@ ZEND_FUNCTION(gmp_rootrem) FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); if (nth % 2 == 0 && mpz_sgn(gmpnum_a) < 0) { - // Todo promote to ValueError? - php_error_docref(NULL, E_WARNING, "Can't take even root of negative number"); + zend_argument_value_error(2, "must be odd if argument #1 ($a) is negative"); FREE_GMP_TEMP(temp_a); - RETURN_FALSE; + RETURN_THROWS(); } gmp_create(&result1, &gmpnum_result1); diff --git a/ext/gmp/gmp.stub.php b/ext/gmp/gmp.stub.php index 898f08bb37fb4..25fb9bd3c28ca 100644 --- a/ext/gmp/gmp.stub.php +++ b/ext/gmp/gmp.stub.php @@ -91,10 +91,10 @@ function gmp_sqrt($a): GMP {} function gmp_sqrtrem($a): array {} /** @param GMP|int|bool|string $a */ -function gmp_root($a, int $nth): GMP|false {} +function gmp_root($a, int $nth): GMP {} /** @param GMP|int|bool|string $a */ -function gmp_rootrem($a, int $nth): array|false {} +function gmp_rootrem($a, int $nth): array {} /** @param GMP|int|bool|string $base */ function gmp_pow($base, int $exp): GMP {} diff --git a/ext/gmp/gmp_arginfo.h b/ext/gmp/gmp_arginfo.h index f7cd487de0f36..e03ef686b03f0 100644 --- a/ext/gmp/gmp_arginfo.h +++ b/ext/gmp/gmp_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 3094dae32430922d11c7bdb3a4da0e2c0b47ac7e */ + * Stub hash: a07c755ba28151df412a32411cd25f75eeea7fe0 */ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_init, 0, 1, GMP, 0) ZEND_ARG_INFO(0, number) @@ -70,12 +70,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_sqrtrem, 0, 1, IS_ARRAY, 0) ZEND_ARG_INFO(0, a) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_root, 0, 2, GMP, MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_root, 0, 2, GMP, 0) ZEND_ARG_INFO(0, a) ZEND_ARG_TYPE_INFO(0, nth, IS_LONG, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gmp_rootrem, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_rootrem, 0, 2, IS_ARRAY, 0) ZEND_ARG_INFO(0, a) ZEND_ARG_TYPE_INFO(0, nth, IS_LONG, 0) ZEND_END_ARG_INFO() diff --git a/ext/gmp/tests/gmp_remroot.phpt b/ext/gmp/tests/gmp_remroot.phpt index b7bf5f131bec5..969182f37e0aa 100644 --- a/ext/gmp/tests/gmp_remroot.phpt +++ b/ext/gmp/tests/gmp_remroot.phpt @@ -11,7 +11,11 @@ var_dump(gmp_rootrem(-100, 3)); var_dump(gmp_rootrem(1000, 4)); var_dump(gmp_rootrem(100, 4)); -var_dump(gmp_rootrem(-100, 4)); +try { + var_dump(gmp_rootrem(-100, 4)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_rootrem(0, 3)); @@ -88,9 +92,7 @@ array(2) { string(2) "19" } } - -Warning: gmp_rootrem(): Can't take even root of negative number in %s on line %d -bool(false) +gmp_rootrem(): Argument #2 ($nth) must be odd if argument #1 ($a) is negative array(2) { [0]=> object(GMP)#%d (1) { diff --git a/ext/gmp/tests/gmp_root.phpt b/ext/gmp/tests/gmp_root.phpt index 646d365e135b1..e50990a4f6863 100644 --- a/ext/gmp/tests/gmp_root.phpt +++ b/ext/gmp/tests/gmp_root.phpt @@ -11,7 +11,12 @@ var_dump(gmp_root(-100, 3)); var_dump(gmp_root(1000, 4)); var_dump(gmp_root(100, 4)); -var_dump(gmp_root(-100, 4)); + +try { + var_dump(gmp_root(-100, 4)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} var_dump(gmp_root(0, 3)); @@ -48,9 +53,7 @@ object(GMP)#%d (1) { ["num"]=> string(1) "3" } - -Warning: gmp_root(): Can't take even root of negative number in %s on line %d -bool(false) +gmp_root(): Argument #2 ($nth) must be odd if argument #1 ($a) is negative object(GMP)#%d (1) { ["num"]=> string(1) "0" From 471a8fa6e56783d26553b4fa14856efe066eec87 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 4 Aug 2020 17:45:35 +0200 Subject: [PATCH 10/14] gmp_invert improvement --- ext/gmp/gmp.c | 10 ++++++++-- ext/gmp/tests/gmp_invert.phpt | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index a34153a8fb152..d1b7188362fdb 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -1562,17 +1562,23 @@ ZEND_FUNCTION(gmp_invert) if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz", &a_arg, &b_arg) == FAILURE){ RETURN_THROWS(); } - // TODO Check b_arg is not 0 as behaviour is undefined for op2 = 0 for mpz_invert FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1); FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a, 2); + // TODO Early check if b_arg IS_LONG? + if (0 == mpz_cmp_ui(gmpnum_b, 0)) { + zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero"); + FREE_GMP_TEMP(temp_a); + FREE_GMP_TEMP(temp_b); + RETURN_THROWS(); + } + INIT_GMP_RETVAL(gmpnum_result); res = mpz_invert(gmpnum_result, gmpnum_a, gmpnum_b); FREE_GMP_TEMP(temp_a); FREE_GMP_TEMP(temp_b); if (!res) { - // Should return 0 instead of false? A legit 0 value is impossible. zval_ptr_dtor(return_value); RETURN_FALSE; } diff --git a/ext/gmp/tests/gmp_invert.phpt b/ext/gmp/tests/gmp_invert.phpt index f67bf3c2fdd4c..8ea60b084789a 100644 --- a/ext/gmp/tests/gmp_invert.phpt +++ b/ext/gmp/tests/gmp_invert.phpt @@ -8,7 +8,13 @@ gmp_invert() basic tests var_dump(gmp_strval(gmp_invert(123123,5467624))); var_dump(gmp_strval(gmp_invert(123123,"3333334345467624"))); var_dump(gmp_strval(gmp_invert("12312323213123123",7624))); -var_dump(gmp_strval(gmp_invert(444,0))); + +try { + var_dump(gmp_strval(gmp_invert(444,0))); +} catch (\DivisionByZeroError $e) { + echo $e->getMessage() . \PHP_EOL; +} + var_dump(gmp_strval(gmp_invert(0,28347))); var_dump(gmp_strval(gmp_invert(-12,456456))); var_dump(gmp_strval(gmp_invert(234234,-435345))); @@ -41,7 +47,7 @@ echo "Done\n"; string(7) "2293131" string(1) "0" string(4) "5827" -string(1) "0" +Division by zero string(1) "0" string(1) "0" string(1) "0" From 0ba169e28bb5de7c70e8720da4ead883a966e267 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Thu, 6 Aug 2020 13:59:24 +0200 Subject: [PATCH 11/14] Second batch of reviews --- ext/gmp/gmp.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index d1b7188362fdb..33f61eb912876 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -384,10 +384,6 @@ static int gmp_do_operation_ex(zend_uchar opcode, zval *result, zval *op1, zval DO_BINARY_UI_OP_EX(mpz_tdiv_q, gmp_mpz_tdiv_q_ui, 1); case ZEND_MOD: DO_BINARY_UI_OP_EX(mpz_mod, gmp_mpz_mod_ui, 1); - if (UNEXPECTED(EG(exception))) { - return FAILURE; - } - return SUCCESS; case ZEND_SL: shift_operator_helper(mpz_mul_2exp, result, op1, op2, opcode); return SUCCESS; @@ -1153,13 +1149,6 @@ ZEND_FUNCTION(gmp_div_q) ZEND_FUNCTION(gmp_mod) { gmp_binary_ui_op_no_zero(mpz_mod, gmp_mpz_mod_ui); - /* Clear division by zero and rethrow a modulo by zero exception */ - if (UNEXPECTED(EG(exception) && EG(exception)->ce == zend_ce_division_by_zero_error)) { - /* - zend_clear_exception(); - zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");*/ - RETURN_THROWS(); - } } /* }}} */ From d85454f720a38b66814459f8f5ee086d6e19ee5e Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Thu, 6 Aug 2020 14:14:20 +0200 Subject: [PATCH 12/14] Refactor gmp_fact again --- ext/gmp/gmp.c | 22 +++++++++++++++------- ext/gmp/gmp.stub.php | 2 +- ext/gmp/gmp_arginfo.h | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index 33f61eb912876..ea3f9ad2fc1f6 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -1177,20 +1177,28 @@ ZEND_FUNCTION(gmp_abs) ZEND_FUNCTION(gmp_fact) { zval *a_arg; - mpz_ptr gmpnum; mpz_ptr gmpnum_result; - gmp_temp_t temp_a; if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &a_arg) == FAILURE){ RETURN_THROWS(); } - FETCH_GMP_ZVAL(gmpnum, a_arg, temp_a, 1); - FREE_GMP_TEMP(temp_a); + if (Z_TYPE_P(a_arg) == IS_LONG) { + if (Z_LVAL_P(a_arg) < 0) { + zend_argument_value_error(1, "must be greater than or equal to 0"); + RETURN_THROWS(); + } + } else { + mpz_ptr gmpnum; + gmp_temp_t temp_a; - if (mpz_sgn(gmpnum) < 0) { - zend_argument_value_error(1, "must be greater than or equal to 0"); - RETURN_THROWS(); + FETCH_GMP_ZVAL(gmpnum, a_arg, temp_a, 1); + FREE_GMP_TEMP(temp_a); + + if (mpz_sgn(gmpnum) < 0) { + zend_argument_value_error(1, "must be greater than or equal to 0"); + RETURN_THROWS(); + } } INIT_GMP_RETVAL(gmpnum_result); diff --git a/ext/gmp/gmp.stub.php b/ext/gmp/gmp.stub.php index 25fb9bd3c28ca..6d4390ab411fb 100644 --- a/ext/gmp/gmp.stub.php +++ b/ext/gmp/gmp.stub.php @@ -81,7 +81,7 @@ function gmp_neg($a): GMP {} /** @param GMP|int|bool|string $a */ function gmp_abs($a): GMP {} -/** @param GMP|int $a */ +/** @param GMP|int|bool|string $a */ function gmp_fact($a): GMP {} /** @param GMP|int|bool|string $a */ diff --git a/ext/gmp/gmp_arginfo.h b/ext/gmp/gmp_arginfo.h index e03ef686b03f0..e0fd4f8318635 100644 --- a/ext/gmp/gmp_arginfo.h +++ b/ext/gmp/gmp_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: a07c755ba28151df412a32411cd25f75eeea7fe0 */ + * Stub hash: b2bbdaeb1b396bd20eb59eefc92116be80ddb63b */ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_init, 0, 1, GMP, 0) ZEND_ARG_INFO(0, number) From b0c77ffa5dc9f9adf38e061b6d4dd5d1759605c9 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Thu, 6 Aug 2020 14:18:24 +0200 Subject: [PATCH 13/14] Fix test --- ext/gmp/tests/gmp_setbit_long.phpt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ext/gmp/tests/gmp_setbit_long.phpt b/ext/gmp/tests/gmp_setbit_long.phpt index d7f56767d8a43..065c8f8208fd6 100644 --- a/ext/gmp/tests/gmp_setbit_long.phpt +++ b/ext/gmp/tests/gmp_setbit_long.phpt @@ -27,7 +27,11 @@ $n = gmp_init("227200"); for($a = 1<<30; $a > 0 && $a < 0x8000000000; $a <<= 2) { $i = $a - 1; printf("%X\n", $i); - gmp_setbit($n, $i, 1); + try { + gmp_setbit($n, $i, 1); + } catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; + } } echo "Done\n"; ?> @@ -37,6 +41,5 @@ FFFFFFFF 3FFFFFFFF FFFFFFFFF 3FFFFFFFFF - -Warning: gmp_setbit(): Index must be less than %d * %d in %s/gmp_setbit_long.php on line %d +gmp_setbit(): Argument #2 ($index) must be less than %d * %d Done From 670896bdbde31e77f34e2f83031a1a78be9590ba Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Thu, 6 Aug 2020 20:35:44 +0200 Subject: [PATCH 14/14] Revert base indication in conversion failure --- ext/gmp/gmp.c | 13 ++----------- ext/gmp/tests/003.phpt | 2 +- ext/gmp/tests/bug66872.phpt | 2 +- ext/gmp/tests/gmp_abs.phpt | 6 +++--- ext/gmp/tests/gmp_and.phpt | 2 +- ext/gmp/tests/gmp_com.phpt | 2 +- ext/gmp/tests/gmp_fact.phpt | 2 +- ext/gmp/tests/gmp_init.phpt | 6 +++--- ext/gmp/tests/gmp_mod.phpt | 2 +- ext/gmp/tests/gmp_neg.phpt | 2 +- ext/gmp/tests/gmp_nextprime.phpt | 2 +- ext/gmp/tests/gmp_or.phpt | 2 +- ext/gmp/tests/gmp_random_seed.phpt | 2 +- ext/gmp/tests/gmp_sign.phpt | 4 ++-- ext/gmp/tests/gmp_strval.phpt | 2 +- ext/gmp/tests/gmp_sub.phpt | 2 +- ext/gmp/tests/gmp_xor.phpt | 2 +- 17 files changed, 23 insertions(+), 32 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index ea3f9ad2fc1f6..855513bf392d5 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -612,22 +612,13 @@ static int convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base, uint32_t a ret = mpz_set_str(gmpnumber, (skip_lead ? &numstr[2] : numstr), (int) base); if (-1 == ret) { - /* Try to guess base for better error message */ - if (base == 0) { - if (numstr[0] == '0' || ((numstr[0] == '+' || numstr[0] == '-') && numstr[1] == '0')) { - base = 8; - } else { /* Default to base 10 */ - base = 10; - } - } - /* if unserializing */ if (arg_pos == 0) { php_error_docref(NULL, E_WARNING, - "Cannot convert variable to GMP, string is not an integer in base " ZEND_LONG_FMT, base); + "Cannot convert variable to GMP, it is not an integer string"); return FAILURE; } - zend_argument_type_error(arg_pos, "must be an integer string in base " ZEND_LONG_FMT, base); + zend_argument_type_error(arg_pos, "is not an integer string"); return FAILURE; } diff --git a/ext/gmp/tests/003.phpt b/ext/gmp/tests/003.phpt index 95ee45c2c5c1c..7a84d3f8d0151 100644 --- a/ext/gmp/tests/003.phpt +++ b/ext/gmp/tests/003.phpt @@ -35,7 +35,7 @@ Check for number base recognition } ?> --EXPECT-- -gmp_init(): Argument #1 ($number) must be an integer string in base 10 +gmp_init(): Argument #1 ($number) is not an integer string 1234 1234 10011010010 diff --git a/ext/gmp/tests/bug66872.phpt b/ext/gmp/tests/bug66872.phpt index 0bbaaa9ab4dc3..c44d4c807e8a0 100644 --- a/ext/gmp/tests/bug66872.phpt +++ b/ext/gmp/tests/bug66872.phpt @@ -13,4 +13,4 @@ try { ?> --EXPECT-- -gmp_testbit(): Argument #1 ($a) must be an integer string in base 10 +gmp_testbit(): Argument #1 ($a) is not an integer string diff --git a/ext/gmp/tests/gmp_abs.phpt b/ext/gmp/tests/gmp_abs.phpt index c0268fdf0cc4b..3b64004c89eda 100644 --- a/ext/gmp/tests/gmp_abs.phpt +++ b/ext/gmp/tests/gmp_abs.phpt @@ -44,14 +44,14 @@ try { echo "Done\n"; ?> --EXPECT-- -gmp_abs(): Argument #1 ($a) must be an integer string in base 10 +gmp_abs(): Argument #1 ($a) is not an integer string string(1) "0" string(1) "0" gmp_abs(): Argument #1 ($a) must be of type GMP|string|int|bool, float given string(21) "111111111111111111111" string(21) "111111111111111111111" string(1) "0" -gmp_abs(): Argument #1 ($a) must be an integer string in base 8 -gmp_abs(): Argument #1 ($a) must be an integer string in base 8 +gmp_abs(): Argument #1 ($a) is not an integer string +gmp_abs(): Argument #1 ($a) is not an integer string gmp_abs(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_and.phpt b/ext/gmp/tests/gmp_and.phpt index c1837fac26377..90387e5f64635 100644 --- a/ext/gmp/tests/gmp_and.phpt +++ b/ext/gmp/tests/gmp_and.phpt @@ -47,7 +47,7 @@ string(5) "40994" string(3) "515" string(4) "3333" string(4) "4544" -gmp_and(): Argument #1 ($a) must be an integer string in base 10 +gmp_and(): Argument #1 ($a) is not an integer string string(4) "1536" string(15) "424703623692768" gmp_and(): Argument #1 ($a) must be of type GMP|string|int|bool, array given diff --git a/ext/gmp/tests/gmp_com.phpt b/ext/gmp/tests/gmp_com.phpt index 09100da96f139..7f653f7ad3637 100644 --- a/ext/gmp/tests/gmp_com.phpt +++ b/ext/gmp/tests/gmp_com.phpt @@ -33,7 +33,7 @@ echo "Done\n"; --EXPECT-- string(2) "-1" string(2) "-1" -gmp_com(): Argument #1 ($a) must be an integer string in base 10 +gmp_com(): Argument #1 ($a) is not an integer string string(14) "-2394876545679" string(3) "110" string(7) "-874654" diff --git a/ext/gmp/tests/gmp_fact.phpt b/ext/gmp/tests/gmp_fact.phpt index 4c75c0f06b651..3829599788e11 100644 --- a/ext/gmp/tests/gmp_fact.phpt +++ b/ext/gmp/tests/gmp_fact.phpt @@ -53,7 +53,7 @@ echo "Done\n"; ?> --EXPECT-- string(1) "1" -gmp_fact(): Argument #1 ($a) must be an integer string in base 10 +gmp_fact(): Argument #1 ($a) is not an integer string string(1) "1" gmp_fact(): Argument #1 ($a) must be greater than or equal to 0 gmp_fact(): Argument #1 ($a) must be greater than or equal to 0 diff --git a/ext/gmp/tests/gmp_init.phpt b/ext/gmp/tests/gmp_init.phpt index 0c2125468da3b..b600a020ec7f9 100644 --- a/ext/gmp/tests/gmp_init.phpt +++ b/ext/gmp/tests/gmp_init.phpt @@ -38,7 +38,7 @@ object(GMP)#1 (1) { } string(8) "98765678" gmp_init(): Argument #2 ($base) must be between 2 and 62 -gmp_init(): Argument #1 ($number) must be an integer string in base 36 -gmp_init(): Argument #1 ($number) must be an integer string in base 3 -gmp_init(): Argument #1 ($number) must be an integer string in base 3 +gmp_init(): Argument #1 ($number) is not an integer string +gmp_init(): Argument #1 ($number) is not an integer string +gmp_init(): Argument #1 ($number) is not an integer string Done diff --git a/ext/gmp/tests/gmp_mod.phpt b/ext/gmp/tests/gmp_mod.phpt index 460deae34f261..a8a56a4d37fb3 100644 --- a/ext/gmp/tests/gmp_mod.phpt +++ b/ext/gmp/tests/gmp_mod.phpt @@ -33,7 +33,7 @@ var_dump(gmp_mod($a, $b)); echo "Done\n"; ?> --EXPECT-- -gmp_mod(): Argument #1 ($a) must be an integer string in base 10 +gmp_mod(): Argument #1 ($a) is not an integer string object(GMP)#2 (1) { ["num"]=> string(1) "0" diff --git a/ext/gmp/tests/gmp_neg.phpt b/ext/gmp/tests/gmp_neg.phpt index fa98f5f21cd57..0bded20758899 100644 --- a/ext/gmp/tests/gmp_neg.phpt +++ b/ext/gmp/tests/gmp_neg.phpt @@ -36,7 +36,7 @@ int(0) int(-1) int(1) int(1) -gmp_neg(): Argument #1 ($a) must be an integer string in base 10 +gmp_neg(): Argument #1 ($a) is not an integer string int(0) int(0) string(21) "-12345678901234567890" diff --git a/ext/gmp/tests/gmp_nextprime.phpt b/ext/gmp/tests/gmp_nextprime.phpt index 3ebfde923d7e3..6f9e9bfaf6b8f 100644 --- a/ext/gmp/tests/gmp_nextprime.phpt +++ b/ext/gmp/tests/gmp_nextprime.phpt @@ -44,6 +44,6 @@ string(1) "2" string(4) "1009" string(6) "100003" gmp_nextprime(): Argument #1 ($a) must be of type GMP|string|int|bool, array given -gmp_nextprime(): Argument #1 ($a) must be an integer string in base 10 +gmp_nextprime(): Argument #1 ($a) is not an integer string gmp_nextprime(): Argument #1 ($a) must be of type GMP|string|int|bool, stdClass given Done diff --git a/ext/gmp/tests/gmp_or.phpt b/ext/gmp/tests/gmp_or.phpt index 5b9a4843e02dd..ad8f26a87afd2 100644 --- a/ext/gmp/tests/gmp_or.phpt +++ b/ext/gmp/tests/gmp_or.phpt @@ -46,7 +46,7 @@ string(6) "517363" string(10) "2342341163" string(2) "-1" string(3) "-19" -gmp_or(): Argument #1 ($a) must be an integer string in base 10 +gmp_or(): Argument #1 ($a) is not an integer string string(15) "987657876576252" string(21) "987658441719689394144" gmp_or(): Argument #1 ($a) must be of type GMP|string|int|bool, array given diff --git a/ext/gmp/tests/gmp_random_seed.phpt b/ext/gmp/tests/gmp_random_seed.phpt index 6e71f27894165..c4dc23e2595be 100644 --- a/ext/gmp/tests/gmp_random_seed.phpt +++ b/ext/gmp/tests/gmp_random_seed.phpt @@ -172,5 +172,5 @@ string(301) "7240560133683902061389868703829443708354917824328579773726122219756 string(4) "9636" string(5) "-9848" string(5) "-9648" -gmp_random_seed(): Argument #1 ($seed) must be an integer string in base 10 +gmp_random_seed(): Argument #1 ($seed) is not an integer string Done diff --git a/ext/gmp/tests/gmp_sign.phpt b/ext/gmp/tests/gmp_sign.phpt index 51b6cbbb36a2f..a660ed9e7631c 100644 --- a/ext/gmp/tests/gmp_sign.phpt +++ b/ext/gmp/tests/gmp_sign.phpt @@ -36,7 +36,7 @@ int(1) int(0) int(1) int(-1) -gmp_sign(): Argument #1 ($a) must be an integer string in base 10 -gmp_init(): Argument #1 ($number) must be an integer string in base 8 +gmp_sign(): Argument #1 ($a) is not an integer string +gmp_init(): Argument #1 ($number) is not an integer string gmp_sign(): Argument #1 ($a) must be of type GMP|string|int|bool, array given Done diff --git a/ext/gmp/tests/gmp_strval.phpt b/ext/gmp/tests/gmp_strval.phpt index 17963291e54bd..722cdfdd8f583 100644 --- a/ext/gmp/tests/gmp_strval.phpt +++ b/ext/gmp/tests/gmp_strval.phpt @@ -65,7 +65,7 @@ try { echo "Done\n"; ?> --EXPECT-- -gmp_strval(): Argument #1 ($gmpnumber) must be an integer string in base 10 +gmp_strval(): Argument #1 ($gmpnumber) is not an integer string gmp_strval(): Argument #2 ($base) must be between 2 and 62, or -2 and -36 gmp_strval(): Argument #1 ($gmpnumber) must be of type GMP|string|int|bool, resource given string(7) "9765456" diff --git a/ext/gmp/tests/gmp_sub.phpt b/ext/gmp/tests/gmp_sub.phpt index efcb3f6a8e0bb..48b1c81092e5c 100644 --- a/ext/gmp/tests/gmp_sub.phpt +++ b/ext/gmp/tests/gmp_sub.phpt @@ -37,7 +37,7 @@ try { echo "Done\n"; ?> --EXPECT-- -gmp_sub(): Argument #1 ($a) must be an integer string in base 10 +gmp_sub(): Argument #1 ($a) is not an integer string gmp_sub(): Argument #1 ($a) must be of type GMP|string|int|bool, array given object(GMP)#1 (1) { ["num"]=> diff --git a/ext/gmp/tests/gmp_xor.phpt b/ext/gmp/tests/gmp_xor.phpt index d4aa0f6c1dd69..fadcd0086e32a 100644 --- a/ext/gmp/tests/gmp_xor.phpt +++ b/ext/gmp/tests/gmp_xor.phpt @@ -46,7 +46,7 @@ string(6) "476369" string(10) "2342340648" string(5) "-3334" string(5) "-4563" -gmp_xor(): Argument #1 ($a) must be an integer string in base 10 +gmp_xor(): Argument #1 ($a) is not an integer string string(15) "987657876574716" string(21) "987658017016065701376" gmp_xor(): Argument #1 ($a) must be of type GMP|string|int|bool, array given