Skip to content

Commit d95e222

Browse files
authored
Zend: Use a dedicated enum for the status of the result of a division (#16020)
1 parent 623c327 commit d95e222

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

Zend/zend_operators.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,10 +1389,13 @@ ZEND_API zend_result ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *o
13891389
}
13901390
/* }}} */
13911391

1392-
/* Returns SUCCESS/TYPES_NOT_HANDLED/DIV_BY_ZERO */
1393-
#define TYPES_NOT_HANDLED 1
1394-
#define DIV_BY_ZERO 2
1395-
static int ZEND_FASTCALL div_function_base(zval *result, zval *op1, zval *op2) /* {{{ */
1392+
typedef enum {
1393+
DIV_SUCCESS,
1394+
DIV_BY_ZERO,
1395+
DIV_TYPES_NOT_HANDLED
1396+
} zend_div_status;
1397+
1398+
static zend_div_status ZEND_FASTCALL div_function_base(zval *result, const zval *op1, const zval *op2) /* {{{ */
13961399
{
13971400
uint8_t type_pair = TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2));
13981401

@@ -1402,34 +1405,34 @@ static int ZEND_FASTCALL div_function_base(zval *result, zval *op1, zval *op2) /
14021405
} else if (Z_LVAL_P(op2) == -1 && Z_LVAL_P(op1) == ZEND_LONG_MIN) {
14031406
/* Prevent overflow error/crash */
14041407
ZVAL_DOUBLE(result, (double) ZEND_LONG_MIN / -1);
1405-
return SUCCESS;
1408+
return DIV_SUCCESS;
14061409
}
14071410
if (Z_LVAL_P(op1) % Z_LVAL_P(op2) == 0) { /* integer */
14081411
ZVAL_LONG(result, Z_LVAL_P(op1) / Z_LVAL_P(op2));
14091412
} else {
14101413
ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1)) / Z_LVAL_P(op2));
14111414
}
1412-
return SUCCESS;
1415+
return DIV_SUCCESS;
14131416
} else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_DOUBLE))) {
14141417
if (Z_DVAL_P(op2) == 0) {
14151418
return DIV_BY_ZERO;
14161419
}
14171420
ZVAL_DOUBLE(result, Z_DVAL_P(op1) / Z_DVAL_P(op2));
1418-
return SUCCESS;
1421+
return DIV_SUCCESS;
14191422
} else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_LONG))) {
14201423
if (Z_LVAL_P(op2) == 0) {
14211424
return DIV_BY_ZERO;
14221425
}
14231426
ZVAL_DOUBLE(result, Z_DVAL_P(op1) / (double)Z_LVAL_P(op2));
1424-
return SUCCESS;
1427+
return DIV_SUCCESS;
14251428
} else if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_DOUBLE))) {
14261429
if (Z_DVAL_P(op2) == 0) {
14271430
return DIV_BY_ZERO;
14281431
}
14291432
ZVAL_DOUBLE(result, (double)Z_LVAL_P(op1) / Z_DVAL_P(op2));
1430-
return SUCCESS;
1433+
return DIV_SUCCESS;
14311434
} else {
1432-
return TYPES_NOT_HANDLED;
1435+
return DIV_TYPES_NOT_HANDLED;
14331436
}
14341437
}
14351438
/* }}} */
@@ -1439,8 +1442,8 @@ ZEND_API zend_result ZEND_FASTCALL div_function(zval *result, zval *op1, zval *o
14391442
ZVAL_DEREF(op1);
14401443
ZVAL_DEREF(op2);
14411444

1442-
int retval = div_function_base(result, op1, op2);
1443-
if (EXPECTED(retval == SUCCESS)) {
1445+
zend_div_status retval = div_function_base(result, op1, op2);
1446+
if (EXPECTED(retval == DIV_SUCCESS)) {
14441447
return SUCCESS;
14451448
}
14461449

@@ -1461,7 +1464,7 @@ ZEND_API zend_result ZEND_FASTCALL div_function(zval *result, zval *op1, zval *o
14611464
}
14621465

14631466
retval = div_function_base(&result_copy, &op1_copy, &op2_copy);
1464-
if (retval == SUCCESS) {
1467+
if (retval == DIV_SUCCESS) {
14651468
if (result == op1) {
14661469
zval_ptr_dtor(result);
14671470
}
@@ -1470,7 +1473,7 @@ ZEND_API zend_result ZEND_FASTCALL div_function(zval *result, zval *op1, zval *o
14701473
}
14711474

14721475
div_by_zero:
1473-
ZEND_ASSERT(retval == DIV_BY_ZERO && "TYPES_NOT_HANDLED should not occur here");
1476+
ZEND_ASSERT(retval == DIV_BY_ZERO && "DIV_TYPES_NOT_HANDLED should not occur here");
14741477
if (result != op1) {
14751478
ZVAL_UNDEF(result);
14761479
}

0 commit comments

Comments
 (0)