]> granicus.if.org Git - php/commitdiff
Fixed incorrect reference counting (we shouldn't skip ADDREF for IS_CV result)
authorDmitry Stogov <dmitry@zend.com>
Mon, 27 Jul 2020 10:18:34 +0000 (13:18 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 27 Jul 2020 10:18:34 +0000 (13:18 +0300)
ext/opcache/jit/zend_jit_x86.dasc

index 8c446a133e8bf4a6636f4baf9be92f37fd3cb372..6ae7f325082f12efa4d650cc497e8a0f90da3791 100644 (file)
@@ -10434,7 +10434,8 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst, const zend_op *opline, cons
                 && (op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
                        flags |= ZEND_JIT_EXIT_FREE_OP2;
                }
-               if ((res_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))
+               if ((opline->result_type & (IS_VAR|IS_TMP_VAR))
+                && (res_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))
                 && (ssa_op+1)->op1_use == ssa_op->result_def
                 && zend_jit_may_avoid_refcounting(opline+1)) {
                        res_info |= AVOID_REFCOUNTING;
@@ -11419,7 +11420,8 @@ static int zend_jit_fetch_obj(dasm_State **Dst, const zend_op *opline, const zen
 
                        |       LOAD_ZVAL_ADDR r0, prop_addr
 
-                       if ((res_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))
+                       if ((opline->result_type & (IS_VAR|IS_TMP_VAR))
+                        && (res_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))
                         && (ssa_op+1)->op1_use == ssa_op->result_def
                         && zend_jit_may_avoid_refcounting(opline+1)) {
                                res_info |= AVOID_REFCOUNTING;