Skip to content

Commit 7b6572f

Browse files
committed
Add observer_retval to observe the return_value
1 parent 51d8fd9 commit 7b6572f

File tree

3 files changed

+120
-209
lines changed

3 files changed

+120
-209
lines changed

Zend/zend_vm_def.h

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4239,20 +4239,18 @@ 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();
42484250
if (return_value) {
42494251
ZVAL_NULL(return_value);
42504252
}
4251-
ZEND_OBSERVER_SAVE_OPLINE();
4252-
ZEND_OBSERVER_FCALL_END(execute_data, retval_ptr);
42534253
} else if (!return_value) {
4254-
ZEND_OBSERVER_SAVE_OPLINE();
4255-
ZEND_OBSERVER_FCALL_END(execute_data, retval_ptr);
42564254
if (OP1_TYPE & (IS_VAR|IS_TMP_VAR)) {
42574255
if (Z_REFCOUNTED_P(retval_ptr) && !Z_DELREF_P(retval_ptr)) {
42584256
SAVE_OPLINE();
@@ -4267,8 +4265,6 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
42674265
Z_ADDREF_P(return_value);
42684266
}
42694267
}
4270-
ZEND_OBSERVER_SAVE_OPLINE();
4271-
ZEND_OBSERVER_FCALL_END(execute_data, retval_ptr);
42724268
} else if (OP1_TYPE == IS_CV) {
42734269
do {
42744270
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))
42804276
gc_possible_root(ref);
42814277
}
42824278
ZVAL_NULL(retval_ptr);
4283-
ZEND_OBSERVER_SAVE_OPLINE();
4284-
ZEND_OBSERVER_FCALL_END(execute_data, return_value);
42854279
break;
42864280
} else {
42874281
Z_ADDREF_P(retval_ptr);
@@ -4294,8 +4288,6 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
42944288
}
42954289
}
42964290
ZVAL_COPY_VALUE(return_value, retval_ptr);
4297-
ZEND_OBSERVER_SAVE_OPLINE();
4298-
ZEND_OBSERVER_FCALL_END(execute_data, retval_ptr);
42994291
} while (0);
43004292
} else /* if (OP1_TYPE == IS_VAR) */ {
43014293
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))
43114303
} else {
43124304
ZVAL_COPY_VALUE(return_value, retval_ptr);
43134305
}
4314-
ZEND_OBSERVER_SAVE_OPLINE();
4315-
ZEND_OBSERVER_FCALL_END(execute_data, retval_ptr);
43164306
}
43174307
}
4308+
ZEND_OBSERVER_SAVE_OPLINE();
4309+
ZEND_OBSERVER_FCALL_END(execute_data, return_value);
4310+
ZEND_OBSERVER_FREE_RETVAL();
43184311
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
43194312
}
43204313

43214314
ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC, SPEC(OBSERVER))
43224315
{
43234316
USE_OPLINE
43244317
zval *retval_ptr;
4318+
zval *return_value;
4319+
ZEND_OBSERVER_USE_RETVAL;
43254320

43264321
SAVE_OPLINE();
43274322

4323+
return_value = EX(return_value);
4324+
ZEND_OBSERVER_SET_RETVAL();
43284325
do {
43294326
if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR)) ||
43304327
(OP1_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) {
43314328
/* Not supposed to happen, but we'll allow it */
43324329
zend_error(E_NOTICE, "Only variable references should be returned by reference");
43334330

43344331
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) {
43374333
FREE_OP1();
43384334
} else {
43394335
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);
43424337
break;
43434338
}
43444339

4345-
ZVAL_NEW_REF(EX(return_value), retval_ptr);
4340+
ZVAL_NEW_REF(return_value, retval_ptr);
43464341
if (OP1_TYPE == IS_CONST) {
43474342
Z_TRY_ADDREF_P(retval_ptr);
43484343
}
4349-
ZEND_OBSERVER_FCALL_END(execute_data, retval_ptr);
43504344
}
43514345
break;
43524346
}
@@ -4357,30 +4351,29 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC,
43574351
ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
43584352
if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) {
43594353
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);
43634356
} else {
4364-
ZEND_OBSERVER_FCALL_END(execute_data, retval_ptr);
43654357
FREE_OP1_VAR_PTR();
43664358
}
43674359
break;
43684360
}
43694361
}
43704362

4371-
if (EX(return_value)) {
4363+
if (return_value) {
43724364
if (Z_ISREF_P(retval_ptr)) {
43734365
Z_ADDREF_P(retval_ptr);
43744366
} else {
43754367
ZVAL_MAKE_REF_EX(retval_ptr, 2);
43764368
}
4377-
ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr));
4369+
ZVAL_REF(return_value, Z_REF_P(retval_ptr));
43784370
}
43794371

4380-
ZEND_OBSERVER_FCALL_END(execute_data, retval_ptr);
43814372
FREE_OP1_VAR_PTR();
43824373
} while (0);
43834374

4375+
ZEND_OBSERVER_FCALL_END(execute_data, return_value);
4376+
ZEND_OBSERVER_FREE_RETVAL();
43844377
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
43854378
}
43864379

0 commit comments

Comments
 (0)