Skip to content

Commit 2bb15f6

Browse files
committed
Refactor bcmatch to avoid the conversion from zend_enum_RoundingMode to PHP_ROUND_*
1 parent e424425 commit 2bb15f6

File tree

4 files changed

+33
-42
lines changed

4 files changed

+33
-42
lines changed

ext/bcmath/bcmath.c

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -788,20 +788,17 @@ PHP_FUNCTION(bcround)
788788
{
789789
zend_string *numstr;
790790
zend_long precision = 0;
791-
zend_long mode;
792-
zend_enum_RoundingMode mode_enum = ZEND_ENUM_RoundingMode_HalfAwayFromZero;
791+
zend_enum_RoundingMode rounding_mode = ZEND_ENUM_RoundingMode_HalfAwayFromZero;
793792
bc_num num = NULL, result;
794793

795794
ZEND_PARSE_PARAMETERS_START(1, 3)
796795
Z_PARAM_STR(numstr)
797796
Z_PARAM_OPTIONAL
798797
Z_PARAM_LONG(precision)
799-
Z_PARAM_ENUM(mode_enum, rounding_mode_ce)
798+
Z_PARAM_ENUM(rounding_mode, rounding_mode_ce)
800799
ZEND_PARSE_PARAMETERS_END();
801800

802-
mode = php_math_round_mode_from_enum(mode_enum);
803-
804-
switch (mode_enum) {
801+
switch (rounding_mode) {
805802
case ZEND_ENUM_RoundingMode_HalfAwayFromZero:
806803
case ZEND_ENUM_RoundingMode_HalfTowardsZero:
807804
case ZEND_ENUM_RoundingMode_HalfEven:
@@ -826,7 +823,7 @@ PHP_FUNCTION(bcround)
826823
goto cleanup;
827824
}
828825

829-
size_t scale = bc_round(num, precision, mode, &result);
826+
size_t scale = bc_round(num, precision, rounding_mode, &result);
830827
RETVAL_NEW_STR(bc_num2str_ex(result, scale));
831828

832829
cleanup: {
@@ -1795,18 +1792,15 @@ PHP_METHOD(BcMath_Number, ceil)
17951792
PHP_METHOD(BcMath_Number, round)
17961793
{
17971794
zend_long precision = 0;
1798-
zend_long rounding_mode;
1799-
zend_enum_RoundingMode mode_enum = ZEND_ENUM_RoundingMode_HalfAwayFromZero;
1795+
zend_enum_RoundingMode rounding_mode = ZEND_ENUM_RoundingMode_HalfAwayFromZero;
18001796

18011797
ZEND_PARSE_PARAMETERS_START(0, 2)
18021798
Z_PARAM_OPTIONAL
18031799
Z_PARAM_LONG(precision);
1804-
Z_PARAM_ENUM(mode_enum, rounding_mode_ce);
1800+
Z_PARAM_ENUM(rounding_mode, rounding_mode_ce);
18051801
ZEND_PARSE_PARAMETERS_END();
18061802

1807-
rounding_mode = php_math_round_mode_from_enum(mode_enum);
1808-
1809-
switch (mode_enum) {
1803+
switch (rounding_mode) {
18101804
case ZEND_ENUM_RoundingMode_HalfAwayFromZero:
18111805
case ZEND_ENUM_RoundingMode_HalfTowardsZero:
18121806
case ZEND_ENUM_RoundingMode_HalfEven:
@@ -1817,6 +1811,7 @@ PHP_METHOD(BcMath_Number, round)
18171811
case ZEND_ENUM_RoundingMode_PositiveInfinity:
18181812
break;
18191813
default:
1814+
/* This is currently unreachable, but might become reachable when new modes are added. */
18201815
zend_argument_value_error(2, "is an unsupported rounding mode");
18211816
RETURN_THROWS();
18221817
}

ext/bcmath/libbcmath/src/bcmath.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ bool bc_divmod(bc_num num1, bc_num num2, bc_num *quo, bc_num *rem, size_t scale)
155155

156156
bc_num bc_floor_or_ceil(bc_num num, bool is_floor);
157157

158-
size_t bc_round(bc_num num, zend_long places, zend_long mode, bc_num *result);
158+
size_t bc_round(bc_num num, zend_long places, zend_enum_RoundingMode mode, bc_num *result);
159159

160160
typedef enum {
161161
BC_RAISE_STATUS_OK,

ext/bcmath/libbcmath/src/round.c

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#include <stddef.h>
2020

2121
/* Returns the scale of the value after rounding. */
22-
size_t bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
22+
size_t bc_round(bc_num num, zend_long precision, zend_enum_RoundingMode mode, bc_num *result)
2323
{
2424
/* clear result */
2525
bc_free_num(result);
@@ -38,32 +38,30 @@ size_t bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
3838
/* e.g. value is 0.1 and precision is -3, ret is 0 or 1000 */
3939
if (precision < 0 && num->n_len < (size_t) (-(precision + Z_L(1))) + 1) {
4040
switch (mode) {
41-
case PHP_ROUND_HALF_UP:
42-
case PHP_ROUND_HALF_DOWN:
43-
case PHP_ROUND_HALF_EVEN:
44-
case PHP_ROUND_HALF_ODD:
45-
case PHP_ROUND_TOWARD_ZERO:
41+
case ZEND_ENUM_RoundingMode_HalfAwayFromZero:
42+
case ZEND_ENUM_RoundingMode_HalfTowardsZero:
43+
case ZEND_ENUM_RoundingMode_HalfEven:
44+
case ZEND_ENUM_RoundingMode_HalfOdd:
45+
case ZEND_ENUM_RoundingMode_TowardsZero:
4646
*result = bc_copy_num(BCG(_zero_));
4747
return 0;
4848

49-
case PHP_ROUND_CEILING:
49+
case ZEND_ENUM_RoundingMode_PositiveInfinity:
5050
if (num->n_sign == MINUS) {
5151
*result = bc_copy_num(BCG(_zero_));
5252
return 0;
5353
}
5454
break;
5555

56-
case PHP_ROUND_FLOOR:
56+
case ZEND_ENUM_RoundingMode_NegativeInfinity:
5757
if (num->n_sign == PLUS) {
5858
*result = bc_copy_num(BCG(_zero_));
5959
return 0;
6060
}
6161
break;
6262

63-
case PHP_ROUND_AWAY_FROM_ZERO:
63+
case ZEND_ENUM_RoundingMode_AwayFromZero:
6464
break;
65-
66-
EMPTY_SWITCH_DEFAULT_CASE()
6765
}
6866

6967
if (bc_is_zero(num)) {
@@ -117,17 +115,17 @@ size_t bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
117115

118116
/* Check cases that can be determined without looping. */
119117
switch (mode) {
120-
case PHP_ROUND_HALF_UP:
118+
case ZEND_ENUM_RoundingMode_HalfAwayFromZero:
121119
if (*nptr >= 5) {
122120
goto up;
123121
} else if (*nptr < 5) {
124122
goto check_zero;
125123
}
126124
break;
127125

128-
case PHP_ROUND_HALF_DOWN:
129-
case PHP_ROUND_HALF_EVEN:
130-
case PHP_ROUND_HALF_ODD:
126+
case ZEND_ENUM_RoundingMode_HalfTowardsZero:
127+
case ZEND_ENUM_RoundingMode_HalfEven:
128+
case ZEND_ENUM_RoundingMode_HalfOdd:
131129
if (*nptr > 5) {
132130
goto up;
133131
} else if (*nptr < 5) {
@@ -136,7 +134,7 @@ size_t bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
136134
/* if *nptr == 5, we need to look-up further digits before making a decision. */
137135
break;
138136

139-
case PHP_ROUND_CEILING:
137+
case ZEND_ENUM_RoundingMode_PositiveInfinity:
140138
if (num->n_sign != PLUS) {
141139
goto check_zero;
142140
} else if (*nptr > 0) {
@@ -145,7 +143,7 @@ size_t bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
145143
/* if *nptr == 0, a loop is required for judgment. */
146144
break;
147145

148-
case PHP_ROUND_FLOOR:
146+
case ZEND_ENUM_RoundingMode_NegativeInfinity:
149147
if (num->n_sign != MINUS) {
150148
goto check_zero;
151149
} else if (*nptr > 0) {
@@ -154,17 +152,15 @@ size_t bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
154152
/* if *nptr == 0, a loop is required for judgment. */
155153
break;
156154

157-
case PHP_ROUND_TOWARD_ZERO:
155+
case ZEND_ENUM_RoundingMode_TowardsZero:
158156
goto check_zero;
159157

160-
case PHP_ROUND_AWAY_FROM_ZERO:
158+
case ZEND_ENUM_RoundingMode_AwayFromZero:
161159
if (*nptr > 0) {
162160
goto up;
163161
}
164162
/* if *nptr == 0, a loop is required for judgment. */
165163
break;
166-
167-
EMPTY_SWITCH_DEFAULT_CASE()
168164
}
169165

170166
/* Loop through the remaining digits. */
@@ -180,19 +176,19 @@ size_t bc_round(bc_num num, zend_long precision, zend_long mode, bc_num *result)
180176
}
181177

182178
switch (mode) {
183-
case PHP_ROUND_HALF_DOWN:
184-
case PHP_ROUND_CEILING:
185-
case PHP_ROUND_FLOOR:
186-
case PHP_ROUND_AWAY_FROM_ZERO:
179+
case ZEND_ENUM_RoundingMode_HalfTowardsZero:
180+
case ZEND_ENUM_RoundingMode_PositiveInfinity:
181+
case ZEND_ENUM_RoundingMode_NegativeInfinity:
182+
case ZEND_ENUM_RoundingMode_AwayFromZero:
187183
goto check_zero;
188184

189-
case PHP_ROUND_HALF_EVEN:
185+
case ZEND_ENUM_RoundingMode_HalfEven:
190186
if (rounded_len == 0 || num->n_value[rounded_len - 1] % 2 == 0) {
191187
goto check_zero;
192188
}
193189
break;
194190

195-
case PHP_ROUND_HALF_ODD:
191+
case ZEND_ENUM_RoundingMode_HalfOdd:
196192
if (rounded_len != 0 && num->n_value[rounded_len - 1] % 2 == 1) {
197193
goto check_zero;
198194
}

ext/bcmath/php_bcmath.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
#ifndef PHP_BCMATH_H
1818
#define PHP_BCMATH_H
1919

20+
#include "ext/standard/php_math_round_mode.h"
2021
#include "libbcmath/src/bcmath.h"
2122
#include "zend_API.h"
22-
#include "ext/standard/php_math_round_mode.h"
2323

2424
extern zend_module_entry bcmath_module_entry;
2525
#define phpext_bcmath_ptr &bcmath_module_entry

0 commit comments

Comments
 (0)