]> granicus.if.org Git - php/commitdiff
Avoid reference-counting
authorDmitry Stogov <dmitry@zend.com>
Mon, 28 May 2018 14:10:58 +0000 (17:10 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 28 May 2018 14:10:58 +0000 (17:10 +0300)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index e29162fa10d84f305445d813f5e52c7e2ec3f740..85540341518771742c3675eeb001bf5a0cea18c5 100644 (file)
@@ -5153,11 +5153,13 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSE
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (OP1_TYPE == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
+                       FREE_OP1_VAR_PTR();
                }
-               FREE_OP1_VAR_PTR();
        } else {
                expr_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
                if (OP1_TYPE == IS_TMP_VAR) {
index 17f3e386d7963e20f7b69e1554018f25d51b4fbf..3db1a969f2d5a10f719e7a4fcadfe45203b17992 100644 (file)
@@ -5575,11 +5575,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_C
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = NULL;
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_CONST == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
-               }
 
+               }
        } else {
                expr_ptr = RT_CONSTANT(opline, opline->op1);
                if (IS_CONST == IS_TMP_VAR) {
@@ -7643,11 +7645,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_T
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = NULL;
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_CONST == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
-               }
 
+               }
        } else {
                expr_ptr = RT_CONSTANT(opline, opline->op1);
                if (IS_CONST == IS_TMP_VAR) {
@@ -8921,11 +8925,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_U
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = NULL;
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_CONST == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
-               }
 
+               }
        } else {
                expr_ptr = RT_CONSTANT(opline, opline->op1);
                if (IS_CONST == IS_TMP_VAR) {
@@ -10701,11 +10707,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_C
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = NULL;
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_CONST == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
-               }
 
+               }
        } else {
                expr_ptr = RT_CONSTANT(opline, opline->op1);
                if (IS_CONST == IS_TMP_VAR) {
@@ -18777,11 +18785,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CON
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = NULL;
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_TMP_VAR == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
-               }
 
+               }
        } else {
                expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
                if (IS_TMP_VAR == IS_TMP_VAR) {
@@ -19191,11 +19201,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = NULL;
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_TMP_VAR == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
-               }
 
+               }
        } else {
                expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
                if (IS_TMP_VAR == IS_TMP_VAR) {
@@ -19681,11 +19693,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNU
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = NULL;
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_TMP_VAR == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
-               }
 
+               }
        } else {
                expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
                if (IS_TMP_VAR == IS_TMP_VAR) {
@@ -20151,11 +20165,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = NULL;
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_TMP_VAR == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
-               }
 
+               }
        } else {
                expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
                if (IS_TMP_VAR == IS_TMP_VAR) {
@@ -24033,11 +24049,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CON
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_VAR == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
+                       if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
                }
-               if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
        } else {
                expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
                if (IS_VAR == IS_TMP_VAR) {
@@ -26178,11 +26196,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_VAR == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
+                       if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
                }
-               if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
        } else {
                expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
                if (IS_VAR == IS_TMP_VAR) {
@@ -27764,11 +27784,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNU
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_VAR == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
+                       if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
                }
-               if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
        } else {
                expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
                if (IS_VAR == IS_TMP_VAR) {
@@ -29988,11 +30010,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_VAR == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
+                       if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
                }
-               if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
        } else {
                expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
                if (IS_VAR == IS_TMP_VAR) {
@@ -41056,11 +41080,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONS
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_CV == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
-               }
 
+               }
        } else {
                expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
                if (IS_CV == IS_TMP_VAR) {
@@ -44724,11 +44750,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPV
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_CV == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
-               }
 
+               }
        } else {
                expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
                if (IS_CV == IS_TMP_VAR) {
@@ -46758,11 +46786,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUS
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_CV == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
-               }
 
+               }
        } else {
                expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
                if (IS_CV == IS_TMP_VAR) {
@@ -50331,11 +50361,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_H
            UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
                expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
                if (Z_ISREF_P(expr_ptr)) {
-                       Z_ADDREF_P(expr_ptr);
+                       if (IS_CV == IS_CV) {
+                               Z_ADDREF_P(expr_ptr);
+                       }
                } else {
                        ZVAL_MAKE_REF_EX(expr_ptr, 2);
-               }
 
+               }
        } else {
                expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
                if (IS_CV == IS_TMP_VAR) {