]> granicus.if.org Git - php/commitdiff
Revert "An demo(for review) to show how to fix the problem we meet"
authorXinchen Hui <laruence@gmail.com>
Mon, 10 Mar 2014 08:24:35 +0000 (16:24 +0800)
committerXinchen Hui <laruence@gmail.com>
Mon, 10 Mar 2014 08:24:35 +0000 (16:24 +0800)
This reverts commit 4aeae157062f69deb36e16f13ff0ddff62fd487c.

Zend/zend_execute.c
Zend/zend_execute_API.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index b9f710cce3f4f3f2223b555f6f3862b13564e967..7977c873b3a57b23930b7663061207b64a0357fe 100644 (file)
@@ -214,9 +214,8 @@ static zend_never_inline zval *_get_zval_cv_lookup(zval *ptr, zend_uint var, int
        if (EG(active_symbol_table)) {
                ret = zend_hash_find(EG(active_symbol_table), cv);
                if (ret) {
-                       ZEND_ASSERT(Z_TYPE_P(ret) == IS_INDIRECT);
-                       ZVAL_INDIRECT(ptr, Z_INDIRECT_P(ret));
-                       return Z_INDIRECT_P(ptr);
+                       ZVAL_INDIRECT(ptr, ret);
+                       return ret;
                }
        }
 
@@ -232,14 +231,12 @@ static zend_never_inline zval *_get_zval_cv_lookup(zval *ptr, zend_uint var, int
                        /* break missing intentionally */
                case BP_VAR_W:
                        if (EG(active_symbol_table)) {
-                               zval zv;
-                               ZVAL_COPY_VALUE(ptr, &EG(uninitialized_zval));
-                               ZVAL_INDIRECT(&zv, ptr);
-                               zend_hash_update(EG(active_symbol_table), cv, &zv);
+                               ret = zend_hash_update(EG(active_symbol_table), cv, ret);
+                               ZVAL_INDIRECT(ptr, ret);
                        } else {
                                ZVAL_NULL(ptr);
+                               ret = ptr;
                        }
-                       ret = ptr;
                        break;
        }
        return ret;
@@ -253,9 +250,8 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_R(zval *ptr, zend_uint
        if (EG(active_symbol_table)) {
                ret = zend_hash_find(EG(active_symbol_table), cv);
                if (ret) {
-                       ZEND_ASSERT(Z_TYPE_P(ret) == IS_INDIRECT);
-                       ZVAL_INDIRECT(ptr, Z_INDIRECT_P(ret));
-                       return Z_INDIRECT_P(ptr);
+                       ZVAL_INDIRECT(ptr, ret);
+                       return ret;
                }
        }
 
@@ -271,9 +267,8 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_UNSET(zval *ptr, zend_
        if (EG(active_symbol_table)) {
                ret = zend_hash_find(EG(active_symbol_table), cv);
                if (ret) {
-                       ZEND_ASSERT(Z_TYPE_P(ret) == IS_INDIRECT);
-                       ZVAL_INDIRECT(ptr, Z_INDIRECT_P(ret));
-                       return Z_INDIRECT_P(ptr);
+                       ZVAL_INDIRECT(ptr, ret);
+                       return ret;
                }
        }
 
@@ -289,9 +284,8 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_IS(zval *ptr, zend_uin
        if (EG(active_symbol_table)) {
                ret = zend_hash_find(EG(active_symbol_table), cv);
                if (ret) {
-                       ZEND_ASSERT(Z_TYPE_P(ret) == IS_INDIRECT);
-                       ZVAL_INDIRECT(ptr, Z_INDIRECT_P(ret));
-                       return Z_INDIRECT_P(ptr);
+                       ZVAL_INDIRECT(ptr, ret);
+                       return ret;
                }
        }
 
@@ -306,17 +300,13 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_RW(zval *ptr, zend_uin
        if (EG(active_symbol_table)) {
                ret = zend_hash_find(EG(active_symbol_table), cv);
                if (ret) {
-                       ZEND_ASSERT(Z_TYPE_P(ret) == IS_INDIRECT);
-                       ZVAL_INDIRECT(ptr, Z_INDIRECT_P(ret));
-                       return Z_INDIRECT_P(ptr);
-               } else {
-                       zval zv;
-                       ZVAL_COPY_VALUE(ptr, &EG(uninitialized_zval));
-                       ZVAL_INDIRECT(&zv, ptr);
-                       zend_hash_update(EG(active_symbol_table), cv, &zv);
-                       zend_error(E_NOTICE, "Undefined variable: %s", cv->val);
-                       return ptr;
+                       ZVAL_INDIRECT(ptr, ret);
+                       return ret;
                }
+               ret = zend_hash_update(EG(active_symbol_table), cv, &EG(uninitialized_zval));
+               ZVAL_INDIRECT(ptr, ret);
+               zend_error(E_NOTICE, "Undefined variable: %s", cv->val);
+               return ret;
        } else {
                ZVAL_NULL(ptr);
                zend_error(E_NOTICE, "Undefined variable: %s", cv->val);
@@ -332,16 +322,12 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_W(zval *ptr, zend_uint
        if (EG(active_symbol_table)) {
                ret = zend_hash_find(EG(active_symbol_table), cv);
                if (ret) {
-                       ZEND_ASSERT(Z_TYPE_P(ret) == IS_INDIRECT);
-                       ZVAL_INDIRECT(ptr, Z_INDIRECT_P(ret));
-                       return Z_INDIRECT_P(ptr);
-               } else {
-                       zval zv;
-                       ZVAL_COPY_VALUE(ptr, &EG(uninitialized_zval));
-                       ZVAL_INDIRECT(&zv, ptr);
-                       zend_hash_update(EG(active_symbol_table), cv, &zv);
-                       return ptr;
+                       ZVAL_INDIRECT(ptr, ret);
+                       return ret;
                }
+               ret = zend_hash_update(EG(active_symbol_table), cv, &EG(uninitialized_zval));
+               ZVAL_INDIRECT(ptr, ret);
+               return ret;
        } else {
                ZVAL_NULL(ptr);
                return ptr;
@@ -1539,20 +1525,20 @@ static inline zend_brk_cont_element* zend_brk_cont(int nest_levels, int array_of
                zend_hash_apply(EG(active_symbol_table), (apply_func_t) zend_check_symbol TSRMLS_CC);   \
        }
 
-static int zend_check_symbol(zval *zv TSRMLS_DC)
+static int zend_check_symbol(zval **pz TSRMLS_DC)
 {
-       if (Z_TYPE_P(zv) > 17) {
-               fprintf(stderr, "Warning!  %x has invalid type!\n", *zv);
+       if (Z_TYPE_PP(pz) > 9) {
+               fprintf(stderr, "Warning!  %x has invalid type!\n", *pz);
 /* See http://support.microsoft.com/kb/190351 */
 #ifdef PHP_WIN32
                fflush(stderr);
 #endif
-       } else if (Z_TYPE_P(zv) == IS_ARRAY) {
-               zend_hash_apply(Z_ARRVAL_P(zv), (apply_func_t) zend_check_symbol TSRMLS_CC);
-       } else if (Z_TYPE_P(zv) == IS_OBJECT) {
+       } else if (Z_TYPE_PP(pz) == IS_ARRAY) {
+               zend_hash_apply(Z_ARRVAL_PP(pz), (apply_func_t) zend_check_symbol TSRMLS_CC);
+       } else if (Z_TYPE_PP(pz) == IS_OBJECT) {
 
                /* OBJ-TBI - doesn't support new object model! */
-               zend_hash_apply(Z_OBJPROP_P(zv), (apply_func_t) zend_check_symbol TSRMLS_CC);
+               zend_hash_apply(Z_OBJPROP_PP(pz), (apply_func_t) zend_check_symbol TSRMLS_CC);
        }
 
        return 0;
@@ -1742,10 +1728,11 @@ static zend_always_inline zend_execute_data *i_create_execute_data_from_op_array
                if (!EG(active_symbol_table)) {
                        ZVAL_COPY(EX_VAR_NUM(op_array->this_var), &EG(This));
                } else {
-                       zval zv;
                        ZVAL_COPY(EX_VAR_NUM(op_array->this_var), &EG(This));
-                       ZVAL_INDIRECT(&zv, EX_VAR_NUM(op_array->this_var));
-                       zend_hash_str_add(EG(active_symbol_table), "this", sizeof("this")-1, &zv);
+                       zval *zv = zend_hash_str_add(EG(active_symbol_table), "this", sizeof("this")-1, EX_VAR(op_array->this_var));
+                       if (zv) {
+                               ZVAL_INDIRECT(EX_VAR_NUM(op_array->this_var), zv);
+                       }
                }
        }
 
index 9721fbda7bc9ac5e14f48b0100520bca489ec990..8faba97fc784bc2341e113f8ceb18f3175d26c31 100644 (file)
@@ -1728,9 +1728,10 @@ ZEND_API void zend_rebuild_symbol_table(TSRMLS_D) /* {{{ */
                        }
                        for (i = 0; i < ex->op_array->last_var; i++) {
                                if (Z_TYPE_P(EX_VAR_NUM_2(ex, i)) != IS_UNDEF) {
-                                       zval zv;
-                                       ZVAL_INDIRECT(&zv, EX_VAR_NUM_2(ex, i));
-                                       zend_hash_update(EG(active_symbol_table), ex->op_array->vars[i], &zv);
+                                       zval *zv = zend_hash_update(EG(active_symbol_table),
+                                               ex->op_array->vars[i],
+                                               EX_VAR_NUM_2(ex, i));
+                                       ZVAL_INDIRECT(EX_VAR_NUM_2(ex, i), zv);
                                }
                        }
                }
index 9d4a1f92b6b2e1ee28eb30a9f018f83068fb73f5..6049f658f0fc88e56341d167b01fa2b4e5c0a75d 100644 (file)
@@ -1069,16 +1069,30 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST|
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (OP1_TYPE != IS_TMP_VAR) {
+                                       FREE_OP1();
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+                               FREE_OP1();
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (OP1_TYPE == IS_VAR && !OP1_FREE) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -1086,35 +1100,11 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST|
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (OP1_TYPE != IS_TMP_VAR) {
-                               FREE_OP1();
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-                       FREE_OP1();
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (OP1_TYPE == IS_VAR && !OP1_FREE) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -4630,9 +4620,6 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (OP1_TYPE != IS_CONST && varname == &tmp) {
index 494c917aa01a0d31a9fc623f969ff34a20bbf1ff..32042fc548b1a875f33185c98c8f6b8ecc666b2c 100644 (file)
@@ -3622,16 +3622,30 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (IS_CONST != IS_TMP_VAR) {
+
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (IS_CONST == IS_VAR && !0) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -3639,35 +3653,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (IS_CONST != IS_TMP_VAR) {
-
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (IS_CONST == IS_VAR && !0) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -4223,9 +4213,6 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (IS_CONST != IS_CONST && varname == &tmp) {
@@ -5417,16 +5404,30 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type,
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (IS_CONST != IS_TMP_VAR) {
+
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (IS_CONST == IS_VAR && !0) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -5434,35 +5435,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type,
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (IS_CONST != IS_TMP_VAR) {
-
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (IS_CONST == IS_VAR && !0) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -5904,9 +5881,6 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (IS_CONST != IS_CONST && varname == &tmp) {
@@ -6139,16 +6113,30 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (IS_CONST != IS_TMP_VAR) {
+
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (IS_CONST == IS_VAR && !0) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -6156,35 +6144,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (IS_CONST != IS_TMP_VAR) {
-
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (IS_CONST == IS_VAR && !0) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -6594,9 +6558,6 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (IS_CONST != IS_CONST && varname == &tmp) {
@@ -8810,16 +8771,30 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type,
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (IS_TMP_VAR != IS_TMP_VAR) {
+                                       zval_dtor(free_op1.var);
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+                               zval_dtor(free_op1.var);
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (IS_TMP_VAR == IS_VAR && !1) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -8827,35 +8802,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type,
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (IS_TMP_VAR != IS_TMP_VAR) {
-                               zval_dtor(free_op1.var);
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-                       zval_dtor(free_op1.var);
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (IS_TMP_VAR == IS_VAR && !1) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -9319,9 +9270,6 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
@@ -10490,16 +10438,30 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZE
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (IS_TMP_VAR != IS_TMP_VAR) {
+                                       zval_dtor(free_op1.var);
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+                               zval_dtor(free_op1.var);
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (IS_TMP_VAR == IS_VAR && !1) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -10507,35 +10469,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZE
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (IS_TMP_VAR != IS_TMP_VAR) {
-                               zval_dtor(free_op1.var);
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-                       zval_dtor(free_op1.var);
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (IS_TMP_VAR == IS_VAR && !1) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -10987,9 +10925,6 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
@@ -11222,16 +11157,30 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type,
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (IS_TMP_VAR != IS_TMP_VAR) {
+                                       zval_dtor(free_op1.var);
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+                               zval_dtor(free_op1.var);
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (IS_TMP_VAR == IS_VAR && !1) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -11239,35 +11188,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type,
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (IS_TMP_VAR != IS_TMP_VAR) {
-                               zval_dtor(free_op1.var);
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-                       zval_dtor(free_op1.var);
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (IS_TMP_VAR == IS_VAR && !1) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -11566,9 +11491,6 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
@@ -14572,16 +14494,30 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type,
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (IS_VAR != IS_TMP_VAR) {
+                                       zval_ptr_dtor_nogc(free_op1.var);
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+                               zval_ptr_dtor_nogc(free_op1.var);
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -14589,35 +14525,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type,
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (IS_VAR != IS_TMP_VAR) {
-                               zval_ptr_dtor_nogc(free_op1.var);
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-                       zval_ptr_dtor_nogc(free_op1.var);
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -15950,9 +15862,6 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (IS_VAR != IS_CONST && varname == &tmp) {
@@ -19120,16 +19029,30 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (IS_VAR != IS_TMP_VAR) {
+                                       zval_ptr_dtor_nogc(free_op1.var);
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+                               zval_ptr_dtor_nogc(free_op1.var);
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -19137,35 +19060,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (IS_VAR != IS_TMP_VAR) {
-                               zval_ptr_dtor_nogc(free_op1.var);
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-                       zval_ptr_dtor_nogc(free_op1.var);
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -20462,9 +20361,6 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (IS_VAR != IS_CONST && varname == &tmp) {
@@ -21104,16 +21000,30 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type,
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (IS_VAR != IS_TMP_VAR) {
+                                       zval_ptr_dtor_nogc(free_op1.var);
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+                               zval_ptr_dtor_nogc(free_op1.var);
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -21121,35 +21031,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type,
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (IS_VAR != IS_TMP_VAR) {
-                               zval_ptr_dtor_nogc(free_op1.var);
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-                       zval_ptr_dtor_nogc(free_op1.var);
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -21737,9 +21623,6 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (IS_VAR != IS_CONST && varname == &tmp) {
@@ -31845,16 +31728,30 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (IS_CV != IS_TMP_VAR) {
+
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (IS_CV == IS_VAR && !0) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -31862,35 +31759,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (IS_CV != IS_TMP_VAR) {
-
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (IS_CV == IS_VAR && !0) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -33010,9 +32883,6 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (IS_CV != IS_CONST && varname == &tmp) {
@@ -36050,16 +35920,30 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (IS_CV != IS_TMP_VAR) {
+
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (IS_CV == IS_VAR && !0) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -36067,35 +35951,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (IS_CV != IS_TMP_VAR) {
-
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (IS_CV == IS_VAR && !0) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -37271,9 +37131,6 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (IS_CV != IS_CONST && varname == &tmp) {
@@ -37908,16 +37765,30 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type,
                                case BP_VAR_RW:
                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
                                        /* break missing intentionally */
-                               case BP_VAR_W: {
-                                          zval zv;
-                                          ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval));
-                                          ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var));
-                                          zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv);
-                                       }
+                               case BP_VAR_W:
+                                       retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval));
                                        break;
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                }
+               switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
+                       case ZEND_FETCH_GLOBAL:
+                               if (IS_CV != IS_TMP_VAR) {
+
+                               }
+                               break;
+                       case ZEND_FETCH_LOCAL:
+
+                               break;
+                       case ZEND_FETCH_STATIC:
+                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
+                               break;
+                       case ZEND_FETCH_GLOBAL_LOCK:
+                               if (IS_CV == IS_VAR && !0) {
+                                       Z_ADDREF_P(EX_VAR(opline->op1.var));
+                               }
+                               break;
+               }
        }
 
 
@@ -37925,35 +37796,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type,
                zval_dtor(&tmp_varname);
        }
 
-       if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
-               retval = Z_INDIRECT_P(retval);
-       }
-
-       switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
-               case ZEND_FETCH_GLOBAL:
-                       if (IS_CV != IS_TMP_VAR) {
-
-                       }
-                       break;
-               case ZEND_FETCH_LOCAL:
-
-                       break;
-               case ZEND_FETCH_STATIC:
-                       if (retval) {
-                               zval_update_constant(retval, (void*) 1 TSRMLS_CC);
-                       }
-                       break;
-               case ZEND_FETCH_GLOBAL_LOCK:
-                       if (IS_CV == IS_VAR && !0) {
-                               Z_ADDREF_P(EX_VAR(opline->op1.var));
-                       }
-                       break;
+       if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
+               SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
-               }
                if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
@@ -38428,9 +38275,6 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
                        if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
                                isset = 0;
                        }
-                       if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) {
-                               value = Z_INDIRECT_P(value);
-                       }
                }
 
                if (IS_CV != IS_CONST && varname == &tmp) {