Skip to content

Commit 82aad0b

Browse files
authored
Unify type juggling in math.c (#12286)
- Consistently use a `switch()` with `EMPTY_SWITCH_DEFAULT_CASE();` - Consistently use `zval_get_double()` for multi-type / non-double zvals instead of casting manually.
1 parent 0a8ff0b commit 82aad0b

File tree

1 file changed

+26
-31
lines changed

1 file changed

+26
-31
lines changed

ext/standard/math.c

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,8 @@ static inline double php_round_helper(double value, int mode) {
157157
}
158158

159159
return integral;
160+
EMPTY_SWITCH_DEFAULT_CASE();
160161
}
161-
162-
ZEND_UNREACHABLE();
163162
}
164163
/* }}} */
165164

@@ -259,16 +258,16 @@ PHP_FUNCTION(abs)
259258
Z_PARAM_NUMBER(value)
260259
ZEND_PARSE_PARAMETERS_END();
261260

262-
if (Z_TYPE_P(value) == IS_DOUBLE) {
263-
RETURN_DOUBLE(fabs(Z_DVAL_P(value)));
264-
} else if (Z_TYPE_P(value) == IS_LONG) {
265-
if (Z_LVAL_P(value) == ZEND_LONG_MIN) {
266-
RETURN_DOUBLE(-(double)ZEND_LONG_MIN);
267-
} else {
268-
RETURN_LONG(Z_LVAL_P(value) < 0 ? -Z_LVAL_P(value) : Z_LVAL_P(value));
269-
}
270-
} else {
271-
ZEND_ASSERT(0 && "Unexpected type");
261+
switch (Z_TYPE_P(value)) {
262+
case IS_LONG:
263+
if (Z_LVAL_P(value) == ZEND_LONG_MIN) {
264+
RETURN_DOUBLE(-(double)ZEND_LONG_MIN);
265+
} else {
266+
RETURN_LONG(Z_LVAL_P(value) < 0 ? -Z_LVAL_P(value) : Z_LVAL_P(value));
267+
}
268+
case IS_DOUBLE:
269+
RETURN_DOUBLE(fabs(Z_DVAL_P(value)));
270+
EMPTY_SWITCH_DEFAULT_CASE();
272271
}
273272
}
274273
/* }}} */
@@ -282,12 +281,12 @@ PHP_FUNCTION(ceil)
282281
Z_PARAM_NUMBER(value)
283282
ZEND_PARSE_PARAMETERS_END();
284283

285-
if (Z_TYPE_P(value) == IS_DOUBLE) {
286-
RETURN_DOUBLE(ceil(Z_DVAL_P(value)));
287-
} else if (Z_TYPE_P(value) == IS_LONG) {
288-
RETURN_DOUBLE(zval_get_double(value));
289-
} else {
290-
ZEND_ASSERT(0 && "Unexpected type");
284+
switch (Z_TYPE_P(value)) {
285+
case IS_LONG:
286+
RETURN_DOUBLE(zval_get_double(value));
287+
case IS_DOUBLE:
288+
RETURN_DOUBLE(ceil(Z_DVAL_P(value)));
289+
EMPTY_SWITCH_DEFAULT_CASE();
291290
}
292291
}
293292
/* }}} */
@@ -301,12 +300,12 @@ PHP_FUNCTION(floor)
301300
Z_PARAM_NUMBER(value)
302301
ZEND_PARSE_PARAMETERS_END();
303302

304-
if (Z_TYPE_P(value) == IS_DOUBLE) {
305-
RETURN_DOUBLE(floor(Z_DVAL_P(value)));
306-
} else if (Z_TYPE_P(value) == IS_LONG) {
307-
RETURN_DOUBLE(zval_get_double(value));
308-
} else {
309-
ZEND_ASSERT(0 && "Unexpected type");
303+
switch (Z_TYPE_P(value)) {
304+
case IS_LONG:
305+
RETURN_DOUBLE(zval_get_double(value));
306+
case IS_DOUBLE:
307+
RETURN_DOUBLE(floor(Z_DVAL_P(value)));
308+
EMPTY_SWITCH_DEFAULT_CASE();
310309
}
311310
}
312311
/* }}} */
@@ -318,7 +317,6 @@ PHP_FUNCTION(round)
318317
int places = 0;
319318
zend_long precision = 0;
320319
zend_long mode = PHP_ROUND_HALF_UP;
321-
double return_val;
322320

323321
ZEND_PARSE_PARAMETERS_START(1, 3)
324322
Z_PARAM_NUMBER(value)
@@ -350,17 +348,14 @@ PHP_FUNCTION(round)
350348
case IS_LONG:
351349
/* Simple case - long that doesn't need to be rounded. */
352350
if (places >= 0) {
353-
RETURN_DOUBLE((double) Z_LVAL_P(value));
351+
RETURN_DOUBLE(zval_get_double(value));
354352
}
355353
ZEND_FALLTHROUGH;
356354

357355
case IS_DOUBLE:
358-
return_val = (Z_TYPE_P(value) == IS_LONG) ? (double)Z_LVAL_P(value) : Z_DVAL_P(value);
359-
return_val = _php_math_round(return_val, (int)places, (int)mode);
360-
RETURN_DOUBLE(return_val);
361-
break;
356+
RETURN_DOUBLE(_php_math_round(zval_get_double(value), (int)places, (int)mode));
362357

363-
EMPTY_SWITCH_DEFAULT_CASE()
358+
EMPTY_SWITCH_DEFAULT_CASE();
364359
}
365360
}
366361
/* }}} */

0 commit comments

Comments
 (0)