]> granicus.if.org Git - php/commitdiff
Use specialized destructors when types of zvals are known.
authorDmitry Stogov <dmitry@zend.com>
Mon, 24 Nov 2014 22:22:59 +0000 (01:22 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 24 Nov 2014 22:22:59 +0000 (01:22 +0300)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index cd748b73f0b50397a20062ccec44456a7098f398..95968d8ac60a9ff9d3cd1b2d7497a75c20d40e6c 100644 (file)
@@ -385,7 +385,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMP|VAR
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -711,7 +711,7 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR|
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -798,7 +798,7 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -2080,7 +2080,7 @@ ZEND_VM_HANDLER(56, ZEND_ADD_VAR, TMP|UNUSED, TMP|VAR|CV)
        add_string_to_string(str, str, var);
 
        if (use_copy) {
-               zval_dtor(var);
+               zend_string_release(Z_STR_P(var));
        }
        /* original comment, possibly problematic:
         * FREE_OP is missing intentionally here - we're always working on the same temporary variable
@@ -2980,9 +2980,7 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, CV)
        }
 
        exception = EG(exception);
-       if (Z_REFCOUNTED_P(EX_VAR(opline->op2.var))) {
-               zval_ptr_dtor(EX_VAR(opline->op2.var));
-       }
+       zval_ptr_dtor(EX_VAR(opline->op2.var));
        ZVAL_OBJ(EX_VAR(opline->op2.var), EG(exception));
        if (UNEXPECTED(EG(exception) != exception)) {
                GC_REFCOUNT(EG(exception))++;
@@ -3269,7 +3267,7 @@ ZEND_VM_C_LABEL(send_again):
                                        if (Z_TYPE(key) == IS_STRING) {
                                                zend_error(E_RECOVERABLE_ERROR,
                                                        "Cannot unpack Traversable with string keys");
-                                               zval_dtor(&key);
+                                               zend_string_release(Z_STR(key));
                                                ZEND_VM_C_GOTO(unpack_iter_dtor);
                                        }
 
@@ -3721,7 +3719,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, CONST|VAR, ANY)
                if (RETURN_VALUE_USED(opline)) {
                        ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &object_zval);
                } else {
-                       zval_ptr_dtor(&object_zval);
+                       OBJ_RELEASE(Z_OBJ(object_zval));
                }
                ZEND_VM_JMP(opline->op2.jmp_addr);
        } else {
@@ -3799,7 +3797,7 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMP|VAR|UNUSED|CV, ANY)
        if (EXPECTED(EG(exception) == NULL)) {
                ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));
                if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
+                       OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
                }
        }
        FREE_OP1_IF_VAR();
@@ -4206,7 +4204,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY)
                }
        }
        if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) {
-               zval_ptr_dtor(&tmp_inc_filename);
+               zend_string_release(Z_STR(tmp_inc_filename));
        }
        FREE_OP1();
        if (UNEXPECTED(EG(exception) != NULL)) {
@@ -4297,8 +4295,8 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (OP1_TYPE != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
                                        FREE_OP1();
                                        HANDLE_EXCEPTION();
@@ -4317,8 +4315,8 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (OP1_TYPE != IS_CONST) {
-               zval_dtor(&tmp);
+       if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
        FREE_OP1();
        CHECK_EXCEPTION();
@@ -4901,6 +4899,7 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
                zend_free_op free_op1;
                zval tmp, *varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
 
+               ZVAL_UNDEF(&tmp);
                if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -4929,8 +4928,8 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (OP1_TYPE != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
                FREE_OP1();
 
index a1f7a3ffc283e172257244a52090d6ac1aa2e6f1..cd4a91f27ac5bfc7a6460197c3951d7147277a8b 100644 (file)
@@ -798,7 +798,7 @@ send_again:
                                        if (Z_TYPE(key) == IS_STRING) {
                                                zend_error(E_RECOVERABLE_ERROR,
                                                        "Cannot unpack Traversable with string keys");
-                                               zval_dtor(&key);
+                                               zend_string_release(Z_STR(key));
                                                goto unpack_iter_dtor;
                                        }
 
@@ -2766,7 +2766,7 @@ static int ZEND_FASTCALL  ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                if (RETURN_VALUE_USED(opline)) {
                        ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &object_zval);
                } else {
-                       zval_ptr_dtor(&object_zval);
+                       OBJ_RELEASE(Z_OBJ(object_zval));
                }
                ZEND_VM_JMP(opline->op2.jmp_addr);
        } else {
@@ -2844,7 +2844,7 @@ static int ZEND_FASTCALL  ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        if (EXPECTED(EG(exception) == NULL)) {
                ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));
                if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
+                       OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
                }
        }
 
@@ -3032,7 +3032,7 @@ static int ZEND_FASTCALL  ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HA
                }
        }
        if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) {
-               zval_ptr_dtor(&tmp_inc_filename);
+               zend_string_release(Z_STR(tmp_inc_filename));
        }
 
        if (UNEXPECTED(EG(exception) != NULL)) {
@@ -4602,8 +4602,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HA
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (IS_CONST != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
 
                                        HANDLE_EXCEPTION();
@@ -4622,8 +4622,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HA
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (IS_CONST != IS_CONST) {
-               zval_dtor(&tmp);
+       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
 
        CHECK_EXCEPTION();
@@ -4654,6 +4654,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O
 
                zval tmp, *varname = opline->op1.zv;
 
+               ZVAL_UNDEF(&tmp);
                if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -4682,8 +4683,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (IS_CONST != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
 
                if (opline->extended_value & ZEND_ISSET) {
@@ -7104,8 +7105,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HAND
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (IS_CONST != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
 
                                        HANDLE_EXCEPTION();
@@ -7124,8 +7125,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HAND
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (IS_CONST != IS_CONST) {
-               zval_dtor(&tmp);
+       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
 
        CHECK_EXCEPTION();
@@ -7156,6 +7157,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC
 
                zval tmp, *varname = opline->op1.zv;
 
+               ZVAL_UNDEF(&tmp);
                if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -7184,8 +7186,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (IS_CONST != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
 
                if (opline->extended_value & ZEND_ISSET) {
@@ -7969,8 +7971,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_H
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (IS_CONST != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
 
                                        HANDLE_EXCEPTION();
@@ -7989,8 +7991,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_H
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (IS_CONST != IS_CONST) {
-               zval_dtor(&tmp);
+       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
 
        CHECK_EXCEPTION();
@@ -8021,6 +8023,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_
 
                zval tmp, *varname = opline->op1.zv;
 
+               ZVAL_UNDEF(&tmp);
                if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -8049,8 +8052,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (IS_CONST != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
 
                if (opline->extended_value & ZEND_ISSET) {
@@ -8921,9 +8924,7 @@ static int ZEND_FASTCALL  ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
        }
 
        exception = EG(exception);
-       if (Z_REFCOUNTED_P(EX_VAR(opline->op2.var))) {
-               zval_ptr_dtor(EX_VAR(opline->op2.var));
-       }
+       zval_ptr_dtor(EX_VAR(opline->op2.var));
        ZVAL_OBJ(EX_VAR(opline->op2.var), EG(exception));
        if (UNEXPECTED(EG(exception) != exception)) {
                GC_REFCOUNT(EG(exception))++;
@@ -9807,7 +9808,7 @@ static int ZEND_FASTCALL  ZEND_CLONE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        if (EXPECTED(EG(exception) == NULL)) {
                ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));
                if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
+                       OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
                }
        }
 
@@ -9996,7 +9997,7 @@ static int ZEND_FASTCALL  ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HAND
                }
        }
        if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) {
-               zval_ptr_dtor(&tmp_inc_filename);
+               zend_string_release(Z_STR(tmp_inc_filename));
        }
        zval_ptr_dtor_nogc(free_op1);
        if (UNEXPECTED(EG(exception) != NULL)) {
@@ -11433,8 +11434,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HAND
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (IS_TMP_VAR != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
                                        zval_ptr_dtor_nogc(free_op1);
                                        HANDLE_EXCEPTION();
@@ -11453,8 +11454,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HAND
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (IS_TMP_VAR != IS_CONST) {
-               zval_dtor(&tmp);
+       if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
        zval_ptr_dtor_nogc(free_op1);
        CHECK_EXCEPTION();
@@ -11485,6 +11486,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC
                zend_free_op free_op1;
                zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
 
+               ZVAL_UNDEF(&tmp);
                if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -11513,8 +11515,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
                zval_ptr_dtor_nogc(free_op1);
 
@@ -12375,7 +12377,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_
        add_string_to_string(str, str, var);
 
        if (use_copy) {
-               zval_dtor(var);
+               zend_string_release(Z_STR_P(var));
        }
        /* original comment, possibly problematic:
         * FREE_OP is missing intentionally here - we're always working on the same temporary variable
@@ -13585,7 +13587,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_
        add_string_to_string(str, str, var);
 
        if (use_copy) {
-               zval_dtor(var);
+               zend_string_release(Z_STR_P(var));
        }
        /* original comment, possibly problematic:
         * FREE_OP is missing intentionally here - we're always working on the same temporary variable
@@ -13888,8 +13890,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLE
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (IS_TMP_VAR != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
                                        zval_ptr_dtor_nogc(free_op1);
                                        HANDLE_EXCEPTION();
@@ -13908,8 +13910,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLE
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (IS_TMP_VAR != IS_CONST) {
-               zval_dtor(&tmp);
+       if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
        zval_ptr_dtor_nogc(free_op1);
        CHECK_EXCEPTION();
@@ -13940,6 +13942,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
                zend_free_op free_op1;
                zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
 
+               ZVAL_UNDEF(&tmp);
                if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -13968,8 +13971,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
                zval_ptr_dtor_nogc(free_op1);
 
@@ -14669,8 +14672,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HAN
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (IS_TMP_VAR != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
                                        zval_ptr_dtor_nogc(free_op1);
                                        HANDLE_EXCEPTION();
@@ -14689,8 +14692,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HAN
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (IS_TMP_VAR != IS_CONST) {
-               zval_dtor(&tmp);
+       if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
        zval_ptr_dtor_nogc(free_op1);
        CHECK_EXCEPTION();
@@ -14721,6 +14724,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
                zend_free_op free_op1;
                zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
 
+               ZVAL_UNDEF(&tmp);
                if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -14749,8 +14753,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
                zval_ptr_dtor_nogc(free_op1);
 
@@ -15410,7 +15414,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_A
        add_string_to_string(str, str, var);
 
        if (use_copy) {
-               zval_dtor(var);
+               zend_string_release(Z_STR_P(var));
        }
        /* original comment, possibly problematic:
         * FREE_OP is missing intentionally here - we're always working on the same temporary variable
@@ -16715,7 +16719,7 @@ static int ZEND_FASTCALL  ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                if (RETURN_VALUE_USED(opline)) {
                        ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &object_zval);
                } else {
-                       zval_ptr_dtor(&object_zval);
+                       OBJ_RELEASE(Z_OBJ(object_zval));
                }
                ZEND_VM_JMP(opline->op2.jmp_addr);
        } else {
@@ -16793,7 +16797,7 @@ static int ZEND_FASTCALL  ZEND_CLONE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        if (EXPECTED(EG(exception) == NULL)) {
                ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));
                if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
+                       OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
                }
        }
        zval_ptr_dtor_nogc(free_op1);
@@ -16983,7 +16987,7 @@ static int ZEND_FASTCALL  ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
                }
        }
        if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) {
-               zval_ptr_dtor(&tmp_inc_filename);
+               zend_string_release(Z_STR(tmp_inc_filename));
        }
        zval_ptr_dtor_nogc(free_op1);
        if (UNEXPECTED(EG(exception) != NULL)) {
@@ -18003,7 +18007,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(int (*b
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -18326,7 +18330,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(incdec_t
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -18412,7 +18416,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -19600,8 +19604,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (IS_VAR != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
                                        zval_ptr_dtor_nogc(free_op1);
                                        HANDLE_EXCEPTION();
@@ -19620,8 +19624,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (IS_VAR != IS_CONST) {
-               zval_dtor(&tmp);
+       if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
        zval_ptr_dtor_nogc(free_op1);
        CHECK_EXCEPTION();
@@ -19765,6 +19769,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC
                zend_free_op free_op1;
                zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
+               ZVAL_UNDEF(&tmp);
                if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -19793,8 +19798,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (IS_VAR != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
                zval_ptr_dtor_nogc(free_op1);
 
@@ -20482,7 +20487,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(int (*bin
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -20808,7 +20813,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMP(incdec_t i
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -20895,7 +20900,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMP(incdec_t
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -22508,7 +22513,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*bin
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -22834,7 +22839,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t i
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -22921,7 +22926,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -24049,8 +24054,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (IS_VAR != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
                                        zval_ptr_dtor_nogc(free_op1);
                                        HANDLE_EXCEPTION();
@@ -24069,8 +24074,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (IS_VAR != IS_CONST) {
-               zval_dtor(&tmp);
+       if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
        zval_ptr_dtor_nogc(free_op1);
        CHECK_EXCEPTION();
@@ -24214,6 +24219,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
                zend_free_op free_op1;
                zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
+               ZVAL_UNDEF(&tmp);
                if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -24242,8 +24248,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (IS_VAR != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
                zval_ptr_dtor_nogc(free_op1);
 
@@ -24658,7 +24664,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(int (*
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -25507,8 +25513,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (IS_VAR != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
                                        zval_ptr_dtor_nogc(free_op1);
                                        HANDLE_EXCEPTION();
@@ -25527,8 +25533,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (IS_VAR != IS_CONST) {
-               zval_dtor(&tmp);
+       if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
        zval_ptr_dtor_nogc(free_op1);
        CHECK_EXCEPTION();
@@ -25559,6 +25565,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
                zend_free_op free_op1;
                zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
+               ZVAL_UNDEF(&tmp);
                if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -25587,8 +25594,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (IS_VAR != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
                zval_ptr_dtor_nogc(free_op1);
 
@@ -26095,7 +26102,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CV(int (*bina
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -26418,7 +26425,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(incdec_t in
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -26504,7 +26511,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t i
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -27890,7 +27897,7 @@ static int ZEND_FASTCALL  ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARG
        if (EXPECTED(EG(exception) == NULL)) {
                ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));
                if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
+                       OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
                }
        }
 
@@ -27979,7 +27986,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(int
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -28301,7 +28308,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(incde
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -28387,7 +28394,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CONST(incd
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -29380,7 +29387,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(int (*
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -29705,7 +29712,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_TMP(incdec_
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -29792,7 +29799,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_TMP(incdec
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -30092,7 +30099,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDL
        add_string_to_string(str, str, var);
 
        if (use_copy) {
-               zval_dtor(var);
+               zend_string_release(Z_STR_P(var));
        }
        /* original comment, possibly problematic:
         * FREE_OP is missing intentionally here - we're always working on the same temporary variable
@@ -30699,7 +30706,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (*
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -31024,7 +31031,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -31111,7 +31118,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -31411,7 +31418,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDL
        add_string_to_string(str, str, var);
 
        if (use_copy) {
-               zval_dtor(var);
+               zend_string_release(Z_STR_P(var));
        }
        /* original comment, possibly problematic:
         * FREE_OP is missing intentionally here - we're always working on the same temporary variable
@@ -32018,7 +32025,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(int
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -32510,7 +32517,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(int (*b
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -32832,7 +32839,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CV(incdec_t
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -32918,7 +32925,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CV(incdec_
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -33215,7 +33222,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLE
        add_string_to_string(str, str, var);
 
        if (use_copy) {
-               zval_dtor(var);
+               zend_string_release(Z_STR_P(var));
        }
        /* original comment, possibly problematic:
         * FREE_OP is missing intentionally here - we're always working on the same temporary variable
@@ -34512,7 +34519,7 @@ static int ZEND_FASTCALL  ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        if (EXPECTED(EG(exception) == NULL)) {
                ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));
                if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) {
-                       zval_ptr_dtor(EX_VAR(opline->result.var));
+                       OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
                }
        }
 
@@ -34700,7 +34707,7 @@ static int ZEND_FASTCALL  ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
                }
        }
        if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) {
-               zval_ptr_dtor(&tmp_inc_filename);
+               zend_string_release(Z_STR(tmp_inc_filename));
        }
 
        if (UNEXPECTED(EG(exception) != NULL)) {
@@ -35468,7 +35475,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CONST(int (*bi
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -35790,7 +35797,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CONST(incdec_t
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -35876,7 +35883,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CONST(incdec_t
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -36840,8 +36847,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (IS_CV != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
 
                                        HANDLE_EXCEPTION();
@@ -36860,8 +36867,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (IS_CV != IS_CONST) {
-               zval_dtor(&tmp);
+       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
 
        CHECK_EXCEPTION();
@@ -37005,6 +37012,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO
 
                zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
 
+               ZVAL_UNDEF(&tmp);
                if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -37033,8 +37041,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (IS_CV != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
 
                if (opline->extended_value & ZEND_ISSET) {
@@ -37776,7 +37784,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_TMP(int (*bina
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -38101,7 +38109,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_TMP(incdec_t in
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -38188,7 +38196,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_TMP(incdec_t i
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -39674,7 +39682,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*bina
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -39999,7 +40007,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t in
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -40086,7 +40094,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t i
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -41087,8 +41095,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (IS_CV != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
 
                                        HANDLE_EXCEPTION();
@@ -41107,8 +41115,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (IS_CV != IS_CONST) {
-               zval_dtor(&tmp);
+       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
 
        CHECK_EXCEPTION();
@@ -41252,6 +41260,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
 
                zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
 
+               ZVAL_UNDEF(&tmp);
                if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -41280,8 +41289,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (IS_CV != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
 
                if (opline->extended_value & ZEND_ISSET) {
@@ -41694,7 +41703,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(int (*b
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -42418,8 +42427,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAND
                        } else {
                                ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
                                if (UNEXPECTED(EG(exception) != NULL)) {
-                                       if (IS_CV != IS_CONST) {
-                                               zval_dtor(&tmp);
+                                       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                                               zend_string_release(Z_STR(tmp));
                                        }
 
                                        HANDLE_EXCEPTION();
@@ -42438,8 +42447,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAND
                zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
        }
 
-       if (IS_CV != IS_CONST) {
-               zval_dtor(&tmp);
+       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+               zend_string_release(Z_STR(tmp));
        }
 
        CHECK_EXCEPTION();
@@ -42470,6 +42479,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
 
                zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
 
+               ZVAL_UNDEF(&tmp);
                if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
                        ZVAL_STR(&tmp, zval_get_string(varname));
                        varname = &tmp;
@@ -42498,8 +42508,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
                }
 
-               if (IS_CV != IS_CONST && varname == &tmp) {
-                       zval_dtor(&tmp);
+               if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
+                       zend_string_release(Z_STR(tmp));
                }
 
                if (opline->extended_value & ZEND_ISSET) {
@@ -42986,7 +42996,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CV(int (*binar
                                        zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
-                                               zval_dtor(z);
+                                               zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                        }
                                        ZVAL_COPY_VALUE(z, value);
                                }
@@ -43308,7 +43318,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CV(incdec_t inc
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }
@@ -43394,7 +43404,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CV(incdec_t in
                                zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
-                                       zval_dtor(z);
+                                       zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);
                                }
                                ZVAL_COPY_VALUE(z, value);
                        }