mirror of
https://github.com/php/php-src.git
synced 2024-11-27 03:44:07 +08:00
Elevate warnings to Error Exceptions in ext/bcmath
`bcdiv()` and `bcmod()` throw DivisionByZeroError if the divisor is 0, which matches the behavior of the `/` and `%` operators, and `bcsqrt()` throws ValueError for negative operands.
This commit is contained in:
parent
82dc9a31c3
commit
84f2a984d4
@ -23,6 +23,7 @@
|
||||
#if HAVE_BCMATH
|
||||
|
||||
#include "php_ini.h"
|
||||
#include "zend_exceptions.h"
|
||||
#include "bcmath_arginfo.h"
|
||||
#include "ext/standard/info.h"
|
||||
#include "php_bcmath.h"
|
||||
@ -284,7 +285,7 @@ PHP_FUNCTION(bcdiv)
|
||||
RETVAL_STR(bc_num2str_ex(result, scale));
|
||||
break;
|
||||
case -1: /* division by zero */
|
||||
php_error_docref(NULL, E_WARNING, "Division by zero");
|
||||
zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero");
|
||||
break;
|
||||
}
|
||||
|
||||
@ -326,7 +327,7 @@ PHP_FUNCTION(bcmod)
|
||||
RETVAL_STR(bc_num2str_ex(result, scale));
|
||||
break;
|
||||
case -1:
|
||||
php_error_docref(NULL, E_WARNING, "Division by zero");
|
||||
zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
|
||||
break;
|
||||
}
|
||||
|
||||
@ -438,7 +439,7 @@ PHP_FUNCTION(bcsqrt)
|
||||
if (bc_sqrt (&result, scale) != 0) {
|
||||
RETVAL_STR(bc_num2str_ex(result, scale));
|
||||
} else {
|
||||
php_error_docref(NULL, E_WARNING, "Square root of negative number");
|
||||
zend_value_error("Square root of negative number");
|
||||
}
|
||||
|
||||
bc_free_num(&result);
|
||||
|
@ -6,16 +6,16 @@ function bcsub(string $left_operand, string $right_operand, int $scale = UNKNOWN
|
||||
|
||||
function bcmul(string $left_operand, string $right_operand, int $scale = UNKNOWN) : string {}
|
||||
|
||||
function bcdiv(string $dividend, string $divisor, int $scale = UNKNOWN) : ?string {}
|
||||
function bcdiv(string $dividend, string $divisor, int $scale = UNKNOWN) : string {}
|
||||
|
||||
function bcmod(string $dividend, string $divisor, int $scale = UNKNOWN) : ?string {}
|
||||
function bcmod(string $dividend, string $divisor, int $scale = UNKNOWN) : string {}
|
||||
|
||||
/** @return string|false */
|
||||
function bcpowmod(string $base, string $exponent, string $modulus, int $scale = UNKNOWN) {}
|
||||
|
||||
function bcpow(string $base, string $exponent, int $scale = UNKNOWN) : string {}
|
||||
|
||||
function bcsqrt(string $operand, int $scale = UNKNOWN) : ?string {}
|
||||
function bcsqrt(string $operand, int $scale = UNKNOWN) : string {}
|
||||
|
||||
function bccomp(string $left_operand, string $right_operand, int $scale = UNKNOWN) : int {}
|
||||
|
||||
|
@ -10,7 +10,7 @@ ZEND_END_ARG_INFO()
|
||||
|
||||
#define arginfo_bcmul arginfo_bcadd
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcdiv, 0, 2, IS_STRING, 1)
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcdiv, 0, 2, IS_STRING, 0)
|
||||
ZEND_ARG_TYPE_INFO(0, dividend, IS_STRING, 0)
|
||||
ZEND_ARG_TYPE_INFO(0, divisor, IS_STRING, 0)
|
||||
ZEND_ARG_TYPE_INFO(0, scale, IS_LONG, 0)
|
||||
@ -31,7 +31,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcpow, 0, 2, IS_STRING, 0)
|
||||
ZEND_ARG_TYPE_INFO(0, scale, IS_LONG, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcsqrt, 0, 1, IS_STRING, 1)
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcsqrt, 0, 1, IS_STRING, 0)
|
||||
ZEND_ARG_TYPE_INFO(0, operand, IS_STRING, 0)
|
||||
ZEND_ARG_TYPE_INFO(0, scale, IS_LONG, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
@ -8,7 +8,11 @@ antoni@solucionsinternet.com
|
||||
<?php if(!extension_loaded("bcmath")) print "skip"; ?>
|
||||
--FILE--
|
||||
<?php
|
||||
echo bcdiv('10.99', '0');
|
||||
try {
|
||||
bcdiv('10.99', '0');
|
||||
} catch (DivisionByZeroError $ex) {
|
||||
echo $ex->getMessage(), PHP_EOL;
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: bcdiv(): Division by zero in %s.php on line %d
|
||||
--EXPECT--
|
||||
Division by zero
|
||||
|
@ -6,7 +6,11 @@ bcmod() - mod by 0
|
||||
bcmath.scale=0
|
||||
--FILE--
|
||||
<?php
|
||||
echo bcmod("10", "0");
|
||||
try {
|
||||
bcmod("10", "0");
|
||||
} catch (DivisionByZeroError $ex) {
|
||||
echo $ex->getMessage(), PHP_EOL;
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: bcmod(): Division by zero in %s on line %d
|
||||
--EXPECT--
|
||||
Modulo by zero
|
||||
|
@ -7,7 +7,11 @@ antoni@solucionsinternet.com
|
||||
<?php if(!extension_loaded("bcmath")) print "skip"; ?>
|
||||
--FILE--
|
||||
<?php
|
||||
echo bcsqrt('-9');
|
||||
try {
|
||||
bcsqrt('-9');
|
||||
} catch (ValueError $ex) {
|
||||
echo $ex->getMessage(), PHP_EOL;
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: bcsqrt(): Square root of negative number in %s.php on line %d
|
||||
--EXPECT--
|
||||
Square root of negative number
|
||||
|
Loading…
Reference in New Issue
Block a user