@@ -323,7 +323,7 @@ static inline zend_bool can_elide_return_type_check(
323
323
}
324
324
325
325
static zend_bool opline_supports_assign_contraction (
326
- zend_ssa * ssa , zend_op * opline , int src_var , uint32_t cv_var ) {
326
+ zend_op_array * op_array , zend_ssa * ssa , zend_op * opline , int src_var , uint32_t cv_var ) {
327
327
if (opline -> opcode == ZEND_NEW ) {
328
328
/* see Zend/tests/generators/aborted_yield_during_new.phpt */
329
329
return 0 ;
@@ -357,6 +357,13 @@ static zend_bool opline_supports_assign_contraction(
357
357
return opline -> op1_type != IS_CV || opline -> op1 .var != cv_var ;
358
358
}
359
359
360
+ if (opline -> opcode == ZEND_ASSIGN_OP
361
+ && opline -> op1_type == IS_CV
362
+ && opline -> op1 .var == cv_var
363
+ && zend_may_throw (opline , & ssa -> ops [ssa -> vars [src_var ].definition ], op_array , ssa )) {
364
+ return 0 ;
365
+ }
366
+
360
367
return 1 ;
361
368
}
362
369
@@ -1310,7 +1317,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
1310
1317
&& !ssa -> vars [src_var ].phi_use_chain
1311
1318
&& !ssa -> vars [src_var ].sym_use_chain
1312
1319
&& opline_supports_assign_contraction (
1313
- ssa , & op_array -> opcodes [ssa -> vars [src_var ].definition ],
1320
+ op_array , ssa , & op_array -> opcodes [ssa -> vars [src_var ].definition ],
1314
1321
src_var , opline -> result .var )
1315
1322
&& !variable_defined_or_used_in_range (ssa , EX_VAR_TO_NUM (opline -> result .var ),
1316
1323
ssa -> vars [src_var ].definition + 1 , op_1 )
@@ -1467,7 +1474,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
1467
1474
&& !ssa -> vars [src_var ].phi_use_chain
1468
1475
&& !ssa -> vars [src_var ].sym_use_chain
1469
1476
&& opline_supports_assign_contraction (
1470
- ssa , & op_array -> opcodes [ssa -> vars [src_var ].definition ],
1477
+ op_array , ssa , & op_array -> opcodes [ssa -> vars [src_var ].definition ],
1471
1478
src_var , opline -> op1 .var )
1472
1479
&& !variable_defined_or_used_in_range (ssa , EX_VAR_TO_NUM (opline -> op1 .var ),
1473
1480
ssa -> vars [src_var ].definition + 1 , op_1 )
0 commit comments