@@ -1253,15 +1253,16 @@ ZEND_API zend_result ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *o
1253
1253
}
1254
1254
/* }}} */
1255
1255
1256
- /* Returns SUCCESS/FAILURE/ TYPES_NOT_HANDLED */
1256
+ /* Returns SUCCESS/TYPES_NOT_HANDLED/DIV_BY_ZERO */
1257
1257
#define TYPES_NOT_HANDLED 1
1258
+ #define DIV_BY_ZERO 2
1258
1259
static int ZEND_FASTCALL div_function_base (zval * result , zval * op1 , zval * op2 ) /* {{{ */
1259
1260
{
1260
1261
zend_uchar type_pair = TYPE_PAIR (Z_TYPE_P (op1 ), Z_TYPE_P (op2 ));
1261
1262
1262
1263
if (EXPECTED (type_pair == TYPE_PAIR (IS_LONG , IS_LONG ))) {
1263
1264
if (Z_LVAL_P (op2 ) == 0 ) {
1264
- goto division_by_0 ;
1265
+ return DIV_BY_ZERO ;
1265
1266
} else if (Z_LVAL_P (op2 ) == -1 && Z_LVAL_P (op1 ) == ZEND_LONG_MIN ) {
1266
1267
/* Prevent overflow error/crash */
1267
1268
ZVAL_DOUBLE (result , (double ) ZEND_LONG_MIN / -1 );
@@ -1275,31 +1276,25 @@ static int ZEND_FASTCALL div_function_base(zval *result, zval *op1, zval *op2) /
1275
1276
return SUCCESS ;
1276
1277
} else if (EXPECTED (type_pair == TYPE_PAIR (IS_DOUBLE , IS_DOUBLE ))) {
1277
1278
if (Z_DVAL_P (op2 ) == 0 ) {
1278
- goto division_by_0 ;
1279
+ return DIV_BY_ZERO ;
1279
1280
}
1280
1281
ZVAL_DOUBLE (result , Z_DVAL_P (op1 ) / Z_DVAL_P (op2 ));
1281
1282
return SUCCESS ;
1282
1283
} else if (EXPECTED (type_pair == TYPE_PAIR (IS_DOUBLE , IS_LONG ))) {
1283
1284
if (Z_LVAL_P (op2 ) == 0 ) {
1284
- goto division_by_0 ;
1285
+ return DIV_BY_ZERO ;
1285
1286
}
1286
1287
ZVAL_DOUBLE (result , Z_DVAL_P (op1 ) / (double )Z_LVAL_P (op2 ));
1287
1288
return SUCCESS ;
1288
1289
} else if (EXPECTED (type_pair == TYPE_PAIR (IS_LONG , IS_DOUBLE ))) {
1289
1290
if (Z_DVAL_P (op2 ) == 0 ) {
1290
- goto division_by_0 ;
1291
+ return DIV_BY_ZERO ;
1291
1292
}
1292
1293
ZVAL_DOUBLE (result , (double )Z_LVAL_P (op1 ) / Z_DVAL_P (op2 ));
1293
1294
return SUCCESS ;
1294
1295
} else {
1295
1296
return TYPES_NOT_HANDLED ;
1296
1297
}
1297
- division_by_0 :
1298
- if (result != op1 ) {
1299
- ZVAL_UNDEF (result );
1300
- }
1301
- zend_throw_error (zend_ce_division_by_zero_error , "Division by zero" );
1302
- return FAILURE ;
1303
1298
}
1304
1299
/* }}} */
1305
1300
@@ -1309,8 +1304,12 @@ ZEND_API zend_result ZEND_FASTCALL div_function(zval *result, zval *op1, zval *o
1309
1304
ZVAL_DEREF (op2 );
1310
1305
1311
1306
int retval = div_function_base (result , op1 , op2 );
1312
- if (retval != TYPES_NOT_HANDLED ) {
1313
- return retval ;
1307
+ if (EXPECTED (retval == SUCCESS )) {
1308
+ return SUCCESS ;
1309
+ }
1310
+
1311
+ if (UNEXPECTED (retval == DIV_BY_ZERO )) {
1312
+ goto div_by_zero ;
1314
1313
}
1315
1314
1316
1315
ZEND_TRY_BINARY_OBJECT_OPERATION (ZEND_DIV );
@@ -1330,8 +1329,17 @@ ZEND_API zend_result ZEND_FASTCALL div_function(zval *result, zval *op1, zval *o
1330
1329
}
1331
1330
1332
1331
retval = div_function_base (result , & op1_copy , & op2_copy );
1333
- ZEND_ASSERT (retval != TYPES_NOT_HANDLED && "Types should be handled" );
1334
- return retval ;
1332
+ if (retval == SUCCESS ) {
1333
+ return SUCCESS ;
1334
+ }
1335
+
1336
+ div_by_zero :
1337
+ ZEND_ASSERT (retval == DIV_BY_ZERO && "TYPES_NOT_HANDLED should not occur here" );
1338
+ if (result != op1 ) {
1339
+ ZVAL_UNDEF (result );
1340
+ }
1341
+ zend_throw_error (zend_ce_division_by_zero_error , "Division by zero" );
1342
+ return FAILURE ;
1335
1343
}
1336
1344
/* }}} */
1337
1345
0 commit comments