]> granicus.if.org Git - php/commitdiff
Revert "More accurate reference-counter inference"
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 7 Jul 2020 14:53:00 +0000 (16:53 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 7 Jul 2020 14:53:00 +0000 (16:53 +0200)
This reverts commit b35255ad21a4e441f2304d944014c0649e37d712.

Temporarily revert this, because it causes a memory leak on the
ext/intl/tests/bug72241.phpt test case, because temporary arrays
are not handled correctly.

ext/opcache/Optimizer/zend_inference.c
ext/opcache/jit/zend_jit_x86.dasc

index 76cc15f2dab98322e5d2abcf1dbfc683642ec713..d45b58d6d7f63226632ab370bc0730e2e743d731 100644 (file)
@@ -1972,15 +1972,15 @@ uint32_t zend_array_element_type(uint32_t t1, int write, int insert)
                        if (tmp & MAY_BE_ARRAY) {
                                tmp |= MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
                        }
-                       if (tmp & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
+                       if (t1 & MAY_BE_ARRAY_OF_REF) {
                                if (!write) {
                                        /* can't be REF  because of ZVAL_COPY_DEREF() usage */
-                                       tmp |= MAY_BE_RCN;
-                               } else if (t1 & MAY_BE_ARRAY_OF_REF) {
-                                       tmp |= MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN;
-                               } else {
                                        tmp |= MAY_BE_RC1 | MAY_BE_RCN;
+                               } else {
+                                       tmp |= MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN;
                                }
+                       } else if (tmp & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
+                               tmp |= MAY_BE_RC1 | MAY_BE_RCN;
                        }
                }
                if (write) {
index 2829cbd7acc6e2f0d9fb9985a8e99c2ca6e11bfa..c186a7ee8fc8d266a7e6fb48e344dbf6c9b725c1 100644 (file)
@@ -5571,9 +5571,6 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, const ze
                        if (op1_info & (MAY_BE_ARRAY_OF_REF|MAY_BE_OBJECT)) {
                                var_info |= MAY_BE_REF;
                        }
-                       if (var_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
-                               var_info |= MAY_BE_RC1;
-                       }
                        |       // value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE);
                        if (!zend_jit_assign_to_variable(Dst, opline, op_array, var_addr, var_info, -1, (opline+1)->op1_type, (opline+1)->op1, op3_addr, val_info, res_addr, 0)) {
                                return 0;
@@ -5784,9 +5781,6 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, const
                        if (op1_info & (MAY_BE_ARRAY_OF_REF|MAY_BE_OBJECT)) {
                                var_info |= MAY_BE_REF;
                        }
-                       if (var_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
-                               var_info |= MAY_BE_RC1;
-                       }
 
                        if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_VAR_RW, op1_info, op2_info, 8, 8, NULL, NULL)) {
                                return 0;
@@ -11138,8 +11132,7 @@ static int zend_jit_fetch_obj(dasm_State **Dst, const zend_op *opline, const zen
        |9: // END
        if (opline->op1_type != IS_UNUSED && !use_this && !op1_indirect) {
                if (opline->op1_type == IS_VAR
-                && opline->opcode == ZEND_FETCH_OBJ_W
-                && (op1_info & MAY_BE_RC1)) {
+                && opline->opcode == ZEND_FETCH_OBJ_W) {
                        zend_jit_addr orig_op1_addr = OP1_ADDR();
 
                        |       IF_NOT_ZVAL_REFCOUNTED orig_op1_addr, >1