]> granicus.if.org Git - php/commitdiff
Improved IS_VAR operands fetching
authorDmitry Stogov <dmitry@zend.com>
Fri, 17 May 2013 09:15:09 +0000 (13:15 +0400)
committerDmitry Stogov <dmitry@zend.com>
Fri, 17 May 2013 09:15:09 +0000 (13:15 +0400)
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
Zend/zend_vm_gen.php

index a65f5331de43fecf435883a64198fd3c8766cb3a..3c3dd8e3b0b574a3976428bff4fef46a5a025d78 100644 (file)
@@ -183,8 +183,7 @@ static zend_always_inline zval *_get_zval_ptr_var(zend_uint var, const zend_exec
 {
        zval *ptr = EX_T(var).var.ptr;
 
-       PZVAL_UNLOCK(ptr, should_free);
-       return ptr;
+       return should_free->var = ptr;
 }
 
 static zend_never_inline zval **_get_zval_cv_lookup(zval ***ptr, zend_uint var, int type TSRMLS_DC)
@@ -386,6 +385,19 @@ static zend_always_inline zval **_get_zval_ptr_ptr_var(zend_uint var, const zend
        return ptr_ptr;
 }
 
+static zend_always_inline zval **_get_zval_ptr_ptr_var_fast(zend_uint var, const zend_execute_data *execute_data, zend_free_op *should_free TSRMLS_DC)
+{
+       zval** ptr_ptr = EX_T(var).var.ptr_ptr;
+
+       if (EXPECTED(ptr_ptr != NULL)) {
+               should_free->var = *ptr_ptr;
+       } else {
+               /* string offset */
+               should_free->var = EX_T(var).str_offset.str;
+       }
+       return ptr_ptr;
+}
+
 static zend_always_inline zval **_get_zval_ptr_ptr_cv(zend_uint var, int type TSRMLS_DC)
 {
        zval ***ptr = EX_CV_NUM(EG(current_execute_data), var);
@@ -909,7 +921,7 @@ static inline zval* zend_assign_to_variable(zval **variable_ptr_ptr, zval *value
                } else { /* we need to split */
                        Z_DELREF_P(variable_ptr);
                        GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
-                       if (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0) {
+                       if (PZVAL_IS_REF(value)) {
                                ALLOC_ZVAL(variable_ptr);
                                *variable_ptr_ptr = variable_ptr;
                                INIT_PZVAL_COPY(variable_ptr, value);
@@ -918,7 +930,6 @@ static inline zval* zend_assign_to_variable(zval **variable_ptr_ptr, zval *value
                        } else {
                                *variable_ptr_ptr = value;
                                Z_ADDREF_P(value);
-                               Z_UNSET_ISREF_P(value);
                                return value;
                        }
                }
index f66d9775e0cfdd85add1c7d4f109accd534e0f32..4c7d53b23e2b0e9d5dde93b42e33edffee797a0e 100644 (file)
@@ -1170,22 +1170,18 @@ ZEND_VM_HANDLER(81, ZEND_FETCH_DIM_R, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           OP1_TYPE != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (OP1_TYPE == IS_TMP_VAR || OP1_TYPE == IS_CONST) {
                zval *container = GET_OP1_ZVAL_PTR(BP_VAR_R);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_R TSRMLS_CC);
                FREE_OP2();
                FREE_OP1();
        } else {
-               container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R);
+               container = GET_OP1_ZVAL_PTR_PTR_FAST(BP_VAR_R);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_R TSRMLS_CC);
                FREE_OP2();
-               FREE_OP1_VAR_PTR();
+               if (OP1_TYPE == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+                       FREE_OP1_VAR_PTR_FAST();
+               }
        }
 
        CHECK_EXCEPTION();
@@ -1255,10 +1251,10 @@ ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, VAR|CV, CONST|TMP|VAR|CV)
        zval **container;
 
        SAVE_OPLINE();
-       container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_IS);
+       container = GET_OP1_ZVAL_PTR_PTR_FAST(BP_VAR_IS);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_IS TSRMLS_CC);
        FREE_OP2();
-       FREE_OP1_VAR_PTR();
+       FREE_OP1_VAR_PTR_FAST();
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -1280,15 +1276,17 @@ ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
                if (OP1_TYPE == IS_VAR && OP1_FREE && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+               FREE_OP2();
+               FREE_OP1_VAR_PTR();
        } else {
                if (OP2_TYPE == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
                }
-               container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R);
+               container = GET_OP1_ZVAL_PTR_PTR_FAST(BP_VAR_R);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_R TSRMLS_CC);
+               FREE_OP2();
+               FREE_OP1_VAR_PTR_FAST();
        }
-       FREE_OP2();
-       FREE_OP1_VAR_PTR();
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -2842,9 +2840,7 @@ ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
        retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
 
        if (!EG(return_value_ptr_ptr)) {
-               if (OP1_TYPE == IS_TMP_VAR) {
-                       FREE_OP1();
-               }
+               FREE_OP1();
        } else {
                if (OP1_TYPE == IS_CONST ||
                    OP1_TYPE == IS_TMP_VAR ||
@@ -2857,18 +2853,23 @@ ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
                                zval_copy_ctor(ret);
                        }
                        *EG(return_value_ptr_ptr) = ret;
+                       FREE_OP1_IF_VAR();
                } else if ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) &&
                           retval_ptr == &EG(uninitialized_zval)) {
                        zval *ret;
 
+                       if (OP1_TYPE == IS_VAR) {
+                               Z_DELREF_P(retval_ptr);
+                       }
                        ALLOC_INIT_ZVAL(ret);
                        *EG(return_value_ptr_ptr) = ret;
                } else {
                        *EG(return_value_ptr_ptr) = retval_ptr;
-                       Z_ADDREF_P(retval_ptr);
+                       if (OP1_TYPE == IS_CV) {
+                               Z_ADDREF_P(retval_ptr);
+                       }
                }
        }
-       FREE_OP1_IF_VAR();
        ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
 }
 
@@ -2936,7 +2937,7 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY)
                }
        } while (0);
 
-       FREE_OP1_IF_VAR();
+       FREE_OP1_VAR_PTR();
        ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
 }
 
@@ -3079,21 +3080,26 @@ ZEND_VM_HELPER(zend_send_by_var_helper, VAR|CV, ANY)
        varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
 
        if (varptr == &EG(uninitialized_zval)) {
-               ALLOC_ZVAL(varptr);
-               INIT_ZVAL(*varptr);
-               Z_SET_REFCOUNT_P(varptr, 0);
+               if (OP1_TYPE == IS_VAR) {
+                       Z_DELREF_P(varptr);
+               }
+               ALLOC_INIT_ZVAL(varptr);
        } else if (PZVAL_IS_REF(varptr)) {
-               zval *original_var = varptr;
+               if (OP1_TYPE == IS_CV ||
+                   (OP1_TYPE == IS_VAR && Z_REFCOUNT_P(varptr) > 2)) {
+                       zval *original_var = varptr;
 
-               ALLOC_ZVAL(varptr);
-               ZVAL_COPY_VALUE(varptr, original_var);
-               Z_UNSET_ISREF_P(varptr);
-               Z_SET_REFCOUNT_P(varptr, 0);
-               zval_copy_ctor(varptr);
+                       ALLOC_ZVAL(varptr);
+                       INIT_PZVAL_COPY(varptr, original_var);
+                       zval_copy_ctor(varptr);
+                       FREE_OP1();
+               } else {
+                       Z_UNSET_ISREF_P(varptr);
+               }
+       } else if (OP1_TYPE == IS_CV) {
+               Z_ADDREF_P(varptr);
        }
-       Z_ADDREF_P(varptr);
        zend_vm_stack_push(varptr TSRMLS_CC);
-       FREE_OP1();  /* for string offsets */
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -3114,22 +3120,15 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
                ZEND_VM_DISPATCH_TO_HELPER(zend_send_by_var_helper);
        }
 
-       if (OP1_TYPE == IS_VAR &&
-               (opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
-               EX_T(opline->op1.var).var.fcall_returned_reference &&
-               EX_T(opline->op1.var).var.ptr) {
-               varptr = EX_T(opline->op1.var).var.ptr;
-               PZVAL_UNLOCK_EX(varptr, &free_op1, 0);
-       } else {
-               varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
-       }
+       varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
        if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
             EX_T(opline->op1.var).var.fcall_returned_reference) &&
            varptr != &EG(uninitialized_zval) &&
-           (PZVAL_IS_REF(varptr) ||
-            (Z_REFCOUNT_P(varptr) == 1 && (OP1_TYPE == IS_CV || free_op1.var)))) {
+           (PZVAL_IS_REF(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
                Z_SET_ISREF_P(varptr);
-               Z_ADDREF_P(varptr);
+               if (OP1_TYPE == IS_CV) {
+                       Z_ADDREF_P(varptr);
+               }
                zend_vm_stack_push(varptr TSRMLS_CC);
        } else {
                zval *valptr;
@@ -3144,9 +3143,9 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
                if (!IS_OP1_TMP_FREE()) {
                        zval_copy_ctor(valptr);
                }
+               FREE_OP1_IF_VAR();
                zend_vm_stack_push(valptr TSRMLS_CC);
        }
-       FREE_OP1_IF_VAR();
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -3347,9 +3346,6 @@ ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        zend_free_op free_op1, free_op2;
 
        SAVE_OPLINE();
-       if (OP1_TYPE==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 GET_OP1_ZVAL_PTR(BP_VAR_R),
                                 GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
@@ -3611,7 +3607,8 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMP|VAR|UNUS
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+                       FREE_OP1_IF_VAR();
+               } else if (OP1_TYPE == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -3659,8 +3656,6 @@ ZEND_VM_C_LABEL(num_index):
        }
        if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) && opline->extended_value) {
                FREE_OP1_VAR_PTR();
-       } else {
-               FREE_OP1_IF_VAR();
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -4147,19 +4142,27 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                        ce = Z_OBJCE_P(array_ptr);
                        if (!ce || !ce->get_iterator) {
-                               Z_ADDREF_P(array_ptr);
+                               if (OP1_TYPE == IS_CV) {
+                                       Z_ADDREF_P(array_ptr);
+                               }
                        }
                } else if (OP1_TYPE == IS_CONST ||
-                          ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) &&
+                          (OP1_TYPE == IS_CV && 
                            !Z_ISREF_P(array_ptr) &&
-                           Z_REFCOUNT_P(array_ptr) > 1)) {
+                           Z_REFCOUNT_P(array_ptr) > 1) ||
+                          (OP1_TYPE == IS_VAR &&
+                           !Z_ISREF_P(array_ptr) &&
+                           Z_REFCOUNT_P(array_ptr) > 2)) {
                        zval *tmp;
 
+                       if (OP1_TYPE == IS_VAR) {
+                               Z_DELREF_P(array_ptr);
+                       }
                        ALLOC_ZVAL(tmp);
                        INIT_PZVAL_COPY(tmp, array_ptr);
                        zval_copy_ctor(tmp);
                        array_ptr = tmp;
-               } else {
+               } else if (OP1_TYPE == IS_CV) {
                        Z_ADDREF_P(array_ptr);
                }
        }
@@ -4167,10 +4170,15 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
        if (ce && ce->get_iterator) {
                iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
 
+               if (OP1_TYPE == IS_VAR && !(opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
+                       FREE_OP1_IF_VAR();
+               }
                if (iter && EXPECTED(EG(exception) == NULL)) {
                        array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
                } else {
-                       FREE_OP1_IF_VAR();
+                       if (OP1_TYPE == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+                               FREE_OP1_VAR_PTR();
+                       }
                        if (!EG(exception)) {
                                zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
                        }
@@ -4187,14 +4195,18 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
                        iter->funcs->rewind(iter TSRMLS_CC);
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                zval_ptr_dtor(&array_ptr);
-                               FREE_OP1_IF_VAR();
+                               if (OP1_TYPE == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+                                       FREE_OP1_VAR_PTR();
+                               }
                                HANDLE_EXCEPTION();
                        }
                }
                is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zval_ptr_dtor(&array_ptr);
-                       FREE_OP1_IF_VAR();
+                       if (OP1_TYPE == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+                               FREE_OP1_VAR_PTR();
+                       }
                        HANDLE_EXCEPTION();
                }
                iter->index = -1; /* will be set to 0 before using next handler */
@@ -4224,7 +4236,9 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
                is_empty = 1;
        }
 
-       FREE_OP1_IF_VAR();
+       if (OP1_TYPE == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+               FREE_OP1_VAR_PTR();
+       }
        if (is_empty) {
                ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
        } else {
@@ -4460,7 +4474,7 @@ ZEND_VM_HELPER_EX(zend_isset_isempty_dim_prop_obj_handler, VAR|UNUSED|CV, CONST|
        zval *offset;
 
        SAVE_OPLINE();
-       container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_IS);
+       container = GET_OP1_OBJ_ZVAL_PTR_PTR_FAST(BP_VAR_IS);
 
        offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
 
@@ -4587,7 +4601,7 @@ ZEND_VM_C_LABEL(num_index_prop):
                Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
        }
 
-       FREE_OP1_VAR_PTR();
+       FREE_OP1_VAR_PTR_FAST();
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -5289,14 +5303,14 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
                                        generator->value = *value_ptr;
                                }
 
-                               FREE_OP1_IF_VAR();
+                               FREE_OP1_VAR_PTR();
                        }
                } else {
                        zval *value = GET_OP1_ZVAL_PTR(BP_VAR_R);
 
                        /* Consts, temporary variables and references need copying */
                        if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -5309,12 +5323,13 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
                                }
 
                                generator->value = copy;
+                               FREE_OP1_IF_VAR();
                        } else {
-                               Z_ADDREF_P(value);
+                               if (OP1_TYPE == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
-                       FREE_OP1_IF_VAR();
                }
        } else {
                /* If no value was specified yield null */
index c3635c114869bc3fe41875fdd0288fd5292dbdff..bb50b4803f7143acff1c15647f5f45807d7ced16 100644 (file)
@@ -1716,7 +1716,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                        zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
                }
 
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
                CHECK_EXCEPTION();
                ZEND_VM_NEXT_OPCODE();
        }
@@ -1765,7 +1765,7 @@ static int ZEND_FASTCALL  ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H
                                zend_error_noreturn(E_ERROR, "Call to undefined function %s()", function_name_strval);
                        }
                        efree(lcname);
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                        call->object = NULL;
                        call->called_scope = NULL;
                        call->is_ctor_call = 0;
@@ -1784,7 +1784,7 @@ static int ZEND_FASTCALL  ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H
                                /* Delay closure destruction until its invocation */
                                call->fbc->common.prototype = (zend_function*)function_name;
                        } else {
-                               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                               zval_ptr_dtor(&free_op2.var);
                        }
                        call->is_ctor_call = 0;
                        EX(call) = call;
@@ -1855,7 +1855,7 @@ static int ZEND_FASTCALL  ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H
                        }
                        call->is_ctor_call = 0;
                        EX(call) = call;
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                        CHECK_EXCEPTION();
                        ZEND_VM_NEXT_OPCODE();
                } else {
@@ -2336,9 +2336,7 @@ static int ZEND_FASTCALL  ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
        retval_ptr = opline->op1.zv;
 
        if (!EG(return_value_ptr_ptr)) {
-               if (IS_CONST == IS_TMP_VAR) {
 
-               }
        } else {
                if (IS_CONST == IS_CONST ||
                    IS_CONST == IS_TMP_VAR ||
@@ -2351,18 +2349,23 @@ static int ZEND_FASTCALL  ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                zval_copy_ctor(ret);
                        }
                        *EG(return_value_ptr_ptr) = ret;
+
                } else if ((IS_CONST == IS_CV || IS_CONST == IS_VAR) &&
                           retval_ptr == &EG(uninitialized_zval)) {
                        zval *ret;
 
+                       if (IS_CONST == IS_VAR) {
+                               Z_DELREF_P(retval_ptr);
+                       }
                        ALLOC_INIT_ZVAL(ret);
                        *EG(return_value_ptr_ptr) = ret;
                } else {
                        *EG(return_value_ptr_ptr) = retval_ptr;
-                       Z_ADDREF_P(retval_ptr);
+                       if (IS_CONST == IS_CV) {
+                               Z_ADDREF_P(retval_ptr);
+                       }
                }
        }
-
        return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
@@ -2822,19 +2825,27 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                        ce = Z_OBJCE_P(array_ptr);
                        if (!ce || !ce->get_iterator) {
-                               Z_ADDREF_P(array_ptr);
+                               if (IS_CONST == IS_CV) {
+                                       Z_ADDREF_P(array_ptr);
+                               }
                        }
                } else if (IS_CONST == IS_CONST ||
-                          ((IS_CONST == IS_CV || IS_CONST == IS_VAR) &&
+                          (IS_CONST == IS_CV &&
+                           !Z_ISREF_P(array_ptr) &&
+                           Z_REFCOUNT_P(array_ptr) > 1) ||
+                          (IS_CONST == IS_VAR &&
                            !Z_ISREF_P(array_ptr) &&
-                           Z_REFCOUNT_P(array_ptr) > 1)) {
+                           Z_REFCOUNT_P(array_ptr) > 2)) {
                        zval *tmp;
 
+                       if (IS_CONST == IS_VAR) {
+                               Z_DELREF_P(array_ptr);
+                       }
                        ALLOC_ZVAL(tmp);
                        INIT_PZVAL_COPY(tmp, array_ptr);
                        zval_copy_ctor(tmp);
                        array_ptr = tmp;
-               } else {
+               } else if (IS_CONST == IS_CV) {
                        Z_ADDREF_P(array_ptr);
                }
        }
@@ -2842,10 +2853,15 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
        if (ce && ce->get_iterator) {
                iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
 
+               if (IS_CONST == IS_VAR && !(opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
+
+               }
                if (iter && EXPECTED(EG(exception) == NULL)) {
                        array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
                } else {
+                       if (IS_CONST == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
 
+                       }
                        if (!EG(exception)) {
                                zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
                        }
@@ -2862,14 +2878,18 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                        iter->funcs->rewind(iter TSRMLS_CC);
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                zval_ptr_dtor(&array_ptr);
+                               if (IS_CONST == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
 
+                               }
                                HANDLE_EXCEPTION();
                        }
                }
                is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zval_ptr_dtor(&array_ptr);
+                       if (IS_CONST == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
 
+                       }
                        HANDLE_EXCEPTION();
                }
                iter->index = -1; /* will be set to 0 before using next handler */
@@ -2899,6 +2919,9 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                is_empty = 1;
        }
 
+       if (IS_CONST == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+
+       }
        if (is_empty) {
                ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
        } else {
@@ -3481,12 +3504,6 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_CONST != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) {
                zval *container = opline->op1.zv;
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
@@ -3496,7 +3513,9 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_
                container = NULL;
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 
+               if (IS_CONST == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 
+               }
        }
 
        CHECK_EXCEPTION();
@@ -3654,9 +3673,6 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER
 
 
        SAVE_OPLINE();
-       if (IS_CONST==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 opline->op1.zv,
                                 opline->op2.zv TSRMLS_CC);
@@ -3791,7 +3807,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_O
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_CONST == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -3839,8 +3856,6 @@ num_index:
        }
        if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -4133,7 +4148,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLE
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -4146,11 +4161,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLE
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_CONST == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -4498,12 +4515,6 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HA
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_CONST != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) {
                zval *container = opline->op1.zv;
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
@@ -4513,7 +4524,9 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HA
                container = NULL;
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
                zval_dtor(free_op2.var);
+               if (IS_CONST == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 
+               }
        }
 
        CHECK_EXCEPTION();
@@ -4647,9 +4660,6 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_A
        zend_free_op free_op2;
 
        SAVE_OPLINE();
-       if (IS_CONST==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 opline->op1.zv,
                                 _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
@@ -4690,7 +4700,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPC
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_CONST == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -4738,8 +4749,6 @@ num_index:
        }
        if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -4831,7 +4840,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -4844,11 +4853,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_CONST == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -4922,7 +4933,7 @@ static int ZEND_FASTCALL  ZEND_ADD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -4937,7 +4948,7 @@ static int ZEND_FASTCALL  ZEND_SUB_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -4952,7 +4963,7 @@ static int ZEND_FASTCALL  ZEND_MUL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -4967,7 +4978,7 @@ static int ZEND_FASTCALL  ZEND_DIV_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -4982,7 +4993,7 @@ static int ZEND_FASTCALL  ZEND_MOD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -4997,7 +5008,7 @@ static int ZEND_FASTCALL  ZEND_SL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5012,7 +5023,7 @@ static int ZEND_FASTCALL  ZEND_SR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5027,7 +5038,7 @@ static int ZEND_FASTCALL  ZEND_CONCAT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5042,7 +5053,7 @@ static int ZEND_FASTCALL  ZEND_IS_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_H
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5059,7 +5070,7 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCO
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        Z_LVAL_P(result) = !Z_LVAL_P(result);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5075,7 +5086,7 @@ static int ZEND_FASTCALL  ZEND_IS_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5091,7 +5102,7 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_H
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5107,7 +5118,7 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HAN
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5123,7 +5134,7 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_O
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5138,7 +5149,7 @@ static int ZEND_FASTCALL  ZEND_BW_OR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5153,7 +5164,7 @@ static int ZEND_FASTCALL  ZEND_BW_AND_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5168,7 +5179,7 @@ static int ZEND_FASTCALL  ZEND_BW_XOR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5183,7 +5194,7 @@ static int ZEND_FASTCALL  ZEND_BOOL_XOR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL
                opline->op1.zv,
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5360,22 +5371,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HA
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_CONST != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) {
                zval *container = opline->op1.zv;
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
 
        } else {
                container = NULL;
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
+               if (IS_CONST == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 
+               }
        }
 
        CHECK_EXCEPTION();
@@ -5464,7 +5471,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZE
                        }
                }
                if (IS_VAR != IS_CONST) {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        } else {
                if (UNEXPECTED(ce->constructor == NULL)) {
@@ -5509,14 +5516,11 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
        zend_free_op free_op2;
 
        SAVE_OPLINE();
-       if (IS_CONST==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 opline->op1.zv,
                                 _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -5552,7 +5556,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPC
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_CONST == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -5594,14 +5599,12 @@ num_index:
                                /* do nothing */
                                break;
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
        }
        if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -5854,7 +5857,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -5867,11 +5870,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_CONST == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -5910,7 +5915,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                        generator->largest_used_integer_key = Z_LVAL_P(generator->key);
                }
 
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                /* If no key was specified we use auto-increment keys */
                generator->largest_used_integer_key++;
@@ -6252,7 +6257,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_CONST == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -6300,8 +6306,6 @@ num_index:
        }
        if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -6572,7 +6576,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDL
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -6585,11 +6589,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDL
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_CONST == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -6937,12 +6943,6 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HAN
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_CONST != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) {
                zval *container = opline->op1.zv;
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
@@ -6952,7 +6952,9 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HAN
                container = NULL;
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 
+               if (IS_CONST == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 
+               }
        }
 
        CHECK_EXCEPTION();
@@ -7146,9 +7148,6 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_AR
 
 
        SAVE_OPLINE();
-       if (IS_CONST==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 opline->op1.zv,
                                 _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
@@ -7188,7 +7187,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCO
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_CONST == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -7236,8 +7236,6 @@ num_index:
        }
        if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -7329,7 +7327,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -7342,11 +7340,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_CONST == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -7643,9 +7643,7 @@ static int ZEND_FASTCALL  ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        retval_ptr = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
        if (!EG(return_value_ptr_ptr)) {
-               if (IS_TMP_VAR == IS_TMP_VAR) {
-                       zval_dtor(free_op1.var);
-               }
+               zval_dtor(free_op1.var);
        } else {
                if (IS_TMP_VAR == IS_CONST ||
                    IS_TMP_VAR == IS_TMP_VAR ||
@@ -7658,18 +7656,23 @@ static int ZEND_FASTCALL  ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                                zval_copy_ctor(ret);
                        }
                        *EG(return_value_ptr_ptr) = ret;
+
                } else if ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) &&
                           retval_ptr == &EG(uninitialized_zval)) {
                        zval *ret;
 
+                       if (IS_TMP_VAR == IS_VAR) {
+                               Z_DELREF_P(retval_ptr);
+                       }
                        ALLOC_INIT_ZVAL(ret);
                        *EG(return_value_ptr_ptr) = ret;
                } else {
                        *EG(return_value_ptr_ptr) = retval_ptr;
-                       Z_ADDREF_P(retval_ptr);
+                       if (IS_TMP_VAR == IS_CV) {
+                               Z_ADDREF_P(retval_ptr);
+                       }
                }
        }
-
        return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
@@ -8130,19 +8133,27 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                        ce = Z_OBJCE_P(array_ptr);
                        if (!ce || !ce->get_iterator) {
-                               Z_ADDREF_P(array_ptr);
+                               if (IS_TMP_VAR == IS_CV) {
+                                       Z_ADDREF_P(array_ptr);
+                               }
                        }
                } else if (IS_TMP_VAR == IS_CONST ||
-                          ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) &&
+                          (IS_TMP_VAR == IS_CV &&
+                           !Z_ISREF_P(array_ptr) &&
+                           Z_REFCOUNT_P(array_ptr) > 1) ||
+                          (IS_TMP_VAR == IS_VAR &&
                            !Z_ISREF_P(array_ptr) &&
-                           Z_REFCOUNT_P(array_ptr) > 1)) {
+                           Z_REFCOUNT_P(array_ptr) > 2)) {
                        zval *tmp;
 
+                       if (IS_TMP_VAR == IS_VAR) {
+                               Z_DELREF_P(array_ptr);
+                       }
                        ALLOC_ZVAL(tmp);
                        INIT_PZVAL_COPY(tmp, array_ptr);
                        zval_copy_ctor(tmp);
                        array_ptr = tmp;
-               } else {
+               } else if (IS_TMP_VAR == IS_CV) {
                        Z_ADDREF_P(array_ptr);
                }
        }
@@ -8150,10 +8161,15 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
        if (ce && ce->get_iterator) {
                iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
 
+               if (IS_TMP_VAR == IS_VAR && !(opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
+
+               }
                if (iter && EXPECTED(EG(exception) == NULL)) {
                        array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
                } else {
+                       if (IS_TMP_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
 
+                       }
                        if (!EG(exception)) {
                                zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
                        }
@@ -8170,14 +8186,18 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                        iter->funcs->rewind(iter TSRMLS_CC);
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                zval_ptr_dtor(&array_ptr);
+                               if (IS_TMP_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
 
+                               }
                                HANDLE_EXCEPTION();
                        }
                }
                is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zval_ptr_dtor(&array_ptr);
+                       if (IS_TMP_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
 
+                       }
                        HANDLE_EXCEPTION();
                }
                iter->index = -1; /* will be set to 0 before using next handler */
@@ -8207,6 +8227,9 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                is_empty = 1;
        }
 
+       if (IS_TMP_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+
+       }
        if (is_empty) {
                ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
        } else {
@@ -8841,12 +8864,6 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HA
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_TMP_VAR != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) {
                zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
@@ -8856,7 +8873,9 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HA
                container = NULL;
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 
+               if (IS_TMP_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 
+               }
        }
 
        CHECK_EXCEPTION();
@@ -9018,9 +9037,6 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
        zend_free_op free_op1;
 
        SAVE_OPLINE();
-       if (IS_TMP_VAR==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                                 opline->op2.zv TSRMLS_CC);
@@ -9060,7 +9076,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPC
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_TMP_VAR == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -9108,8 +9125,6 @@ num_index:
        }
        if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -9362,7 +9377,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -9375,11 +9390,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_TMP_VAR == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -9727,12 +9744,6 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HAND
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_TMP_VAR != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) {
                zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
@@ -9742,7 +9753,9 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HAND
                container = NULL;
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
                zval_dtor(free_op2.var);
+               if (IS_TMP_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 
+               }
        }
 
        CHECK_EXCEPTION();
@@ -9880,9 +9893,6 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
        zend_free_op free_op1, free_op2;
 
        SAVE_OPLINE();
-       if (IS_TMP_VAR==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                                 _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
@@ -9923,7 +9933,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER(ZEND_OPCOD
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_TMP_VAR == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -9971,8 +9982,6 @@ num_index:
        }
        if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -10064,7 +10073,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -10077,11 +10086,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_TMP_VAR == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -10155,7 +10166,7 @@ static int ZEND_FASTCALL  ZEND_ADD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10170,7 +10181,7 @@ static int ZEND_FASTCALL  ZEND_SUB_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10185,7 +10196,7 @@ static int ZEND_FASTCALL  ZEND_MUL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10200,7 +10211,7 @@ static int ZEND_FASTCALL  ZEND_DIV_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10215,7 +10226,7 @@ static int ZEND_FASTCALL  ZEND_MOD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10230,7 +10241,7 @@ static int ZEND_FASTCALL  ZEND_SL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10245,7 +10256,7 @@ static int ZEND_FASTCALL  ZEND_SR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10260,7 +10271,7 @@ static int ZEND_FASTCALL  ZEND_CONCAT_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10275,7 +10286,7 @@ static int ZEND_FASTCALL  ZEND_IS_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAN
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10292,7 +10303,7 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        Z_LVAL_P(result) = !Z_LVAL_P(result);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10308,7 +10319,7 @@ static int ZEND_FASTCALL  ZEND_IS_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10324,7 +10335,7 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAN
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10340,7 +10351,7 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDL
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10356,7 +10367,7 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPC
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10371,7 +10382,7 @@ static int ZEND_FASTCALL  ZEND_BW_OR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10386,7 +10397,7 @@ static int ZEND_FASTCALL  ZEND_BW_AND_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10401,7 +10412,7 @@ static int ZEND_FASTCALL  ZEND_BW_XOR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10416,7 +10427,7 @@ static int ZEND_FASTCALL  ZEND_BOOL_XOR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER
                _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        zval_dtor(free_op1.var);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10593,22 +10604,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAND
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_TMP_VAR != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) {
                zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
                zval_dtor(free_op1.var);
        } else {
                container = NULL;
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
+               if (IS_TMP_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 
+               }
        }
 
        CHECK_EXCEPTION();
@@ -10654,7 +10661,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_
         * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
         * string offsets or overloaded objects
         */
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -10712,7 +10719,7 @@ static int ZEND_FASTCALL  ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE
                }
        } else {
                if (UNEXPECTED(EG(exception) != NULL)) {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                        HANDLE_EXCEPTION();
                }
                zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
@@ -10734,7 +10741,7 @@ static int ZEND_FASTCALL  ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE
        call->is_ctor_call = 0;
        EX(call) = call;
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -10746,14 +10753,11 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
        zend_free_op free_op1, free_op2;
 
        SAVE_OPLINE();
-       if (IS_TMP_VAR==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                                 _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -10789,7 +10793,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_TMP_VAR == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -10831,14 +10836,12 @@ num_index:
                                /* do nothing */
                                break;
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
        }
        if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -11091,7 +11094,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -11104,11 +11107,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_TMP_VAR == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -11147,7 +11152,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                        generator->largest_used_integer_key = Z_LVAL_P(generator->key);
                }
 
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                /* If no key was specified we use auto-increment keys */
                generator->largest_used_integer_key++;
@@ -11368,7 +11373,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_TMP_VAR == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -11416,8 +11422,6 @@ num_index:
        }
        if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -11670,7 +11674,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -11683,11 +11687,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_TMP_VAR == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -12035,12 +12041,6 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDL
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_TMP_VAR != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) {
                zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
@@ -12050,7 +12050,9 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDL
                container = NULL;
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 
+               if (IS_TMP_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 
+               }
        }
 
        CHECK_EXCEPTION();
@@ -12186,9 +12188,6 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        zend_free_op free_op1;
 
        SAVE_OPLINE();
-       if (IS_TMP_VAR==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                                 _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
@@ -12228,7 +12227,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_TMP_VAR == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -12276,8 +12276,6 @@ num_index:
        }
        if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -12369,7 +12367,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -12382,11 +12380,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_TMP_VAR == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -12458,7 +12458,7 @@ static int ZEND_FASTCALL  ZEND_BW_NOT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        SAVE_OPLINE();
        bitwise_not_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -12471,7 +12471,7 @@ static int ZEND_FASTCALL  ZEND_BOOL_NOT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
        SAVE_OPLINE();
        boolean_not_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -12670,7 +12670,7 @@ static int ZEND_FASTCALL  ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        }
        zend_print_variable(z);
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -12697,7 +12697,7 @@ static int ZEND_FASTCALL  ZEND_JMPZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                ret = Z_LVAL_P(val);
        } else {
                ret = i_zend_is_true(val);
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
                if (UNEXPECTED(EG(exception) != NULL)) {
                        HANDLE_EXCEPTION();
                }
@@ -12727,7 +12727,7 @@ static int ZEND_FASTCALL  ZEND_JMPNZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                ret = Z_LVAL_P(val);
        } else {
                ret = i_zend_is_true(val);
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
                if (UNEXPECTED(EG(exception) != NULL)) {
                        HANDLE_EXCEPTION();
                }
@@ -12757,7 +12757,7 @@ static int ZEND_FASTCALL  ZEND_JMPZNZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                retval = Z_LVAL_P(val);
        } else {
                retval = i_zend_is_true(val);
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
                if (UNEXPECTED(EG(exception) != NULL)) {
                        HANDLE_EXCEPTION();
                }
@@ -12791,7 +12791,7 @@ static int ZEND_FASTCALL  ZEND_JMPZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                retval = Z_LVAL_P(val);
        } else {
                retval = i_zend_is_true(val);
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
                if (UNEXPECTED(EG(exception) != NULL)) {
                        HANDLE_EXCEPTION();
                }
@@ -12822,7 +12822,7 @@ static int ZEND_FASTCALL  ZEND_JMPNZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                retval = Z_LVAL_P(val);
        } else {
                retval = i_zend_is_true(val);
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
                if (UNEXPECTED(EG(exception) != NULL)) {
                        HANDLE_EXCEPTION();
                }
@@ -12863,9 +12863,7 @@ static int ZEND_FASTCALL  ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        retval_ptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
        if (!EG(return_value_ptr_ptr)) {
-               if (IS_VAR == IS_TMP_VAR) {
-                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-               }
+               zval_ptr_dtor(&free_op1.var);
        } else {
                if (IS_VAR == IS_CONST ||
                    IS_VAR == IS_TMP_VAR ||
@@ -12878,18 +12876,23 @@ static int ZEND_FASTCALL  ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                                zval_copy_ctor(ret);
                        }
                        *EG(return_value_ptr_ptr) = ret;
+                       zval_ptr_dtor(&free_op1.var);
                } else if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) &&
                           retval_ptr == &EG(uninitialized_zval)) {
                        zval *ret;
 
+                       if (IS_VAR == IS_VAR) {
+                               Z_DELREF_P(retval_ptr);
+                       }
                        ALLOC_INIT_ZVAL(ret);
                        *EG(return_value_ptr_ptr) = ret;
                } else {
                        *EG(return_value_ptr_ptr) = retval_ptr;
-                       Z_ADDREF_P(retval_ptr);
+                       if (IS_VAR == IS_CV) {
+                               Z_ADDREF_P(retval_ptr);
+                       }
                }
        }
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
@@ -12910,7 +12913,7 @@ static int ZEND_FASTCALL  ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE
                        retval_ptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                        if (!EG(return_value_ptr_ptr)) {
                                if (IS_VAR == IS_TMP_VAR) {
-                                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                                       zval_ptr_dtor(&free_op1.var);
                                }
                        } else if (!0) { /* Not a temp var */
                                zval *ret;
@@ -12988,7 +12991,7 @@ static int ZEND_FASTCALL  ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 
        zend_throw_exception_object(exception TSRMLS_CC);
        zend_exception_restore(TSRMLS_C);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        HANDLE_EXCEPTION();
 }
 
@@ -13000,21 +13003,26 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_AR
        varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
        if (varptr == &EG(uninitialized_zval)) {
-               ALLOC_ZVAL(varptr);
-               INIT_ZVAL(*varptr);
-               Z_SET_REFCOUNT_P(varptr, 0);
+               if (IS_VAR == IS_VAR) {
+                       Z_DELREF_P(varptr);
+               }
+               ALLOC_INIT_ZVAL(varptr);
        } else if (PZVAL_IS_REF(varptr)) {
-               zval *original_var = varptr;
+               if (IS_VAR == IS_CV ||
+                   (IS_VAR == IS_VAR && Z_REFCOUNT_P(varptr) > 2)) {
+                       zval *original_var = varptr;
 
-               ALLOC_ZVAL(varptr);
-               ZVAL_COPY_VALUE(varptr, original_var);
-               Z_UNSET_ISREF_P(varptr);
-               Z_SET_REFCOUNT_P(varptr, 0);
-               zval_copy_ctor(varptr);
+                       ALLOC_ZVAL(varptr);
+                       INIT_PZVAL_COPY(varptr, original_var);
+                       zval_copy_ctor(varptr);
+                       zval_ptr_dtor(&free_op1.var);
+               } else {
+                       Z_UNSET_ISREF_P(varptr);
+               }
+       } else if (IS_VAR == IS_CV) {
+               Z_ADDREF_P(varptr);
        }
-       Z_ADDREF_P(varptr);
        zend_vm_stack_push(varptr TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};  /* for string offsets */
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -13035,22 +13043,15 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
                return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        }
 
-       if (IS_VAR == IS_VAR &&
-               (opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
-               EX_T(opline->op1.var).var.fcall_returned_reference &&
-               EX_T(opline->op1.var).var.ptr) {
-               varptr = EX_T(opline->op1.var).var.ptr;
-               PZVAL_UNLOCK_EX(varptr, &free_op1, 0);
-       } else {
-               varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
-       }
+       varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
             EX_T(opline->op1.var).var.fcall_returned_reference) &&
            varptr != &EG(uninitialized_zval) &&
-           (PZVAL_IS_REF(varptr) ||
-            (Z_REFCOUNT_P(varptr) == 1 && (IS_VAR == IS_CV || free_op1.var)))) {
+           (PZVAL_IS_REF(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
                Z_SET_ISREF_P(varptr);
-               Z_ADDREF_P(varptr);
+               if (IS_VAR == IS_CV) {
+                       Z_ADDREF_P(varptr);
+               }
                zend_vm_stack_push(varptr TSRMLS_CC);
        } else {
                zval *valptr;
@@ -13065,9 +13066,9 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
                if (!0) {
                        zval_copy_ctor(valptr);
                }
+               zval_ptr_dtor(&free_op1.var);
                zend_vm_stack_push(valptr TSRMLS_CC);
        }
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -13130,7 +13131,7 @@ static int ZEND_FASTCALL  ZEND_BOOL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        SAVE_OPLINE();
        /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
        ZVAL_BOOL(retval, i_zend_is_true(_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC)));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -13207,7 +13208,7 @@ static int ZEND_FASTCALL  ZEND_CLONE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                        AI_SET_PTR(&EX_T(opline->result.var), retval);
                }
        }
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -13249,7 +13250,7 @@ static int ZEND_FASTCALL  ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                        if (use_copy) {
                                ZVAL_COPY_VALUE(result, &var_copy);
                                if (0) {
-                                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                                       zval_ptr_dtor(&free_op1.var);
                                }
                        } else {
                                ZVAL_COPY_VALUE(result, expr);
@@ -13266,7 +13267,7 @@ static int ZEND_FASTCALL  ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                        convert_to_object(result);
                        break;
        }
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -13355,7 +13356,7 @@ static int ZEND_FASTCALL  ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
        if (tmp_inc_filename) {
                zval_ptr_dtor(&tmp_inc_filename);
        }
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        if (UNEXPECTED(EG(exception) != NULL)) {
                HANDLE_EXCEPTION();
        } else if (EXPECTED(new_op_array != NULL)) {
@@ -13462,19 +13463,27 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                        ce = Z_OBJCE_P(array_ptr);
                        if (!ce || !ce->get_iterator) {
-                               Z_ADDREF_P(array_ptr);
+                               if (IS_VAR == IS_CV) {
+                                       Z_ADDREF_P(array_ptr);
+                               }
                        }
                } else if (IS_VAR == IS_CONST ||
-                          ((IS_VAR == IS_CV || IS_VAR == IS_VAR) &&
+                          (IS_VAR == IS_CV &&
+                           !Z_ISREF_P(array_ptr) &&
+                           Z_REFCOUNT_P(array_ptr) > 1) ||
+                          (IS_VAR == IS_VAR &&
                            !Z_ISREF_P(array_ptr) &&
-                           Z_REFCOUNT_P(array_ptr) > 1)) {
+                           Z_REFCOUNT_P(array_ptr) > 2)) {
                        zval *tmp;
 
+                       if (IS_VAR == IS_VAR) {
+                               Z_DELREF_P(array_ptr);
+                       }
                        ALLOC_ZVAL(tmp);
                        INIT_PZVAL_COPY(tmp, array_ptr);
                        zval_copy_ctor(tmp);
                        array_ptr = tmp;
-               } else {
+               } else if (IS_VAR == IS_CV) {
                        Z_ADDREF_P(array_ptr);
                }
        }
@@ -13482,10 +13491,15 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
        if (ce && ce->get_iterator) {
                iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
 
+               if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
+                       zval_ptr_dtor(&free_op1.var);
+               }
                if (iter && EXPECTED(EG(exception) == NULL)) {
                        array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
                } else {
-                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                       if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+                               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                       }
                        if (!EG(exception)) {
                                zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
                        }
@@ -13502,14 +13516,18 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                        iter->funcs->rewind(iter TSRMLS_CC);
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                zval_ptr_dtor(&array_ptr);
-                               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                               if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+                                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                               }
                                HANDLE_EXCEPTION();
                        }
                }
                is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zval_ptr_dtor(&array_ptr);
-                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                       if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+                               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                       }
                        HANDLE_EXCEPTION();
                }
                iter->index = -1; /* will be set to 0 before using next handler */
@@ -13539,7 +13557,9 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                is_empty = 1;
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       }
        if (is_empty) {
                ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
        } else {
@@ -13694,7 +13714,7 @@ static int ZEND_FASTCALL  ZEND_EXIT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                } else {
                        zend_print_variable(ptr);
                }
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
        }
 #endif
        zend_bailout();
@@ -13715,14 +13735,14 @@ static int ZEND_FASTCALL  ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                if (!0) {
                        zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
                }
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
 #if DEBUG_ZEND>=2
                printf("Conditional jmp to %d\n", opline->op2.opline_num);
 #endif
                ZEND_VM_JMP(opline->op2.jmp_addr);
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -13750,14 +13770,14 @@ static int ZEND_FASTCALL  ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                                zval_copy_ctor(EX_T(opline->result.var).var.ptr);
                        }
                }
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
 #if DEBUG_ZEND>=2
                printf("Conditional jmp to %d\n", opline->op2.opline_num);
 #endif
                ZEND_VM_JMP(opline->op2.jmp_addr);
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -13775,7 +13795,7 @@ static int ZEND_FASTCALL  ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
        if (!0) {
                zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
        }
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -13803,7 +13823,7 @@ static int ZEND_FASTCALL  ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE
                }
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -13824,7 +13844,7 @@ static int ZEND_FASTCALL  ZEND_INSTANCEOF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
                result = 0;
        }
        ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, result);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -13838,7 +13858,7 @@ static int ZEND_FASTCALL  ZEND_ADD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
        fast_add_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -13853,7 +13873,7 @@ static int ZEND_FASTCALL  ZEND_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
        fast_sub_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -13868,7 +13888,7 @@ static int ZEND_FASTCALL  ZEND_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
        fast_mul_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -13883,7 +13903,7 @@ static int ZEND_FASTCALL  ZEND_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
        fast_div_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -13898,7 +13918,7 @@ static int ZEND_FASTCALL  ZEND_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
        fast_mod_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -13913,7 +13933,7 @@ static int ZEND_FASTCALL  ZEND_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
        shift_left_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -13928,7 +13948,7 @@ static int ZEND_FASTCALL  ZEND_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
        shift_right_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -13943,7 +13963,7 @@ static int ZEND_FASTCALL  ZEND_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER
        concat_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -13958,7 +13978,7 @@ static int ZEND_FASTCALL  ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H
        is_identical_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -13975,7 +13995,7 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
        Z_LVAL_P(result) = !Z_LVAL_P(result);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -13991,7 +14011,7 @@ static int ZEND_FASTCALL  ZEND_IS_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL
        ZVAL_BOOL(result, fast_equal_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -14007,7 +14027,7 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H
        ZVAL_BOOL(result, fast_not_equal_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -14023,7 +14043,7 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN
        ZVAL_BOOL(result, fast_is_smaller_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -14039,7 +14059,7 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_O
        ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -14054,7 +14074,7 @@ static int ZEND_FASTCALL  ZEND_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_
        bitwise_or_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -14069,7 +14089,7 @@ static int ZEND_FASTCALL  ZEND_BW_AND_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER
        bitwise_and_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -14084,7 +14104,7 @@ static int ZEND_FASTCALL  ZEND_BW_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER
        bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -14099,7 +14119,7 @@ static int ZEND_FASTCALL  ZEND_BOOL_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL
        boolean_xor_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                opline->op2.zv TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -14601,7 +14621,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type,
                                        if (IS_VAR != IS_CONST && varname == &tmp_varname) {
                                                zval_dtor(&tmp_varname);
                                        }
-                                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                                       zval_ptr_dtor(&free_op1.var);
                                        CHECK_EXCEPTION();
                                        ZEND_VM_NEXT_OPCODE();
                                }
@@ -14611,7 +14631,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type,
                        ce = EX_T(opline->op2.var).class_entry;
                }
                retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
        } else {
                target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
 /*
@@ -14650,11 +14670,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type,
                switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
                        case ZEND_FETCH_GLOBAL:
                                if (IS_VAR != IS_TMP_VAR) {
-                                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                                       zval_ptr_dtor(&free_op1.var);
                                }
                                break;
                        case ZEND_FETCH_LOCAL:
-                               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                               zval_ptr_dtor(&free_op1.var);
                                break;
                        case ZEND_FETCH_STATIC:
                                zval_update_constant(retval, (void*) 1 TSRMLS_CC);
@@ -14739,22 +14759,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_VAR != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) {
                zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
        } else {
-               container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+                       zval_ptr_dtor(&free_op1.var);
+               }
        }
 
        CHECK_EXCEPTION();
@@ -14824,10 +14840,10 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H
        zval **container;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_IS TSRMLS_CC);
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -14849,15 +14865,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OP
                if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        } else {
                if (IS_CONST == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
                }
-               container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
-       }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -14941,7 +14959,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CONST(
                }
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -15068,7 +15086,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H
                }
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -15392,7 +15410,7 @@ static int ZEND_FASTCALL  ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO
        call->is_ctor_call = 0;
        EX(call) = call;
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -15525,9 +15543,6 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
        zend_free_op free_op1;
 
        SAVE_OPLINE();
-       if (IS_VAR==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                                 opline->op2.zv TSRMLS_CC);
@@ -15662,7 +15677,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPC
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+                       zval_ptr_dtor(&free_op1.var);
+               } else if (IS_VAR == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -15710,8 +15726,6 @@ num_index:
        }
        if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
                if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       } else {
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -15780,7 +15794,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND
                                        } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
                                                zval_ptr_dtor(&varname);
                                        }
-                                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                                       zval_ptr_dtor(&free_op1.var);
                                        CHECK_EXCEPTION();
                                        ZEND_VM_NEXT_OPCODE();
                                }
@@ -15802,7 +15816,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND
        } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
                zval_ptr_dtor(&varname);
        }
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -16012,7 +16026,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC
                if (IS_VAR != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
        }
 
        if (opline->extended_value & ZEND_ISSET) {
@@ -16044,7 +16058,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST(
        zval *offset;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
        offset = opline->op2.zv;
 
@@ -16171,7 +16185,7 @@ num_index_prop:
                Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16260,7 +16274,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -16273,12 +16287,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_
                                }
 
                                generator->value = copy;
+                               zval_ptr_dtor(&free_op1.var);
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_VAR == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
-                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
                }
        } else {
                /* If no value was specified yield null */
@@ -16351,7 +16366,7 @@ static int ZEND_FASTCALL  ZEND_ADD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        fast_add_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16366,7 +16381,7 @@ static int ZEND_FASTCALL  ZEND_SUB_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        fast_sub_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16381,7 +16396,7 @@ static int ZEND_FASTCALL  ZEND_MUL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        fast_mul_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16396,7 +16411,7 @@ static int ZEND_FASTCALL  ZEND_DIV_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        fast_div_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16411,7 +16426,7 @@ static int ZEND_FASTCALL  ZEND_MOD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        fast_mod_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16426,7 +16441,7 @@ static int ZEND_FASTCALL  ZEND_SL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        shift_left_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16441,7 +16456,7 @@ static int ZEND_FASTCALL  ZEND_SR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        shift_right_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16456,7 +16471,7 @@ static int ZEND_FASTCALL  ZEND_CONCAT_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_A
        concat_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16471,7 +16486,7 @@ static int ZEND_FASTCALL  ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN
        is_identical_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16488,7 +16503,7 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        Z_LVAL_P(result) = !Z_LVAL_P(result);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16504,7 +16519,7 @@ static int ZEND_FASTCALL  ZEND_IS_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER
        ZVAL_BOOL(result, fast_equal_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16520,7 +16535,7 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN
        ZVAL_BOOL(result, fast_not_equal_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16536,7 +16551,7 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL
        ZVAL_BOOL(result, fast_is_smaller_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16552,7 +16567,7 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPC
        ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16567,7 +16582,7 @@ static int ZEND_FASTCALL  ZEND_BW_OR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
        bitwise_or_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16582,7 +16597,7 @@ static int ZEND_FASTCALL  ZEND_BW_AND_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_A
        bitwise_and_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16597,7 +16612,7 @@ static int ZEND_FASTCALL  ZEND_BW_XOR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_A
        bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -16612,7 +16627,7 @@ static int ZEND_FASTCALL  ZEND_BOOL_XOR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER
        boolean_xor_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        zval_dtor(free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -17089,22 +17104,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_VAR != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) {
                zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
                zval_dtor(free_op2.var);
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
        } else {
-               container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
                zval_dtor(free_op2.var);
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+                       zval_ptr_dtor(&free_op1.var);
+               }
        }
 
        CHECK_EXCEPTION();
@@ -17174,10 +17185,10 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN
        zval **container;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_IS TSRMLS_CC);
        zval_dtor(free_op2.var);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -17199,15 +17210,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCO
                if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+               zval_dtor(free_op2.var);
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        } else {
                if (IS_TMP_VAR == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
                }
-               container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
+               zval_dtor(free_op2.var);
+               zval_ptr_dtor(&free_op1.var);
        }
-       zval_dtor(free_op2.var);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -17291,7 +17304,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_TMP(ZE
                }
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -17418,7 +17431,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN
                }
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -17744,7 +17757,7 @@ static int ZEND_FASTCALL  ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE
        EX(call) = call;
 
        zval_dtor(free_op2.var);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -17877,9 +17890,6 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
        zend_free_op free_op1, free_op2;
 
        SAVE_OPLINE();
-       if (IS_VAR==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                                 _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
@@ -17920,7 +17930,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCOD
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+                       zval_ptr_dtor(&free_op1.var);
+               } else if (IS_VAR == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -17968,8 +17979,6 @@ num_index:
        }
        if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
                if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       } else {
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -18141,7 +18150,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in
        zval *offset;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
        offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
@@ -18268,7 +18277,7 @@ num_index_prop:
                Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -18357,7 +18366,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -18370,12 +18379,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
                                }
 
                                generator->value = copy;
+                               zval_ptr_dtor(&free_op1.var);
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_VAR == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
-                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
                }
        } else {
                /* If no value was specified yield null */
@@ -18448,8 +18458,8 @@ static int ZEND_FASTCALL  ZEND_ADD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        fast_add_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18463,8 +18473,8 @@ static int ZEND_FASTCALL  ZEND_SUB_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        fast_sub_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18478,8 +18488,8 @@ static int ZEND_FASTCALL  ZEND_MUL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        fast_mul_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18493,8 +18503,8 @@ static int ZEND_FASTCALL  ZEND_DIV_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        fast_div_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18508,8 +18518,8 @@ static int ZEND_FASTCALL  ZEND_MOD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        fast_mod_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18523,8 +18533,8 @@ static int ZEND_FASTCALL  ZEND_SL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        shift_left_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18538,8 +18548,8 @@ static int ZEND_FASTCALL  ZEND_SR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        shift_right_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18553,8 +18563,8 @@ static int ZEND_FASTCALL  ZEND_CONCAT_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
        concat_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18568,8 +18578,8 @@ static int ZEND_FASTCALL  ZEND_IS_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
        is_identical_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18585,8 +18595,8 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        Z_LVAL_P(result) = !Z_LVAL_P(result);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18601,8 +18611,8 @@ static int ZEND_FASTCALL  ZEND_IS_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER
        ZVAL_BOOL(result, fast_equal_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18617,8 +18627,8 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
        ZVAL_BOOL(result, fast_not_equal_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18633,8 +18643,8 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
        ZVAL_BOOL(result, fast_is_smaller_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18649,8 +18659,8 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPC
        ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18664,8 +18674,8 @@ static int ZEND_FASTCALL  ZEND_BW_OR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
        bitwise_or_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18679,8 +18689,8 @@ static int ZEND_FASTCALL  ZEND_BW_AND_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
        bitwise_and_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18694,8 +18704,8 @@ static int ZEND_FASTCALL  ZEND_BW_XOR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
        bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18709,8 +18719,8 @@ static int ZEND_FASTCALL  ZEND_BOOL_XOR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER
        boolean_xor_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op1.var);
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -18734,7 +18744,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*bin
 
        if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
                zend_error(E_WARNING, "Attempt to assign property of non-object");
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
                FREE_OP(free_op_data1);
 
                if (RETURN_VALUE_USED(opline)) {
@@ -18815,7 +18825,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*bin
                if (0) {
                        zval_ptr_dtor(&property);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
                FREE_OP(free_op_data1);
        }
@@ -18874,7 +18884,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_
                        PZVAL_LOCK(&EG(uninitialized_zval));
                        AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
                if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
                CHECK_EXCEPTION();
                if (opline->extended_value == ZEND_ASSIGN_DIM) {
@@ -18902,7 +18912,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_
                PZVAL_LOCK(*var_ptr);
                AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
        }
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
 
        if (opline->extended_value == ZEND_ASSIGN_DIM) {
                FREE_OP(free_op_data1);
@@ -18996,7 +19006,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t i
 
        if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
                zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
                if (RETURN_VALUE_USED(opline)) {
                        PZVAL_LOCK(&EG(uninitialized_zval));
                        *retval = &EG(uninitialized_zval);
@@ -19059,7 +19069,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t i
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        CHECK_EXCEPTION();
@@ -19100,7 +19110,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t
 
        if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
                zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
                ZVAL_NULL(retval);
                if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
                CHECK_EXCEPTION();
@@ -19161,7 +19171,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        CHECK_EXCEPTION();
@@ -19212,7 +19222,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE
                                        if (IS_VAR != IS_CONST && varname == &tmp_varname) {
                                                zval_dtor(&tmp_varname);
                                        }
-                                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                                       zval_ptr_dtor(&free_op1.var);
                                        CHECK_EXCEPTION();
                                        ZEND_VM_NEXT_OPCODE();
                                }
@@ -19222,7 +19232,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE
                        ce = EX_T(opline->op2.var).class_entry;
                }
                retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
        } else {
                target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
 /*
@@ -19261,11 +19271,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE
                switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
                        case ZEND_FETCH_GLOBAL:
                                if (IS_VAR != IS_TMP_VAR) {
-                                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                                       zval_ptr_dtor(&free_op1.var);
                                }
                                break;
                        case ZEND_FETCH_LOCAL:
-                               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                               zval_ptr_dtor(&free_op1.var);
                                break;
                        case ZEND_FETCH_STATIC:
                                zval_update_constant(retval, (void*) 1 TSRMLS_CC);
@@ -19350,22 +19360,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_VAR != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) {
                zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op2.var);
+               zval_ptr_dtor(&free_op1.var);
        } else {
-               container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op2.var);
+               if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+                       zval_ptr_dtor(&free_op1.var);
+               }
        }
 
        CHECK_EXCEPTION();
@@ -19385,7 +19391,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND
                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        }
        zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
        }
@@ -19419,7 +19425,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_RW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        }
        zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_RW TSRMLS_CC);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
        }
@@ -19435,10 +19441,10 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
        zval **container;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_IS TSRMLS_CC);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op2.var);
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -19460,15 +19466,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCO
                if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+               zval_ptr_dtor(&free_op2.var);
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        } else {
                if (IS_VAR == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
                }
-               container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
+               zval_ptr_dtor(&free_op2.var);
+               zval_ptr_dtor(&free_op1.var);
        }
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -19491,7 +19499,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_
                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        }
        zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_UNSET TSRMLS_CC);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
        }
@@ -19531,7 +19539,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_VAR(ZE
                zend_error(E_NOTICE, "Trying to get property of non-object");
                PZVAL_LOCK(&EG(uninitialized_zval));
                AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                zval *retval;
 
@@ -19548,11 +19556,11 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_VAR(ZE
                if (0) {
                        zval_ptr_dtor(&offset);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -19589,7 +19597,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -19632,7 +19640,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_RW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -19658,7 +19666,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
            UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
                PZVAL_LOCK(&EG(uninitialized_zval));
                AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                zval *retval;
 
@@ -19675,11 +19683,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
                if (0) {
                        zval_ptr_dtor(&offset);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -19708,7 +19716,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCO
                if (0) {
                        zval_ptr_dtor(&property);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
                if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -19747,7 +19755,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -19785,7 +19793,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
        if (0) {
                zval_ptr_dtor(&property_name);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        /* assign_obj has two opcodes! */
@@ -19817,7 +19825,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
                if (0) {
                        zval_ptr_dtor(&property_name);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        } else {
                zend_free_op free_op2, free_op_data1, free_op_data2;
@@ -19826,7 +19834,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
                zval **variable_ptr_ptr;
 
                zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_VAR, BP_VAR_W TSRMLS_CC);
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
 
                value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
@@ -19925,7 +19933,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 
        /* zend_assign_to_variable() always takes care of op2, never free it! */
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -20037,7 +20045,7 @@ static int ZEND_FASTCALL  ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE
                }
        } else {
                if (UNEXPECTED(EG(exception) != NULL)) {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                        HANDLE_EXCEPTION();
                }
                zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
@@ -20059,8 +20067,8 @@ static int ZEND_FASTCALL  ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE
        call->is_ctor_call = 0;
        EX(call) = call;
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op2.var);
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -20148,7 +20156,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND
                        }
                }
                if (IS_VAR != IS_CONST) {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        } else {
                if (UNEXPECTED(ce->constructor == NULL)) {
@@ -20193,14 +20201,11 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
        zend_free_op free_op1, free_op2;
 
        SAVE_OPLINE();
-       if (IS_VAR==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                                 _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -20236,7 +20241,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+                       zval_ptr_dtor(&free_op1.var);
+               } else if (IS_VAR == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -20278,14 +20284,12 @@ num_index:
                                /* do nothing */
                                break;
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
        }
        if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
                if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       } else {
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -20354,7 +20358,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
                                        } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
                                                zval_ptr_dtor(&varname);
                                        }
-                                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                                       zval_ptr_dtor(&free_op1.var);
                                        CHECK_EXCEPTION();
                                        ZEND_VM_NEXT_OPCODE();
                                }
@@ -20376,7 +20380,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
        } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
                zval_ptr_dtor(&varname);
        }
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -20448,7 +20452,7 @@ num_index_dim:
                                                zend_error(E_WARNING, "Illegal offset type in unset");
                                                break;
                                }
-                               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                               zval_ptr_dtor(&free_op2.var);
                                break;
                        }
                        case IS_OBJECT:
@@ -20462,18 +20466,18 @@ num_index_dim:
                                if (0) {
                                        zval_ptr_dtor(&offset);
                                } else {
-                                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                                       zval_ptr_dtor(&free_op2.var);
                                }
                                break;
                        case IS_STRING:
                                zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
                                ZEND_VM_CONTINUE(); /* bailed out before */
                        default:
-                               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                               zval_ptr_dtor(&free_op2.var);
                                break;
                }
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 
@@ -20508,13 +20512,13 @@ static int ZEND_FASTCALL  ZEND_UNSET_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
                        if (0) {
                                zval_ptr_dtor(&offset);
                        } else {
-                               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                               zval_ptr_dtor(&free_op2.var);
                        }
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 
@@ -20586,7 +20590,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
                if (IS_VAR != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
        }
 
        if (opline->extended_value & ZEND_ISSET) {
@@ -20618,7 +20622,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in
        zval *offset;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
@@ -20681,7 +20685,7 @@ num_index_prop:
                                result = 1;
                        }
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else if (Z_TYPE_PP(container) == IS_OBJECT) {
                if (0) {
                        MAKE_REAL_ZVAL_PTR(offset);
@@ -20704,7 +20708,7 @@ num_index_prop:
                if (0) {
                        zval_ptr_dtor(&offset);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
                zval tmp;
@@ -20733,9 +20737,9 @@ num_index_prop:
                                }
                        }
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
@@ -20745,7 +20749,7 @@ num_index_prop:
                Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -20834,7 +20838,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -20847,12 +20851,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                                }
 
                                generator->value = copy;
+                               zval_ptr_dtor(&free_op1.var);
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_VAR == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
-                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
                }
        } else {
                /* If no value was specified yield null */
@@ -20891,7 +20896,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                        generator->largest_used_integer_key = Z_LVAL_P(generator->key);
                }
 
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                /* If no key was specified we use auto-increment keys */
                generator->largest_used_integer_key++;
@@ -21207,7 +21212,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type,
                                        if (IS_VAR != IS_CONST && varname == &tmp_varname) {
                                                zval_dtor(&tmp_varname);
                                        }
-                                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                                       zval_ptr_dtor(&free_op1.var);
                                        CHECK_EXCEPTION();
                                        ZEND_VM_NEXT_OPCODE();
                                }
@@ -21217,7 +21222,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type,
                        ce = EX_T(opline->op2.var).class_entry;
                }
                retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
        } else {
                target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
 /*
@@ -21256,11 +21261,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type,
                switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
                        case ZEND_FETCH_GLOBAL:
                                if (IS_VAR != IS_TMP_VAR) {
-                                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                                       zval_ptr_dtor(&free_op1.var);
                                }
                                break;
                        case ZEND_FETCH_LOCAL:
-                               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                               zval_ptr_dtor(&free_op1.var);
                                break;
                        case ZEND_FETCH_STATIC:
                                zval_update_constant(retval, (void*) 1 TSRMLS_CC);
@@ -21410,15 +21415,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_O
                if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        } else {
                if (IS_UNUSED == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
                }
-               container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_R TSRMLS_CC);
-       }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -21655,7 +21662,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+                       zval_ptr_dtor(&free_op1.var);
+               } else if (IS_VAR == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -21703,8 +21711,6 @@ num_index:
        }
        if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
                if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       } else {
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -21773,7 +21779,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN
                                        } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
                                                zval_ptr_dtor(&varname);
                                        }
-                                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+                                       zval_ptr_dtor(&free_op1.var);
                                        CHECK_EXCEPTION();
                                        ZEND_VM_NEXT_OPCODE();
                                }
@@ -21795,7 +21801,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN
        } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
                zval_ptr_dtor(&varname);
        }
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -21864,7 +21870,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
                if (IS_VAR != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
        }
 
        if (opline->extended_value & ZEND_ISSET) {
@@ -21979,7 +21985,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -21992,12 +21998,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
                                }
 
                                generator->value = copy;
+                               zval_ptr_dtor(&free_op1.var);
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_VAR == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
-                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
                }
        } else {
                /* If no value was specified yield null */
@@ -22070,7 +22077,7 @@ static int ZEND_FASTCALL  ZEND_ADD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        fast_add_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22085,7 +22092,7 @@ static int ZEND_FASTCALL  ZEND_SUB_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        fast_sub_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22100,7 +22107,7 @@ static int ZEND_FASTCALL  ZEND_MUL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        fast_mul_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22115,7 +22122,7 @@ static int ZEND_FASTCALL  ZEND_DIV_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        fast_div_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22130,7 +22137,7 @@ static int ZEND_FASTCALL  ZEND_MOD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        fast_mod_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22145,7 +22152,7 @@ static int ZEND_FASTCALL  ZEND_SL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        shift_left_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22160,7 +22167,7 @@ static int ZEND_FASTCALL  ZEND_SR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        shift_right_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22175,7 +22182,7 @@ static int ZEND_FASTCALL  ZEND_CONCAT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR
        concat_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22190,7 +22197,7 @@ static int ZEND_FASTCALL  ZEND_IS_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND
        is_identical_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22207,7 +22214,7 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
        Z_LVAL_P(result) = !Z_LVAL_P(result);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22223,7 +22230,7 @@ static int ZEND_FASTCALL  ZEND_IS_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_
        ZVAL_BOOL(result, fast_equal_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22239,7 +22246,7 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND
        ZVAL_BOOL(result, fast_not_equal_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22255,7 +22262,7 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE
        ZVAL_BOOL(result, fast_is_smaller_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22271,7 +22278,7 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCO
        ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC));
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22286,7 +22293,7 @@ static int ZEND_FASTCALL  ZEND_BW_OR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
        bitwise_or_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22301,7 +22308,7 @@ static int ZEND_FASTCALL  ZEND_BW_AND_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR
        bitwise_and_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22316,7 +22323,7 @@ static int ZEND_FASTCALL  ZEND_BW_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR
        bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22331,7 +22338,7 @@ static int ZEND_FASTCALL  ZEND_BOOL_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_
        boolean_xor_function(&EX_T(opline->result.var).tmp_var,
                _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -22807,22 +22814,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_VAR != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) {
                zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
        } else {
-               container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+                       zval_ptr_dtor(&free_op1.var);
+               }
        }
 
        CHECK_EXCEPTION();
@@ -22892,10 +22895,10 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND
        zval **container;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_IS TSRMLS_CC);
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -22917,15 +22920,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCOD
                if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        } else {
                if (IS_CV == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
                }
-               container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
-       }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               zval_ptr_dtor(&free_op1.var);
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -23009,7 +23014,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CV(ZEN
                }
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -23136,7 +23141,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND
                }
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -23513,7 +23518,7 @@ static int ZEND_FASTCALL  ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_
        call->is_ctor_call = 0;
        EX(call) = call;
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -23646,9 +23651,6 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        zend_free_op free_op1;
 
        SAVE_OPLINE();
-       if (IS_VAR==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
                                 _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
@@ -23688,7 +23690,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+                       zval_ptr_dtor(&free_op1.var);
+               } else if (IS_VAR == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -23736,8 +23739,6 @@ num_index:
        }
        if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
                if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-       } else {
-               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -23909,7 +23910,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int
        zval *offset;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
 
@@ -24036,7 +24037,7 @@ num_index_prop:
                Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
        }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       zval_ptr_dtor(&free_op1.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -24125,7 +24126,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -24138,12 +24139,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                }
 
                                generator->value = copy;
+                               zval_ptr_dtor(&free_op1.var);
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_VAR == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
-                       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
                }
        } else {
                /* If no value was specified yield null */
@@ -25629,7 +25631,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDL
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -25642,11 +25644,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDL
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_UNUSED == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -26950,7 +26954,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -26963,11 +26967,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_UNUSED == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -27050,7 +27056,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (*
 
        if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
                zend_error(E_WARNING, "Attempt to assign property of non-object");
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
                FREE_OP(free_op_data1);
 
                if (RETURN_VALUE_USED(opline)) {
@@ -27131,7 +27137,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (*
                if (0) {
                        zval_ptr_dtor(&property);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
                FREE_OP(free_op_data1);
        }
@@ -27189,7 +27195,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina
                        PZVAL_LOCK(&EG(uninitialized_zval));
                        AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
 
                CHECK_EXCEPTION();
                if (opline->extended_value == ZEND_ASSIGN_DIM) {
@@ -27217,7 +27223,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina
                PZVAL_LOCK(*var_ptr);
                AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
        }
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
 
        if (opline->extended_value == ZEND_ASSIGN_DIM) {
                FREE_OP(free_op_data1);
@@ -27311,7 +27317,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_
 
        if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
                zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
                if (RETURN_VALUE_USED(opline)) {
                        PZVAL_LOCK(&EG(uninitialized_zval));
                        *retval = &EG(uninitialized_zval);
@@ -27374,7 +27380,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        CHECK_EXCEPTION();
@@ -27415,7 +27421,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec
 
        if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
                zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
                ZVAL_NULL(retval);
 
                CHECK_EXCEPTION();
@@ -27476,7 +27482,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        CHECK_EXCEPTION();
@@ -27510,7 +27516,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR
                zend_error(E_NOTICE, "Trying to get property of non-object");
                PZVAL_LOCK(&EG(uninitialized_zval));
                AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                zval *retval;
 
@@ -27527,7 +27533,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR
                if (0) {
                        zval_ptr_dtor(&offset);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        }
 
@@ -27567,7 +27573,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_H
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -27609,7 +27615,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_RW_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -27635,7 +27641,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_
            UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
                PZVAL_LOCK(&EG(uninitialized_zval));
                AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                zval *retval;
 
@@ -27652,7 +27658,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_
                if (0) {
                        zval_ptr_dtor(&offset);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        }
 
@@ -27684,7 +27690,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_VAR_HANDLER(ZEND_O
                if (0) {
                        zval_ptr_dtor(&property);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
                if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -27723,7 +27729,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCO
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -27760,7 +27766,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HA
        if (0) {
                zval_ptr_dtor(&property_name);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        /* assign_obj has two opcodes! */
@@ -27808,7 +27814,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDL
         * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
         * string offsets or overloaded objects
         */
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -27866,7 +27872,7 @@ static int ZEND_FASTCALL  ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC
                }
        } else {
                if (UNEXPECTED(EG(exception) != NULL)) {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                        HANDLE_EXCEPTION();
                }
                zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
@@ -27888,7 +27894,7 @@ static int ZEND_FASTCALL  ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC
        call->is_ctor_call = 0;
        EX(call) = call;
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -27975,7 +27981,7 @@ num_index_dim:
                                                zend_error(E_WARNING, "Illegal offset type in unset");
                                                break;
                                }
-                               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                               zval_ptr_dtor(&free_op2.var);
                                break;
                        }
                        case IS_OBJECT:
@@ -27989,18 +27995,18 @@ num_index_dim:
                                if (0) {
                                        zval_ptr_dtor(&offset);
                                } else {
-                                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                                       zval_ptr_dtor(&free_op2.var);
                                }
                                break;
                        case IS_STRING:
                                zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
                                ZEND_VM_CONTINUE(); /* bailed out before */
                        default:
-                               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                               zval_ptr_dtor(&free_op2.var);
                                break;
                }
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        CHECK_EXCEPTION();
@@ -28034,13 +28040,13 @@ static int ZEND_FASTCALL  ZEND_UNSET_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN
                        if (0) {
                                zval_ptr_dtor(&offset);
                        } else {
-                               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                               zval_ptr_dtor(&free_op2.var);
                        }
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        CHECK_EXCEPTION();
@@ -28121,7 +28127,7 @@ num_index_prop:
                                result = 1;
                        }
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else if (Z_TYPE_PP(container) == IS_OBJECT) {
                if (0) {
                        MAKE_REAL_ZVAL_PTR(offset);
@@ -28144,7 +28150,7 @@ num_index_prop:
                if (0) {
                        zval_ptr_dtor(&offset);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
                zval tmp;
@@ -28173,9 +28179,9 @@ num_index_prop:
                                }
                        }
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
@@ -28271,7 +28277,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -28284,11 +28290,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_UNUSED == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -28327,7 +28335,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER
                        generator->largest_used_integer_key = Z_LVAL_P(generator->key);
                }
 
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                /* If no key was specified we use auto-increment keys */
                generator->largest_used_integer_key++;
@@ -28694,7 +28702,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HAND
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -28707,11 +28715,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HAND
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_UNUSED == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -30012,7 +30022,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -30025,11 +30035,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_UNUSED == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -30487,9 +30499,7 @@ static int ZEND_FASTCALL  ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        retval_ptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 
        if (!EG(return_value_ptr_ptr)) {
-               if (IS_CV == IS_TMP_VAR) {
 
-               }
        } else {
                if (IS_CV == IS_CONST ||
                    IS_CV == IS_TMP_VAR ||
@@ -30502,18 +30512,23 @@ static int ZEND_FASTCALL  ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                                zval_copy_ctor(ret);
                        }
                        *EG(return_value_ptr_ptr) = ret;
+
                } else if ((IS_CV == IS_CV || IS_CV == IS_VAR) &&
                           retval_ptr == &EG(uninitialized_zval)) {
                        zval *ret;
 
+                       if (IS_CV == IS_VAR) {
+                               Z_DELREF_P(retval_ptr);
+                       }
                        ALLOC_INIT_ZVAL(ret);
                        *EG(return_value_ptr_ptr) = ret;
                } else {
                        *EG(return_value_ptr_ptr) = retval_ptr;
-                       Z_ADDREF_P(retval_ptr);
+                       if (IS_CV == IS_CV) {
+                               Z_ADDREF_P(retval_ptr);
+                       }
                }
        }
-
        return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
@@ -30623,21 +30638,26 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARG
        varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 
        if (varptr == &EG(uninitialized_zval)) {
-               ALLOC_ZVAL(varptr);
-               INIT_ZVAL(*varptr);
-               Z_SET_REFCOUNT_P(varptr, 0);
+               if (IS_CV == IS_VAR) {
+                       Z_DELREF_P(varptr);
+               }
+               ALLOC_INIT_ZVAL(varptr);
        } else if (PZVAL_IS_REF(varptr)) {
-               zval *original_var = varptr;
+               if (IS_CV == IS_CV ||
+                   (IS_CV == IS_VAR && Z_REFCOUNT_P(varptr) > 2)) {
+                       zval *original_var = varptr;
 
-               ALLOC_ZVAL(varptr);
-               ZVAL_COPY_VALUE(varptr, original_var);
-               Z_UNSET_ISREF_P(varptr);
-               Z_SET_REFCOUNT_P(varptr, 0);
-               zval_copy_ctor(varptr);
+                       ALLOC_ZVAL(varptr);
+                       INIT_PZVAL_COPY(varptr, original_var);
+                       zval_copy_ctor(varptr);
+
+               } else {
+                       Z_UNSET_ISREF_P(varptr);
+               }
+       } else if (IS_CV == IS_CV) {
+               Z_ADDREF_P(varptr);
        }
-       Z_ADDREF_P(varptr);
        zend_vm_stack_push(varptr TSRMLS_CC);
-       ;  /* for string offsets */
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -30646,7 +30666,7 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARG
 static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zend_free_op free_op1;
+
        zval *varptr;
 
        SAVE_OPLINE();
@@ -30658,22 +30678,15 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
                return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        }
 
-       if (IS_CV == IS_VAR &&
-               (opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
-               EX_T(opline->op1.var).var.fcall_returned_reference &&
-               EX_T(opline->op1.var).var.ptr) {
-               varptr = EX_T(opline->op1.var).var.ptr;
-               PZVAL_UNLOCK_EX(varptr, &free_op1, 0);
-       } else {
-               varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
-       }
+       varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
        if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
             EX_T(opline->op1.var).var.fcall_returned_reference) &&
            varptr != &EG(uninitialized_zval) &&
-           (PZVAL_IS_REF(varptr) ||
-            (Z_REFCOUNT_P(varptr) == 1 && (IS_CV == IS_CV || free_op1.var)))) {
+           (PZVAL_IS_REF(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
                Z_SET_ISREF_P(varptr);
-               Z_ADDREF_P(varptr);
+               if (IS_CV == IS_CV) {
+                       Z_ADDREF_P(varptr);
+               }
                zend_vm_stack_push(varptr TSRMLS_CC);
        } else {
                zval *valptr;
@@ -30688,9 +30701,9 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
                if (!0) {
                        zval_copy_ctor(valptr);
                }
+
                zend_vm_stack_push(valptr TSRMLS_CC);
        }
-
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -31073,19 +31086,27 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                        ce = Z_OBJCE_P(array_ptr);
                        if (!ce || !ce->get_iterator) {
-                               Z_ADDREF_P(array_ptr);
+                               if (IS_CV == IS_CV) {
+                                       Z_ADDREF_P(array_ptr);
+                               }
                        }
                } else if (IS_CV == IS_CONST ||
-                          ((IS_CV == IS_CV || IS_CV == IS_VAR) &&
+                          (IS_CV == IS_CV &&
+                           !Z_ISREF_P(array_ptr) &&
+                           Z_REFCOUNT_P(array_ptr) > 1) ||
+                          (IS_CV == IS_VAR &&
                            !Z_ISREF_P(array_ptr) &&
-                           Z_REFCOUNT_P(array_ptr) > 1)) {
+                           Z_REFCOUNT_P(array_ptr) > 2)) {
                        zval *tmp;
 
+                       if (IS_CV == IS_VAR) {
+                               Z_DELREF_P(array_ptr);
+                       }
                        ALLOC_ZVAL(tmp);
                        INIT_PZVAL_COPY(tmp, array_ptr);
                        zval_copy_ctor(tmp);
                        array_ptr = tmp;
-               } else {
+               } else if (IS_CV == IS_CV) {
                        Z_ADDREF_P(array_ptr);
                }
        }
@@ -31093,10 +31114,15 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        if (ce && ce->get_iterator) {
                iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
 
+               if (IS_CV == IS_VAR && !(opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
+
+               }
                if (iter && EXPECTED(EG(exception) == NULL)) {
                        array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
                } else {
+                       if (IS_CV == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
 
+                       }
                        if (!EG(exception)) {
                                zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
                        }
@@ -31113,14 +31139,18 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                        iter->funcs->rewind(iter TSRMLS_CC);
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                zval_ptr_dtor(&array_ptr);
+                               if (IS_CV == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
 
+                               }
                                HANDLE_EXCEPTION();
                        }
                }
                is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zval_ptr_dtor(&array_ptr);
+                       if (IS_CV == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
 
+                       }
                        HANDLE_EXCEPTION();
                }
                iter->index = -1; /* will be set to 0 before using next handler */
@@ -31150,6 +31180,9 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                is_empty = 1;
        }
 
+       if (IS_CV == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+
+       }
        if (is_empty) {
                ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
        } else {
@@ -32214,12 +32247,6 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAN
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_CV != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) {
                zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
@@ -32229,7 +32256,9 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAN
                container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 
+               if (IS_CV == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 
+               }
        }
 
        CHECK_EXCEPTION();
@@ -32323,15 +32352,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPC
                if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+
+
        } else {
                if (IS_CONST == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
                }
                container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
-       }
 
 
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -32871,9 +32902,6 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
 
 
        SAVE_OPLINE();
-       if (IS_CV==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                                 opline->op2.zv TSRMLS_CC);
@@ -32913,7 +32941,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCO
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_CV == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -32961,8 +32990,6 @@ num_index:
        }
        if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -33506,7 +33533,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -33519,11 +33546,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_CV == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -34333,12 +34362,6 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDL
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_CV != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) {
                zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
@@ -34348,7 +34371,9 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDL
                container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
                zval_dtor(free_op2.var);
+               if (IS_CV == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 
+               }
        }
 
        CHECK_EXCEPTION();
@@ -34442,15 +34467,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP_HANDLER(ZEND_OPCOD
                if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+               zval_dtor(free_op2.var);
+
        } else {
                if (IS_TMP_VAR == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
                }
                container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
-       }
-       zval_dtor(free_op2.var);
+               zval_dtor(free_op2.var);
 
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -34992,9 +35019,6 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        zend_free_op free_op2;
 
        SAVE_OPLINE();
-       if (IS_CV==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                                 _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
@@ -35035,7 +35059,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_CV == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -35083,8 +35108,6 @@ num_index:
        }
        if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -35467,7 +35490,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -35480,11 +35503,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_CV == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -35558,7 +35583,7 @@ static int ZEND_FASTCALL  ZEND_ADD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35573,7 +35598,7 @@ static int ZEND_FASTCALL  ZEND_SUB_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35588,7 +35613,7 @@ static int ZEND_FASTCALL  ZEND_MUL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35603,7 +35628,7 @@ static int ZEND_FASTCALL  ZEND_DIV_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35618,7 +35643,7 @@ static int ZEND_FASTCALL  ZEND_MOD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35633,7 +35658,7 @@ static int ZEND_FASTCALL  ZEND_SL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35648,7 +35673,7 @@ static int ZEND_FASTCALL  ZEND_SR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35663,7 +35688,7 @@ static int ZEND_FASTCALL  ZEND_CONCAT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35678,7 +35703,7 @@ static int ZEND_FASTCALL  ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35695,7 +35720,7 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
        Z_LVAL_P(result) = !Z_LVAL_P(result);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35711,7 +35736,7 @@ static int ZEND_FASTCALL  ZEND_IS_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35727,7 +35752,7 @@ static int ZEND_FASTCALL  ZEND_IS_NOT_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35743,7 +35768,7 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35759,7 +35784,7 @@ static int ZEND_FASTCALL  ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCO
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35774,7 +35799,7 @@ static int ZEND_FASTCALL  ZEND_BW_OR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35789,7 +35814,7 @@ static int ZEND_FASTCALL  ZEND_BW_AND_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35804,7 +35829,7 @@ static int ZEND_FASTCALL  ZEND_BW_XOR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35819,7 +35844,7 @@ static int ZEND_FASTCALL  ZEND_BOOL_XOR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35843,7 +35868,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*bina
 
        if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
                zend_error(E_WARNING, "Attempt to assign property of non-object");
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
                FREE_OP(free_op_data1);
 
                if (RETURN_VALUE_USED(opline)) {
@@ -35924,7 +35949,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*bina
                if (0) {
                        zval_ptr_dtor(&property);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
                FREE_OP(free_op_data1);
        }
@@ -35982,7 +36007,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o
                        PZVAL_LOCK(&EG(uninitialized_zval));
                        AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
 
                CHECK_EXCEPTION();
                if (opline->extended_value == ZEND_ASSIGN_DIM) {
@@ -36010,7 +36035,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o
                PZVAL_LOCK(*var_ptr);
                AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
        }
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
 
        if (opline->extended_value == ZEND_ASSIGN_DIM) {
                FREE_OP(free_op_data1);
@@ -36104,7 +36129,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t in
 
        if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
                zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
                if (RETURN_VALUE_USED(opline)) {
                        PZVAL_LOCK(&EG(uninitialized_zval));
                        *retval = &EG(uninitialized_zval);
@@ -36167,7 +36192,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t in
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        CHECK_EXCEPTION();
@@ -36208,7 +36233,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t i
 
        if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
                zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
                ZVAL_NULL(retval);
 
                CHECK_EXCEPTION();
@@ -36269,7 +36294,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t i
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        CHECK_EXCEPTION();
@@ -36458,22 +36483,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_CV != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) {
                zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
 
        } else {
                container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
+               if (IS_CV == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 
+               }
        }
 
        CHECK_EXCEPTION();
@@ -36493,7 +36514,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL
                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        }
        zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
        }
@@ -36526,7 +36547,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        }
        zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_RW TSRMLS_CC);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
        }
@@ -36544,7 +36565,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_IS TSRMLS_CC);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -36567,15 +36588,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD
                if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+               zval_ptr_dtor(&free_op2.var);
+
        } else {
                if (IS_VAR == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
                }
                container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
-       }
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
 
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -36598,7 +36621,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_H
                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        }
        zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_UNSET TSRMLS_CC);
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
        }
@@ -36638,7 +36661,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_VAR(ZEN
                zend_error(E_NOTICE, "Trying to get property of non-object");
                PZVAL_LOCK(&EG(uninitialized_zval));
                AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                zval *retval;
 
@@ -36655,7 +36678,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_VAR(ZEN
                if (0) {
                        zval_ptr_dtor(&offset);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        }
 
@@ -36695,7 +36718,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -36737,7 +36760,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -36763,7 +36786,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
            UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
                PZVAL_LOCK(&EG(uninitialized_zval));
                AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                zval *retval;
 
@@ -36780,7 +36803,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
                if (0) {
                        zval_ptr_dtor(&offset);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        }
 
@@ -36812,7 +36835,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD
                if (0) {
                        zval_ptr_dtor(&property);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
                if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -36851,7 +36874,7 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_H
        if (0) {
                zval_ptr_dtor(&property);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
        if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -36888,7 +36911,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
        if (0) {
                zval_ptr_dtor(&property_name);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        /* assign_obj has two opcodes! */
@@ -36920,7 +36943,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
                if (0) {
                        zval_ptr_dtor(&property_name);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        } else {
                zend_free_op free_op2, free_op_data1, free_op_data2;
@@ -36929,7 +36952,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
                zval **variable_ptr_ptr;
 
                zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_VAR, BP_VAR_W TSRMLS_CC);
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
 
                value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
@@ -37026,7 +37049,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
        }
 
        /* zend_assign_to_variable() always takes care of op2, never free it! */
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -37137,7 +37160,7 @@ static int ZEND_FASTCALL  ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_
                }
        } else {
                if (UNEXPECTED(EG(exception) != NULL)) {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                        HANDLE_EXCEPTION();
                }
                zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
@@ -37159,7 +37182,7 @@ static int ZEND_FASTCALL  ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_
        call->is_ctor_call = 0;
        EX(call) = call;
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -37171,14 +37194,11 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        zend_free_op free_op2;
 
        SAVE_OPLINE();
-       if (IS_CV==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                                 _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
 
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+       zval_ptr_dtor(&free_op2.var);
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -37214,7 +37234,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_CV == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -37256,14 +37277,12 @@ num_index:
                                /* do nothing */
                                break;
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
        }
        if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -37426,7 +37445,7 @@ num_index_dim:
                                                zend_error(E_WARNING, "Illegal offset type in unset");
                                                break;
                                }
-                               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                               zval_ptr_dtor(&free_op2.var);
                                break;
                        }
                        case IS_OBJECT:
@@ -37440,18 +37459,18 @@ num_index_dim:
                                if (0) {
                                        zval_ptr_dtor(&offset);
                                } else {
-                                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                                       zval_ptr_dtor(&free_op2.var);
                                }
                                break;
                        case IS_STRING:
                                zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
                                ZEND_VM_CONTINUE(); /* bailed out before */
                        default:
-                               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                               zval_ptr_dtor(&free_op2.var);
                                break;
                }
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        CHECK_EXCEPTION();
@@ -37485,13 +37504,13 @@ static int ZEND_FASTCALL  ZEND_UNSET_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER
                        if (0) {
                                zval_ptr_dtor(&offset);
                        } else {
-                               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                               zval_ptr_dtor(&free_op2.var);
                        }
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        CHECK_EXCEPTION();
@@ -37657,7 +37676,7 @@ num_index_prop:
                                result = 1;
                        }
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else if (Z_TYPE_PP(container) == IS_OBJECT) {
                if (0) {
                        MAKE_REAL_ZVAL_PTR(offset);
@@ -37680,7 +37699,7 @@ num_index_prop:
                if (0) {
                        zval_ptr_dtor(&offset);
                } else {
-                       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+                       zval_ptr_dtor(&free_op2.var);
                }
        } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
                zval tmp;
@@ -37709,9 +37728,9 @@ num_index_prop:
                                }
                        }
                }
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        }
 
        Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
@@ -37807,7 +37826,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -37820,11 +37839,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_CV == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -37863,7 +37884,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                        generator->largest_used_integer_key = Z_LVAL_P(generator->key);
                }
 
-               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               zval_ptr_dtor(&free_op2.var);
        } else {
                /* If no key was specified we use auto-increment keys */
                generator->largest_used_integer_key++;
@@ -38380,15 +38401,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OP
                if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+
+
        } else {
                if (IS_UNUSED == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
                }
                container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_R TSRMLS_CC);
-       }
 
 
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -38504,7 +38527,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_CV == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -38552,8 +38576,6 @@ num_index:
        }
        if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -38806,7 +38828,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -38819,11 +38841,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_CV == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
@@ -39632,12 +39656,6 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLE
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_CV != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
-       }
-
        if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) {
                zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
@@ -39647,7 +39665,9 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLE
                container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 
+               if (IS_CV == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 
+               }
        }
 
        CHECK_EXCEPTION();
@@ -39741,15 +39761,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE
                if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+
+
        } else {
                if (IS_CV == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
                }
                container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
-       }
 
 
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -40341,9 +40363,6 @@ static int ZEND_FASTCALL  ZEND_CASE_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 
 
        SAVE_OPLINE();
-       if (IS_CV==IS_VAR) {
-               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
-       }
        is_equal_function(&EX_T(opline->result.var).tmp_var,
                                 _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
                                 _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
@@ -40383,7 +40402,8 @@ static int ZEND_FASTCALL  ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_
                        INIT_PZVAL_COPY(new_expr, expr_ptr);
                        expr_ptr = new_expr;
                        zendi_zval_copy_ctor(*expr_ptr);
-               } else {
+
+               } else if (IS_CV == IS_CV) {
                        Z_ADDREF_P(expr_ptr);
                }
        }
@@ -40431,8 +40451,6 @@ num_index:
        }
        if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
 
-       } else {
-
        }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -40815,7 +40833,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
 
                        /* Consts, temporary variables and references need copying */
                        if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR
-                               || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+                               || PZVAL_IS_REF(value)
                        ) {
                                zval *copy;
 
@@ -40828,11 +40846,13 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                                }
 
                                generator->value = copy;
+
                        } else {
-                               Z_ADDREF_P(value);
+                               if (IS_CV == IS_CV) {
+                                       Z_ADDREF_P(value);
+                               }
                                generator->value = value;
                        }
-
                }
        } else {
                /* If no value was specified yield null */
index 63d0cf73f0d521eb7a00f00e8810cc7b7734f578..f1afdf0ce13cbb87c9ec3d3567439dd2a0b553af 100644 (file)
@@ -143,6 +143,8 @@ $op1_get_zval_ptr_ptr = array(
        "UNUSED" => "NULL",
        "CV"     => "_get_zval_ptr_ptr_cv_\\1(execute_data, opline->op1.var TSRMLS_CC)",
 );
+$op1_get_zval_ptr_ptr_fast = $op1_get_zval_ptr_ptr;
+$op1_get_zval_ptr_ptr_fast["VAR"] = "_get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC)";
 
 $op2_get_zval_ptr_ptr = array(
        "ANY"    => "get_zval_ptr_ptr(opline->op2_type, &opline->op2, execute_data, &free_op2, \\1)",
@@ -152,6 +154,8 @@ $op2_get_zval_ptr_ptr = array(
        "UNUSED" => "NULL",
        "CV"     => "_get_zval_ptr_ptr_cv_\\1(execute_data, opline->op2.var TSRMLS_CC)",
 );
+$op2_get_zval_ptr_ptr_fast = $op2_get_zval_ptr_ptr;
+$op2_get_zval_ptr_ptr_fast["VAR"] = "_get_zval_ptr_ptr_var_fast(opline->op2.var, execute_data, &free_op2 TSRMLS_CC)";
 
 $op1_get_obj_zval_ptr = array(
        "ANY"    => "get_obj_zval_ptr(opline->op1_type, &opline->op1, execute_data, &free_op1, \\1)",
@@ -179,6 +183,8 @@ $op1_get_obj_zval_ptr_ptr = array(
        "UNUSED" => "_get_obj_zval_ptr_ptr_unused(TSRMLS_C)",
        "CV"     => "_get_zval_ptr_ptr_cv_\\1(execute_data, opline->op1.var TSRMLS_CC)",
 );
+$op1_get_obj_zval_ptr_ptr_fast = $op1_get_obj_zval_ptr_ptr;
+$op1_get_obj_zval_ptr_ptr_fast["VAR"] = "_get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC)";
 
 $op2_get_obj_zval_ptr_ptr = array(
        "ANY"    => "get_obj_zval_ptr_ptr(opline->op2_type, &opline->op2, execute_data, &free_op2, \\1)",
@@ -188,6 +194,8 @@ $op2_get_obj_zval_ptr_ptr = array(
        "UNUSED" => "_get_obj_zval_ptr_ptr_unused(TSRMLS_C)",
        "CV"     => "_get_zval_ptr_ptr_cv_\\1(execute_data, opline->op2.var TSRMLS_CC)",
 );
+$op2_get_obj_zval_ptr_ptr_fast = $op2_get_obj_zval_ptr_ptr;
+$op2_get_obj_zval_ptr_ptr_fast["VAR"] = "_get_zval_ptr_ptr_var_fast(opline->op2.var, execute_data, &free_op2 TSRMLS_CC)";
 
 $op1_is_tmp_free = array(
        "ANY"    => "IS_TMP_FREE(free_op1)",
@@ -210,7 +218,7 @@ $op2_is_tmp_free = array(
 $op1_free_op = array(
        "ANY"    => "FREE_OP(free_op1)",
        "TMP"    => "zval_dtor(free_op1.var)",
-       "VAR"    => "if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}",
+       "VAR"    => "zval_ptr_dtor(&free_op1.var)",
        "CONST"  => "",
        "UNUSED" => "",
        "CV"     => "",
@@ -219,7 +227,7 @@ $op1_free_op = array(
 $op2_free_op = array(
        "ANY"    => "FREE_OP(free_op2)",
        "TMP"    => "zval_dtor(free_op2.var)",
-       "VAR"    => "if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}",
+       "VAR"    => "zval_ptr_dtor(&free_op2.var)",
        "CONST"  => "",
        "UNUSED" => "",
        "CV"     => "",
@@ -228,7 +236,7 @@ $op2_free_op = array(
 $op1_free_op_if_var = array(
        "ANY"    => "FREE_OP_IF_VAR(free_op1)",
        "TMP"    => "",
-       "VAR"    => "if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}",
+       "VAR"    => "zval_ptr_dtor(&free_op1.var)",
        "CONST"  => "",
        "UNUSED" => "",
        "CV"     => "",
@@ -237,7 +245,7 @@ $op1_free_op_if_var = array(
 $op2_free_op_if_var = array(
        "ANY"    => "FREE_OP_IF_VAR(free_op2)",
        "TMP"    => "",
-       "VAR"    => "if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}",
+       "VAR"    => "zval_ptr_dtor(&free_op2.var)",
        "CONST"  => "",
        "UNUSED" => "",
        "CV"     => "",
@@ -251,6 +259,8 @@ $op1_free_op_var_ptr = array(
        "UNUSED" => "",
        "CV"     => "",
 );
+$op1_free_op_var_ptr_fast = $op1_free_op_var_ptr;
+$op1_free_op_var_ptr_fast["VAR"] = "zval_ptr_dtor(&free_op1.var)";
 
 $op2_free_op_var_ptr = array(
        "ANY"    => "if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}",
@@ -260,6 +270,8 @@ $op2_free_op_var_ptr = array(
        "UNUSED" => "",
        "CV"     => "",
 );
+$op2_free_op_var_ptr_fast = $op2_free_op_var_ptr;
+$op2_free_op_var_ptr_fast["VAR"] = "zval_ptr_dtor(&free_op2.var)";
 
 $list    = array(); // list of opcode handlers and helpers in original order
 $opcodes = array(); // opcode handlers by code
@@ -311,7 +323,10 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name) {
                $op1_get_obj_zval_ptr_ptr, $op2_get_obj_zval_ptr_ptr,
                $op1_is_tmp_free, $op2_is_tmp_free, $op1_free, $op2_free,
                $op1_free_op, $op2_free_op, $op1_free_op_if_var, $op2_free_op_if_var,
-               $op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix;
+               $op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix, 
+               $op1_get_zval_ptr_ptr_fast, $op2_get_zval_ptr_ptr_fast,
+               $op1_get_obj_zval_ptr_ptr_fast, $op2_get_obj_zval_ptr_ptr_fast,
+               $op1_free_op_var_ptr_fast, $op2_free_op_var_ptr_fast;
 
        // Specializing
        $code = preg_replace(
@@ -336,6 +351,12 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name) {
                        "/FREE_OP2_IF_VAR\(\)/",
                        "/FREE_OP1_VAR_PTR\(\)/",
                        "/FREE_OP2_VAR_PTR\(\)/",
+                       "/GET_OP1_ZVAL_PTR_PTR_FAST\(([^)]*)\)/",
+                       "/GET_OP2_ZVAL_PTR_PTR_FAST\(([^)]*)\)/",
+                       "/GET_OP1_OBJ_ZVAL_PTR_PTR_FAST\(([^)]*)\)/",
+                       "/GET_OP2_OBJ_ZVAL_PTR_PTR_FAST\(([^)]*)\)/",
+                       "/FREE_OP1_VAR_PTR_FAST\(\)/",
+                       "/FREE_OP2_VAR_PTR_FAST\(\)/",
                        "/^#ifdef\s+ZEND_VM_SPEC\s*\n/m",
                        "/^#ifndef\s+ZEND_VM_SPEC\s*\n/m",
                        "/\!defined\(ZEND_VM_SPEC\)/m",
@@ -368,6 +389,12 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name) {
                        $op2_free_op_if_var[$op2],
                        $op1_free_op_var_ptr[$op1],
                        $op2_free_op_var_ptr[$op2],
+                       $op1_get_zval_ptr_ptr_fast[$op1],
+                       $op2_get_zval_ptr_ptr_fast[$op2],
+                       $op1_get_obj_zval_ptr_ptr_fast[$op1],
+                       $op2_get_obj_zval_ptr_ptr_fast[$op2],
+                       $op1_free_op_var_ptr_fast[$op1],
+                       $op2_free_op_var_ptr_fast[$op2],
                        ($op1!="ANY"||$op2!="ANY")?"#if 1\n":"#if 0\n",
                        ($op1!="ANY"||$op2!="ANY")?"#if 0\n":"#if 1\n",
                        ($op1!="ANY"||$op2!="ANY")?"0":"1",