]> granicus.if.org Git - php/commitdiff
Make opcodes to return de-refereced values of typed references (in the same was as...
authorDmitry Stogov <dmitry@zend.com>
Thu, 6 Feb 2020 12:48:54 +0000 (15:48 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 6 Feb 2020 12:48:54 +0000 (15:48 +0300)
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index de00080b5a988c99d784976cdd3884c382a6abdb..e9017ecde93599643d58f1f783ac4bbf20739ab8 100644 (file)
@@ -1740,11 +1740,11 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i
                do {
                        if (Z_ISREF_P(prop)) {
                                zend_reference *ref = Z_REF_P(prop);
+                               prop = Z_REFVAL_P(prop);
                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                        zend_incdec_typed_ref(ref, NULL OPLINE_CC EXECUTE_DATA_CC);
                                        break;
                                }
-                               prop = Z_REFVAL_P(prop);
                        }
 
                        if (UNEXPECTED(prop_info)) {
@@ -1777,11 +1777,11 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_
        } else {
                if (Z_ISREF_P(prop)) {
                        zend_reference *ref = Z_REF_P(prop);
+                       prop = Z_REFVAL_P(prop);
                        if (ZEND_REF_HAS_TYPE_SOURCES(ref)) {
                                zend_incdec_typed_ref(ref, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
                                return;
                        }
-                       prop = Z_REFVAL_P(prop);
                }
 
                if (UNEXPECTED(prop_info)) {
index a6e4c2c3374edde14c8ef480e94f4c8f559511f0..26679777af159799630def67e7e3b3169740c8ba 100644 (file)
@@ -1113,11 +1113,11 @@ ZEND_VM_C_LABEL(assign_op_object):
                                do {
                                        if (UNEXPECTED(Z_ISREF_P(zptr))) {
                                                ref = Z_REF_P(zptr);
+                                               zptr = Z_REFVAL_P(zptr);
                                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                                        break;
                                                }
-                                               zptr = Z_REFVAL_P(zptr);
                                        }
 
                                        if (OP2_TYPE == IS_CONST) {
@@ -1174,11 +1174,11 @@ ZEND_VM_HANDLER(29, ZEND_ASSIGN_STATIC_PROP_OP, ANY, ANY, OP)
        do {
                if (UNEXPECTED(Z_ISREF_P(prop))) {
                        ref = Z_REF_P(prop);
+                       prop = Z_REFVAL_P(prop);
                        if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                break;
                        }
-                       prop = Z_REFVAL_P(prop);
                }
 
                if (UNEXPECTED(prop_info->type)) {
@@ -1302,11 +1302,11 @@ ZEND_VM_HANDLER(26, ZEND_ASSIGN_OP, VAR|CV, CONST|TMPVAR|CV, OP)
                do {
                        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
                                zend_reference *ref = Z_REF_P(var_ptr);
+                               var_ptr = Z_REFVAL_P(var_ptr);
                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                        break;
                                }
-                               var_ptr = Z_REFVAL_P(var_ptr);
                        }
                        zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
                } while (0);
index 3987d1b94501deef03a297fb47019aed8d38e262..4da5094a791e58fdb3e42c6a3f47d96345afa7ee 100644 (file)
@@ -816,11 +816,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_OP_SPEC_HAN
        do {
                if (UNEXPECTED(Z_ISREF_P(prop))) {
                        ref = Z_REF_P(prop);
+                       prop = Z_REFVAL_P(prop);
                        if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                break;
                        }
-                       prop = Z_REFVAL_P(prop);
                }
 
                if (UNEXPECTED(prop_info->type)) {
@@ -22087,11 +22087,11 @@ assign_op_object:
                                do {
                                        if (UNEXPECTED(Z_ISREF_P(zptr))) {
                                                ref = Z_REF_P(zptr);
+                                               zptr = Z_REFVAL_P(zptr);
                                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                                        break;
                                                }
-                                               zptr = Z_REFVAL_P(zptr);
                                        }
 
                                        if (IS_CONST == IS_CONST) {
@@ -22227,11 +22227,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OP_SPEC_VAR_CONST_HANDL
                do {
                        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
                                zend_reference *ref = Z_REF_P(var_ptr);
+                               var_ptr = Z_REFVAL_P(var_ptr);
                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                        break;
                                }
-                               var_ptr = Z_REFVAL_P(var_ptr);
                        }
                        zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
                } while (0);
@@ -24384,11 +24384,11 @@ assign_op_object:
                                do {
                                        if (UNEXPECTED(Z_ISREF_P(zptr))) {
                                                ref = Z_REF_P(zptr);
+                                               zptr = Z_REFVAL_P(zptr);
                                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                                        break;
                                                }
-                                               zptr = Z_REFVAL_P(zptr);
                                        }
 
                                        if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
@@ -24525,11 +24525,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OP_SPEC_VAR_TMPVAR_HAND
                do {
                        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
                                zend_reference *ref = Z_REF_P(var_ptr);
+                               var_ptr = Z_REFVAL_P(var_ptr);
                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                        break;
                                }
-                               var_ptr = Z_REFVAL_P(var_ptr);
                        }
                        zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
                } while (0);
@@ -28078,11 +28078,11 @@ assign_op_object:
                                do {
                                        if (UNEXPECTED(Z_ISREF_P(zptr))) {
                                                ref = Z_REF_P(zptr);
+                                               zptr = Z_REFVAL_P(zptr);
                                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                                        break;
                                                }
-                                               zptr = Z_REFVAL_P(zptr);
                                        }
 
                                        if (IS_CV == IS_CONST) {
@@ -28218,11 +28218,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OP_SPEC_VAR_CV_HANDLER(
                do {
                        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
                                zend_reference *ref = Z_REF_P(var_ptr);
+                               var_ptr = Z_REFVAL_P(var_ptr);
                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                        break;
                                }
-                               var_ptr = Z_REFVAL_P(var_ptr);
                        }
                        zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
                } while (0);
@@ -30556,11 +30556,11 @@ assign_op_object:
                                do {
                                        if (UNEXPECTED(Z_ISREF_P(zptr))) {
                                                ref = Z_REF_P(zptr);
+                                               zptr = Z_REFVAL_P(zptr);
                                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                                        break;
                                                }
-                                               zptr = Z_REFVAL_P(zptr);
                                        }
 
                                        if (IS_CONST == IS_CONST) {
@@ -32395,11 +32395,11 @@ assign_op_object:
                                do {
                                        if (UNEXPECTED(Z_ISREF_P(zptr))) {
                                                ref = Z_REF_P(zptr);
+                                               zptr = Z_REFVAL_P(zptr);
                                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                                        break;
                                                }
-                                               zptr = Z_REFVAL_P(zptr);
                                        }
 
                                        if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
@@ -34919,11 +34919,11 @@ assign_op_object:
                                do {
                                        if (UNEXPECTED(Z_ISREF_P(zptr))) {
                                                ref = Z_REF_P(zptr);
+                                               zptr = Z_REFVAL_P(zptr);
                                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                                        break;
                                                }
-                                               zptr = Z_REFVAL_P(zptr);
                                        }
 
                                        if (IS_CV == IS_CONST) {
@@ -39034,11 +39034,11 @@ assign_op_object:
                                do {
                                        if (UNEXPECTED(Z_ISREF_P(zptr))) {
                                                ref = Z_REF_P(zptr);
+                                               zptr = Z_REFVAL_P(zptr);
                                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                                        break;
                                                }
-                                               zptr = Z_REFVAL_P(zptr);
                                        }
 
                                        if (IS_CONST == IS_CONST) {
@@ -39174,11 +39174,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OP_SPEC_CV_CONST_HANDLE
                do {
                        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
                                zend_reference *ref = Z_REF_P(var_ptr);
+                               var_ptr = Z_REFVAL_P(var_ptr);
                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                        break;
                                }
-                               var_ptr = Z_REFVAL_P(var_ptr);
                        }
                        zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
                } while (0);
@@ -42541,11 +42541,11 @@ assign_op_object:
                                do {
                                        if (UNEXPECTED(Z_ISREF_P(zptr))) {
                                                ref = Z_REF_P(zptr);
+                                               zptr = Z_REFVAL_P(zptr);
                                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                                        break;
                                                }
-                                               zptr = Z_REFVAL_P(zptr);
                                        }
 
                                        if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
@@ -42682,11 +42682,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OP_SPEC_CV_TMPVAR_HANDL
                do {
                        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
                                zend_reference *ref = Z_REF_P(var_ptr);
+                               var_ptr = Z_REFVAL_P(var_ptr);
                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                        break;
                                }
-                               var_ptr = Z_REFVAL_P(var_ptr);
                        }
                        zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
                } while (0);
@@ -47639,11 +47639,11 @@ assign_op_object:
                                do {
                                        if (UNEXPECTED(Z_ISREF_P(zptr))) {
                                                ref = Z_REF_P(zptr);
+                                               zptr = Z_REFVAL_P(zptr);
                                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                                        break;
                                                }
-                                               zptr = Z_REFVAL_P(zptr);
                                        }
 
                                        if (IS_CV == IS_CONST) {
@@ -47779,11 +47779,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OP_SPEC_CV_CV_HANDLER(Z
                do {
                        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
                                zend_reference *ref = Z_REF_P(var_ptr);
+                               var_ptr = Z_REFVAL_P(var_ptr);
                                if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
                                        zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
                                        break;
                                }
-                               var_ptr = Z_REFVAL_P(var_ptr);
                        }
                        zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
                } while (0);