@@ -1297,15 +1297,16 @@ ZEND_API zend_result ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *o
1297
1297
}
1298
1298
/* }}} */
1299
1299
1300
- /* Returns SUCCESS/FAILURE/ TYPES_NOT_HANDLED */
1300
+ /* Returns SUCCESS/TYPES_NOT_HANDLED/DIV_BY_ZERO */
1301
1301
#define TYPES_NOT_HANDLED 1
1302
+ #define DIV_BY_ZERO 2
1302
1303
static int ZEND_FASTCALL div_function_base (zval * result , zval * op1 , zval * op2 ) /* {{{ */
1303
1304
{
1304
1305
zend_uchar type_pair = TYPE_PAIR (Z_TYPE_P (op1 ), Z_TYPE_P (op2 ));
1305
1306
1306
1307
if (EXPECTED (type_pair == TYPE_PAIR (IS_LONG , IS_LONG ))) {
1307
1308
if (Z_LVAL_P (op2 ) == 0 ) {
1308
- goto division_by_0 ;
1309
+ return DIV_BY_ZERO ;
1309
1310
} else if (Z_LVAL_P (op2 ) == -1 && Z_LVAL_P (op1 ) == ZEND_LONG_MIN ) {
1310
1311
/* Prevent overflow error/crash */
1311
1312
ZVAL_DOUBLE (result , (double ) ZEND_LONG_MIN / -1 );
@@ -1319,31 +1320,25 @@ static int ZEND_FASTCALL div_function_base(zval *result, zval *op1, zval *op2) /
1319
1320
return SUCCESS ;
1320
1321
} else if (EXPECTED (type_pair == TYPE_PAIR (IS_DOUBLE , IS_DOUBLE ))) {
1321
1322
if (Z_DVAL_P (op2 ) == 0 ) {
1322
- goto division_by_0 ;
1323
+ return DIV_BY_ZERO ;
1323
1324
}
1324
1325
ZVAL_DOUBLE (result , Z_DVAL_P (op1 ) / Z_DVAL_P (op2 ));
1325
1326
return SUCCESS ;
1326
1327
} else if (EXPECTED (type_pair == TYPE_PAIR (IS_DOUBLE , IS_LONG ))) {
1327
1328
if (Z_LVAL_P (op2 ) == 0 ) {
1328
- goto division_by_0 ;
1329
+ return DIV_BY_ZERO ;
1329
1330
}
1330
1331
ZVAL_DOUBLE (result , Z_DVAL_P (op1 ) / (double )Z_LVAL_P (op2 ));
1331
1332
return SUCCESS ;
1332
1333
} else if (EXPECTED (type_pair == TYPE_PAIR (IS_LONG , IS_DOUBLE ))) {
1333
1334
if (Z_DVAL_P (op2 ) == 0 ) {
1334
- goto division_by_0 ;
1335
+ return DIV_BY_ZERO ;
1335
1336
}
1336
1337
ZVAL_DOUBLE (result , (double )Z_LVAL_P (op1 ) / Z_DVAL_P (op2 ));
1337
1338
return SUCCESS ;
1338
1339
} else {
1339
1340
return TYPES_NOT_HANDLED ;
1340
1341
}
1341
- division_by_0 :
1342
- if (result != op1 ) {
1343
- ZVAL_UNDEF (result );
1344
- }
1345
- zend_throw_error (zend_ce_division_by_zero_error , "Division by zero" );
1346
- return FAILURE ;
1347
1342
}
1348
1343
/* }}} */
1349
1344
@@ -1353,8 +1348,12 @@ ZEND_API zend_result ZEND_FASTCALL div_function(zval *result, zval *op1, zval *o
1353
1348
ZVAL_DEREF (op2 );
1354
1349
1355
1350
int retval = div_function_base (result , op1 , op2 );
1356
- if (retval != TYPES_NOT_HANDLED ) {
1357
- return retval ;
1351
+ if (EXPECTED (retval == SUCCESS )) {
1352
+ return SUCCESS ;
1353
+ }
1354
+
1355
+ if (UNEXPECTED (retval == DIV_BY_ZERO )) {
1356
+ goto div_by_zero ;
1358
1357
}
1359
1358
1360
1359
ZEND_TRY_BINARY_OBJECT_OPERATION (ZEND_DIV );
@@ -1374,8 +1373,17 @@ ZEND_API zend_result ZEND_FASTCALL div_function(zval *result, zval *op1, zval *o
1374
1373
}
1375
1374
1376
1375
retval = div_function_base (result , & op1_copy , & op2_copy );
1377
- ZEND_ASSERT (retval != TYPES_NOT_HANDLED && "Types should be handled" );
1378
- return retval ;
1376
+ if (retval == SUCCESS ) {
1377
+ return SUCCESS ;
1378
+ }
1379
+
1380
+ div_by_zero :
1381
+ ZEND_ASSERT (retval == DIV_BY_ZERO && "TYPES_NOT_HANDLED should not occur here" );
1382
+ if (result != op1 ) {
1383
+ ZVAL_UNDEF (result );
1384
+ }
1385
+ zend_throw_error (zend_ce_division_by_zero_error , "Division by zero" );
1386
+ return FAILURE ;
1379
1387
}
1380
1388
/* }}} */
1381
1389
0 commit comments