@@ -4239,9 +4239,11 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
4239
4239
USE_OPLINE
4240
4240
zval * retval_ptr ;
4241
4241
zval * return_value ;
4242
+ ZEND_OBSERVER_USE_RETVAL ;
4242
4243
4243
4244
retval_ptr = GET_OP1_ZVAL_PTR_UNDEF (BP_VAR_R );
4244
4245
return_value = EX (return_value );
4246
+ ZEND_OBSERVER_SET_RETVAL ();
4245
4247
if (OP1_TYPE == IS_CV && UNEXPECTED (Z_TYPE_INFO_P (retval_ptr ) == IS_UNDEF )) {
4246
4248
SAVE_OPLINE ();
4247
4249
retval_ptr = ZVAL_UNDEFINED_OP1 ();
@@ -4305,32 +4307,37 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
4305
4307
}
4306
4308
ZEND_OBSERVER_SAVE_OPLINE ();
4307
4309
ZEND_OBSERVER_FCALL_END (execute_data , return_value );
4310
+ ZEND_OBSERVER_FREE_RETVAL ();
4308
4311
ZEND_VM_DISPATCH_TO_HELPER (zend_leave_helper );
4309
4312
}
4310
4313
4311
4314
ZEND_VM_COLD_CONST_HANDLER (111 , ZEND_RETURN_BY_REF , CONST |TMP |VAR |CV , ANY , SRC , SPEC (OBSERVER ))
4312
4315
{
4313
4316
USE_OPLINE
4314
4317
zval * retval_ptr ;
4318
+ zval * return_value ;
4319
+ ZEND_OBSERVER_USE_RETVAL ;
4315
4320
4316
4321
SAVE_OPLINE ();
4317
4322
4323
+ return_value = EX (return_value );
4324
+ ZEND_OBSERVER_SET_RETVAL ();
4318
4325
do {
4319
4326
if ((OP1_TYPE & (IS_CONST |IS_TMP_VAR )) ||
4320
4327
(OP1_TYPE == IS_VAR && opline -> extended_value == ZEND_RETURNS_VALUE )) {
4321
4328
/* Not supposed to happen, but we'll allow it */
4322
4329
zend_error (E_NOTICE , "Only variable references should be returned by reference" );
4323
4330
4324
4331
retval_ptr = GET_OP1_ZVAL_PTR (BP_VAR_R );
4325
- if (!EX ( return_value ) ) {
4332
+ if (!return_value ) {
4326
4333
FREE_OP1 ();
4327
4334
} else {
4328
4335
if (OP1_TYPE == IS_VAR && UNEXPECTED (Z_ISREF_P (retval_ptr ))) {
4329
- ZVAL_COPY_VALUE (EX ( return_value ) , retval_ptr );
4336
+ ZVAL_COPY_VALUE (return_value , retval_ptr );
4330
4337
break ;
4331
4338
}
4332
4339
4333
- ZVAL_NEW_REF (EX ( return_value ) , retval_ptr );
4340
+ ZVAL_NEW_REF (return_value , retval_ptr );
4334
4341
if (OP1_TYPE == IS_CONST ) {
4335
4342
Z_TRY_ADDREF_P (retval_ptr );
4336
4343
}
@@ -4344,28 +4351,29 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC,
4344
4351
ZEND_ASSERT (retval_ptr != & EG (uninitialized_zval ));
4345
4352
if (opline -> extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P (retval_ptr )) {
4346
4353
zend_error (E_NOTICE , "Only variable references should be returned by reference" );
4347
- if (EX ( return_value ) ) {
4348
- ZVAL_NEW_REF (EX ( return_value ) , retval_ptr );
4354
+ if (return_value ) {
4355
+ ZVAL_NEW_REF (return_value , retval_ptr );
4349
4356
} else {
4350
4357
FREE_OP1_VAR_PTR ();
4351
4358
}
4352
4359
break ;
4353
4360
}
4354
4361
}
4355
4362
4356
- if (EX ( return_value ) ) {
4363
+ if (return_value ) {
4357
4364
if (Z_ISREF_P (retval_ptr )) {
4358
4365
Z_ADDREF_P (retval_ptr );
4359
4366
} else {
4360
4367
ZVAL_MAKE_REF_EX (retval_ptr , 2 );
4361
4368
}
4362
- ZVAL_REF (EX ( return_value ) , Z_REF_P (retval_ptr ));
4369
+ ZVAL_REF (return_value , Z_REF_P (retval_ptr ));
4363
4370
}
4364
4371
4365
4372
FREE_OP1_VAR_PTR ();
4366
4373
} while (0 );
4367
4374
4368
- ZEND_OBSERVER_FCALL_END (execute_data , EX (return_value ));
4375
+ ZEND_OBSERVER_FCALL_END (execute_data , return_value );
4376
+ ZEND_OBSERVER_FREE_RETVAL ();
4369
4377
ZEND_VM_DISPATCH_TO_HELPER (zend_leave_helper );
4370
4378
}
4371
4379
@@ -7710,7 +7718,7 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca
7710
7718
7711
7719
/* Uncaught exception */
7712
7720
if (zend_observer_fcall_op_array_extension != -1 ) {
7713
- zend_observer_fcall_end (execute_data , EX ( return_value ) );
7721
+ zend_observer_fcall_end (execute_data , NULL );
7714
7722
}
7715
7723
cleanup_live_vars (execute_data , op_num , 0 );
7716
7724
if (UNEXPECTED ((EX_CALL_INFO () & ZEND_CALL_GENERATOR ) != 0 )) {
0 commit comments