@@ -4239,9 +4239,11 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
42394239 USE_OPLINE
42404240 zval * retval_ptr ;
42414241 zval * return_value ;
4242+ ZEND_OBSERVER_USE_RETVAL ;
42424243
42434244 retval_ptr = GET_OP1_ZVAL_PTR_UNDEF (BP_VAR_R );
42444245 return_value = EX (return_value );
4246+ ZEND_OBSERVER_SET_RETVAL ();
42454247 if (OP1_TYPE == IS_CV && UNEXPECTED (Z_TYPE_INFO_P (retval_ptr ) == IS_UNDEF )) {
42464248 SAVE_OPLINE ();
42474249 retval_ptr = ZVAL_UNDEFINED_OP1 ();
@@ -4305,32 +4307,37 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
43054307 }
43064308 ZEND_OBSERVER_SAVE_OPLINE ();
43074309 ZEND_OBSERVER_FCALL_END (execute_data , return_value );
4310+ ZEND_OBSERVER_FREE_RETVAL ();
43084311 ZEND_VM_DISPATCH_TO_HELPER (zend_leave_helper );
43094312}
43104313
43114314ZEND_VM_COLD_CONST_HANDLER (111 , ZEND_RETURN_BY_REF , CONST |TMP |VAR |CV , ANY , SRC , SPEC (OBSERVER ))
43124315{
43134316 USE_OPLINE
43144317 zval * retval_ptr ;
4318+ zval * return_value ;
4319+ ZEND_OBSERVER_USE_RETVAL ;
43154320
43164321 SAVE_OPLINE ();
43174322
4323+ return_value = EX (return_value );
4324+ ZEND_OBSERVER_SET_RETVAL ();
43184325 do {
43194326 if ((OP1_TYPE & (IS_CONST |IS_TMP_VAR )) ||
43204327 (OP1_TYPE == IS_VAR && opline -> extended_value == ZEND_RETURNS_VALUE )) {
43214328 /* Not supposed to happen, but we'll allow it */
43224329 zend_error (E_NOTICE , "Only variable references should be returned by reference" );
43234330
43244331 retval_ptr = GET_OP1_ZVAL_PTR (BP_VAR_R );
4325- if (!EX ( return_value ) ) {
4332+ if (!return_value ) {
43264333 FREE_OP1 ();
43274334 } else {
43284335 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 );
43304337 break ;
43314338 }
43324339
4333- ZVAL_NEW_REF (EX ( return_value ) , retval_ptr );
4340+ ZVAL_NEW_REF (return_value , retval_ptr );
43344341 if (OP1_TYPE == IS_CONST ) {
43354342 Z_TRY_ADDREF_P (retval_ptr );
43364343 }
@@ -4344,28 +4351,29 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC,
43444351 ZEND_ASSERT (retval_ptr != & EG (uninitialized_zval ));
43454352 if (opline -> extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P (retval_ptr )) {
43464353 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 );
43494356 } else {
43504357 FREE_OP1_VAR_PTR ();
43514358 }
43524359 break ;
43534360 }
43544361 }
43554362
4356- if (EX ( return_value ) ) {
4363+ if (return_value ) {
43574364 if (Z_ISREF_P (retval_ptr )) {
43584365 Z_ADDREF_P (retval_ptr );
43594366 } else {
43604367 ZVAL_MAKE_REF_EX (retval_ptr , 2 );
43614368 }
4362- ZVAL_REF (EX ( return_value ) , Z_REF_P (retval_ptr ));
4369+ ZVAL_REF (return_value , Z_REF_P (retval_ptr ));
43634370 }
43644371
43654372 FREE_OP1_VAR_PTR ();
43664373 } while (0 );
43674374
4368- ZEND_OBSERVER_FCALL_END (execute_data , EX (return_value ));
4375+ ZEND_OBSERVER_FCALL_END (execute_data , return_value );
4376+ ZEND_OBSERVER_FREE_RETVAL ();
43694377 ZEND_VM_DISPATCH_TO_HELPER (zend_leave_helper );
43704378}
43714379
@@ -7710,7 +7718,7 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca
77107718
77117719 /* Uncaught exception */
77127720 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 );
77147722 }
77157723 cleanup_live_vars (execute_data , op_num , 0 );
77167724 if (UNEXPECTED ((EX_CALL_INFO () & ZEND_CALL_GENERATOR ) != 0 )) {
0 commit comments