@@ -333,7 +333,7 @@ static inline bool can_elide_return_type_check(
333
333
}
334
334
335
335
static bool opline_supports_assign_contraction (
336
- zend_ssa * ssa , zend_op * opline , int src_var , uint32_t cv_var ) {
336
+ zend_op_array * op_array , zend_ssa * ssa , zend_op * opline , int src_var , uint32_t cv_var ) {
337
337
if (opline -> opcode == ZEND_NEW ) {
338
338
/* see Zend/tests/generators/aborted_yield_during_new.phpt */
339
339
return 0 ;
@@ -367,6 +367,13 @@ static bool opline_supports_assign_contraction(
367
367
return opline -> op1_type != IS_CV || opline -> op1 .var != cv_var ;
368
368
}
369
369
370
+ if (opline -> opcode == ZEND_ASSIGN_OP
371
+ && opline -> op1_type == IS_CV
372
+ && opline -> op1 .var == cv_var
373
+ && zend_may_throw (opline , & ssa -> ops [ssa -> vars [src_var ].definition ], op_array , ssa )) {
374
+ return 0 ;
375
+ }
376
+
370
377
return 1 ;
371
378
}
372
379
@@ -1357,7 +1364,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
1357
1364
&& !ssa -> vars [src_var ].phi_use_chain
1358
1365
&& !ssa -> vars [src_var ].sym_use_chain
1359
1366
&& opline_supports_assign_contraction (
1360
- ssa , & op_array -> opcodes [ssa -> vars [src_var ].definition ],
1367
+ op_array , ssa , & op_array -> opcodes [ssa -> vars [src_var ].definition ],
1361
1368
src_var , opline -> result .var )
1362
1369
&& !variable_defined_or_used_in_range (ssa , EX_VAR_TO_NUM (opline -> result .var ),
1363
1370
ssa -> vars [src_var ].definition + 1 , op_1 )
@@ -1514,7 +1521,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
1514
1521
&& !ssa -> vars [src_var ].phi_use_chain
1515
1522
&& !ssa -> vars [src_var ].sym_use_chain
1516
1523
&& opline_supports_assign_contraction (
1517
- ssa , & op_array -> opcodes [ssa -> vars [src_var ].definition ],
1524
+ op_array , ssa , & op_array -> opcodes [ssa -> vars [src_var ].definition ],
1518
1525
src_var , opline -> op1 .var )
1519
1526
&& !variable_defined_or_used_in_range (ssa , EX_VAR_TO_NUM (opline -> op1 .var ),
1520
1527
ssa -> vars [src_var ].definition + 1 , op_1 )
0 commit comments