@@ -4239,20 +4239,18 @@ 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 ();
4248
4250
if (return_value ) {
4249
4251
ZVAL_NULL (return_value );
4250
4252
}
4251
- ZEND_OBSERVER_SAVE_OPLINE ();
4252
- ZEND_OBSERVER_FCALL_END (execute_data , retval_ptr );
4253
4253
} else if (!return_value ) {
4254
- ZEND_OBSERVER_SAVE_OPLINE ();
4255
- ZEND_OBSERVER_FCALL_END (execute_data , retval_ptr );
4256
4254
if (OP1_TYPE & (IS_VAR |IS_TMP_VAR )) {
4257
4255
if (Z_REFCOUNTED_P (retval_ptr ) && !Z_DELREF_P (retval_ptr )) {
4258
4256
SAVE_OPLINE ();
@@ -4267,8 +4265,6 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
4267
4265
Z_ADDREF_P (return_value );
4268
4266
}
4269
4267
}
4270
- ZEND_OBSERVER_SAVE_OPLINE ();
4271
- ZEND_OBSERVER_FCALL_END (execute_data , retval_ptr );
4272
4268
} else if (OP1_TYPE == IS_CV ) {
4273
4269
do {
4274
4270
if (Z_OPT_REFCOUNTED_P (retval_ptr )) {
@@ -4280,8 +4276,6 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
4280
4276
gc_possible_root (ref );
4281
4277
}
4282
4278
ZVAL_NULL (retval_ptr );
4283
- ZEND_OBSERVER_SAVE_OPLINE ();
4284
- ZEND_OBSERVER_FCALL_END (execute_data , return_value );
4285
4279
break ;
4286
4280
} else {
4287
4281
Z_ADDREF_P (retval_ptr );
@@ -4294,8 +4288,6 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
4294
4288
}
4295
4289
}
4296
4290
ZVAL_COPY_VALUE (return_value , retval_ptr );
4297
- ZEND_OBSERVER_SAVE_OPLINE ();
4298
- ZEND_OBSERVER_FCALL_END (execute_data , retval_ptr );
4299
4291
} while (0 );
4300
4292
} else /* if (OP1_TYPE == IS_VAR) */ {
4301
4293
if (UNEXPECTED (Z_ISREF_P (retval_ptr ))) {
@@ -4311,42 +4303,44 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
4311
4303
} else {
4312
4304
ZVAL_COPY_VALUE (return_value , retval_ptr );
4313
4305
}
4314
- ZEND_OBSERVER_SAVE_OPLINE ();
4315
- ZEND_OBSERVER_FCALL_END (execute_data , retval_ptr );
4316
4306
}
4317
4307
}
4308
+ ZEND_OBSERVER_SAVE_OPLINE ();
4309
+ ZEND_OBSERVER_FCALL_END (execute_data , return_value );
4310
+ ZEND_OBSERVER_FREE_RETVAL ();
4318
4311
ZEND_VM_DISPATCH_TO_HELPER (zend_leave_helper );
4319
4312
}
4320
4313
4321
4314
ZEND_VM_COLD_CONST_HANDLER (111 , ZEND_RETURN_BY_REF , CONST |TMP |VAR |CV , ANY , SRC , SPEC (OBSERVER ))
4322
4315
{
4323
4316
USE_OPLINE
4324
4317
zval * retval_ptr ;
4318
+ zval * return_value ;
4319
+ ZEND_OBSERVER_USE_RETVAL ;
4325
4320
4326
4321
SAVE_OPLINE ();
4327
4322
4323
+ return_value = EX (return_value );
4324
+ ZEND_OBSERVER_SET_RETVAL ();
4328
4325
do {
4329
4326
if ((OP1_TYPE & (IS_CONST |IS_TMP_VAR )) ||
4330
4327
(OP1_TYPE == IS_VAR && opline -> extended_value == ZEND_RETURNS_VALUE )) {
4331
4328
/* Not supposed to happen, but we'll allow it */
4332
4329
zend_error (E_NOTICE , "Only variable references should be returned by reference" );
4333
4330
4334
4331
retval_ptr = GET_OP1_ZVAL_PTR (BP_VAR_R );
4335
- if (!EX (return_value )) {
4336
- ZEND_OBSERVER_FCALL_END (execute_data , retval_ptr );
4332
+ if (!return_value ) {
4337
4333
FREE_OP1 ();
4338
4334
} else {
4339
4335
if (OP1_TYPE == IS_VAR && UNEXPECTED (Z_ISREF_P (retval_ptr ))) {
4340
- ZVAL_COPY_VALUE (EX (return_value ), retval_ptr );
4341
- ZEND_OBSERVER_FCALL_END (execute_data , retval_ptr );
4336
+ ZVAL_COPY_VALUE (return_value , retval_ptr );
4342
4337
break ;
4343
4338
}
4344
4339
4345
- ZVAL_NEW_REF (EX ( return_value ) , retval_ptr );
4340
+ ZVAL_NEW_REF (return_value , retval_ptr );
4346
4341
if (OP1_TYPE == IS_CONST ) {
4347
4342
Z_TRY_ADDREF_P (retval_ptr );
4348
4343
}
4349
- ZEND_OBSERVER_FCALL_END (execute_data , retval_ptr );
4350
4344
}
4351
4345
break ;
4352
4346
}
@@ -4357,30 +4351,29 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC,
4357
4351
ZEND_ASSERT (retval_ptr != & EG (uninitialized_zval ));
4358
4352
if (opline -> extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P (retval_ptr )) {
4359
4353
zend_error (E_NOTICE , "Only variable references should be returned by reference" );
4360
- if (EX (return_value )) {
4361
- ZVAL_NEW_REF (EX (return_value ), retval_ptr );
4362
- ZEND_OBSERVER_FCALL_END (execute_data , retval_ptr );
4354
+ if (return_value ) {
4355
+ ZVAL_NEW_REF (return_value , retval_ptr );
4363
4356
} else {
4364
- ZEND_OBSERVER_FCALL_END (execute_data , retval_ptr );
4365
4357
FREE_OP1_VAR_PTR ();
4366
4358
}
4367
4359
break ;
4368
4360
}
4369
4361
}
4370
4362
4371
- if (EX ( return_value ) ) {
4363
+ if (return_value ) {
4372
4364
if (Z_ISREF_P (retval_ptr )) {
4373
4365
Z_ADDREF_P (retval_ptr );
4374
4366
} else {
4375
4367
ZVAL_MAKE_REF_EX (retval_ptr , 2 );
4376
4368
}
4377
- ZVAL_REF (EX ( return_value ) , Z_REF_P (retval_ptr ));
4369
+ ZVAL_REF (return_value , Z_REF_P (retval_ptr ));
4378
4370
}
4379
4371
4380
- ZEND_OBSERVER_FCALL_END (execute_data , retval_ptr );
4381
4372
FREE_OP1_VAR_PTR ();
4382
4373
} while (0 );
4383
4374
4375
+ ZEND_OBSERVER_FCALL_END (execute_data , return_value );
4376
+ ZEND_OBSERVER_FREE_RETVAL ();
4384
4377
ZEND_VM_DISPATCH_TO_HELPER (zend_leave_helper );
4385
4378
}
4386
4379
0 commit comments