Skip to content

Commit 30f4c4f

Browse files
committed
Attempt to make the BCMath adjustments
1 parent 0716f54 commit 30f4c4f

10 files changed

+33
-42
lines changed

ext/bcmath/bcmath.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -696,15 +696,20 @@ PHP_FUNCTION(bcround)
696696
zend_string *numstr;
697697
zend_long precision = 0;
698698
zend_long mode = PHP_ROUND_HALF_UP;
699+
zend_object mode_object = NULL;
699700
bc_num num = NULL, result;
700701

701702
ZEND_PARSE_PARAMETERS_START(1, 3)
702703
Z_PARAM_STR(numstr)
703704
Z_PARAM_OPTIONAL
704705
Z_PARAM_LONG(precision)
705-
Z_PARAM_LONG(mode)
706+
Z_PARAM_OBJ_OF_CLASS(mode_object, rounding_mode_ce)
706707
ZEND_PARSE_PARAMETERS_END();
707708

709+
if (mode_object != NULL) {
710+
mode = php_math_round_mode_from_enum(mode_object);
711+
}
712+
708713
switch (mode) {
709714
case PHP_ROUND_HALF_UP:
710715
case PHP_ROUND_HALF_DOWN:
@@ -716,7 +721,8 @@ PHP_FUNCTION(bcround)
716721
case PHP_ROUND_AWAY_FROM_ZERO:
717722
break;
718723
default:
719-
zend_argument_value_error(3, "must be a valid rounding mode (PHP_ROUND_*)");
724+
/* This is currently unreachable, but might become reachable when new modes are added. */
725+
zend_argument_value_error(3, " is a rounding mode that is not supported");
720726
return;
721727
}
722728

ext/bcmath/tests/bcround_ceiling.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
--TEST--
2-
bcround() function PHP_ROUND_CEILING
2+
bcround() function PositiveInfinity
33
--EXTENSIONS--
44
bcmath
55
--FILE--
66
<?php
77
require_once __DIR__ . '/bcround_test_helper.inc';
8-
run_round_test(PHP_ROUND_CEILING);
8+
run_round_test(RoundingMode::PositiveInfinity);
99
?>
1010
--EXPECT--
1111
========== non-boundary value ==========

ext/bcmath/tests/bcround_early_return.phpt

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,6 @@ bcround() function with early return
44
bcmath
55
--FILE--
66
<?php
7-
$otherModes = [
8-
'PHP_ROUND_HALF_DOWN',
9-
'PHP_ROUND_HALF_EVEN',
10-
'PHP_ROUND_HALF_ODD',
11-
'PHP_ROUND_FLOOR',
12-
'PHP_ROUND_CEILING',
13-
'PHP_ROUND_AWAY_FROM_ZERO',
14-
'PHP_ROUND_TOWARD_ZERO',
15-
];
167

178
$early_return_cases = [
189
['123', -4],
@@ -38,33 +29,27 @@ $early_return_cases = [
3829
];
3930

4031
$results = [
41-
'PHP_ROUND_HALF_UP' => [],
42-
'PHP_ROUND_HALF_DOWN' => [],
43-
'PHP_ROUND_HALF_EVEN' => [],
44-
'PHP_ROUND_HALF_ODD' => [],
45-
'PHP_ROUND_FLOOR' => [],
46-
'PHP_ROUND_CEIL' => [],
47-
'PHP_ROUND_AWAY_FROM_ZERO' => [],
48-
'PHP_ROUND_TOWARD_ZERO' => [],
32+
RoundingMode::HalfAwayFromZero->name => [],
4933
];
5034
foreach ($early_return_cases as [$num, $precision]) {
51-
$result = str_pad("[{$num}, {$precision}]", 33, ' ', STR_PAD_LEFT) . ' => ' . bcround($num, $precision, PHP_ROUND_HALF_UP) . "\n";
35+
$result = str_pad("[{$num}, {$precision}]", 33, ' ', STR_PAD_LEFT) . ' => ' . bcround($num, $precision, RoundingMode::HalfAwayFromZero) . "\n";
5236
echo $result;
53-
$results['PHP_ROUND_HALF_UP'][] = $result;
37+
$results[RoundingMode::HalfAwayFromZero->name][] = $result;
5438
}
5539

5640
echo "\n";
5741

58-
foreach ($otherModes as $mode) {
42+
foreach (RoundingMode::cases() as $mode) {
43+
$results[$mode->name] = [];
5944
foreach ($early_return_cases as [$num, $precision]) {
60-
$result = str_pad("[{$num}, {$precision}]", 33, ' ', STR_PAD_LEFT) . ' => ' . bcround($num, $precision, constant($mode)) . "\n";
61-
$results[$mode][] = $result;
45+
$result = str_pad("[{$num}, {$precision}]", 33, ' ', STR_PAD_LEFT) . ' => ' . bcround($num, $precision, $mode) . "\n";
46+
$results[$mode->name][] = $result;
6247
}
6348

64-
if ($results['PHP_ROUND_HALF_UP'] === $results[$mode]) {
65-
echo str_pad($mode, 24, ' ', STR_PAD_LEFT) . ": result is same to PHP_ROUND_HALF_UP\n";
49+
if ($results[RoundingMode::HalfAwayFromZero->name] === $results[$mode->name]) {
50+
echo str_pad($mode->name, 24, ' ', STR_PAD_LEFT) . ": result is same to HalfAwayFromZero\n";
6651
} else {
67-
echo str_pad($mode, 24, ' ', STR_PAD_LEFT) . ": result is not same to PHP_ROUND_HALF_UP, failed\n";
52+
echo str_pad($mode->name, 24, ' ', STR_PAD_LEFT) . ": result is not same to HalfAwayFromZero, failed\n";
6853
}
6954
}
7055
?>

ext/bcmath/tests/bcround_error.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ try {
2525
--EXPECT--
2626
bcround(): Argument #1 ($num) is not well-formed
2727
bcround(): Argument #1 ($num) is not well-formed
28-
bcround(): Argument #3 ($mode) must be a valid rounding mode (PHP_ROUND_*)
28+
bcround(): Argument #3 ($mode) must be of type RoundingMode, int given

ext/bcmath/tests/bcround_floor.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
--TEST--
2-
bcround() function PHP_ROUND_FLOOR
2+
bcround() function NegativeInfinity
33
--EXTENSIONS--
44
bcmath
55
--FILE--
66
<?php
77
require_once __DIR__ . '/bcround_test_helper.inc';
8-
run_round_test(PHP_ROUND_FLOOR);
8+
run_round_test(RoundingMode::NegativeInfinity);
99
?>
1010
--EXPECT--
1111
========== non-boundary value ==========

ext/bcmath/tests/bcround_half_down.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
--TEST--
2-
bcround() function PHP_ROUND_HALF_DOWN
2+
bcround() function HalfTowardsZero
33
--EXTENSIONS--
44
bcmath
55
--FILE--
66
<?php
77
require_once __DIR__ . '/bcround_test_helper.inc';
8-
run_round_test(PHP_ROUND_HALF_DOWN);
8+
run_round_test(RoundingMode::HalfTowardsZero);
99
?>
1010
--EXPECT--
1111
========== non-boundary value ==========

ext/bcmath/tests/bcround_half_even.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
--TEST--
2-
bcround() function PHP_ROUND_HALF_EVEN
2+
bcround() function HalfEven
33
--EXTENSIONS--
44
bcmath
55
--FILE--
66
<?php
77
require_once __DIR__ . '/bcround_test_helper.inc';
8-
run_round_test(PHP_ROUND_HALF_EVEN);
8+
run_round_test(RoundingMode::HalfEven);
99
?>
1010
--EXPECT--
1111
========== non-boundary value ==========

ext/bcmath/tests/bcround_half_odd.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
--TEST--
2-
bcround() function PHP_ROUND_HALF_ODD
2+
bcround() function HalfOdd
33
--EXTENSIONS--
44
bcmath
55
--FILE--
66
<?php
77
require_once __DIR__ . '/bcround_test_helper.inc';
8-
run_round_test(PHP_ROUND_HALF_ODD);
8+
run_round_test(RoundingMode::HalfOdd);
99
?>
1010
--EXPECT--
1111
========== non-boundary value ==========

ext/bcmath/tests/bcround_half_up.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
--TEST--
2-
bcround() function PHP_ROUND_HALF_UP
2+
bcround() function HalfAwayFromZero
33
--EXTENSIONS--
44
bcmath
55
--FILE--
66
<?php
77
require_once __DIR__ . '/bcround_test_helper.inc';
8-
run_round_test(PHP_ROUND_HALF_UP);
8+
run_round_test(RoundingMode::HalfAwayFromZero);
99
?>
1010
--EXPECT--
1111
========== non-boundary value ==========

ext/bcmath/tests/bcround_toward_zero.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
--TEST--
2-
bcround() function PHP_ROUND_TOWARD_ZERO
2+
bcround() function TowardsZero
33
--EXTENSIONS--
44
bcmath
55
--FILE--
66
<?php
77
require_once __DIR__ . '/bcround_test_helper.inc';
8-
run_round_test(PHP_ROUND_TOWARD_ZERO);
8+
run_round_test(RoundingMode::TowardsZero);
99
?>
1010
--EXPECT--
1111
========== non-boundary value ==========

0 commit comments

Comments
 (0)