]> granicus.if.org Git - php/commitdiff
Simplify ASSIGN code
authorDmitry Stogov <dmitry@zend.com>
Thu, 11 Sep 2014 13:00:06 +0000 (17:00 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 11 Sep 2014 13:00:06 +0000 (17:00 +0400)
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index b988011073a13b2adff9bcd32d3dd603078c86c3..27636fdb29af4c529e590b106cb42ddd36918f91 100644 (file)
@@ -813,144 +813,61 @@ static void zend_assign_to_string_offset(zval *str, zend_long offset, zval *valu
        }
 }
 
-static inline zval* zend_assign_tmp_to_variable(zval *variable_ptr, zval *value TSRMLS_DC)
+static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type TSRMLS_DC)
 {
-       ZVAL_DEREF(variable_ptr);
-
-       if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
-               zend_refcounted *garbage;
-
-               if (Z_TYPE_P(variable_ptr) == IS_OBJECT &&
-                   UNEXPECTED(Z_OBJ_HANDLER_P(variable_ptr, set) != NULL)) {
-                       Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value TSRMLS_CC);
-                       return variable_ptr;
-               }
+       do {
+               if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) { 
+                       zend_refcounted *garbage;
 
-               garbage = Z_COUNTED_P(variable_ptr);
-               if (UNEXPECTED(GC_REFCOUNT(garbage) > 1)) {
-                       /* we need to split */
-                       GC_REFCOUNT(garbage)--;
-                       /* optimized version of GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr) */
-                       if ((Z_COLLECTABLE_P(variable_ptr)) &&
-                       UNEXPECTED(!GC_INFO(garbage))) {
-                               gc_possible_root(garbage TSRMLS_CC);
+                       if (Z_ISREF_P(variable_ptr)) {
+                               variable_ptr = Z_REFVAL_P(variable_ptr);
+                               if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) {
+                                       break;
+                               }
                        }
-               } else {
-                       ZVAL_COPY_VALUE(variable_ptr, value);
-                       _zval_dtor_func(garbage ZEND_FILE_LINE_CC);
-                       return variable_ptr;
-               }
-       }
-
-       ZVAL_COPY_VALUE(variable_ptr, value);
-       
-       return variable_ptr;
-}
-
-static inline zval* zend_assign_const_to_variable(zval *variable_ptr, zval *value TSRMLS_DC)
-{
-       ZVAL_DEREF(variable_ptr);
-
-       if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
-               zend_refcounted *garbage;
-
-               if (Z_TYPE_P(variable_ptr) == IS_OBJECT &&
-                   UNEXPECTED(Z_OBJ_HANDLER_P(variable_ptr, set) != NULL)) {
-                       Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value TSRMLS_CC);
-                       return variable_ptr;
-               }
-
-               garbage = Z_COUNTED_P(variable_ptr);
-               if (UNEXPECTED(GC_REFCOUNT(garbage) > 1)) {
-                       /* we need to split */
-                       GC_REFCOUNT(garbage)--;
-                       /* optimized version of GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr) */
-                       if (Z_COLLECTABLE_P(variable_ptr) &&
-                       UNEXPECTED(!GC_INFO(garbage))) {
-                               gc_possible_root(garbage TSRMLS_CC);
+                       if (Z_TYPE_P(variable_ptr) == IS_OBJECT &&
+                       UNEXPECTED(Z_OBJ_HANDLER_P(variable_ptr, set) != NULL)) {
+                               Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value TSRMLS_CC);
+                               return variable_ptr;
                        }
-               } else {
-                       ZVAL_COPY_VALUE(variable_ptr, value);
-                       /* IS_CONST can't be IS_OBJECT, IS_RESOURCE or IS_REFERENCE */
-                       if (UNEXPECTED(Z_OPT_COPYABLE_P(variable_ptr))) {
-                               zval_copy_ctor_func(variable_ptr);
+                       if ((value_type & (IS_VAR|IS_CV)) && variable_ptr == value) {
+                               return variable_ptr;
                        }
-                       _zval_dtor_func(garbage ZEND_FILE_LINE_CC);
-                       return variable_ptr;
-               }
-       }
-       
-       ZVAL_COPY_VALUE(variable_ptr, value);
-       /* IS_CONST can't be IS_OBJECT, IS_RESOURCE or IS_REFERENCE */
-       if (UNEXPECTED(Z_OPT_COPYABLE_P(variable_ptr))) {
-               zval_copy_ctor_func(variable_ptr);
-       }
-
-       return variable_ptr;
-}
-
-static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRMLS_DC)
-{
-       zend_refcounted *garbage;
-
-       if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) {  
-               goto assign_simple;
-       } else if (UNEXPECTED(variable_ptr == value)) {
-               return variable_ptr;
-       }
-       if (Z_ISREF_P(variable_ptr)) {
-               variable_ptr = Z_REFVAL_P(variable_ptr);
-               if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) {
-                       goto assign_simple;
-               } else if (UNEXPECTED(variable_ptr == value)) {
-                       return variable_ptr;
-               }
-       }
-
-       if (Z_TYPE_P(variable_ptr) == IS_OBJECT &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(variable_ptr, set) != NULL)) {
-               Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value TSRMLS_CC);
-       } else {
-               if (Z_REFCOUNT_P(variable_ptr)==1) {
                        garbage = Z_COUNTED_P(variable_ptr);
-                       if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
-                               if (EXPECTED(!Z_ISREF_P(value))) {
-                                       Z_ADDREF_P(value);
-                               } else {
-                                       if (Z_REFCOUNT_P(value) == 1) {
-                                               ZVAL_UNREF(value);
-                                       } else {
-                                               value = Z_REFVAL_P(value);
+                       if (GC_REFCOUNT(garbage) == 1) {
+                               ZVAL_COPY_VALUE(variable_ptr, value);
+                               if (value_type == IS_CONST) {
+                                       /* IS_CONST can't be IS_OBJECT, IS_RESOURCE or IS_REFERENCE */
+                                       if (UNEXPECTED(Z_OPT_COPYABLE_P(variable_ptr))) {
+                                               zval_copy_ctor_func(variable_ptr);
                                        }
-                                       if (Z_REFCOUNTED_P(value)) {
-                                               if (UNEXPECTED(variable_ptr == value)) {
-                                                       return variable_ptr;
-                                               }
-                                               Z_ADDREF_P(value);
+                               } else if (value_type != IS_TMP_VAR) {
+                                       if (UNEXPECTED(Z_OPT_REFCOUNTED_P(variable_ptr))) {
+                                               Z_ADDREF_P(variable_ptr);
                                        }
                                }
-                       }
-                       ZVAL_COPY_VALUE(variable_ptr, value);
-                       _zval_dtor_func(garbage ZEND_FILE_LINE_CC);
-               } else { /* we need to split */
-                       Z_DELREF_P(variable_ptr);
-                       GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
-assign_simple:
-                       if (UNEXPECTED(Z_REFCOUNTED_P(value))) {
-                               if (EXPECTED(!Z_ISREF_P(value))) {
-                                       Z_ADDREF_P(value);
-                               } else {
-                                       if (Z_REFCOUNT_P(value) == 1) {
-                                               ZVAL_UNREF(value);
-                                       } else {
-                                               value = Z_REFVAL_P(value);
-                                       }
-                                       if (Z_REFCOUNTED_P(value)) {
-                                               Z_ADDREF_P(value);
-                                       }
+                               _zval_dtor_func(garbage ZEND_FILE_LINE_CC);
+                               return variable_ptr;
+                       } else { /* we need to split */
+                               GC_REFCOUNT(garbage)--;
+                               /* optimized version of GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr) */
+                               if ((Z_COLLECTABLE_P(variable_ptr)) &&
+                               UNEXPECTED(!GC_INFO(garbage))) {
+                                       gc_possible_root(garbage TSRMLS_CC);
                                }
                        }
-                       ZVAL_COPY_VALUE(variable_ptr, value);
+               }
+       } while (0);
+
+       ZVAL_COPY_VALUE(variable_ptr, value);
+       if (value_type == IS_CONST) {
+               /* IS_CONST can't be IS_OBJECT, IS_RESOURCE or IS_REFERENCE */
+               if (UNEXPECTED(Z_OPT_COPYABLE_P(variable_ptr))) {
+                       zval_copy_ctor_func(variable_ptr);
+               }
+       } else if (value_type != IS_TMP_VAR) {
+               if (UNEXPECTED(Z_OPT_REFCOUNTED_P(variable_ptr))) {
+                       Z_ADDREF_P(variable_ptr);
                }
        }
        return variable_ptr;
index aedd4852edec2a8a30f16d4898c42c60e14846cb..c50cc177e64db5ede6a6db1a8d49832288afd61c 100644 (file)
@@ -1643,7 +1643,7 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
 
                variable_ptr = zend_fetch_dimension_address_W_str(EX_VAR((opline+1)->op2.var), object_ptr, dim, OP2_TYPE TSRMLS_CC);
                FREE_OP2();
-               value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
+               value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                if (UNEXPECTED(variable_ptr != NULL)) {
                        zend_assign_to_string_offset(variable_ptr, Z_LVAL_P(EX_VAR((opline+1)->op2.var)), value, (opline+1)->op1_type, (RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : NULL) TSRMLS_CC);
                } else {
@@ -1657,13 +1657,7 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
                                }
                                FREE_OP_VAR_PTR(free_op_data2);
                        } else {
-                               if ((opline+1)->op1_type == IS_TMP_VAR) {
-                                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else if ((opline+1)->op1_type == IS_CONST) {
-                                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else {
-                                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-                               }
+                               value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
                                if (RETURN_VALUE_USED(opline)) {
                                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                                }
@@ -1687,7 +1681,7 @@ ZEND_VM_HANDLER(38, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV)
        zval *variable_ptr;
 
        SAVE_OPLINE();
-       value = GET_OP2_ZVAL_PTR(BP_VAR_R);
+       value = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
        variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
 
        if (OP1_TYPE == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
@@ -1698,13 +1692,7 @@ ZEND_VM_HANDLER(38, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV)
                        ZVAL_NULL(EX_VAR(opline->result.var));
                }
        } else {
-               if (OP2_TYPE == IS_TMP_VAR) {
-                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-               } else if (OP2_TYPE == IS_CONST) {
-                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-               } else {
-                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-               }
+               value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE TSRMLS_CC);
                if (RETURN_VALUE_USED(opline)) {
                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                }
index 2bc348763168053f34b77023493aeea273f38b90..bee8583ba70bc99049b7f03abdc4354448bd05df 100644 (file)
@@ -18216,7 +18216,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN
 
                variable_ptr = zend_fetch_dimension_address_W_str(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_CONST TSRMLS_CC);
 
-               value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
+               value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                if (UNEXPECTED(variable_ptr != NULL)) {
                        zend_assign_to_string_offset(variable_ptr, Z_LVAL_P(EX_VAR((opline+1)->op2.var)), value, (opline+1)->op1_type, (RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : NULL) TSRMLS_CC);
                } else {
@@ -18230,13 +18230,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN
                                }
                                FREE_OP_VAR_PTR(free_op_data2);
                        } else {
-                               if ((opline+1)->op1_type == IS_TMP_VAR) {
-                                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else if ((opline+1)->op1_type == IS_CONST) {
-                                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else {
-                                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-                               }
+                               value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
                                if (RETURN_VALUE_USED(opline)) {
                                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                                }
@@ -18271,13 +18265,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER
                        ZVAL_NULL(EX_VAR(opline->result.var));
                }
        } else {
-               if (IS_CONST == IS_TMP_VAR) {
-                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-               } else if (IS_CONST == IS_CONST) {
-                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-               } else {
-                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-               }
+               value = zend_assign_to_variable(variable_ptr, value, IS_CONST TSRMLS_CC);
                if (RETURN_VALUE_USED(opline)) {
                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                }
@@ -20457,7 +20445,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL
 
                variable_ptr = zend_fetch_dimension_address_W_str(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_TMP_VAR TSRMLS_CC);
                zval_dtor(free_op2.var);
-               value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
+               value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                if (UNEXPECTED(variable_ptr != NULL)) {
                        zend_assign_to_string_offset(variable_ptr, Z_LVAL_P(EX_VAR((opline+1)->op2.var)), value, (opline+1)->op1_type, (RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : NULL) TSRMLS_CC);
                } else {
@@ -20471,13 +20459,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL
                                }
                                FREE_OP_VAR_PTR(free_op_data2);
                        } else {
-                               if ((opline+1)->op1_type == IS_TMP_VAR) {
-                                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else if ((opline+1)->op1_type == IS_CONST) {
-                                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else {
-                                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-                               }
+                               value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
                                if (RETURN_VALUE_USED(opline)) {
                                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                                }
@@ -20512,13 +20494,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_A
                        ZVAL_NULL(EX_VAR(opline->result.var));
                }
        } else {
-               if (IS_TMP_VAR == IS_TMP_VAR) {
-                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-               } else if (IS_TMP_VAR == IS_CONST) {
-                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-               } else {
-                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-               }
+               value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR TSRMLS_CC);
                if (RETURN_VALUE_USED(opline)) {
                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                }
@@ -22606,7 +22582,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
 
                variable_ptr = zend_fetch_dimension_address_W_str(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_VAR TSRMLS_CC);
                zval_ptr_dtor_nogc(free_op2.var);
-               value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
+               value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                if (UNEXPECTED(variable_ptr != NULL)) {
                        zend_assign_to_string_offset(variable_ptr, Z_LVAL_P(EX_VAR((opline+1)->op2.var)), value, (opline+1)->op1_type, (RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : NULL) TSRMLS_CC);
                } else {
@@ -22620,13 +22596,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
                                }
                                FREE_OP_VAR_PTR(free_op_data2);
                        } else {
-                               if ((opline+1)->op1_type == IS_TMP_VAR) {
-                                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else if ((opline+1)->op1_type == IS_CONST) {
-                                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else {
-                                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-                               }
+                               value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
                                if (RETURN_VALUE_USED(opline)) {
                                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                                }
@@ -22650,7 +22620,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
        zval *variable_ptr;
 
        SAVE_OPLINE();
-       value = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+       value = _get_zval_ptr_var_deref(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
        variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
        if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
@@ -22661,13 +22631,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
                        ZVAL_NULL(EX_VAR(opline->result.var));
                }
        } else {
-               if (IS_VAR == IS_TMP_VAR) {
-                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-               } else if (IS_VAR == IS_CONST) {
-                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-               } else {
-                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-               }
+               value = zend_assign_to_variable(variable_ptr, value, IS_VAR TSRMLS_CC);
                if (RETURN_VALUE_USED(opline)) {
                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                }
@@ -24263,7 +24227,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HA
 
                variable_ptr = zend_fetch_dimension_address_W_str(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_UNUSED TSRMLS_CC);
 
-               value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
+               value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                if (UNEXPECTED(variable_ptr != NULL)) {
                        zend_assign_to_string_offset(variable_ptr, Z_LVAL_P(EX_VAR((opline+1)->op2.var)), value, (opline+1)->op1_type, (RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : NULL) TSRMLS_CC);
                } else {
@@ -24277,13 +24241,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HA
                                }
                                FREE_OP_VAR_PTR(free_op_data2);
                        } else {
-                               if ((opline+1)->op1_type == IS_TMP_VAR) {
-                                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else if ((opline+1)->op1_type == IS_CONST) {
-                                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else {
-                                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-                               }
+                               value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
                                if (RETURN_VALUE_USED(opline)) {
                                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                                }
@@ -26006,7 +25964,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE
 
                variable_ptr = zend_fetch_dimension_address_W_str(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_CV TSRMLS_CC);
 
-               value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
+               value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                if (UNEXPECTED(variable_ptr != NULL)) {
                        zend_assign_to_string_offset(variable_ptr, Z_LVAL_P(EX_VAR((opline+1)->op2.var)), value, (opline+1)->op1_type, (RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : NULL) TSRMLS_CC);
                } else {
@@ -26020,13 +25978,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE
                                }
                                FREE_OP_VAR_PTR(free_op_data2);
                        } else {
-                               if ((opline+1)->op1_type == IS_TMP_VAR) {
-                                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else if ((opline+1)->op1_type == IS_CONST) {
-                                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else {
-                                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-                               }
+                               value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
                                if (RETURN_VALUE_USED(opline)) {
                                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                                }
@@ -26050,7 +26002,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR
        zval *variable_ptr;
 
        SAVE_OPLINE();
-       value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
+       value = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
        variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
        if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
@@ -26061,13 +26013,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR
                        ZVAL_NULL(EX_VAR(opline->result.var));
                }
        } else {
-               if (IS_CV == IS_TMP_VAR) {
-                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-               } else if (IS_CV == IS_CONST) {
-                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-               } else {
-                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-               }
+               value = zend_assign_to_variable(variable_ptr, value, IS_CV TSRMLS_CC);
                if (RETURN_VALUE_USED(opline)) {
                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                }
@@ -35444,7 +35390,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAND
 
                variable_ptr = zend_fetch_dimension_address_W_str(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_CONST TSRMLS_CC);
 
-               value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
+               value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                if (UNEXPECTED(variable_ptr != NULL)) {
                        zend_assign_to_string_offset(variable_ptr, Z_LVAL_P(EX_VAR((opline+1)->op2.var)), value, (opline+1)->op1_type, (RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : NULL) TSRMLS_CC);
                } else {
@@ -35458,13 +35404,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAND
                                }
                                FREE_OP_VAR_PTR(free_op_data2);
                        } else {
-                               if ((opline+1)->op1_type == IS_TMP_VAR) {
-                                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else if ((opline+1)->op1_type == IS_CONST) {
-                                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else {
-                                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-                               }
+                               value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
                                if (RETURN_VALUE_USED(opline)) {
                                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                                }
@@ -35499,13 +35439,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_
                        ZVAL_NULL(EX_VAR(opline->result.var));
                }
        } else {
-               if (IS_CONST == IS_TMP_VAR) {
-                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-               } else if (IS_CONST == IS_CONST) {
-                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-               } else {
-                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-               }
+               value = zend_assign_to_variable(variable_ptr, value, IS_CONST TSRMLS_CC);
                if (RETURN_VALUE_USED(opline)) {
                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                }
@@ -37499,7 +37433,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLE
 
                variable_ptr = zend_fetch_dimension_address_W_str(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_TMP_VAR TSRMLS_CC);
                zval_dtor(free_op2.var);
-               value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
+               value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                if (UNEXPECTED(variable_ptr != NULL)) {
                        zend_assign_to_string_offset(variable_ptr, Z_LVAL_P(EX_VAR((opline+1)->op2.var)), value, (opline+1)->op1_type, (RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : NULL) TSRMLS_CC);
                } else {
@@ -37513,13 +37447,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLE
                                }
                                FREE_OP_VAR_PTR(free_op_data2);
                        } else {
-                               if ((opline+1)->op1_type == IS_TMP_VAR) {
-                                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else if ((opline+1)->op1_type == IS_CONST) {
-                                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else {
-                                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-                               }
+                               value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
                                if (RETURN_VALUE_USED(opline)) {
                                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                                }
@@ -37554,13 +37482,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
                        ZVAL_NULL(EX_VAR(opline->result.var));
                }
        } else {
-               if (IS_TMP_VAR == IS_TMP_VAR) {
-                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-               } else if (IS_TMP_VAR == IS_CONST) {
-                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-               } else {
-                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-               }
+               value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR TSRMLS_CC);
                if (RETURN_VALUE_USED(opline)) {
                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                }
@@ -39529,7 +39451,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
 
                variable_ptr = zend_fetch_dimension_address_W_str(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_VAR TSRMLS_CC);
                zval_ptr_dtor_nogc(free_op2.var);
-               value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
+               value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                if (UNEXPECTED(variable_ptr != NULL)) {
                        zend_assign_to_string_offset(variable_ptr, Z_LVAL_P(EX_VAR((opline+1)->op2.var)), value, (opline+1)->op1_type, (RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : NULL) TSRMLS_CC);
                } else {
@@ -39543,13 +39465,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
                                }
                                FREE_OP_VAR_PTR(free_op_data2);
                        } else {
-                               if ((opline+1)->op1_type == IS_TMP_VAR) {
-                                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else if ((opline+1)->op1_type == IS_CONST) {
-                                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else {
-                                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-                               }
+                               value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
                                if (RETURN_VALUE_USED(opline)) {
                                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                                }
@@ -39573,7 +39489,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
        zval *variable_ptr;
 
        SAVE_OPLINE();
-       value = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+       value = _get_zval_ptr_var_deref(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
        variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
 
        if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
@@ -39584,13 +39500,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
                        ZVAL_NULL(EX_VAR(opline->result.var));
                }
        } else {
-               if (IS_VAR == IS_TMP_VAR) {
-                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-               } else if (IS_VAR == IS_CONST) {
-                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-               } else {
-                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-               }
+               value = zend_assign_to_variable(variable_ptr, value, IS_VAR TSRMLS_CC);
                if (RETURN_VALUE_USED(opline)) {
                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                }
@@ -41066,7 +40976,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAN
 
                variable_ptr = zend_fetch_dimension_address_W_str(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_UNUSED TSRMLS_CC);
 
-               value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
+               value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                if (UNEXPECTED(variable_ptr != NULL)) {
                        zend_assign_to_string_offset(variable_ptr, Z_LVAL_P(EX_VAR((opline+1)->op2.var)), value, (opline+1)->op1_type, (RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : NULL) TSRMLS_CC);
                } else {
@@ -41080,13 +40990,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAN
                                }
                                FREE_OP_VAR_PTR(free_op_data2);
                        } else {
-                               if ((opline+1)->op1_type == IS_TMP_VAR) {
-                                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else if ((opline+1)->op1_type == IS_CONST) {
-                                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else {
-                                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-                               }
+                               value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
                                if (RETURN_VALUE_USED(opline)) {
                                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                                }
@@ -42673,7 +42577,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER
 
                variable_ptr = zend_fetch_dimension_address_W_str(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_CV TSRMLS_CC);
 
-               value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
+               value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
                if (UNEXPECTED(variable_ptr != NULL)) {
                        zend_assign_to_string_offset(variable_ptr, Z_LVAL_P(EX_VAR((opline+1)->op2.var)), value, (opline+1)->op1_type, (RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : NULL) TSRMLS_CC);
                } else {
@@ -42687,13 +42591,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER
                                }
                                FREE_OP_VAR_PTR(free_op_data2);
                        } else {
-                               if ((opline+1)->op1_type == IS_TMP_VAR) {
-                                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else if ((opline+1)->op1_type == IS_CONST) {
-                                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-                               } else {
-                                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-                               }
+                               value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
                                if (RETURN_VALUE_USED(opline)) {
                                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                                }
@@ -42717,7 +42615,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
        zval *variable_ptr;
 
        SAVE_OPLINE();
-       value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
+       value = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
        variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
 
        if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
@@ -42728,13 +42626,7 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
                        ZVAL_NULL(EX_VAR(opline->result.var));
                }
        } else {
-               if (IS_CV == IS_TMP_VAR) {
-                       value = zend_assign_tmp_to_variable(variable_ptr, value TSRMLS_CC);
-               } else if (IS_CV == IS_CONST) {
-                       value = zend_assign_const_to_variable(variable_ptr, value TSRMLS_CC);
-               } else {
-                       value = zend_assign_to_variable(variable_ptr, value TSRMLS_CC);
-               }
+               value = zend_assign_to_variable(variable_ptr, value, IS_CV TSRMLS_CC);
                if (RETURN_VALUE_USED(opline)) {
                        ZVAL_COPY(EX_VAR(opline->result.var), value);
                }