summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2021-01-26 19:25:50 +0300
committerDmitry Stogov <dmitry@zend.com>2021-01-26 19:25:50 +0300
commit1d2fd57c9939b7b5fcbe4c6d16c30d05ab236eb2 (patch)
treeef83e00f6d8919e736f47f54cdf20c81dc8f299d
parent26f573840f09eb7e1c6ee97c72e959d99798e6ab (diff)
parentb529d02d248587d298487d3d46120be7ebd59480 (diff)
downloadphp-git-1d2fd57c9939b7b5fcbe4c6d16c30d05ab236eb2.tar.gz
Merge branch 'PHP-8.0'
* PHP-8.0: Allow observer handlers disabling optimization in RETURN opcode handler, that may cause loss value of returned local variable.
-rw-r--r--Zend/zend_compile.h3
-rw-r--r--Zend/zend_vm_def.h2
-rw-r--r--Zend/zend_vm_execute.h20
3 files changed, 14 insertions, 11 deletions
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index abd7c6449d..ffc2f7baa4 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -529,6 +529,9 @@ struct _zend_execute_data {
#define ZEND_CALL_DYNAMIC (1 << 25)
#define ZEND_CALL_MAY_HAVE_UNDEF (1 << 26)
#define ZEND_CALL_HAS_EXTRA_NAMED_PARAMS (1 << 27)
+#define ZEND_CALL_OBSERVED (1 << 28) /* "fcall_begin" observer handler may set this flag */
+ /* to prevent optimization in RETURN handler and */
+ /* keep all local variables for "fcall_end" handler */
#define ZEND_CALL_SEND_ARG_BY_REF (1u << 31)
#define ZEND_CALL_NESTED_FUNCTION (ZEND_CALL_FUNCTION | ZEND_CALL_NESTED)
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index f45a08ac06..2663945a66 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -4271,7 +4271,7 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
do {
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
- if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
if (GC_MAY_LEAK(ref)) {
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index cccc2e9b53..e4b1c03aee 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -4047,7 +4047,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_
do {
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
- if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
if (GC_MAY_LEAK(ref)) {
@@ -4124,7 +4124,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_OBSER
do {
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
- if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
if (GC_MAY_LEAK(ref)) {
@@ -18572,7 +18572,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA
do {
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
- if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
if (GC_MAY_LEAK(ref)) {
@@ -21144,7 +21144,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA
do {
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
- if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
if (GC_MAY_LEAK(ref)) {
@@ -37658,7 +37658,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN
do {
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
- if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
if (GC_MAY_LEAK(ref)) {
@@ -54747,7 +54747,7 @@ zend_leave_helper_SPEC_LABEL:
do {
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
- if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
if (GC_MAY_LEAK(ref)) {
@@ -54825,7 +54825,7 @@ zend_leave_helper_SPEC_LABEL:
do {
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
- if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
if (GC_MAY_LEAK(ref)) {
@@ -56362,7 +56362,7 @@ zend_leave_helper_SPEC_LABEL:
do {
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
- if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
if (GC_MAY_LEAK(ref)) {
@@ -56663,7 +56663,7 @@ zend_leave_helper_SPEC_LABEL:
do {
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
- if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
if (GC_MAY_LEAK(ref)) {
@@ -57784,7 +57784,7 @@ zend_leave_helper_SPEC_LABEL:
do {
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
- if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
ZVAL_COPY_VALUE(return_value, retval_ptr);
if (GC_MAY_LEAK(ref)) {