]> granicus.if.org Git - php/commitdiff
- Commit the variable fetch optimization.
authorAndi Gutmans <andi@php.net>
Mon, 4 Oct 2004 19:54:35 +0000 (19:54 +0000)
committerAndi Gutmans <andi@php.net>
Mon, 4 Oct 2004 19:54:35 +0000 (19:54 +0000)
- Extensions which delete global variables need to use new special function
- delete_global_variable() (I'm about to rename it) to remove them.
- Will post to internals@ or via commit messages if there's anything else.

15 files changed:
Zend/Zend.m4
Zend/zend_API.h
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_execute.c
Zend/zend_execute_API.c
Zend/zend_language_parser.y
Zend/zend_opcode.c
Zend/zend_vm.h
Zend/zend_vm_handlers.h
Zend/zend_vm_spec.h
ext/session/session.c
ext/spl/spl_array.c
ext/standard/array.c
ext/standard/basic_functions.c

index 83c764a0580140316c87377083e818c060153eb5..f3b8a3d171cf987cf46d55c756b8a1e6d887f7ee 100644 (file)
@@ -108,6 +108,22 @@ AC_ARG_ENABLE(debug,
 
 AC_DEFUN(LIBZEND_OTHER_CHECKS,[
 
+PHP_ARG_WITH(zend-vm,[virtual machine dispatch method],
+[  --with-zend-vm=TYPE     Sets virtual machine dispatch methos. Type is
+                          one of "CALL" (default), "SWITCH" or "GOTO"], CALL, no)
+
+case $PHP_ZEND_VM in
+  SWITCH)
+    AC_DEFINE(ZEND_VM_KIND,ZEND_VM_KIND_SWITCH,[virtual machine dispatch method])
+    ;;
+  GOTO)
+    AC_DEFINE(ZEND_VM_KIND,ZEND_VM_KIND_GOTO,[virtual machine dispatch method])
+    ;;
+  *)
+    AC_DEFINE(ZEND_VM_KIND,ZEND_VM_KIND_CALL,[virtual machine dispatch method])
+    ;;
+esac
+
 AC_ARG_ENABLE(maintainer-zts,
 [  --enable-maintainer-zts Enable thread safety - for code maintainers only],[
   ZEND_MAINTAINER_ZTS=$enableval
index e5d3927c9bfc2fa550482316438dc6f4c04bdd3b..14663084563572610b9623eee216658abc2b0b6e 100644 (file)
@@ -333,6 +333,8 @@ ZEND_API int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci
 ZEND_API int zend_set_hash_symbol(zval *symbol, char *name, int name_length,
                                   zend_bool is_ref, int num_symbol_tables, ...);
 
+ZEND_API int delete_global_variable(char *name, int name_len TSRMLS_DC);
+
 #define add_method(arg, key, method)   add_assoc_function((arg), (key), (method))
 
 ZEND_API ZEND_FUNCTION(display_disabled_function);
index 913be149e7feb0f52d5b262ec5d89e7200e48492..2f34969a02f946aa3b0246c052bd458d183ba2d7 100644 (file)
@@ -221,6 +221,32 @@ static zend_uint get_temporary_variable(zend_op_array *op_array)
        return (op_array->T)++ * sizeof(temp_variable);
 }
 
+static int lookup_cv(zend_op_array *op_array, char* name, int name_len)
+{
+       int i = 0;
+       ulong hash_value = zend_inline_hash_func(name, name_len+1);
+
+       while (i < op_array->last_var) {
+               if (op_array->vars[i].hash_value == hash_value &&
+                   op_array->vars[i].name_len == name_len &&
+                   strcmp(op_array->vars[i].name, name) == 0) {
+                 efree(name);
+                 return i;
+               }
+               i++;
+       }
+       i = op_array->last_var;
+       op_array->last_var++;
+       if (op_array->last_var > op_array->size_var) {
+               op_array->size_var += 16; /* FIXME */           
+               op_array->vars = erealloc(op_array->vars, op_array->size_var*sizeof(zend_compiled_variable));
+       }
+       op_array->vars[i].name = name; //estrndup(name, name_len);
+       op_array->vars[i].name_len = name_len;
+       op_array->vars[i].hash_value = hash_value;
+       return i;
+}
+
 
 void zend_do_binary_op(zend_uchar op, znode *result, znode *op1, znode *op2 TSRMLS_DC)
 {
@@ -295,13 +321,22 @@ void zend_do_binary_assign_op(zend_uchar op, znode *result, znode *op1, znode *o
        }
 }
 
-
 void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar op TSRMLS_DC)
 {
        zend_op opline;
        zend_op *opline_ptr;
        zend_llist *fetch_list_ptr;
 
+       if (varname->op_type == IS_CONST && varname->u.constant.type == IS_STRING &&
+           !zend_is_auto_global(varname->u.constant.value.str.val, varname->u.constant.value.str.len TSRMLS_CC) &&
+           !(varname->u.constant.value.str.len == (sizeof("this")-1) &&
+             !memcmp(varname->u.constant.value.str.val, "this", sizeof("this")))) {
+               result->op_type = IS_CV;
+               result->u.var = lookup_cv(CG(active_op_array), varname->u.constant.value.str.val, varname->u.constant.value.str.len);
+               result->u.EA.type = 0;
+               return;
+       }
+
        if (bp) {
                opline_ptr = &opline;
                init_op(opline_ptr TSRMLS_CC);
@@ -336,18 +371,56 @@ void fetch_simple_variable(znode *result, znode *varname, int bp TSRMLS_DC)
        fetch_simple_variable_ex(result, varname, bp, ZEND_FETCH_W TSRMLS_CC);
 }
 
-void zend_do_fetch_static_member(znode *class_znode TSRMLS_DC)
+void zend_do_fetch_static_member(znode *result, znode *class_znode TSRMLS_DC)
 {
        zend_llist *fetch_list_ptr;
        zend_llist_element *le;
        zend_op *opline_ptr;
+       zend_op opline;
 
        zend_stack_top(&CG(bp_stack), (void **) &fetch_list_ptr);
-       le = fetch_list_ptr->head;
+       if (result->op_type == IS_CV) {
+               init_op(&opline TSRMLS_CC);
+
+               opline.opcode = ZEND_FETCH_W;
+               opline.result.op_type = IS_VAR;
+               opline.result.u.EA.type = 0;
+               opline.result.u.var = get_temporary_variable(CG(active_op_array));
+               opline.op1.op_type = IS_CONST;
+               opline.op1.u.constant.type = IS_STRING;
+               opline.op1.u.constant.value.str.val = estrdup(CG(active_op_array)->vars[result->u.var].name);
+               opline.op1.u.constant.value.str.len = CG(active_op_array)->vars[result->u.var].name_len;
+               SET_UNUSED(opline.op2);
+               opline.op2 = *class_znode;
+               opline.op2.u.EA.type = ZEND_FETCH_STATIC_MEMBER;
+               *result = opline.result;
+
+               zend_llist_add_element(fetch_list_ptr, &opline);
+       } else {
+               le = fetch_list_ptr->head;
 
-       opline_ptr = (zend_op *)le->data;
-       opline_ptr->op2 = *class_znode;
-       opline_ptr->op2.u.EA.type = ZEND_FETCH_STATIC_MEMBER;
+               opline_ptr = (zend_op *)le->data;
+               if (opline_ptr->opcode != ZEND_FETCH_W && opline_ptr->op1.op_type == IS_CV) {
+                       init_op(&opline TSRMLS_CC);
+                       opline.opcode = ZEND_FETCH_W;
+                       opline.result.op_type = IS_VAR;
+                       opline.result.u.EA.type = 0;
+                       opline.result.u.var = get_temporary_variable(CG(active_op_array));
+                       opline.op1.op_type = IS_CONST;
+                       opline.op1.u.constant.type = IS_STRING;
+                       opline.op1.u.constant.value.str.val = estrdup(CG(active_op_array)->vars[opline_ptr->op1.u.var].name);
+                       opline.op1.u.constant.value.str.len = CG(active_op_array)->vars[opline_ptr->op1.u.var].name_len;
+                       SET_UNUSED(opline.op2);
+                       opline.op2 = *class_znode;
+                       opline.op2.u.EA.type = ZEND_FETCH_STATIC_MEMBER;
+                       opline_ptr->op1 = opline.result;
+
+                       zend_llist_prepend_element(fetch_list_ptr, &opline);
+               } else {
+                       opline_ptr->op2 = *class_znode;
+                       opline_ptr->op2.u.EA.type = ZEND_FETCH_STATIC_MEMBER;
+               }
+       }
 }
 
 void fetch_array_begin(znode *result, znode *varname, znode *first_dim TSRMLS_DC)
@@ -866,13 +939,6 @@ void zend_do_add_variable(znode *result, znode *op1, znode *op2 TSRMLS_DC)
        *result = opline->result;
 }
 
-static void zend_lowercase_znode_if_const(znode *z)
-{
-       if (z->op_type == IS_CONST) {
-               zend_str_tolower(z->u.constant.value.str.val, z->u.constant.value.str.len);
-       }
-}
-
 void zend_do_free(znode *op1 TSRMLS_DC)
 {
        if (op1->op_type==IS_TMP_VAR) {
@@ -1396,7 +1462,7 @@ void zend_do_pass_param(znode *param, zend_uchar op, int offset TSRMLS_DC)
        if (op == ZEND_SEND_VAR && zend_is_function_or_method_call(param)) {
                /* Method call */
                op = ZEND_SEND_VAR_NO_REF;
-       } else if (op == ZEND_SEND_VAL && param->op_type == IS_VAR) {
+       } else if (op == ZEND_SEND_VAL && (param->op_type & (IS_VAR|IS_CV))) {
                op = ZEND_SEND_VAR_NO_REF;
        }
 
@@ -1404,6 +1470,7 @@ void zend_do_pass_param(znode *param, zend_uchar op, int offset TSRMLS_DC)
                /* change to passing by reference */
                switch (param->op_type) {
                        case IS_VAR:
+                       case IS_CV:
                                op = ZEND_SEND_REF;
                                break;
                        default:
@@ -2993,6 +3060,7 @@ void zend_do_list_end(znode *result, znode *expr TSRMLS_DC)
                                last_container = *expr;
                                switch (expr->op_type) {
                                        case IS_VAR:
+                                       case IS_CV:
                                                opline->opcode = ZEND_FETCH_DIM_R;
                                                break;
                                        case IS_TMP_VAR:
@@ -3166,22 +3234,34 @@ void zend_do_unset(znode *variable TSRMLS_DC)
 
        zend_check_writable_variable(variable);
 
-       last_op = &CG(active_op_array)->opcodes[get_next_op_number(CG(active_op_array))-1];
+       if (variable->op_type == IS_CV) {
+               zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
+               opline->opcode = ZEND_UNSET_VAR;
+               opline->op1.op_type = IS_CONST;
+               opline->op1.u.constant.type = IS_STRING;
+               opline->op1.u.constant.value.str.len = CG(active_op_array)->vars[variable->u.var].name_len;
+               opline->op1.u.constant.value.str.val = estrdup(CG(active_op_array)->vars[variable->u.var].name);
+               SET_UNUSED(opline->op2);
+               opline->op2.u.EA.type = ZEND_FETCH_LOCAL;
+               SET_UNUSED(opline->result);
+       } else {
+               last_op = &CG(active_op_array)->opcodes[get_next_op_number(CG(active_op_array))-1];
 
-       switch (last_op->opcode) {
-               case ZEND_FETCH_UNSET:
-                       last_op->opcode = ZEND_UNSET_VAR;
-                       break;
-               case ZEND_FETCH_DIM_UNSET:
-                       last_op->opcode = ZEND_UNSET_DIM_OBJ;
-                       last_op->extended_value = ZEND_UNSET_DIM;
-                       break;
-               case ZEND_FETCH_OBJ_UNSET:
-                       last_op->opcode = ZEND_UNSET_DIM_OBJ;
-                       last_op->extended_value = ZEND_UNSET_OBJ;
-                       break;
+               switch (last_op->opcode) {
+                       case ZEND_FETCH_UNSET:
+                               last_op->opcode = ZEND_UNSET_VAR;
+                               break;
+                       case ZEND_FETCH_DIM_UNSET:
+                               last_op->opcode = ZEND_UNSET_DIM_OBJ;
+                               last_op->extended_value = ZEND_UNSET_DIM;
+                               break;
+                       case ZEND_FETCH_OBJ_UNSET:
+                               last_op->opcode = ZEND_UNSET_DIM_OBJ;
+                               last_op->extended_value = ZEND_UNSET_OBJ;
+                               break;
 
-       }
+               }
+       }       
 }
 
 
@@ -3193,18 +3273,29 @@ void zend_do_isset_or_isempty(int type, znode *result, znode *variable TSRMLS_DC
 
        zend_check_writable_variable(variable);
        
-       last_op = &CG(active_op_array)->opcodes[get_next_op_number(CG(active_op_array))-1];
+       if (variable->op_type == IS_CV) {
+               last_op = get_next_op(CG(active_op_array) TSRMLS_CC);
+               last_op->opcode = ZEND_ISSET_ISEMPTY_VAR;
+               last_op->op1.op_type = IS_CONST;
+               last_op->op1.u.constant.type = IS_STRING;
+               last_op->op1.u.constant.value.str.len = CG(active_op_array)->vars[variable->u.var].name_len;
+               last_op->op1.u.constant.value.str.val = estrdup(CG(active_op_array)->vars[variable->u.var].name);
+               SET_UNUSED(last_op->op2);
+               last_op->op2.u.EA.type = ZEND_FETCH_LOCAL;
+       } else {
+               last_op = &CG(active_op_array)->opcodes[get_next_op_number(CG(active_op_array))-1];
        
-       switch (last_op->opcode) {
-               case ZEND_FETCH_IS:
-                       last_op->opcode = ZEND_ISSET_ISEMPTY_VAR;
-                       break;
-               case ZEND_FETCH_DIM_IS:
-                       last_op->opcode = ZEND_ISSET_ISEMPTY_DIM_OBJ;
-                       break;
-               case ZEND_FETCH_OBJ_IS:
-                       last_op->opcode = ZEND_ISSET_ISEMPTY_PROP_OBJ;
-                       break;
+               switch (last_op->opcode) {
+                       case ZEND_FETCH_IS:
+                               last_op->opcode = ZEND_ISSET_ISEMPTY_VAR;
+                               break;
+                       case ZEND_FETCH_DIM_IS:
+                               last_op->opcode = ZEND_ISSET_ISEMPTY_DIM_OBJ;
+                               break;
+                       case ZEND_FETCH_OBJ_IS:
+                               last_op->opcode = ZEND_ISSET_ISEMPTY_PROP_OBJ;
+                               break;
+               }
        }
        last_op->result.op_type = IS_TMP_VAR;
        last_op->extended_value = type;
index b57854a9f88aafa98742125200ae44ddac8729fc..3fab70f7462764f7ac5828e3049b9b146a993faf 100644 (file)
@@ -152,6 +152,12 @@ typedef struct _zend_arg_info {
        int required_num_args;
 } zend_arg_info;
 
+typedef struct _zend_compiled_variable {
+       char *name;
+       int name_len;
+       ulong hash_value;
+} zend_compiled_variable;
+
 struct _zend_op_array {
        /* Common elements */
        zend_uchar type;
@@ -171,6 +177,9 @@ struct _zend_op_array {
        zend_op *opcodes;
        zend_uint last, size;
 
+       zend_compiled_variable *vars;
+       int last_var, size_var;
+
        zend_uint T;
 
        zend_brk_cont_element *brk_cont_array;
@@ -273,8 +282,10 @@ struct _zend_execute_data {
        zend_op_array *op_array;
        zval *object;
        union _temp_variable *Ts;
+       zval ***CVs;
        zend_bool original_in_execution;
        zend_class_entry *calling_scope;
+       HashTable *symbol_table;
        struct _zend_execute_data *prev_execute_data;
 };
 
@@ -285,6 +296,7 @@ struct _zend_execute_data {
 #define IS_TMP_VAR     (1<<1)
 #define IS_VAR         (1<<2)
 #define IS_UNUSED      (1<<3)  /* Unused variable */
+#define IS_CV          (1<<4)  /* Compiled variable */
 
 #define EXT_TYPE_UNUSED                (1<<0)
 
@@ -328,7 +340,7 @@ void zend_do_fetch_global_variable(znode *varname, znode *static_assignment, int
 void fetch_array_begin(znode *result, znode *varname, znode *first_dim TSRMLS_DC);
 void fetch_array_dim(znode *result, znode *parent, znode *dim TSRMLS_DC);
 void fetch_string_offset(znode *result, znode *parent, znode *offset TSRMLS_DC);
-void zend_do_fetch_static_member(znode *class_znode TSRMLS_DC);
+void zend_do_fetch_static_member(znode *result, znode *class_znode TSRMLS_DC);
 void zend_do_print(znode *result, znode *arg TSRMLS_DC);
 void zend_do_echo(znode *arg TSRMLS_DC);
 typedef int (*unary_op_type)(zval *, zval *);
index 612f024e77f9d7f91892395bab0e219e2f9c5d00..9e7c0d2b5781bdd278c9cce767ccb641a16b18cc 100644 (file)
 
 typedef int (*incdec_t)(zval *);
 
-#define get_zval_ptr(node, Ts, should_free, type) _get_zval_ptr(node, Ts, should_free TSRMLS_CC)
-#define get_zval_ptr_ptr(node, Ts, should_free, type) _get_zval_ptr_ptr(node, Ts, should_free TSRMLS_CC)
-#define get_obj_zval_ptr(node, Ts, should_free, type) _get_obj_zval_ptr(node, Ts, should_free TSRMLS_CC)
-#define get_obj_zval_ptr_ptr(node, Ts, should_free, type) _get_obj_zval_ptr_ptr(node, Ts, should_free TSRMLS_CC)
+#define get_zval_ptr(node, Ts, should_free, type) _get_zval_ptr(node, Ts, should_free, type TSRMLS_CC)
+#define get_zval_ptr_ptr(node, Ts, should_free, type) _get_zval_ptr_ptr(node, Ts, should_free, type TSRMLS_CC)
+#define get_obj_zval_ptr(node, Ts, should_free, type) _get_obj_zval_ptr(node, Ts, should_free, type TSRMLS_CC)
+#define get_obj_zval_ptr_ptr(node, Ts, should_free, type) _get_obj_zval_ptr_ptr(node, Ts, should_free, type TSRMLS_CC)
 
 /* Prototypes */
 static void zend_extension_statement_handler(zend_extension *extension, zend_op_array *op_array TSRMLS_DC);
@@ -126,7 +126,18 @@ static inline void zend_pzval_unlock_free_func(zval *z)
 
 /* End of zend_execute_locks.h */
 
-static inline zval *_get_zval_ptr(znode *node, temp_variable *Ts, zend_free_op *should_free TSRMLS_DC)
+#define CV_OF(i)     (EG(current_execute_data)->CVs[i])
+#define CV_DEF_OF(i) (EG(active_op_array)->vars[i])
+
+static inline void zend_get_cv_address(zend_compiled_variable *cv, zval ***ptr, temp_variable *Ts TSRMLS_DC)
+{
+   zval *new_zval = &EG(uninitialized_zval);
+   
+   new_zval->refcount++;
+   zend_hash_quick_update(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, &new_zval, sizeof(zval *), (void **)ptr);
+}
+
+static inline zval *_get_zval_ptr(znode *node, temp_variable *Ts, zend_free_op *should_free, int type TSRMLS_DC)
 {
 /*     should_free->is_var = 0; */
        switch (node->op_type) {
@@ -175,14 +186,64 @@ static inline zval *_get_zval_ptr(znode *node, temp_variable *Ts, zend_free_op *
                        should_free->var = 0;
                        return NULL;
                        break;
+               case IS_CV: {
+                       zval ***ptr = &CV_OF(node->u.var);
+                       
+                       should_free->var = 0;
+                       if (!*ptr) {
+                               zend_compiled_variable *cv = &CV_DEF_OF(node->u.var);
+                               if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **)ptr)==FAILURE) {
+                                       switch (type) {
+                                               case BP_VAR_R:
+                                                       zend_error(E_NOTICE, "Undefined variable: %s", cv->name);
+                                                       /* break missing intentionally */
+                                               case BP_VAR_IS:
+                                                       return &EG(uninitialized_zval);
+                                                       break;
+                                               case BP_VAR_RW:
+                                                       zend_error(E_NOTICE, "Undefined variable: %s", cv->name);
+                                                       /* break missing intentionally */
+                                               case BP_VAR_W:
+                                                       zend_get_cv_address(cv, ptr, Ts TSRMLS_CC);
+                                                       break;
+                                       }
+                               }
+                       }
+                       return **ptr;
+                       break;
+               }
                EMPTY_SWITCH_DEFAULT_CASE()
        }
        return NULL;
 }
 
-static inline zval **_get_zval_ptr_ptr(znode *node, temp_variable *Ts, zend_free_op *should_free TSRMLS_DC)
+static inline zval **_get_zval_ptr_ptr(znode *node, temp_variable *Ts, zend_free_op *should_free, int type TSRMLS_DC)
 {
-       if (node->op_type==IS_VAR) {
+       if (node->op_type == IS_CV) {
+               zval ***ptr = &CV_OF(node->u.var);
+               
+               should_free->var = 0;
+               if (!*ptr) {
+                       zend_compiled_variable *cv = &CV_DEF_OF(node->u.var);
+                       if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **)ptr)==FAILURE) {
+                               switch (type) {
+                                       case BP_VAR_R:
+                                               zend_error(E_NOTICE, "Undefined variable:  %s", cv->name);
+                                               /* break missing intentionally */
+                                       case BP_VAR_IS:
+                                               return &EG(uninitialized_zval_ptr);
+                                               break;
+                                       case BP_VAR_RW:
+                                               zend_error(E_NOTICE, "Undefined variable:  %s", cv->name);
+                                               /* break missing intentionally */
+                                       case BP_VAR_W:
+                                               zend_get_cv_address(cv, ptr, Ts TSRMLS_CC);
+                                               break;
+                               }
+                       }
+               }
+               return *ptr;
+       } else if (node->op_type == IS_VAR) {
                if (T(node->u.var).var.ptr_ptr) {
                        PZVAL_UNLOCK(*T(node->u.var).var.ptr_ptr, should_free);
                        return T(node->u.var).var.ptr_ptr;
@@ -244,6 +305,33 @@ static inline zval *_get_zval_ptr_var(znode *node, temp_variable *Ts, zend_free_
        }
 }
 
+static inline zval *_get_zval_ptr_cv(znode *node, temp_variable *Ts, zend_free_op *should_free, int type TSRMLS_DC)
+{
+       zval ***ptr = &CV_OF(node->u.var);
+                       
+       should_free->var = 0;
+       if (!*ptr) {
+               zend_compiled_variable *cv = &CV_DEF_OF(node->u.var);
+               if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **)ptr)==FAILURE) {
+                       switch (type) {
+                               case BP_VAR_R:
+                                       zend_error(E_NOTICE, "Undefined variable: %s", cv->name);
+                                       /* break missing intentionally */
+                               case BP_VAR_IS:
+                                       return &EG(uninitialized_zval);
+                                       break;
+                               case BP_VAR_RW:
+                                       zend_error(E_NOTICE, "Undefined variable: %s", cv->name);
+                                       /* break missing intentionally */
+                               case BP_VAR_W:
+                                       zend_get_cv_address(cv, ptr, Ts TSRMLS_CC);
+                                       break;
+                       }
+               }
+       }
+       return **ptr;
+}
+
 static inline zval *_get_zval_ptr_unused(znode *node, temp_variable *Ts, zend_free_op *should_free TSRMLS_DC)
 {
        return NULL;
@@ -275,6 +363,33 @@ static inline zval **_get_zval_ptr_ptr_unused(znode *node, temp_variable *Ts, ze
        return NULL;
 }
 
+static inline zval **_get_zval_ptr_ptr_cv(znode *node, temp_variable *Ts, zend_free_op *should_free, int type TSRMLS_DC)
+{
+       zval ***ptr = &CV_OF(node->u.var);
+               
+       should_free->var = 0;
+       if (!*ptr) {
+               zend_compiled_variable *cv = &CV_DEF_OF(node->u.var);
+               if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **)ptr)==FAILURE) {
+                       switch (type) {
+                               case BP_VAR_R:
+                                       zend_error(E_NOTICE, "Undefined variable:  %s", cv->name);
+                                       /* break missing intentionally */
+                               case BP_VAR_IS:
+                                       return &EG(uninitialized_zval_ptr);
+                                       break;
+                               case BP_VAR_RW:
+                                       zend_error(E_NOTICE, "Undefined variable:  %s", cv->name);
+                                       /* break missing intentionally */
+                               case BP_VAR_W:
+                                       zend_get_cv_address(cv, ptr, Ts TSRMLS_CC);
+                                       break;
+                       }
+               }
+       }
+       return *ptr;
+}
+
 static inline zval *_get_obj_zval_ptr_const(znode *op, temp_variable *Ts, zend_free_op *should_free TSRMLS_DC)
 {
        return _get_zval_ptr_const(op, Ts, should_free TSRMLS_CC);
@@ -290,6 +405,11 @@ static inline zval *_get_obj_zval_ptr_var(znode *op, temp_variable *Ts, zend_fre
        return _get_zval_ptr_var(op, Ts, should_free TSRMLS_CC);
 }
 
+static inline zval *_get_obj_zval_ptr_cv(znode *op, temp_variable *Ts, zend_free_op *should_free, int type TSRMLS_DC)
+{
+       return _get_zval_ptr_cv(op, Ts, should_free, type TSRMLS_CC);
+}
+
 static inline zval *_get_obj_zval_ptr_unused(znode *op, temp_variable *Ts, zend_free_op *should_free TSRMLS_DC)
 {
        if (EG(This)) {
@@ -315,6 +435,11 @@ static inline zval **_get_obj_zval_ptr_ptr_var(znode *op, temp_variable *Ts, zen
        return _get_zval_ptr_ptr_var(op, Ts, should_free TSRMLS_CC);
 }
 
+static inline zval **_get_obj_zval_ptr_ptr_cv(znode *op, temp_variable *Ts, zend_free_op *should_free, int type TSRMLS_DC)
+{
+       return _get_zval_ptr_ptr_cv(op, Ts, should_free, type TSRMLS_CC);
+}
+
 static inline zval **_get_obj_zval_ptr_ptr_unused(znode *op, temp_variable *Ts, zend_free_op *should_free TSRMLS_DC)
 {
        if (EG(This)) {
@@ -418,7 +543,7 @@ static inline void make_real_object(zval **object_ptr TSRMLS_DC)
        }
 }
 
-static inline zval **_get_obj_zval_ptr_ptr(znode *op, temp_variable *Ts, zend_free_op *should_free TSRMLS_DC)
+static inline zval **_get_obj_zval_ptr_ptr(znode *op, temp_variable *Ts, zend_free_op *should_free, int type TSRMLS_DC)
 {
        if (op->op_type == IS_UNUSED) {
                if (EG(This)) {
@@ -430,10 +555,10 @@ static inline zval **_get_obj_zval_ptr_ptr(znode *op, temp_variable *Ts, zend_fr
                        zend_error_noreturn(E_ERROR, "Using $this when not in object context");
                }
        }
-       return _get_zval_ptr_ptr(op, Ts, should_free TSRMLS_CC);
+       return get_zval_ptr_ptr(op, Ts, should_free, type);
 }
 
-static inline zval *_get_obj_zval_ptr(znode *op, temp_variable *Ts, zend_free_op *should_free TSRMLS_DC)
+static inline zval *_get_obj_zval_ptr(znode *op, temp_variable *Ts, zend_free_op *should_free, int type TSRMLS_DC)
 {
        if (op->op_type == IS_UNUSED) {
                if (EG(This)) {
@@ -443,7 +568,7 @@ static inline zval *_get_obj_zval_ptr(znode *op, temp_variable *Ts, zend_free_op
                        zend_error_noreturn(E_ERROR, "Using $this when not in object context");
                }
        }
-       return _get_zval_ptr(op, Ts, should_free TSRMLS_CC);
+       return get_zval_ptr(op, Ts, should_free, type);
 }
 
 
@@ -553,6 +678,7 @@ static inline void zend_assign_to_object(znode *result, zval **object_ptr, znode
                        case IS_CONST:
                                /* already a constant string */
                                break;
+                       case IS_CV:
                        case IS_VAR:
                                tmp = *property_name;
                                zval_copy_ctor(&tmp);
@@ -621,7 +747,7 @@ static inline void zend_assign_to_variable(znode *result, znode *op1, znode *op2
 
                        if (value->type!=IS_STRING) {
                                tmp = *value;
-                               if (op2->op_type == IS_VAR) {
+                               if (op2->op_type & (IS_VAR|IS_CV)) {
                                        zval_copy_ctor(&tmp);
                                }
                                convert_to_string(&tmp);
@@ -736,6 +862,7 @@ static inline void zend_assign_to_variable(znode *result, znode *op1, znode *op2
                variable_ptr->refcount--;
                if (variable_ptr->refcount==0) {
                        switch (type) {
+                               case IS_CV:
                                case IS_VAR:
                                        /* break missing intentionally */
                                case IS_CONST:
@@ -765,6 +892,7 @@ static inline void zend_assign_to_variable(znode *result, znode *op1, znode *op2
                                                }
                } else { /* we need to split */
                        switch (type) {
+                               case IS_CV:
                                case IS_VAR:
                                        /* break missing intentionally */
                                case IS_CONST:
@@ -1182,6 +1310,7 @@ static void zend_fetch_property_address(temp_variable *result, zval **container_
                case IS_CONST:
                        /* already a constant string */
                        break;
+               case IS_CV:
                case IS_VAR:
                        tmp = *prop_ptr;
                        zval_copy_ctor(&tmp);
@@ -1316,8 +1445,11 @@ ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)
        } else {
                EX(Ts) = (temp_variable *) safe_emalloc(sizeof(temp_variable), op_array->T, 0);
        }
+       EX(CVs) = (zval***)do_alloca(sizeof(zval**) * op_array->last_var);
+       memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var);
        EX(op_array) = op_array;
        EX(original_in_execution) = EG(in_execution);
+       EX(symbol_table) = EG(active_symbol_table);
        EX(prev_execute_data) = EG(current_execute_data);
        EG(current_execute_data) = &execute_data;
 
@@ -1436,6 +1568,7 @@ void zend_init_opcodes_handlers()
 #  undef ZEND_VM_NULL_LABEL
 #  undef ZEND_VM_SPEC_LABEL
 #  undef ZEND_VM_SPEC_NULL_LABEL
+#  undef ZEND_VM_CONTINUE_LABEL
 
 #  include "zend_vm.h"
 
@@ -1450,9 +1583,12 @@ static void old_execute(zend_op_array *op_array TSRMLS_DC)
                EX(Ts) = (temp_variable *) do_alloca(sizeof(temp_variable) * op_array->T);
        } else {
                EX(Ts) = (temp_variable *) safe_emalloc(sizeof(temp_variable), op_array->T, 0);
-       }
+       }       
+       EX(CVs) = (zval***)do_alloca(sizeof(zval**) * op_array->last_var);
+       memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var);
        EX(op_array) = op_array;
        EX(original_in_execution) = EG(in_execution);
+       EX(symbol_table) = EG(active_symbol_table);
        EX(prev_execute_data) = EG(current_execute_data);
        EG(current_execute_data) = &execute_data;
 
@@ -1522,9 +1658,17 @@ void zend_vm_set_opcode_handler(zend_op* op)
                        _UNUSED_CODE, /* 5              */
                        _UNUSED_CODE, /* 6              */
                        _UNUSED_CODE, /* 7              */
-                       _UNUSED_CODE  /* 8 = IS_UNUSED  */
+                       _UNUSED_CODE, /* 8 = IS_UNUSED  */
+                       _UNUSED_CODE, /* 9              */
+                       _UNUSED_CODE, /* 10             */
+                       _UNUSED_CODE, /* 11             */
+                       _UNUSED_CODE, /* 12             */
+                       _UNUSED_CODE, /* 13             */
+                       _UNUSED_CODE, /* 14             */
+                       _UNUSED_CODE, /* 15             */
+                       _CV_CODE      /* 16 = IS_CV     */
                };
-               op->handler = zend_opcode_handlers[op->opcode * 16 + zend_vm_decode[op->op1.op_type] * 4 + zend_vm_decode[op->op2.op_type]];
+               op->handler = zend_opcode_handlers[op->opcode * 25 + zend_vm_decode[op->op1.op_type] * 5 + zend_vm_decode[op->op2.op_type]];
        }
 }
 
index 45d585f5965c72900ac70a97af692f84d4930128..481d29e26081e49cba346b435f853e68d3fde14b 100644 (file)
@@ -1343,6 +1343,27 @@ void zend_verify_abstract_class(zend_class_entry *ce TSRMLS_DC)
        }
 }
 
+ZEND_API int delete_global_variable(char *name, int name_len TSRMLS_DC)
+{
+       zend_execute_data *ex;
+
+       if (zend_symtable_del(&EG(symbol_table), name, name_len+1) == SUCCESS) {
+               for (ex = EG(current_execute_data); ex; ex = ex->prev_execute_data) {
+                       if (ex->symbol_table == &EG(symbol_table)) {
+                               int i;
+                               for (i = 0; i < ex->op_array->last_var; i++) {
+                                       if (ex->op_array->vars[i].name_len == name_len &&
+                                           !memcmp(ex->op_array->vars[i].name, name, name_len)) {
+                                               ex->CVs[i] = NULL;
+                                               break;
+                                       }
+                               }
+                       }
+               }
+               return SUCCESS;
+       }
+       return FAILURE;
+}
 
 /*
  * Local variables:
index afaa8d0cad9ff4761ae0afd04c3bb12c1f0b5b53..7dd066fb0afd7935ec79bc19f8bf74d4d5518ba6 100644 (file)
@@ -771,7 +771,7 @@ variable_without_objects:
 ;
 
 static_member:
-               fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $3; zend_do_fetch_static_member(&$1 TSRMLS_CC); }
+               fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $3; zend_do_fetch_static_member(&$$, &$1 TSRMLS_CC); }
 ;
 
 
index 0c47ceaa50aec07d97c55422d9b5b9b1cc0c974d..22d03ac8ee1e0935a4a4077a4817df9993cbd8f0 100644 (file)
@@ -67,6 +67,10 @@ void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_siz
        op_array->opcodes = NULL;
        op_array_alloc_ops(op_array);
 
+       op_array->size_var = 0; /* FIXME:??? */
+       op_array->last_var = 0;
+       op_array->vars = NULL;
+
        op_array->T = 0;
 
        op_array->function_name = NULL;
@@ -209,6 +213,15 @@ ZEND_API void destroy_op_array(zend_op_array *op_array TSRMLS_DC)
 
        efree(op_array->refcount);
 
+       if (op_array->vars) {
+               i = op_array->last_var;
+               while (i > 0) {
+                       i--;
+                       efree(op_array->vars[i].name);
+               }
+               efree(op_array->vars);
+       }
+
        while (opline<end) {
                if (opline->op1.op_type==IS_CONST) {
 #if DEBUG_ZEND>2
index cac6b1629ba9ea76ec763a6df42acef36d2235c2..7f888c917c2871d267ac3f877c9118c43b4e7aad 100644 (file)
@@ -43,6 +43,7 @@ void zend_vm_set_opcode_handler(zend_op* opcode);
 #define _TMP_CODE    1
 #define _VAR_CODE    2
 #define _UNUSED_CODE 3
+#define _CV_CODE     4
 
 #ifndef ZEND_VM_KIND
 #  ifdef __GNUC__
@@ -81,11 +82,19 @@ static const int zend_vm_decode[] = {
        _UNUSED_CODE, /* 5              */
        _UNUSED_CODE, /* 6              */
        _UNUSED_CODE, /* 7              */
-       _UNUSED_CODE  /* 8 = IS_UNUSED  */
+       _UNUSED_CODE, /* 8 = IS_UNUSED  */
+       _UNUSED_CODE, /* 9              */
+       _UNUSED_CODE, /* 10             */
+       _UNUSED_CODE, /* 11             */
+       _UNUSED_CODE, /* 12             */
+       _UNUSED_CODE, /* 13             */
+       _UNUSED_CODE, /* 14             */
+       _UNUSED_CODE, /* 15             */
+       _CV_CODE      /* 16 = IS_CV     */
 };
 
 #  define ZEND_VM_CODE(opcode, op1, op2) \
-     opcode * 16 + op1 * 4 + op2
+     opcode * 25 + op1 * 5 + op2
 #  define ZEND_VM_SPEC_OPCODE(opcode, op1, op2) \
      ZEND_VM_CODE(opcode, zend_vm_decode[op1], zend_vm_decode[op2])
 #  ifdef ZEND_VM_HAVE_OLD_EXECUTOR
@@ -173,6 +182,7 @@ static const int zend_vm_decode[] = {
      }
 
 #  define ZEND_VM_RETURN_FROM_EXECUTE_LOOP() \
+     free_alloca(EX(CVs)); \
      if (EX(op_array)->T < TEMP_VAR_STACK_LIMIT) { \
        free_alloca(EX(Ts)); \
      } else { \
@@ -267,6 +277,7 @@ static const int zend_vm_decode[] = {
      }
 
 #  define ZEND_VM_RETURN_FROM_EXECUTE_LOOP() \
+     free_alloca(EX(CVs)); \
      if (EX(op_array)->T < TEMP_VAR_STACK_LIMIT) { \
        free_alloca(EX(Ts)); \
      } else { \
@@ -358,6 +369,7 @@ static const int zend_vm_decode[] = {
      }
 
 #  define ZEND_VM_RETURN_FROM_EXECUTE_LOOP() \
+     free_alloca(EX(CVs)); \
      if (EX(op_array)->T < TEMP_VAR_STACK_LIMIT) { \
        free_alloca(EX(Ts)); \
      } else { \
index 5ce2b3a43a7e7154d6c902e9ab72fa32744fcb6d..adbb7178d4da72a2485772a273a85ef5ce293bc6 100644 (file)
@@ -9,6 +9,8 @@
 # define OP1_TYPE_PREFIX _VAR
 #elif OP1 == IS_UNUSED
 # define OP1_TYPE_PREFIX _UNUSED
+#elif OP1 == IS_CV
+# define OP1_TYPE_PREFIX _CV
 #elif OP1 == IS_ANY
 # define OP1_TYPE_PREFIX _ANY
 #else
@@ -24,6 +26,8 @@
 # define OP2_TYPE_PREFIX _VAR
 #elif OP2 == IS_UNUSED
 # define OP2_TYPE_PREFIX _UNUSED
+#elif OP2 == IS_CV
+# define OP2_TYPE_PREFIX _CV
 #elif OP2 == IS_ANY
 # define OP2_TYPE_PREFIX _ANY
 #else
 
 /* opcode handlers and helpers */
 
-#define ZEND_ADD_SPEC() OPDEF(ZEND_ADD, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_ADD_SPEC() OPDEF(ZEND_ADD, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ADD)
 ZEND_VM_HANDLER(ZEND_ADD)
 {
@@ -203,7 +207,7 @@ ZEND_VM_HANDLER(ZEND_ADD)
 }
 #endif
 
-#define ZEND_SUB_SPEC() OPDEF(ZEND_SUB, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_SUB_SPEC() OPDEF(ZEND_SUB, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_SUB)
 ZEND_VM_HANDLER(ZEND_SUB)
 {
@@ -219,7 +223,7 @@ ZEND_VM_HANDLER(ZEND_SUB)
 }
 #endif
 
-#define ZEND_MUL_SPEC() OPDEF(ZEND_MUL, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_MUL_SPEC() OPDEF(ZEND_MUL, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_MUL)
 ZEND_VM_HANDLER(ZEND_MUL)
 {
@@ -235,7 +239,7 @@ ZEND_VM_HANDLER(ZEND_MUL)
 }
 #endif
 
-#define ZEND_DIV_SPEC() OPDEF(ZEND_DIV, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_DIV_SPEC() OPDEF(ZEND_DIV, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_DIV)
 ZEND_VM_HANDLER(ZEND_DIV)
 {
@@ -251,7 +255,7 @@ ZEND_VM_HANDLER(ZEND_DIV)
 }
 #endif
 
-#define ZEND_MOD_SPEC() OPDEF(ZEND_MOD, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_MOD_SPEC() OPDEF(ZEND_MOD, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_MOD)
 ZEND_VM_HANDLER(ZEND_MOD)
 {
@@ -267,7 +271,7 @@ ZEND_VM_HANDLER(ZEND_MOD)
 }
 #endif
 
-#define ZEND_SL_SPEC() OPDEF(ZEND_SL, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_SL_SPEC() OPDEF(ZEND_SL, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_SL)
 ZEND_VM_HANDLER(ZEND_SL)
 {
@@ -283,7 +287,7 @@ ZEND_VM_HANDLER(ZEND_SL)
 }
 #endif
 
-#define ZEND_SR_SPEC() OPDEF(ZEND_SR, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_SR_SPEC() OPDEF(ZEND_SR, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_SR)
 ZEND_VM_HANDLER(ZEND_SR)
 {
@@ -299,7 +303,7 @@ ZEND_VM_HANDLER(ZEND_SR)
 }
 #endif
 
-#define ZEND_CONCAT_SPEC() OPDEF(ZEND_CONCAT, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_CONCAT_SPEC() OPDEF(ZEND_CONCAT, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_CONCAT)
 ZEND_VM_HANDLER(ZEND_CONCAT)
 {
@@ -315,7 +319,7 @@ ZEND_VM_HANDLER(ZEND_CONCAT)
 }
 #endif
 
-#define ZEND_IS_IDENTICAL_SPEC() OPDEF(ZEND_IS_IDENTICAL, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_IS_IDENTICAL_SPEC() OPDEF(ZEND_IS_IDENTICAL, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_IS_IDENTICAL)
 ZEND_VM_HANDLER(ZEND_IS_IDENTICAL)
 {
@@ -331,7 +335,7 @@ ZEND_VM_HANDLER(ZEND_IS_IDENTICAL)
 }
 #endif
 
-#define ZEND_IS_NOT_IDENTICAL_SPEC() OPDEF(ZEND_IS_NOT_IDENTICAL, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_IS_NOT_IDENTICAL_SPEC() OPDEF(ZEND_IS_NOT_IDENTICAL, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_IS_NOT_IDENTICAL)
 ZEND_VM_HANDLER(ZEND_IS_NOT_IDENTICAL)
 {
@@ -347,7 +351,7 @@ ZEND_VM_HANDLER(ZEND_IS_NOT_IDENTICAL)
 }
 #endif
 
-#define ZEND_IS_EQUAL_SPEC() OPDEF(ZEND_IS_EQUAL, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_IS_EQUAL_SPEC() OPDEF(ZEND_IS_EQUAL, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_IS_EQUAL)
 ZEND_VM_HANDLER(ZEND_IS_EQUAL)
 {
@@ -363,7 +367,7 @@ ZEND_VM_HANDLER(ZEND_IS_EQUAL)
 }
 #endif
 
-#define ZEND_IS_NOT_EQUAL_SPEC() OPDEF(ZEND_IS_NOT_EQUAL, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_IS_NOT_EQUAL_SPEC() OPDEF(ZEND_IS_NOT_EQUAL, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_IS_NOT_EQUAL)
 ZEND_VM_HANDLER(ZEND_IS_NOT_EQUAL)
 {
@@ -379,7 +383,7 @@ ZEND_VM_HANDLER(ZEND_IS_NOT_EQUAL)
 }
 #endif
 
-#define ZEND_IS_SMALLER_SPEC() OPDEF(ZEND_IS_SMALLER, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_IS_SMALLER_SPEC() OPDEF(ZEND_IS_SMALLER, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_IS_SMALLER)
 ZEND_VM_HANDLER(ZEND_IS_SMALLER)
 {
@@ -395,7 +399,7 @@ ZEND_VM_HANDLER(ZEND_IS_SMALLER)
 }
 #endif
 
-#define ZEND_IS_SMALLER_OR_EQUAL_SPEC() OPDEF(ZEND_IS_SMALLER_OR_EQUAL, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_IS_SMALLER_OR_EQUAL_SPEC() OPDEF(ZEND_IS_SMALLER_OR_EQUAL, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_IS_SMALLER_OR_EQUAL)
 ZEND_VM_HANDLER(ZEND_IS_SMALLER_OR_EQUAL)
 {
@@ -411,7 +415,7 @@ ZEND_VM_HANDLER(ZEND_IS_SMALLER_OR_EQUAL)
 }
 #endif
 
-#define ZEND_BW_OR_SPEC() OPDEF(ZEND_BW_OR, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_BW_OR_SPEC() OPDEF(ZEND_BW_OR, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_BW_OR)
 ZEND_VM_HANDLER(ZEND_BW_OR)
 {
@@ -427,7 +431,7 @@ ZEND_VM_HANDLER(ZEND_BW_OR)
 }
 #endif
 
-#define ZEND_BW_AND_SPEC() OPDEF(ZEND_BW_AND, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_BW_AND_SPEC() OPDEF(ZEND_BW_AND, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_BW_AND)
 ZEND_VM_HANDLER(ZEND_BW_AND)
 {
@@ -443,7 +447,7 @@ ZEND_VM_HANDLER(ZEND_BW_AND)
 }
 #endif
 
-#define ZEND_BW_XOR_SPEC() OPDEF(ZEND_BW_XOR, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_BW_XOR_SPEC() OPDEF(ZEND_BW_XOR, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_BW_XOR)
 ZEND_VM_HANDLER(ZEND_BW_XOR)
 {
@@ -459,7 +463,7 @@ ZEND_VM_HANDLER(ZEND_BW_XOR)
 }
 #endif
 
-#define ZEND_BOOL_XOR_SPEC() OPDEF(ZEND_BOOL_XOR, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_BOOL_XOR_SPEC() OPDEF(ZEND_BOOL_XOR, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_BOOL_XOR)
 ZEND_VM_HANDLER(ZEND_BOOL_XOR)
 {
@@ -475,7 +479,7 @@ ZEND_VM_HANDLER(ZEND_BOOL_XOR)
 }
 #endif
 
-#define ZEND_BW_NOT_SPEC() OPDEF(ZEND_BW_NOT, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_BW_NOT_SPEC() OPDEF(ZEND_BW_NOT, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_BW_NOT)
 ZEND_VM_HANDLER(ZEND_BW_NOT)
 {
@@ -489,7 +493,7 @@ ZEND_VM_HANDLER(ZEND_BW_NOT)
 }
 #endif
 
-#define ZEND_BOOL_NOT_SPEC() OPDEF(ZEND_BOOL_NOT, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_BOOL_NOT_SPEC() OPDEF(ZEND_BOOL_NOT, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_BOOL_NOT)
 ZEND_VM_HANDLER(ZEND_BOOL_NOT)
 {
@@ -503,7 +507,7 @@ ZEND_VM_HANDLER(ZEND_BOOL_NOT)
 }
 #endif
 
-#if OP1_OP2_MASK(M_VAR_UNUSED, M_CONST_TMP_VAR)
+#if OP1_OP2_MASK(M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC))
 {
        zend_op *opline = EX(opline);
@@ -537,6 +541,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, int (*binary_op)(zval *resul
                        case IS_CONST:
                                /* already a constant string */
                                break;
+                       case IS_CV:
                        case IS_VAR:
                                tmp = *property;
                                zval_copy_ctor(&tmp);
@@ -631,7 +636,9 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, int (*binary_op)(zval *result, z
                case ZEND_ASSIGN_DIM: {
                                zval **object_ptr = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_W);
 
-                               (*object_ptr)->refcount++;  /* undo the effect of get_obj_zval_ptr_ptr() */
+                               if(OP1_TYPE != IS_CV) {
+                                       (*object_ptr)->refcount++;  /* undo the effect of get_obj_zval_ptr_ptr() */
+                               }
 
                                if ((*object_ptr)->type == IS_OBJECT) {
                                        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_obj_helper, binary_op, binary_op);
@@ -700,7 +707,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, int (*binary_op)(zval *result, z
 }
 #endif
 
-#define ZEND_ASSIGN_ADD_SPEC() OPDEF(ZEND_ASSIGN_ADD, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_ADD_SPEC() OPDEF(ZEND_ASSIGN_ADD, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_ADD)
 ZEND_VM_HANDLER(ZEND_ASSIGN_ADD)
 {
@@ -708,7 +715,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_ADD)
 }
 #endif
 
-#define ZEND_ASSIGN_SUB_SPEC() OPDEF(ZEND_ASSIGN_SUB, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_SUB_SPEC() OPDEF(ZEND_ASSIGN_SUB, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_SUB)
 ZEND_VM_HANDLER(ZEND_ASSIGN_SUB)
 {
@@ -716,7 +723,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_SUB)
 }
 #endif
 
-#define ZEND_ASSIGN_MUL_SPEC() OPDEF(ZEND_ASSIGN_MUL, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_MUL_SPEC() OPDEF(ZEND_ASSIGN_MUL, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_MUL)
 ZEND_VM_HANDLER(ZEND_ASSIGN_MUL)
 {
@@ -724,7 +731,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_MUL)
 }
 #endif
 
-#define ZEND_ASSIGN_DIV_SPEC() OPDEF(ZEND_ASSIGN_DIV, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_DIV_SPEC() OPDEF(ZEND_ASSIGN_DIV, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_DIV)
 ZEND_VM_HANDLER(ZEND_ASSIGN_DIV)
 {
@@ -732,7 +739,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_DIV)
 }
 #endif
 
-#define ZEND_ASSIGN_MOD_SPEC() OPDEF(ZEND_ASSIGN_MOD, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_MOD_SPEC() OPDEF(ZEND_ASSIGN_MOD, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_MOD)
 ZEND_VM_HANDLER(ZEND_ASSIGN_MOD)
 {
@@ -740,7 +747,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_MOD)
 }
 #endif
 
-#define ZEND_ASSIGN_SL_SPEC() OPDEF(ZEND_ASSIGN_SL, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_SL_SPEC() OPDEF(ZEND_ASSIGN_SL, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_SL)
 ZEND_VM_HANDLER(ZEND_ASSIGN_SL)
 {
@@ -748,7 +755,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_SL)
 }
 #endif
 
-#define ZEND_ASSIGN_SR_SPEC() OPDEF(ZEND_ASSIGN_SR, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_SR_SPEC() OPDEF(ZEND_ASSIGN_SR, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_SR)
 ZEND_VM_HANDLER(ZEND_ASSIGN_SR)
 {
@@ -756,7 +763,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_SR)
 }
 #endif
 
-#define ZEND_ASSIGN_CONCAT_SPEC() OPDEF(ZEND_ASSIGN_CONCAT, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_CONCAT_SPEC() OPDEF(ZEND_ASSIGN_CONCAT, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_CONCAT)
 ZEND_VM_HANDLER(ZEND_ASSIGN_CONCAT)
 {
@@ -764,7 +771,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_CONCAT)
 }
 #endif
 
-#define ZEND_ASSIGN_BW_OR_SPEC() OPDEF(ZEND_ASSIGN_BW_OR, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_BW_OR_SPEC() OPDEF(ZEND_ASSIGN_BW_OR, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_BW_OR)
 ZEND_VM_HANDLER(ZEND_ASSIGN_BW_OR)
 {
@@ -772,7 +779,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_BW_OR)
 }
 #endif
 
-#define ZEND_ASSIGN_BW_AND_SPEC() OPDEF(ZEND_ASSIGN_BW_AND, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_BW_AND_SPEC() OPDEF(ZEND_ASSIGN_BW_AND, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_BW_AND)
 ZEND_VM_HANDLER(ZEND_ASSIGN_BW_AND)
 {
@@ -780,7 +787,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_BW_AND)
 }
 #endif
 
-#define ZEND_ASSIGN_BW_XOR_SPEC() OPDEF(ZEND_ASSIGN_BW_XOR, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_BW_XOR_SPEC() OPDEF(ZEND_ASSIGN_BW_XOR, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_BW_XOR)
 ZEND_VM_HANDLER(ZEND_ASSIGN_BW_XOR)
 {
@@ -788,7 +795,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_BW_XOR)
 }
 #endif
 
-#if OP1_OP2_MASK(M_VAR_UNUSED, M_CONST_TMP_VAR)
+#if OP1_OP2_MASK(M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, incdec_t incdec_op)
 {
        zend_op *opline = EX(opline);
@@ -856,7 +863,7 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, incdec_t incdec_op)
 }
 #endif
 
-#define ZEND_PRE_INC_OBJ_SPEC() OPDEF(ZEND_PRE_INC_OBJ, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_PRE_INC_OBJ_SPEC() OPDEF(ZEND_PRE_INC_OBJ, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_PRE_INC_OBJ)
 ZEND_VM_HANDLER(ZEND_PRE_INC_OBJ)
 {
@@ -864,7 +871,7 @@ ZEND_VM_HANDLER(ZEND_PRE_INC_OBJ)
 }
 #endif
 
-#define ZEND_PRE_DEC_OBJ_SPEC() OPDEF(ZEND_PRE_DEC_OBJ, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_PRE_DEC_OBJ_SPEC() OPDEF(ZEND_PRE_DEC_OBJ, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_PRE_DEC_OBJ)
 ZEND_VM_HANDLER(ZEND_PRE_DEC_OBJ)
 {
@@ -872,7 +879,7 @@ ZEND_VM_HANDLER(ZEND_PRE_DEC_OBJ)
 }
 #endif
 
-#if OP1_OP2_MASK(M_VAR_UNUSED, M_CONST_TMP_VAR)
+#if OP1_OP2_MASK(M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, incdec_t incdec_op)
 {
        zend_op *opline = EX(opline);
@@ -936,7 +943,7 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, incdec_t incdec_op)
 }
 #endif
 
-#define ZEND_POST_INC_OBJ_SPEC() OPDEF(ZEND_POST_INC_OBJ, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_POST_INC_OBJ_SPEC() OPDEF(ZEND_POST_INC_OBJ, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_POST_INC_OBJ)
 ZEND_VM_HANDLER(ZEND_POST_INC_OBJ)
 {
@@ -944,7 +951,7 @@ ZEND_VM_HANDLER(ZEND_POST_INC_OBJ)
 }
 #endif
 
-#define ZEND_POST_DEC_OBJ_SPEC() OPDEF(ZEND_POST_DEC_OBJ, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_POST_DEC_OBJ_SPEC() OPDEF(ZEND_POST_DEC_OBJ, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_POST_DEC_OBJ)
 ZEND_VM_HANDLER(ZEND_POST_DEC_OBJ)
 {
@@ -952,7 +959,7 @@ ZEND_VM_HANDLER(ZEND_POST_DEC_OBJ)
 }
 #endif
 
-#define ZEND_PRE_INC_SPEC() OPDEF(ZEND_PRE_INC, M_VAR, M_ANY)
+#define ZEND_PRE_INC_SPEC() OPDEF(ZEND_PRE_INC, M_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_PRE_INC)
 ZEND_VM_HANDLER(ZEND_PRE_INC)
 {
@@ -998,7 +1005,7 @@ ZEND_VM_HANDLER(ZEND_PRE_INC)
 }
 #endif
 
-#define ZEND_PRE_DEC_SPEC() OPDEF(ZEND_PRE_DEC, M_VAR, M_ANY)
+#define ZEND_PRE_DEC_SPEC() OPDEF(ZEND_PRE_DEC, M_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_PRE_DEC)
 ZEND_VM_HANDLER(ZEND_PRE_DEC)
 {
@@ -1044,7 +1051,7 @@ ZEND_VM_HANDLER(ZEND_PRE_DEC)
 }
 #endif
 
-#define ZEND_POST_INC_SPEC() OPDEF(ZEND_POST_INC, M_VAR, M_ANY)
+#define ZEND_POST_INC_SPEC() OPDEF(ZEND_POST_INC, M_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_POST_INC)
 ZEND_VM_HANDLER(ZEND_POST_INC)
 {
@@ -1087,7 +1094,7 @@ ZEND_VM_HANDLER(ZEND_POST_INC)
 }
 #endif
 
-#define ZEND_POST_DEC_SPEC() OPDEF(ZEND_POST_DEC, M_VAR, M_ANY)
+#define ZEND_POST_DEC_SPEC() OPDEF(ZEND_POST_DEC, M_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_POST_DEC)
 ZEND_VM_HANDLER(ZEND_POST_DEC)
 {
@@ -1130,7 +1137,7 @@ ZEND_VM_HANDLER(ZEND_POST_DEC)
 }
 #endif
 
-#define ZEND_ECHO_SPEC() OPDEF(ZEND_ECHO, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_ECHO_SPEC() OPDEF(ZEND_ECHO, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_ECHO)
 ZEND_VM_HANDLER_EX(ZEND_ECHO)
 {
@@ -1152,7 +1159,7 @@ ZEND_VM_HANDLER_EX(ZEND_ECHO)
 }
 #endif
 
-#define ZEND_PRINT_SPEC() OPDEF(ZEND_PRINT, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_PRINT_SPEC() OPDEF(ZEND_PRINT, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_PRINT)
 ZEND_VM_HANDLER(ZEND_PRINT)
 {
@@ -1165,7 +1172,7 @@ ZEND_VM_HANDLER(ZEND_PRINT)
 }
 #endif
 
-#if OP1_OP2_MASK(M_CONST_TMP_VAR, M_ANY)
+#if OP1_OP2_MASK(M_CONST_TMP_VAR_CV, M_ANY)
 ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, int type)
 {
        zend_op *opline = EX(opline);
@@ -1256,7 +1263,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, int type)
 }
 #endif
 
-#define ZEND_FETCH_R_SPEC() OPDEF(ZEND_FETCH_R, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_FETCH_R_SPEC() OPDEF(ZEND_FETCH_R, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_FETCH_R)
 ZEND_VM_HANDLER(ZEND_FETCH_R)
 {
@@ -1264,7 +1271,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_R)
 }
 #endif
 
-#define ZEND_FETCH_W_SPEC() OPDEF(ZEND_FETCH_W, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_FETCH_W_SPEC() OPDEF(ZEND_FETCH_W, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_FETCH_W)
 ZEND_VM_HANDLER(ZEND_FETCH_W)
 {
@@ -1272,7 +1279,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_W)
 }
 #endif
 
-#define ZEND_FETCH_RW_SPEC() OPDEF(ZEND_FETCH_RW, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_FETCH_RW_SPEC() OPDEF(ZEND_FETCH_RW, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_FETCH_RW)
 ZEND_VM_HANDLER(ZEND_FETCH_RW)
 {
@@ -1280,7 +1287,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_RW)
 }
 #endif
 
-#define ZEND_FETCH_FUNC_ARG_SPEC() OPDEF(ZEND_FETCH_FUNC_ARG, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_FETCH_FUNC_ARG_SPEC() OPDEF(ZEND_FETCH_FUNC_ARG, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_FETCH_FUNC_ARG)
 ZEND_VM_HANDLER(ZEND_FETCH_FUNC_ARG)
 {
@@ -1289,7 +1296,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_FUNC_ARG)
 }
 #endif
 
-#define ZEND_FETCH_UNSET_SPEC() OPDEF(ZEND_FETCH_UNSET, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_FETCH_UNSET_SPEC() OPDEF(ZEND_FETCH_UNSET, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_FETCH_UNSET)
 ZEND_VM_HANDLER(ZEND_FETCH_UNSET)
 {
@@ -1297,7 +1304,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_UNSET)
 }
 #endif
 
-#define ZEND_FETCH_IS_SPEC() OPDEF(ZEND_FETCH_IS, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_FETCH_IS_SPEC() OPDEF(ZEND_FETCH_IS, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_FETCH_IS)
 ZEND_VM_HANDLER(ZEND_FETCH_IS)
 {
@@ -1305,14 +1312,14 @@ ZEND_VM_HANDLER(ZEND_FETCH_IS)
 }
 #endif
 
-#define ZEND_FETCH_DIM_R_SPEC() OPDEF(ZEND_FETCH_DIM_R, M_VAR, M_CONST_TMP_VAR)
+#define ZEND_FETCH_DIM_R_SPEC() OPDEF(ZEND_FETCH_DIM_R, M_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_FETCH_DIM_R)
 ZEND_VM_HANDLER(ZEND_FETCH_DIM_R)
 {
        zend_op *opline = EX(opline);
        zend_free_op free_op1, free_op2;
 
-       if (opline->extended_value == ZEND_FETCH_ADD_LOCK) {
+       if (opline->extended_value == ZEND_FETCH_ADD_LOCK && OP1_TYPE != IS_CV) {
                PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
        }
        zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), GET_OP1_ZVAL_PTR_PTR(BP_VAR_R), GET_OP2_ZVAL_PTR(BP_VAR_R), BP_VAR_R TSRMLS_CC);
@@ -1322,7 +1329,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_DIM_R)
 }
 #endif
 
-#define ZEND_FETCH_DIM_W_SPEC() OPDEF(ZEND_FETCH_DIM_W, M_VAR, M_CONST_TMP_VAR_UNUSED)
+#define ZEND_FETCH_DIM_W_SPEC() OPDEF(ZEND_FETCH_DIM_W, M_VAR_CV, M_CONST_TMP_VAR_UNUSED_CV)
 #if HAVE_OP(ZEND_FETCH_DIM_W)
 ZEND_VM_HANDLER(ZEND_FETCH_DIM_W)
 {
@@ -1336,7 +1343,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_DIM_W)
 }
 #endif
 
-#define ZEND_FETCH_DIM_RW_SPEC() OPDEF(ZEND_FETCH_DIM_RW, M_VAR, M_CONST_TMP_VAR)
+#define ZEND_FETCH_DIM_RW_SPEC() OPDEF(ZEND_FETCH_DIM_RW, M_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_FETCH_DIM_RW)
 ZEND_VM_HANDLER(ZEND_FETCH_DIM_RW)
 {
@@ -1350,7 +1357,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_DIM_RW)
 }
 #endif
 
-#define ZEND_FETCH_DIM_IS_SPEC() OPDEF(ZEND_FETCH_DIM_IS, M_VAR, M_CONST_TMP_VAR)
+#define ZEND_FETCH_DIM_IS_SPEC() OPDEF(ZEND_FETCH_DIM_IS, M_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_FETCH_DIM_IS)
 ZEND_VM_HANDLER(ZEND_FETCH_DIM_IS)
 {
@@ -1364,7 +1371,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_DIM_IS)
 }
 #endif
 
-#define ZEND_FETCH_DIM_FUNC_ARG_SPEC() OPDEF(ZEND_FETCH_DIM_FUNC_ARG, M_VAR, M_CONST_TMP_VAR)
+#define ZEND_FETCH_DIM_FUNC_ARG_SPEC() OPDEF(ZEND_FETCH_DIM_FUNC_ARG, M_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_FETCH_DIM_FUNC_ARG)
 ZEND_VM_HANDLER(ZEND_FETCH_DIM_FUNC_ARG)
 {
@@ -1379,7 +1386,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_DIM_FUNC_ARG)
 }
 #endif
 
-#define ZEND_FETCH_DIM_UNSET_SPEC() OPDEF(ZEND_FETCH_DIM_UNSET, M_VAR, M_CONST_TMP_VAR)
+#define ZEND_FETCH_DIM_UNSET_SPEC() OPDEF(ZEND_FETCH_DIM_UNSET, M_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_FETCH_DIM_UNSET)
 ZEND_VM_HANDLER(ZEND_FETCH_DIM_UNSET)
 {
@@ -1410,7 +1417,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_DIM_UNSET)
 }
 #endif
 
-#if OP1_OP2_MASK(M_VAR_UNUSED, M_CONST_TMP_VAR)
+#if OP1_OP2_MASK(M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 ZEND_VM_HELPER_EX(zend_fetch_property_address_read_helper, int type)
 {
        zend_op *opline = EX(opline);
@@ -1446,6 +1453,7 @@ ZEND_VM_HELPER_EX(zend_fetch_property_address_read_helper, int type)
                        case IS_CONST:
                                /* already a constant string */
                                break;
+                       case IS_CV:
                        case IS_VAR:
                                tmp = *offset;
                                zval_copy_ctor(&tmp);
@@ -1478,7 +1486,7 @@ ZEND_VM_HELPER_EX(zend_fetch_property_address_read_helper, int type)
 }
 #endif
 
-#define ZEND_FETCH_OBJ_R_SPEC() OPDEF(ZEND_FETCH_OBJ_R, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_FETCH_OBJ_R_SPEC() OPDEF(ZEND_FETCH_OBJ_R, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_FETCH_OBJ_R)
 ZEND_VM_HANDLER(ZEND_FETCH_OBJ_R)
 {
@@ -1486,14 +1494,14 @@ ZEND_VM_HANDLER(ZEND_FETCH_OBJ_R)
 }
 #endif
 
-#define ZEND_FETCH_OBJ_W_SPEC() OPDEF(ZEND_FETCH_OBJ_W, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_FETCH_OBJ_W_SPEC() OPDEF(ZEND_FETCH_OBJ_W, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_FETCH_OBJ_W)
 ZEND_VM_HANDLER(ZEND_FETCH_OBJ_W)
 {
        zend_op *opline = EX(opline);
        zend_free_op free_op1, free_op2;
 
-       if (opline->extended_value == ZEND_FETCH_ADD_LOCK) {
+       if (opline->extended_value == ZEND_FETCH_ADD_LOCK && OP1_TYPE != IS_CV) {
                PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
                EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
        }
@@ -1504,7 +1512,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_OBJ_W)
 }
 #endif
 
-#define ZEND_FETCH_OBJ_RW_SPEC() OPDEF(ZEND_FETCH_OBJ_RW, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_FETCH_OBJ_RW_SPEC() OPDEF(ZEND_FETCH_OBJ_RW, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_FETCH_OBJ_RW)
 ZEND_VM_HANDLER(ZEND_FETCH_OBJ_RW)
 {
@@ -1518,7 +1526,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_OBJ_RW)
 }
 #endif
 
-#define ZEND_FETCH_OBJ_IS_SPEC() OPDEF(ZEND_FETCH_OBJ_IS, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_FETCH_OBJ_IS_SPEC() OPDEF(ZEND_FETCH_OBJ_IS, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_FETCH_OBJ_IS)
 ZEND_VM_HANDLER(ZEND_FETCH_OBJ_IS)
 {
@@ -1526,7 +1534,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_OBJ_IS)
 }
 #endif
 
-#define ZEND_FETCH_OBJ_FUNC_ARG_SPEC() OPDEF(ZEND_FETCH_OBJ_FUNC_ARG, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_FETCH_OBJ_FUNC_ARG_SPEC() OPDEF(ZEND_FETCH_OBJ_FUNC_ARG, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_FETCH_OBJ_FUNC_ARG)
 ZEND_VM_HANDLER(ZEND_FETCH_OBJ_FUNC_ARG)
 {
@@ -1546,7 +1554,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_OBJ_FUNC_ARG)
 }
 #endif
 
-#define ZEND_FETCH_OBJ_UNSET_SPEC() OPDEF(ZEND_FETCH_OBJ_UNSET, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_FETCH_OBJ_UNSET_SPEC() OPDEF(ZEND_FETCH_OBJ_UNSET, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_FETCH_OBJ_UNSET)
 ZEND_VM_HANDLER(ZEND_FETCH_OBJ_UNSET)
 {
@@ -1593,7 +1601,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_DIM_TMP_VAR)
 }
 #endif
 
-#define ZEND_ASSIGN_OBJ_SPEC() OPDEF(ZEND_ASSIGN_OBJ, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_OBJ_SPEC() OPDEF(ZEND_ASSIGN_OBJ, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_OBJ)
 ZEND_VM_HANDLER(ZEND_ASSIGN_OBJ)
 {
@@ -1610,7 +1618,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_OBJ)
 }
 #endif
 
-#define ZEND_ASSIGN_DIM_SPEC() OPDEF(ZEND_ASSIGN_DIM, M_VAR_UNUSED, M_CONST_TMP_VAR_UNUSED)
+#define ZEND_ASSIGN_DIM_SPEC() OPDEF(ZEND_ASSIGN_DIM, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_UNUSED_CV)
 #if HAVE_OP(ZEND_ASSIGN_DIM)
 ZEND_VM_HANDLER(ZEND_ASSIGN_DIM)
 {
@@ -1619,7 +1627,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_DIM)
        zend_free_op free_op1;
        zval **object_ptr;
 
-       if (EX_T(opline->op1.u.var).var.ptr_ptr) {
+       if (OP1_TYPE == IS_CV || EX_T(opline->op1.u.var).var.ptr_ptr) {
                /* not an array offset */
                object_ptr = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_W);
        } else {
@@ -1632,7 +1640,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_DIM)
                zend_free_op free_op2, free_op_data1;
                zval *value;
 
-               if (object_ptr) {
+               if (object_ptr && OP1_TYPE != IS_CV) {
                        (*object_ptr)->refcount++;  /* undo the effect of get_obj_zval_ptr_ptr() */
                }
                zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), GET_OP1_ZVAL_PTR_PTR(BP_VAR_W), GET_OP2_ZVAL_PTR(BP_VAR_R), BP_VAR_W TSRMLS_CC);
@@ -1649,7 +1657,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN_DIM)
 }
 #endif
 
-#define ZEND_ASSIGN_SPEC() OPDEF(ZEND_ASSIGN, M_VAR, M_CONST_TMP_VAR)
+#define ZEND_ASSIGN_SPEC() OPDEF(ZEND_ASSIGN, M_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN)
 ZEND_VM_HANDLER(ZEND_ASSIGN)
 {
@@ -1665,7 +1673,7 @@ ZEND_VM_HANDLER(ZEND_ASSIGN)
 }
 #endif
 
-#define ZEND_ASSIGN_REF_SPEC() OPDEF(ZEND_ASSIGN_REF, M_VAR, M_VAR)
+#define ZEND_ASSIGN_REF_SPEC() OPDEF(ZEND_ASSIGN_REF, M_VAR_CV, M_VAR_CV)
 #if HAVE_OP(ZEND_ASSIGN_REF)
 ZEND_VM_HANDLER(ZEND_ASSIGN_REF)
 {
@@ -1701,7 +1709,7 @@ ZEND_VM_HANDLER(ZEND_JMP)
 }
 #endif
 
-#define ZEND_JMPZ_SPEC() OPDEF(ZEND_JMPZ, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_JMPZ_SPEC() OPDEF(ZEND_JMPZ, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_JMPZ)
 ZEND_VM_HANDLER(ZEND_JMPZ)
 {
@@ -1722,7 +1730,7 @@ ZEND_VM_HANDLER(ZEND_JMPZ)
 }
 #endif
 
-#define ZEND_JMPNZ_SPEC() OPDEF(ZEND_JMPNZ, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_JMPNZ_SPEC() OPDEF(ZEND_JMPNZ, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_JMPNZ)
 ZEND_VM_HANDLER(ZEND_JMPNZ)
 {
@@ -1743,7 +1751,7 @@ ZEND_VM_HANDLER(ZEND_JMPNZ)
 }
 #endif
 
-#define ZEND_JMPZNZ_SPEC() OPDEF(ZEND_JMPZNZ, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_JMPZNZ_SPEC() OPDEF(ZEND_JMPZNZ, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_JMPZNZ)
 ZEND_VM_HANDLER(ZEND_JMPZNZ)
 {
@@ -1769,7 +1777,7 @@ ZEND_VM_HANDLER(ZEND_JMPZNZ)
 }
 #endif
 
-#define ZEND_JMPZ_EX_SPEC() OPDEF(ZEND_JMPZ_EX, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_JMPZ_EX_SPEC() OPDEF(ZEND_JMPZ_EX, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_JMPZ_EX)
 ZEND_VM_HANDLER(ZEND_JMPZ_EX)
 {
@@ -1791,7 +1799,7 @@ ZEND_VM_HANDLER(ZEND_JMPZ_EX)
 }
 #endif
 
-#define ZEND_JMPNZ_EX_SPEC() OPDEF(ZEND_JMPNZ_EX, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_JMPNZ_EX_SPEC() OPDEF(ZEND_JMPNZ_EX, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_JMPNZ_EX)
 ZEND_VM_HANDLER(ZEND_JMPNZ_EX)
 {
@@ -1868,7 +1876,7 @@ ZEND_VM_HANDLER(ZEND_ADD_STRING)
 }
 #endif
 
-#define ZEND_ADD_VAR_SPEC() OPDEF(ZEND_ADD_VAR, M_TMP, M_TMP_VAR)
+#define ZEND_ADD_VAR_SPEC() OPDEF(ZEND_ADD_VAR, M_TMP, M_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ADD_VAR)
 ZEND_VM_HANDLER(ZEND_ADD_VAR)
 {
@@ -1900,7 +1908,7 @@ ZEND_VM_HANDLER(ZEND_ADD_VAR)
 }
 #endif
 
-#define ZEND_FETCH_CLASS_SPEC() OPDEF(ZEND_FETCH_CLASS, M_ANY, M_CONST_TMP_VAR_UNUSED)
+#define ZEND_FETCH_CLASS_SPEC() OPDEF(ZEND_FETCH_CLASS, M_ANY, M_CONST_TMP_VAR_UNUSED_CV)
 #if HAVE_OP(ZEND_FETCH_CLASS)
 ZEND_VM_HANDLER(ZEND_FETCH_CLASS)
 {
@@ -1933,7 +1941,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_CLASS)
 }
 #endif
 
-#define ZEND_INIT_CTOR_CALL_SPEC() OPDEF(ZEND_INIT_CTOR_CALL, M_TMP_VAR, M_ANY)
+#define ZEND_INIT_CTOR_CALL_SPEC() OPDEF(ZEND_INIT_CTOR_CALL, M_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_INIT_CTOR_CALL)
 ZEND_VM_HANDLER(ZEND_INIT_CTOR_CALL)
 {
@@ -1965,7 +1973,7 @@ ZEND_VM_HANDLER(ZEND_INIT_CTOR_CALL)
 }
 #endif
 
-#define ZEND_INIT_METHOD_CALL_SPEC() OPDEF(ZEND_INIT_METHOD_CALL, M_TMP_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_INIT_METHOD_CALL_SPEC() OPDEF(ZEND_INIT_METHOD_CALL, M_TMP_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_INIT_METHOD_CALL)
 ZEND_VM_HANDLER(ZEND_INIT_METHOD_CALL)
 {
@@ -2031,7 +2039,7 @@ ZEND_VM_HANDLER(ZEND_INIT_METHOD_CALL)
 }
 #endif
 
-#define ZEND_INIT_STATIC_METHOD_CALL_SPEC() OPDEF(ZEND_INIT_STATIC_METHOD_CALL, M_ANY, M_CONST_TMP_VAR_UNUSED)
+#define ZEND_INIT_STATIC_METHOD_CALL_SPEC() OPDEF(ZEND_INIT_STATIC_METHOD_CALL, M_ANY, M_CONST_TMP_VAR_UNUSED_CV)
 #if HAVE_OP(ZEND_INIT_STATIC_METHOD_CALL)
 ZEND_VM_HANDLER(ZEND_INIT_STATIC_METHOD_CALL)
 {
@@ -2088,7 +2096,7 @@ ZEND_VM_HANDLER(ZEND_INIT_STATIC_METHOD_CALL)
 }
 #endif
 
-#define ZEND_INIT_FCALL_BY_NAME_SPEC() OPDEF(ZEND_INIT_FCALL_BY_NAME, M_ANY, M_CONST_TMP_VAR)
+#define ZEND_INIT_FCALL_BY_NAME_SPEC() OPDEF(ZEND_INIT_FCALL_BY_NAME, M_ANY, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_INIT_FCALL_BY_NAME)
 ZEND_VM_HANDLER(ZEND_INIT_FCALL_BY_NAME)
 {
@@ -2344,7 +2352,7 @@ ZEND_VM_HANDLER(ZEND_DO_FCALL)
 }
 #endif
 
-#define ZEND_RETURN_SPEC() OPDEF(ZEND_RETURN, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_RETURN_SPEC() OPDEF(ZEND_RETURN, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_RETURN)
 ZEND_VM_HANDLER(ZEND_RETURN)
 {
@@ -2421,7 +2429,7 @@ ZEND_VM_C_LABEL(return_by_value):
 }
 #endif
 
-#define ZEND_THROW_SPEC() OPDEF(ZEND_THROW, M_VAR, M_ANY)
+#define ZEND_THROW_SPEC() OPDEF(ZEND_THROW, M_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_THROW)
 ZEND_VM_HANDLER(ZEND_THROW)
 {
@@ -2479,7 +2487,7 @@ ZEND_VM_HANDLER(ZEND_CATCH)
 }
 #endif
 
-#define ZEND_SEND_VAL_SPEC() OPDEF(ZEND_SEND_VAL, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_SEND_VAL_SPEC() OPDEF(ZEND_SEND_VAL, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_SEND_VAL)
 ZEND_VM_HANDLER(ZEND_SEND_VAL)
 {
@@ -2507,7 +2515,7 @@ ZEND_VM_HANDLER(ZEND_SEND_VAL)
 }
 #endif
 
-#if OP1_OP2_MASK(M_VAR, M_ANY)
+#if OP1_OP2_MASK(M_VAR_CV, M_ANY)
 ZEND_VM_HELPER(zend_send_by_var_helper)
 {
        zend_op *opline = EX(opline);
@@ -2536,7 +2544,7 @@ ZEND_VM_HELPER(zend_send_by_var_helper)
 }
 #endif
 
-#define ZEND_SEND_VAR_NO_REF_SPEC() OPDEF(ZEND_SEND_VAR_NO_REF, M_VAR, M_ANY)
+#define ZEND_SEND_VAR_NO_REF_SPEC() OPDEF(ZEND_SEND_VAR_NO_REF, M_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_SEND_VAR_NO_REF)
 ZEND_VM_HANDLER(ZEND_SEND_VAR_NO_REF)
 {
@@ -2566,7 +2574,7 @@ ZEND_VM_HANDLER(ZEND_SEND_VAR_NO_REF)
 }
 #endif
 
-#define ZEND_SEND_REF_SPEC() OPDEF(ZEND_SEND_REF, M_VAR, M_ANY)
+#define ZEND_SEND_REF_SPEC() OPDEF(ZEND_SEND_REF, M_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_SEND_REF)
 ZEND_VM_HANDLER_EX(ZEND_SEND_REF)
 {
@@ -2590,7 +2598,7 @@ ZEND_VM_HANDLER_EX(ZEND_SEND_REF)
 }
 #endif
 
-#define ZEND_SEND_VAR_SPEC() OPDEF(ZEND_SEND_VAR, M_VAR, M_ANY)
+#define ZEND_SEND_VAR_SPEC() OPDEF(ZEND_SEND_VAR, M_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_SEND_VAR)
 ZEND_VM_HANDLER(ZEND_SEND_VAR)
 {
@@ -2688,7 +2696,7 @@ ZEND_VM_HANDLER(ZEND_RECV_INIT)
 }
 #endif
 
-#define ZEND_BOOL_SPEC() OPDEF(ZEND_BOOL, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_BOOL_SPEC() OPDEF(ZEND_BOOL, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_BOOL)
 ZEND_VM_HANDLER(ZEND_BOOL)
 {
@@ -2704,7 +2712,7 @@ ZEND_VM_HANDLER(ZEND_BOOL)
 }
 #endif
 
-#define ZEND_BRK_SPEC() OPDEF(ZEND_BRK, M_ANY, M_CONST_TMP_VAR)
+#define ZEND_BRK_SPEC() OPDEF(ZEND_BRK, M_ANY, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_BRK)
 ZEND_VM_HANDLER(ZEND_BRK)
 {
@@ -2720,7 +2728,7 @@ ZEND_VM_HANDLER(ZEND_BRK)
 }
 #endif
 
-#define ZEND_CONT_SPEC() OPDEF(ZEND_CONT, M_ANY, M_CONST_TMP_VAR)
+#define ZEND_CONT_SPEC() OPDEF(ZEND_CONT, M_ANY, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_CONT)
 ZEND_VM_HANDLER(ZEND_CONT)
 {
@@ -2736,7 +2744,7 @@ ZEND_VM_HANDLER(ZEND_CONT)
 }
 #endif
 
-#define ZEND_CASE_SPEC() OPDEF(ZEND_CASE, M_CONST_TMP_VAR, M_CONST_TMP_VAR)
+#define ZEND_CASE_SPEC() OPDEF(ZEND_CASE, M_CONST_TMP_VAR_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_CASE)
 ZEND_VM_HANDLER(ZEND_CASE)
 {
@@ -2806,7 +2814,7 @@ ZEND_VM_HANDLER(ZEND_NEW)
 }
 #endif
 
-#define ZEND_CLONE_SPEC() OPDEF(ZEND_CLONE, M_CONST_TMP_VAR_UNUSED, M_ANY)
+#define ZEND_CLONE_SPEC() OPDEF(ZEND_CLONE, M_CONST_TMP_VAR_UNUSED_CV, M_ANY)
 #if HAVE_OP(ZEND_CLONE)
 ZEND_VM_HANDLER(ZEND_CLONE)
 {
@@ -2909,7 +2917,7 @@ ZEND_VM_HANDLER(ZEND_FETCH_CONSTANT)
 }
 #endif
 
-#if OP1_OP2_MASK(M_CONST_TMP_VAR_UNUSED, M_CONST_TMP_VAR_UNUSED)
+#if OP1_OP2_MASK(M_CONST_TMP_VAR_UNUSED_CV, M_CONST_TMP_VAR_UNUSED_CV)
 ZEND_VM_HELPER(zend_init_add_array_helper)
 {
        zend_op *opline = EX(opline);
@@ -2919,7 +2927,7 @@ ZEND_VM_HELPER(zend_init_add_array_helper)
        zval *offset=GET_OP2_ZVAL_PTR(BP_VAR_R);
 
        if (opline->extended_value) {
-               expr_ptr_ptr=GET_OP1_ZVAL_PTR_PTR(BP_VAR_R);
+               expr_ptr_ptr=GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
                expr_ptr = *expr_ptr_ptr;
        } else {
                expr_ptr=GET_OP1_ZVAL_PTR(BP_VAR_R);
@@ -2987,7 +2995,7 @@ ZEND_VM_HELPER(zend_init_add_array_helper)
 }
 #endif
 
-#define ZEND_INIT_ARRAY_SPEC() OPDEF(ZEND_INIT_ARRAY, M_CONST_TMP_VAR_UNUSED, M_CONST_TMP_VAR_UNUSED)
+#define ZEND_INIT_ARRAY_SPEC() OPDEF(ZEND_INIT_ARRAY, M_CONST_TMP_VAR_UNUSED_CV, M_CONST_TMP_VAR_UNUSED_CV)
 #if HAVE_OP(ZEND_INIT_ARRAY)
 ZEND_VM_HANDLER(ZEND_INIT_ARRAY)
 {
@@ -2995,7 +3003,7 @@ ZEND_VM_HANDLER(ZEND_INIT_ARRAY)
 }
 #endif
 
-#define ZEND_ADD_ARRAY_ELEMENT_SPEC() OPDEF(ZEND_ADD_ARRAY_ELEMENT, M_CONST_TMP_VAR_UNUSED, M_CONST_TMP_VAR_UNUSED)
+#define ZEND_ADD_ARRAY_ELEMENT_SPEC() OPDEF(ZEND_ADD_ARRAY_ELEMENT, M_CONST_TMP_VAR_UNUSED_CV, M_CONST_TMP_VAR_UNUSED_CV)
 #if HAVE_OP(ZEND_ADD_ARRAY_ELEMENT)
 ZEND_VM_HANDLER(ZEND_ADD_ARRAY_ELEMENT)
 {
@@ -3003,7 +3011,7 @@ ZEND_VM_HANDLER(ZEND_ADD_ARRAY_ELEMENT)
 }
 #endif
 
-#define ZEND_CAST_SPEC() OPDEF(ZEND_CAST, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_CAST_SPEC() OPDEF(ZEND_CAST, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_CAST)
 ZEND_VM_HANDLER(ZEND_CAST)
 {
@@ -3052,7 +3060,7 @@ ZEND_VM_HANDLER(ZEND_CAST)
 }
 #endif
 
-#define ZEND_INCLUDE_OR_EVAL_SPEC() OPDEF(ZEND_INCLUDE_OR_EVAL, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_INCLUDE_OR_EVAL_SPEC() OPDEF(ZEND_INCLUDE_OR_EVAL, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_INCLUDE_OR_EVAL)
 ZEND_VM_HANDLER(ZEND_INCLUDE_OR_EVAL)
 {
@@ -3174,7 +3182,7 @@ ZEND_VM_HANDLER(ZEND_INCLUDE_OR_EVAL)
 }
 #endif
 
-#define ZEND_UNSET_VAR_SPEC() OPDEF(ZEND_UNSET_VAR, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_UNSET_VAR_SPEC() OPDEF(ZEND_UNSET_VAR, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_UNSET_VAR)
 ZEND_VM_HANDLER(ZEND_UNSET_VAR)
 {
@@ -3195,8 +3203,22 @@ ZEND_VM_HANDLER(ZEND_UNSET_VAR)
        if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
                zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
        } else {
-               target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
-               zend_hash_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1);
+               target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);               
+               if (zend_hash_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1) == SUCCESS) {          
+                       zend_execute_data *ex = EXECUTE_DATA; 
+                       do {
+                               int i;
+
+                               for (i = 0; i < ex->op_array->last_var; i++) {
+                                       if (ex->op_array->vars[i].name_len == varname->value.str.len &&
+                                               !memcmp(ex->op_array->vars[i].name, varname->value.str.val, varname->value.str.len)) {
+                                               ex->CVs[i] = NULL;
+                                               break;
+                                       }
+                               }
+                 ex = ex->prev_execute_data;
+                 } while (ex && ex->symbol_table == target_symbol_table);
+               }
        }
 
        if (varname == &tmp) {
@@ -3207,7 +3229,7 @@ ZEND_VM_HANDLER(ZEND_UNSET_VAR)
 }
 #endif
 
-#define ZEND_UNSET_DIM_OBJ_SPEC() OPDEF(ZEND_UNSET_DIM_OBJ, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_UNSET_DIM_OBJ_SPEC() OPDEF(ZEND_UNSET_DIM_OBJ, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_UNSET_DIM_OBJ)
 ZEND_VM_HANDLER(ZEND_UNSET_DIM_OBJ)
 {
@@ -3260,7 +3282,23 @@ ZEND_VM_HANDLER(ZEND_UNSET_DIM_OBJ)
                                        zend_hash_index_del(ht, index);
                                        break;
                                case IS_STRING:
-                                       zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1);
+                                       if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
+                                           ht == &EG(symbol_table)) {
+                                               zend_execute_data *ex;
+                                               for (ex = EXECUTE_DATA; ex; ex = ex->prev_execute_data) {
+                                                       if (ex->symbol_table == ht) {
+                                                               int i;
+
+                                                               for (i = 0; i < ex->op_array->last_var; i++) {
+                                                                       if (ex->op_array->vars[i].name_len == offset->value.str.len &&
+                                                                           !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
+                                                                               ex->CVs[i] = NULL;
+                                                                               break;
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       }
                                        break;
                                case IS_NULL:
                                        zend_hash_del(ht, "", sizeof(""));
@@ -3280,7 +3318,7 @@ ZEND_VM_HANDLER(ZEND_UNSET_DIM_OBJ)
 }
 #endif
 
-#define ZEND_FE_RESET_SPEC() OPDEF(ZEND_FE_RESET, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_FE_RESET_SPEC() OPDEF(ZEND_FE_RESET, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_FE_RESET)
 ZEND_VM_HANDLER(ZEND_FE_RESET)
 {
@@ -3366,7 +3404,7 @@ ZEND_VM_HANDLER(ZEND_FE_RESET)
 }
 #endif
 
-#define ZEND_FE_FETCH_SPEC() OPDEF(ZEND_FE_FETCH, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_FE_FETCH_SPEC() OPDEF(ZEND_FE_FETCH, M_VAR, M_ANY)
 #if HAVE_OP(ZEND_FE_FETCH)
 ZEND_VM_HANDLER(ZEND_FE_FETCH)
 {
@@ -3504,7 +3542,7 @@ ZEND_VM_HANDLER(ZEND_FE_FETCH)
 }
 #endif
 
-#define ZEND_JMP_NO_CTOR_SPEC() OPDEF(ZEND_JMP_NO_CTOR, M_TMP_VAR, M_ANY)
+#define ZEND_JMP_NO_CTOR_SPEC() OPDEF(ZEND_JMP_NO_CTOR, M_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_JMP_NO_CTOR)
 ZEND_VM_HANDLER(ZEND_JMP_NO_CTOR)
 {
@@ -3535,13 +3573,13 @@ ZEND_VM_HANDLER(ZEND_JMP_NO_CTOR)
 }
 #endif
 
-#define ZEND_ISSET_ISEMPTY_VAR_SPEC() OPDEF(ZEND_ISSET_ISEMPTY_VAR, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_ISSET_ISEMPTY_VAR_SPEC() OPDEF(ZEND_ISSET_ISEMPTY_VAR, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_ISSET_ISEMPTY_VAR)
 ZEND_VM_HANDLER(ZEND_ISSET_ISEMPTY_VAR)
 {
        zend_op *opline = EX(opline);
        zend_free_op free_op1;
-       zval tmp, *varname = GET_OP1_ZVAL_PTR(BP_VAR_R);
+       zval tmp, *varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
        zval **value;
        zend_bool isset = 1;
        HashTable *target_symbol_table;
@@ -3593,12 +3631,12 @@ ZEND_VM_HANDLER(ZEND_ISSET_ISEMPTY_VAR)
 }
 #endif
 
-#if OP1_OP2_MASK(M_VAR_UNUSED, M_CONST_TMP_VAR)
+#if OP1_OP2_MASK(M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 ZEND_VM_HELPER_EX(zend_isset_isempty_dim_prop_obj_handler, int prop_dim)
 {
        zend_op *opline = EX(opline);
        zend_free_op free_op1, free_op2;
-       zval **container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_R);
+       zval **container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_IS);
        zval *offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
        zval **value = NULL;
        int result = 0;
@@ -3697,7 +3735,7 @@ ZEND_VM_HELPER_EX(zend_isset_isempty_dim_prop_obj_handler, int prop_dim)
 }
 #endif
 
-#define ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC() OPDEF(ZEND_ISSET_ISEMPTY_DIM_OBJ, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC() OPDEF(ZEND_ISSET_ISEMPTY_DIM_OBJ, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ISSET_ISEMPTY_DIM_OBJ)
 ZEND_VM_HANDLER(ZEND_ISSET_ISEMPTY_DIM_OBJ)
 {
@@ -3705,7 +3743,7 @@ ZEND_VM_HANDLER(ZEND_ISSET_ISEMPTY_DIM_OBJ)
 }
 #endif
 
-#define ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC() OPDEF(ZEND_ISSET_ISEMPTY_PROP_OBJ, M_VAR_UNUSED, M_CONST_TMP_VAR)
+#define ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC() OPDEF(ZEND_ISSET_ISEMPTY_PROP_OBJ, M_VAR_UNUSED_CV, M_CONST_TMP_VAR_CV)
 #if HAVE_OP(ZEND_ISSET_ISEMPTY_PROP_OBJ)
 ZEND_VM_HANDLER(ZEND_ISSET_ISEMPTY_PROP_OBJ)
 {
@@ -3713,7 +3751,7 @@ ZEND_VM_HANDLER(ZEND_ISSET_ISEMPTY_PROP_OBJ)
 }
 #endif
 
-#define ZEND_EXIT_SPEC() OPDEF(ZEND_EXIT, M_CONST_TMP_VAR_UNUSED, M_ANY)
+#define ZEND_EXIT_SPEC() OPDEF(ZEND_EXIT, M_CONST_TMP_VAR_UNUSED_CV, M_ANY)
 #if HAVE_OP(ZEND_EXIT)
 ZEND_VM_HANDLER(ZEND_EXIT)
 {
@@ -3776,7 +3814,7 @@ ZEND_VM_HANDLER(ZEND_END_SILENCE)
 }
 #endif
 
-#define ZEND_QM_ASSIGN_SPEC() OPDEF(ZEND_QM_ASSIGN, M_CONST_TMP_VAR, M_ANY)
+#define ZEND_QM_ASSIGN_SPEC() OPDEF(ZEND_QM_ASSIGN, M_CONST_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_QM_ASSIGN)
 ZEND_VM_HANDLER(ZEND_QM_ASSIGN)
 {
@@ -3873,7 +3911,7 @@ ZEND_VM_HANDLER(ZEND_TICKS)
 }
 #endif
 
-#define ZEND_INSTANCEOF_SPEC() OPDEF(ZEND_INSTANCEOF, M_TMP_VAR, M_ANY)
+#define ZEND_INSTANCEOF_SPEC() OPDEF(ZEND_INSTANCEOF, M_TMP_VAR_CV, M_ANY)
 #if HAVE_OP(ZEND_INSTANCEOF)
 ZEND_VM_HANDLER(ZEND_INSTANCEOF)
 {
index 8525da058d746fbc582b45b805062954f75a5a28..2514870cef9381c519ae9b39521e5bd86c3b002d 100644 (file)
 #define SPEC__TMP_CODE                          _TMP_CODE
 #define SPEC__VAR_CODE                          _VAR_CODE
 #define SPEC__UNUSED_CODE                       _UNUSED_CODE
+#define SPEC__CV_CODE                           _CV_CODE
 
 #define SPEC_OP1_TYPE_ANY                       opline->op1.op_type
 #define SPEC_OP1_TYPE_CONST                     IS_CONST
 #define SPEC_OP1_TYPE_TMP                       IS_TMP_VAR
 #define SPEC_OP1_TYPE_VAR                       IS_VAR
 #define SPEC_OP1_TYPE_UNUSED                    IS_UNUSED
+#define SPEC_OP1_TYPE_CV                        IS_CV
 
-#define SPEC_GET_OP1_ZVAL_PTR_ANY(T)            _get_zval_ptr(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
+#define SPEC_GET_OP1_ZVAL_PTR_ANY(T)            get_zval_ptr(&opline->op1, EX(Ts), &free_op1, T)
 #define SPEC_GET_OP1_ZVAL_PTR_CONST(T)          _get_zval_ptr_const(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
 #define SPEC_GET_OP1_ZVAL_PTR_TMP(T)            _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
 #define SPEC_GET_OP1_ZVAL_PTR_VAR(T)            _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
 #define SPEC_GET_OP1_ZVAL_PTR_UNUSED(T)         _get_zval_ptr_unused(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
+#define SPEC_GET_OP1_ZVAL_PTR_CV(T)             _get_zval_ptr_cv(&opline->op1, EX(Ts), &free_op1, T TSRMLS_CC)
 
-#define SPEC_GET_OP1_ZVAL_PTR_PTR_ANY(T)        _get_zval_ptr_ptr(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
+#define SPEC_GET_OP1_ZVAL_PTR_PTR_ANY(T)        get_zval_ptr_ptr(&opline->op1, EX(Ts), &free_op1, T)
 #define SPEC_GET_OP1_ZVAL_PTR_PTR_CONST(T)      _get_zval_ptr_ptr_const(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
 #define SPEC_GET_OP1_ZVAL_PTR_PTR_TMP(T)        _get_zval_ptr_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
 #define SPEC_GET_OP1_ZVAL_PTR_PTR_VAR(T)        _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
 #define SPEC_GET_OP1_ZVAL_PTR_PTR_UNUSED(T)     _get_zval_ptr_ptr_unused(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
+#define SPEC_GET_OP1_ZVAL_PTR_PTR_CV(T)         _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), &free_op1, T TSRMLS_CC)
 
-#define SPEC_GET_OP1_OBJ_ZVAL_PTR_ANY(T)        _get_obj_zval_ptr(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
+#define SPEC_GET_OP1_OBJ_ZVAL_PTR_ANY(T)        get_obj_zval_ptr(&opline->op1, EX(Ts), &free_op1, T)
 #define SPEC_GET_OP1_OBJ_ZVAL_PTR_CONST(T)      _get_obj_zval_ptr_const(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
 #define SPEC_GET_OP1_OBJ_ZVAL_PTR_TMP(T)        _get_obj_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
 #define SPEC_GET_OP1_OBJ_ZVAL_PTR_VAR(T)        _get_obj_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
 #define SPEC_GET_OP1_OBJ_ZVAL_PTR_UNUSED(T)     _get_obj_zval_ptr_unused(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
+#define SPEC_GET_OP1_OBJ_ZVAL_PTR_CV(T)         _get_obj_zval_ptr_cv(&opline->op1, EX(Ts), &free_op1, T TSRMLS_CC)
 
-#define SPEC_GET_OP1_OBJ_ZVAL_PTR_PTR_ANY(T)    _get_obj_zval_ptr_ptr(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
+#define SPEC_GET_OP1_OBJ_ZVAL_PTR_PTR_ANY(T)    get_obj_zval_ptr_ptr(&opline->op1, EX(Ts), &free_op1, T)
 #define SPEC_GET_OP1_OBJ_ZVAL_PTR_PTR_CONST(T)  _get_obj_zval_ptr_ptr_const(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
 #define SPEC_GET_OP1_OBJ_ZVAL_PTR_PTR_TMP(T)    _get_obj_zval_ptr_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
 #define SPEC_GET_OP1_OBJ_ZVAL_PTR_PTR_VAR(T)    _get_obj_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
 #define SPEC_GET_OP1_OBJ_ZVAL_PTR_PTR_UNUSED(T) _get_obj_zval_ptr_ptr_unused(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC)
+#define SPEC_GET_OP1_OBJ_ZVAL_PTR_PTR_CV(T)     _get_obj_zval_ptr_ptr_cv(&opline->op1, EX(Ts), &free_op1, T TSRMLS_CC)
 
 #define SPEC_IS_OP1_TMP_FREE_ANY()              IS_TMP_FREE(free_op1)
 #define SPEC_IS_OP1_TMP_FREE_CONST()            0
 #define SPEC_IS_OP1_TMP_FREE_TMP()              1
 #define SPEC_IS_OP1_TMP_FREE_VAR()              0
 #define SPEC_IS_OP1_TMP_FREE_UNUSED()           0
+#define SPEC_IS_OP1_TMP_FREE_CV()               0
 
 #define SPEC_FREE_OP1_ANY()                     FREE_OP(free_op1);
 #define SPEC_FREE_OP1_CONST()
 #define SPEC_FREE_OP1_TMP()                     zval_dtor(free_op1.var)
 #define SPEC_FREE_OP1_VAR()                     FREE_OP_VAR_PTR(free_op1);
 #define SPEC_FREE_OP1_UNUSED()
+#define SPEC_FREE_OP1_CV()
 
 #define SPEC_FREE_OP1_IF_VAR_ANY()              FREE_OP_IF_VAR(free_op1);
 #define SPEC_FREE_OP1_IF_VAR_CONST()
 #define SPEC_FREE_OP1_IF_VAR_TMP()
 #define SPEC_FREE_OP1_IF_VAR_VAR()              FREE_OP_VAR_PTR(free_op1);
 #define SPEC_FREE_OP1_IF_VAR_UNUSED()
+#define SPEC_FREE_OP1_IF_VAR_CV()
 
 #define SPEC_FREE_OP1_VAR_PTR_ANY()             FREE_OP_VAR_PTR(free_op1);
 #define SPEC_FREE_OP1_VAR_PTR_CONST()
 #define SPEC_FREE_OP1_VAR_PTR_TMP()
 #define SPEC_FREE_OP1_VAR_PTR_VAR()             FREE_OP_VAR_PTR(free_op1);
 #define SPEC_FREE_OP1_VAR_PTR_UNUSED()
+#define SPEC_FREE_OP1_VAR_PTR_CV()
 
 #define SPEC_OP2_TYPE_ANY                       opline->op2.op_type
 #define SPEC_OP2_TYPE_CONST                     IS_CONST
 #define SPEC_OP2_TYPE_TMP                       IS_TMP_VAR
 #define SPEC_OP2_TYPE_VAR                       IS_VAR
 #define SPEC_OP2_TYPE_UNUSED                    IS_UNUSED
+#define SPEC_OP2_TYPE_CV                        IS_CV
 
-#define SPEC_GET_OP2_ZVAL_PTR_ANY(T)            _get_zval_ptr(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
+#define SPEC_GET_OP2_ZVAL_PTR_ANY(T)            get_zval_ptr(&opline->op2, EX(Ts), &free_op2, T)
 #define SPEC_GET_OP2_ZVAL_PTR_CONST(T)          _get_zval_ptr_const(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
 #define SPEC_GET_OP2_ZVAL_PTR_TMP(T)            _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
 #define SPEC_GET_OP2_ZVAL_PTR_VAR(T)            _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
 #define SPEC_GET_OP2_ZVAL_PTR_UNUSED(T)         _get_zval_ptr_unused(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
+#define SPEC_GET_OP2_ZVAL_PTR_CV(T)             _get_zval_ptr_cv(&opline->op2, EX(Ts), &free_op2, T TSRMLS_CC)
 
-#define SPEC_GET_OP2_ZVAL_PTR_PTR_ANY(T)        _get_zval_ptr_ptr(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
+#define SPEC_GET_OP2_ZVAL_PTR_PTR_ANY(T)        get_zval_ptr_ptr(&opline->op2, EX(Ts), &free_op2, T)
 #define SPEC_GET_OP2_ZVAL_PTR_PTR_CONST(T)      _get_zval_ptr_ptr_const(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
 #define SPEC_GET_OP2_ZVAL_PTR_PTR_TMP(T)        _get_zval_ptr_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
 #define SPEC_GET_OP2_ZVAL_PTR_PTR_VAR(T)        _get_zval_ptr_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
 #define SPEC_GET_OP2_ZVAL_PTR_PTR_UNUSED(T)     _get_zval_ptr_ptr_unused(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
+#define SPEC_GET_OP2_ZVAL_PTR_PTR_CV(T)         _get_zval_ptr_ptr_cv(&opline->op2, EX(Ts), &free_op2, T TSRMLS_CC)
 
-#define SPEC_GET_OP2_OBJ_ZVAL_PTR_ANY(T)        _get_obj_zval_ptr(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
+#define SPEC_GET_OP2_OBJ_ZVAL_PTR_ANY(T)        get_obj_zval_ptr(&opline->op2, EX(Ts), &free_op2, T)
 #define SPEC_GET_OP2_OBJ_ZVAL_PTR_CONST(T)      _get_obj_zval_ptr_const(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
 #define SPEC_GET_OP2_OBJ_ZVAL_PTR_TMP(T)        _get_obj_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
 #define SPEC_GET_OP2_OBJ_ZVAL_PTR_VAR(T)        _get_obj_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
 #define SPEC_GET_OP2_OBJ_ZVAL_PTR_UNUSED(T)     _get_obj_zval_ptr_unused(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
+#define SPEC_GET_OP2_OBJ_ZVAL_PTR_CV(T)         _get_obj_zval_ptr_cv(&opline->op2, EX(Ts), &free_op2, T TSRMLS_CC)
 
-#define SPEC_GET_OP2_OBJ_ZVAL_PTR_PTR_ANY(T)    _get_obj_zval_ptr_ptr(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
+#define SPEC_GET_OP2_OBJ_ZVAL_PTR_PTR_ANY(T)    get_obj_zval_ptr_ptr(&opline->op2, EX(Ts), &free_op2, T)
 #define SPEC_GET_OP2_OBJ_ZVAL_PTR_PTR_CONST(T)  _get_obj_zval_ptr_ptr_const(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
 #define SPEC_GET_OP2_OBJ_ZVAL_PTR_PTR_TMP(T)    _get_obj_zval_ptr_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
 #define SPEC_GET_OP2_OBJ_ZVAL_PTR_PTR_VAR(T)    _get_obj_zval_ptr_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
 #define SPEC_GET_OP2_OBJ_ZVAL_PTR_PTR_UNUSED(T) _get_obj_zval_ptr_ptr_unused(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC)
+#define SPEC_GET_OP2_OBJ_ZVAL_PTR_PTR_CV(T)     _get_obj_zval_ptr_ptr_cv(&opline->op2, EX(Ts), &free_op2, T TSRMLS_CC)
 
 #define SPEC_IS_OP2_TMP_FREE_ANY()              IS_TMP_FREE(free_op2)
 #define SPEC_IS_OP2_TMP_FREE_CONST()            0
 #define SPEC_IS_OP2_TMP_FREE_TMP()              1
 #define SPEC_IS_OP2_TMP_FREE_VAR()              0
 #define SPEC_IS_OP2_TMP_FREE_UNUSED()           0
+#define SPEC_IS_OP2_TMP_FREE_CV()               0
 
 #define SPEC_FREE_OP2_ANY()                     FREE_OP(free_op2);
 #define SPEC_FREE_OP2_CONST()
 #define SPEC_FREE_OP2_TMP()                     zval_dtor(free_op2.var)
 #define SPEC_FREE_OP2_VAR()                     FREE_OP_VAR_PTR(free_op2);
 #define SPEC_FREE_OP2_UNUSED()
+#define SPEC_FREE_OP2_CV()
 
 #define SPEC_FREE_OP2_IF_VAR_ANY()              FREE_OP_IF_VAR(free_op2);
 #define SPEC_FREE_OP2_IF_VAR_CONST()
 #define SPEC_FREE_OP2_IF_VAR_TMP()
 #define SPEC_FREE_OP2_IF_VAR_VAR()              FREE_OP_VAR_PTR(free_op2);
 #define SPEC_FREE_OP2_IF_VAR_UNUSED()
+#define SPEC_FREE_OP2_IF_VAR_CV()
 
 #define SPEC_FREE_OP2_VAR_PTR_ANY()             FREE_OP_VAR_PTR(free_op2);
 #define SPEC_FREE_OP2_VAR_PTR_CONST()
 #define SPEC_FREE_OP2_VAR_PTR_TMP()
 #define SPEC_FREE_OP2_VAR_PTR_VAR()             FREE_OP_VAR_PTR(free_op2);
 #define SPEC_FREE_OP2_VAR_PTR_UNUSED()
+#define SPEC_FREE_OP2_VAR_PTR_CV()
 
 #ifndef ZEND_VM_SPEC
 
 
 #else
 
-# define M_ANY                  (IS_ANY)
-# define M_CONST                (IS_CONST)
-# define M_TMP                  (IS_TMP_VAR)
-# define M_VAR                  (IS_VAR)
-# define M_UNUSED               (IS_UNUSED)
-# define M_CONST_TMP            (IS_CONST|IS_TMP_VAR)
-# define M_CONST_VAR            (IS_CONST|IS_VAR)
-# define M_CONST_UNUSED         (IS_CONST|IS_UNUSED)
-# define M_CONST_TMP_VAR        (IS_CONST|IS_TMP_VAR|IS_VAR)
-# define M_CONST_TMP_UNUSED     (IS_CONST|IS_TMP_VAR|IS_UNUSED)
-# define M_CONST_VAR_UNUSED     (IS_CONST|IS_VAR|IS_UNUSED)
-# define M_CONST_TMP_VAR_UNUSED (IS_CONST|IS_TMP_VAR|IS_VAR|IS_UNUSED)
-# define M_TMP_VAR              (IS_TMP_VAR|IS_VAR)
-# define M_TMP_UNUSED           (IS_TMP_VAR|IS_UNUSED)
-# define M_TMP_VAR_UNUSED       (IS_TMP_VAR|IS_VAR|IS_UNUSED)
-# define M_VAR_UNUSED           (IS_VAR|IS_UNUSED)
+# define M_ANY                     (IS_ANY)
+# define M_CONST                   (IS_CONST)
+# define M_TMP                     (IS_TMP_VAR)
+# define M_VAR                     (IS_VAR)
+# define M_UNUSED                  (IS_UNUSED)
+# define M_CONST_TMP               (IS_CONST|IS_TMP_VAR)
+# define M_CONST_VAR               (IS_CONST|IS_VAR)
+# define M_CONST_UNUSED            (IS_CONST|IS_UNUSED)
+# define M_CONST_TMP_VAR           (IS_CONST|IS_TMP_VAR|IS_VAR)
+# define M_CONST_TMP_UNUSED        (IS_CONST|IS_TMP_VAR|IS_UNUSED)
+# define M_CONST_VAR_UNUSED        (IS_CONST|IS_VAR|IS_UNUSED)
+# define M_CONST_TMP_VAR_UNUSED    (IS_CONST|IS_TMP_VAR|IS_VAR|IS_UNUSED)
+# define M_TMP_VAR                 (IS_TMP_VAR|IS_VAR)
+# define M_TMP_UNUSED              (IS_TMP_VAR|IS_UNUSED)
+# define M_TMP_VAR_UNUSED          (IS_TMP_VAR|IS_VAR|IS_UNUSED)
+# define M_VAR_UNUSED              (IS_VAR|IS_UNUSED)
+# define M_CV                      (IS_CV)
+# define M_CONST_CV                (IS_CONST|IS_CV)
+# define M_TMP_CV                  (IS_TMP_VAR|IS_CV)
+# define M_VAR_CV                  (IS_VAR|IS_CV)
+# define M_UNUSED_CV               (IS_UNUSED|IS_CV)
+# define M_CONST_TMP_CV            (IS_CONST|IS_TMP_VAR|IS_CV)
+# define M_CONST_VAR_CV            (IS_CONST|IS_VAR|IS_CV)
+# define M_CONST_UNUSED_CV         (IS_CONST|IS_UNUSED|IS_CV)
+# define M_CONST_TMP_VAR_CV        (IS_CONST|IS_TMP_VAR|IS_VAR|IS_CV)
+# define M_CONST_TMP_UNUSED_CV     (IS_CONST|IS_TMP_VAR|IS_UNUSED|IS_CV)
+# define M_CONST_VAR_UNUSED_CV     (IS_CONST|IS_VAR|IS_UNUSED|IS_CV)
+# define M_CONST_TMP_VAR_UNUSED_CV (IS_CONST|IS_TMP_VAR|IS_VAR|IS_UNUSED|IS_CV)
+# define M_TMP_VAR_CV              (IS_TMP_VAR|IS_VAR|IS_CV)
+# define M_TMP_UNUSED_CV           (IS_TMP_VAR|IS_UNUSED|IS_CV)
+# define M_TMP_VAR_UNUSED_CV       (IS_TMP_VAR|IS_VAR|IS_UNUSED|IS_CV)
+# define M_VAR_UNUSED_CV           (IS_VAR|IS_UNUSED|IS_CV)
 
 # define OP1_OP2_MASK(OP1T, OP2T) \
   ((OP1 & (OP1T)) && (OP2 & (OP2T)))
 # define OP2 IS_ANY
 # include "zend_vm_handlers.h"
 
+# undef  OP1
+# undef  OP2
+# define OP1 IS_CV
+# define OP2 IS_ANY
+# include "zend_vm_handlers.h"
+
 # undef  OP1
 # undef  OP2
 # define OP1 IS_ANY
 # define OP2 IS_UNUSED
 # include "zend_vm_handlers.h"
 
+# undef  OP1
+# undef  OP2
+# define OP1 IS_ANY
+# define OP2 IS_CV
+# include "zend_vm_handlers.h"
+
 # undef  OP1
 # undef  OP2
 # define OP1 IS_UNUSED
 # define OP2 IS_VAR
 # include "zend_vm_handlers.h"
 
+# undef  OP1
+# undef  OP2
+# define OP1 IS_UNUSED
+# define OP2 IS_CV
+# include "zend_vm_handlers.h"
+
 # undef  OP1
 # undef  OP2
 # define OP1 IS_CONST
 # define OP2 IS_UNUSED
 # include "zend_vm_handlers.h"
 
+# undef  OP1
+# undef  OP2
+# define OP1 IS_CV
+# define OP2 IS_UNUSED
+# include "zend_vm_handlers.h"
+
 # undef  OP1
 # undef  OP2
 # define OP1 IS_CONST
 # define OP2 IS_VAR
 # include "zend_vm_handlers.h"
 
+# undef  OP1
+# undef  OP2
+# define OP1 IS_CONST
+# define OP2 IS_CV
+# include "zend_vm_handlers.h"
+
 # undef  OP1
 # undef  OP2
 # define OP1 IS_TMP_VAR
 # define OP2 IS_VAR
 # include "zend_vm_handlers.h"
 
+# undef  OP1
+# undef  OP2
+# define OP1 IS_TMP_VAR
+# define OP2 IS_CV
+# include "zend_vm_handlers.h"
+
 # undef  OP1
 # undef  OP2
 # define OP1 IS_VAR
 # define OP2 IS_VAR
 # include "zend_vm_handlers.h"
 
+# undef  OP1
+# undef  OP2
+# define OP1 IS_VAR
+# define OP2 IS_CV
+# include "zend_vm_handlers.h"
+
+# undef  OP1
+# undef  OP2
+# define OP1 IS_CV
+# define OP2 IS_CONST
+# include "zend_vm_handlers.h"
+
+# undef  OP1
+# undef  OP2
+# define OP1 IS_CV
+# define OP2 IS_TMP_VAR
+# include "zend_vm_handlers.h"
+
+# undef  OP1
+# undef  OP2
+# define OP1 IS_CV
+# define OP2 IS_VAR
+# include "zend_vm_handlers.h"
+
+# undef  OP1
+# undef  OP2
+# define OP1 IS_CV
+# define OP2 IS_CV
+# include "zend_vm_handlers.h"
+
 /* LABELS */
 
 # undef M_ANY
 # undef M_TMP_UNUSED
 # undef M_TMP_VAR_UNUSED
 # undef M_VAR_UNUSED
+# undef M_CV
+# undef M_CONST_CV
+# undef M_TMP_CV
+# undef M_VAR_CV
+# undef M_UNUSED_CV
+# undef M_CONST_TMP_CV
+# undef M_CONST_VAR_CV
+# undef M_CONST_UNUSED_CV
+# undef M_CONST_TMP_VAR_CV
+# undef M_CONST_TMP_UNUSED_CV
+# undef M_CONST_VAR_UNUSED_CV
+# undef M_CONST_TMP_VAR_UNUSED_CV
+# undef M_TMP_VAR_CV
+# undef M_TMP_UNUSED_CV
+# undef M_TMP_VAR_UNUSED_CV
+# undef M_VAR_UNUSED_CV
 
 # undef OPDEF
 
        SPEC_LABELS1_##OP1M(OP##_SPEC, OP, OP2M)
 
 # define SPEC_LABELS1_M_ANY(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _ANY, _ANY, _ANY, _ANY)
+  SPEC_LABELS2_##OP2M(OP, CODE, _ANY, _ANY, _ANY, _ANY, _ANY)
 # define SPEC_LABELS1_M_UNUSED(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _NULL, _NULL, _UNUSED)
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _NULL, _NULL, _UNUSED, _NULL)
 # define SPEC_LABELS1_M_VAR(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _NULL, _VAR, _NULL)
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _NULL, _VAR, _NULL, _NULL)
 # define SPEC_LABELS1_M_VAR_UNUSED(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _NULL, _VAR, _UNUSED)
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _NULL, _VAR, _UNUSED, _NULL)
 # define SPEC_LABELS1_M_TMP(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _TMP, _NULL, _NULL)
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _TMP, _NULL, _NULL, _NULL)
 # define SPEC_LABELS1_M_TMP_UNUSED(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _TMP, _NULL, _UNUSED)
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _TMP, _NULL, _UNUSED, _NULL)
 # define SPEC_LABELS1_M_TMP_VAR(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _TMP, _VAR, _NULL)
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _TMP, _VAR, _NULL, _NULL)
 # define SPEC_LABELS1_M_TMP_VAR_UNUSED(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _TMP, _VAR, _UNUSED)
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _TMP, _VAR, _UNUSED, _NULL)
 # define SPEC_LABELS1_M_CONST(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _NULL, _NULL, _NULL)
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _NULL, _NULL, _NULL, _NULL)
 # define SPEC_LABELS1_M_CONST_UNUSED(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _NULL, _NULL, _UNUSED)
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _NULL, _NULL, _UNUSED, _NULL)
 # define SPEC_LABELS1_M_CONST_VAR(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _NULL, _VAR, _NULL)
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _NULL, _VAR, _NULL, _NULL)
 # define SPEC_LABELS1_M_CONST_VAR_UNUSED(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _NULL, _VAR, _UNUSED)
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _NULL, _VAR, _UNUSED, _NULL)
 # define SPEC_LABELS1_M_CONST_TMP(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _TMP, _NULL, _NULL)
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _TMP, _NULL, _NULL, _NULL)
 # define SPEC_LABELS1_M_CONST_TMP_UNUSED(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _TMP, _NULL, _UNUSED)
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _TMP, _NULL, _UNUSED, _NULL)
 # define SPEC_LABELS1_M_CONST_TMP_VAR(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _TMP, _VAR, _NULL)
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _TMP, _VAR, _NULL, _NULL)
 # define SPEC_LABELS1_M_CONST_TMP_VAR_UNUSED(OP, CODE, OP2M) \
-  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _TMP, _VAR, _UNUSED)
-
-# define SPEC_LABELS2_M_ANY(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _ANY, _ANY, _ANY, _ANY)
-# define SPEC_LABELS2_M_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _NULL, _NULL, _NULL, _UNUSED)
-# define SPEC_LABELS2_M_VAR(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _NULL, _NULL, _VAR, _NULL)
-# define SPEC_LABELS2_M_VAR_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _NULL, _NULL, _VAR, _UNUSED)
-# define SPEC_LABELS2_M_TMP(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _NULL, _TMP, _NULL, _NULL)
-# define SPEC_LABELS2_M_TMP_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _NULL, _TMP, _NULL, _UNUSED)
-# define SPEC_LABELS2_M_TMP_VAR(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _NULL, _TMP, _VAR, _NULL)
-# define SPEC_LABELS2_M_TMP_VAR_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _NULL, _TMP, _VAR, _UNUSED)
-# define SPEC_LABELS2_M_CONST(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _CONST, _NULL, _NULL, _NULL)
-# define SPEC_LABELS2_M_CONST_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _CONST, _NULL, _NULL, _UNUSED)
-# define SPEC_LABELS2_M_CONST_VAR(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _CONST, _NULL, _VAR, _NULL)
-# define SPEC_LABELS2_M_CONST_VAR_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _CONST, _NULL, _VAR, _UNUSED)
-# define SPEC_LABELS2_M_CONST_TMP(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _CONST, _TMP, _NULL, _NULL)
-# define SPEC_LABELS2_M_CONST_TMP_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _CONST, _TMP, _NULL, _UNUSED)
-# define SPEC_LABELS2_M_CONST_TMP_VAR(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _CONST, _TMP, _VAR, _NULL)
-# define SPEC_LABELS2_M_CONST_TMP_VAR_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U) \
-  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, _CONST, _TMP, _VAR, _UNUSED)
-
-# define LABELS_1(OP,CODE,OP1,OP2C,OP2T,OP2V,OP2U) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _TMP, _VAR, _UNUSED, _NULL)
+# define SPEC_LABELS1_M_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _NULL, _NULL, _NULL, _CV)
+# define SPEC_LABELS1_M_UNUSED_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _NULL, _NULL, _UNUSED, _CV)
+# define SPEC_LABELS1_M_VAR_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _NULL, _VAR, _NULL, _CV)
+# define SPEC_LABELS1_M_VAR_UNUSED_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _NULL, _VAR, _UNUSED, _CV)
+# define SPEC_LABELS1_M_TMP_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _TMP, _NULL, _NULL, _CV)
+# define SPEC_LABELS1_M_TMP_UNUSED_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _TMP, _NULL, _UNUSED, _CV)
+# define SPEC_LABELS1_M_TMP_VAR_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _TMP, _VAR, _NULL, _CV)
+# define SPEC_LABELS1_M_TMP_VAR_UNUSED_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _NULL, _TMP, _VAR, _UNUSED, _CV)
+# define SPEC_LABELS1_M_CONST_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _NULL, _NULL, _NULL, _CV)
+# define SPEC_LABELS1_M_CONST_UNUSED_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _NULL, _NULL, _UNUSED, _CV)
+# define SPEC_LABELS1_M_CONST_VAR_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _NULL, _VAR, _NULL, _CV)
+# define SPEC_LABELS1_M_CONST_VAR_UNUSED_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _NULL, _VAR, _UNUSED, _CV)
+# define SPEC_LABELS1_M_CONST_TMP_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _TMP, _NULL, _NULL, _CV)
+# define SPEC_LABELS1_M_CONST_TMP_UNUSED_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _TMP, _NULL, _UNUSED, _CV)
+# define SPEC_LABELS1_M_CONST_TMP_VAR_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _TMP, _VAR, _NULL, _CV)
+# define SPEC_LABELS1_M_CONST_TMP_VAR_UNUSED_CV(OP, CODE, OP2M) \
+  SPEC_LABELS2_##OP2M(OP, CODE, _CONST, _TMP, _VAR, _UNUSED, _CV)
+
+# define SPEC_LABELS2_M_ANY(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _ANY, _ANY, _ANY, _ANY, _NULL)
+# define SPEC_LABELS2_M_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _NULL, _NULL, _UNUSED, _NULL)
+# define SPEC_LABELS2_M_VAR(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _NULL, _VAR, _NULL, _NULL)
+# define SPEC_LABELS2_M_VAR_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _NULL, _VAR, _UNUSED, _NULL)
+# define SPEC_LABELS2_M_TMP(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _TMP, _NULL, _NULL, _NULL)
+# define SPEC_LABELS2_M_TMP_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _TMP, _NULL, _UNUSED, _NULL)
+# define SPEC_LABELS2_M_TMP_VAR(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _TMP, _VAR, _NULL, _NULL)
+# define SPEC_LABELS2_M_TMP_VAR_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _TMP, _VAR, _UNUSED, _NULL)
+# define SPEC_LABELS2_M_CONST(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _NULL, _NULL, _NULL, _NULL)
+# define SPEC_LABELS2_M_CONST_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _NULL, _NULL, _UNUSED, _NULL)
+# define SPEC_LABELS2_M_CONST_VAR(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _NULL, _VAR, _NULL, _NULL)
+# define SPEC_LABELS2_M_CONST_VAR_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _NULL, _VAR, _UNUSED, _NULL)
+# define SPEC_LABELS2_M_CONST_TMP(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _TMP, _NULL, _NULL, _NULL)
+# define SPEC_LABELS2_M_CONST_TMP_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _TMP, _NULL, _UNUSED, _NULL)
+# define SPEC_LABELS2_M_CONST_TMP_VAR(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _TMP, _VAR, _NULL, _NULL)
+# define SPEC_LABELS2_M_CONST_TMP_VAR_UNUSED(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _TMP, _VAR, _UNUSED, _NULL)
+# define SPEC_LABELS2_M_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _NULL, _NULL, _NULL, _CV)
+# define SPEC_LABELS2_M_UNUSED_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _NULL, _NULL, _UNUSED, _CV)
+# define SPEC_LABELS2_M_VAR_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _NULL, _VAR, _NULL, _CV)
+# define SPEC_LABELS2_M_VAR_UNUSED_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _NULL, _VAR, _UNUSED, _CV)
+# define SPEC_LABELS2_M_TMP_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _TMP, _NULL, _NULL, _CV)
+# define SPEC_LABELS2_M_TMP_UNUSED_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _TMP, _NULL, _UNUSED, _CV)
+# define SPEC_LABELS2_M_TMP_VAR_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _TMP, _VAR, _NULL, _CV)
+# define SPEC_LABELS2_M_TMP_VAR_UNUSED_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _NULL, _TMP, _VAR, _UNUSED, _CV)
+# define SPEC_LABELS2_M_CONST_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _NULL, _NULL, _NULL, _CV)
+# define SPEC_LABELS2_M_CONST_UNUSED_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _NULL, _NULL, _UNUSED, _CV)
+# define SPEC_LABELS2_M_CONST_VAR_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _NULL, _VAR, _NULL, _CV)
+# define SPEC_LABELS2_M_CONST_VAR_UNUSED_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _NULL, _VAR, _UNUSED, _CV)
+# define SPEC_LABELS2_M_CONST_TMP_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _TMP, _NULL, _NULL, _CV)
+# define SPEC_LABELS2_M_CONST_TMP_UNUSED_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _TMP, _NULL, _UNUSED, _CV)
+# define SPEC_LABELS2_M_CONST_TMP_VAR_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _TMP, _VAR, _NULL, _CV)
+# define SPEC_LABELS2_M_CONST_TMP_VAR_UNUSED_CV(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X) \
+  SPEC_LABELS(OP, CODE, OP1C, OP1T, OP1V, OP1U, OP1X, _CONST, _TMP, _VAR, _UNUSED, _CV)
+
+# define LABELS_1(OP,CODE,OP1,OP2C,OP2T,OP2V,OP2U,OP2X) \
   OP1##OP2C(OP,CODE), \
   OP1##OP2T(OP,CODE), \
   OP1##OP2V(OP,CODE), \
-  OP1##OP2U(OP,CODE)
+  OP1##OP2U(OP,CODE), \
+  OP1##OP2X(OP,CODE)
 
-# define SPEC_LABELS(OP,CODE,OP1C,OP1T,OP1V,OP1U,OP2C,OP2T,OP2V,OP2U) \
-       LABELS_1(OP,CODE,SPEC_LABEL##OP1C,OP2C,OP2T,OP2V,OP2U), \
-       LABELS_1(OP,CODE,SPEC_LABEL##OP1T,OP2C,OP2T,OP2V,OP2U), \
-       LABELS_1(OP,CODE,SPEC_LABEL##OP1V,OP2C,OP2T,OP2V,OP2U), \
-       LABELS_1(OP,CODE,SPEC_LABEL##OP1U,OP2C,OP2T,OP2V,OP2U)
+# define SPEC_LABELS(OP,CODE,OP1C,OP1T,OP1V,OP1U,OP1X,OP2C,OP2T,OP2V,OP2U,OP2X) \
+       LABELS_1(OP,CODE,SPEC_LABEL##OP1C,OP2C,OP2T,OP2V,OP2U,OP2X), \
+       LABELS_1(OP,CODE,SPEC_LABEL##OP1T,OP2C,OP2T,OP2V,OP2U,OP2X), \
+       LABELS_1(OP,CODE,SPEC_LABEL##OP1V,OP2C,OP2T,OP2V,OP2U,OP2X), \
+       LABELS_1(OP,CODE,SPEC_LABEL##OP1U,OP2C,OP2T,OP2V,OP2U,OP2X), \
+       LABELS_1(OP,CODE,SPEC_LABEL##OP1X,OP2C,OP2T,OP2V,OP2U,OP2X)
 
 # define SPEC_LABEL_CONST_NULL(OP,CODE)    ZEND_VM_SPEC_NULL_LABEL
 # define SPEC_LABEL_TMP_NULL(OP,CODE)      ZEND_VM_SPEC_NULL_LABEL
 # define SPEC_LABEL_VAR_NULL(OP,CODE)      ZEND_VM_SPEC_NULL_LABEL
 # define SPEC_LABEL_UNUSED_NULL(OP,CODE)   ZEND_VM_SPEC_NULL_LABEL
+# define SPEC_LABEL_CV_NULL(OP,CODE)       ZEND_VM_SPEC_NULL_LABEL
 # define SPEC_LABEL_ANY_NULL(OP,CODE)      ZEND_VM_SPEC_NULL_LABEL
 # define SPEC_LABEL_NULL_CONST(OP,CODE)    ZEND_VM_SPEC_NULL_LABEL
 # define SPEC_LABEL_NULL_TMP(OP,CODE)      ZEND_VM_SPEC_NULL_LABEL
 # define SPEC_LABEL_NULL_VAR(OP,CODE)      ZEND_VM_SPEC_NULL_LABEL
 # define SPEC_LABEL_NULL_UNUSED(OP,CODE)   ZEND_VM_SPEC_NULL_LABEL
+# define SPEC_LABEL_NULL_CV(OP,CODE)       ZEND_VM_SPEC_NULL_LABEL
 # define SPEC_LABEL_NULL_ANY(OP,CODE)      ZEND_VM_SPEC_NULL_LABEL
 # define SPEC_LABEL_NULL_NULL(OP,CODE)     ZEND_VM_SPEC_NULL_LABEL
 # define SPEC_LABEL_ANY_ANY(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_ANY_VAR, ZEND_VM_CODE(CODE, _ANY_CODE, _VAR_CODE))
 # define SPEC_LABEL_ANY_UNUSED(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_ANY_UNUSED, ZEND_VM_CODE(CODE, _ANY_CODE, _UNUSED_CODE))
+# define SPEC_LABEL_ANY_CV(OP,CODE) \
+  ZEND_VM_SPEC_LABEL(OP##_ANY_CV, ZEND_VM_CODE(CODE, _ANY_CODE, _CV_CODE))
 # define SPEC_LABEL_CONST_ANY(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_CONST_ANY, ZEND_VM_CODE(CODE, _CONST_CODE, _ANY_CODE))
 # define SPEC_LABEL_CONST_CONST(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_CONST_VAR, ZEND_VM_CODE(CODE, _CONST_CODE, _VAR_CODE))
 # define SPEC_LABEL_CONST_UNUSED(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_CONST_UNUSED, ZEND_VM_CODE(CODE, _CONST_CODE, _UNUSED_CODE))
+# define SPEC_LABEL_CONST_CV(OP,CODE) \
+  ZEND_VM_SPEC_LABEL(OP##_CONST_CV, ZEND_VM_CODE(CODE, _CONST_CODE, _CV_CODE))
 # define SPEC_LABEL_TMP_ANY(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_TMP_ANY, ZEND_VM_CODE(CODE, _TMP_CODE, _ANY_CODE))
 # define SPEC_LABEL_TMP_CONST(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_TMP_VAR, ZEND_VM_CODE(CODE, _TMP_CODE, _VAR_CODE))
 # define SPEC_LABEL_TMP_UNUSED(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_TMP_UNUSED, ZEND_VM_CODE(CODE, _TMP_CODE, _UNUSED_CODE))
+# define SPEC_LABEL_TMP_CV(OP,CODE) \
+  ZEND_VM_SPEC_LABEL(OP##_TMP_CV, ZEND_VM_CODE(CODE, _TMP_CODE, _CV_CODE))
 # define SPEC_LABEL_VAR_ANY(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_VAR_ANY, ZEND_VM_CODE(CODE, _VAR_CODE, _ANY_CODE))
 # define SPEC_LABEL_VAR_CONST(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_VAR_VAR, ZEND_VM_CODE(CODE, _VAR_CODE, _VAR_CODE))
 # define SPEC_LABEL_VAR_UNUSED(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_VAR_UNUSED, ZEND_VM_CODE(CODE, _VAR_CODE, _UNUSED_CODE))
+# define SPEC_LABEL_VAR_CV(OP,CODE) \
+  ZEND_VM_SPEC_LABEL(OP##_VAR_CV, ZEND_VM_CODE(CODE, _VAR_CODE, _CV_CODE))
 # define SPEC_LABEL_UNUSED_ANY(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_UNUSED_ANY, ZEND_VM_CODE(CODE, _UNUSED_CODE, _ANY_CODE))
 # define SPEC_LABEL_UNUSED_CONST(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_UNUSED_VAR, ZEND_VM_CODE(CODE, _UNUSED_CODE, _VAR_CODE))
 # define SPEC_LABEL_UNUSED_UNUSED(OP,CODE) \
   ZEND_VM_SPEC_LABEL(OP##_UNUSED_UNUSED, ZEND_VM_CODE(CODE, _UNUSED_CODE, _UNUSED_CODE))
+# define SPEC_LABEL_UNUSED_CV(OP,CODE) \
+  ZEND_VM_SPEC_LABEL(OP##_UNUSED_CV, ZEND_VM_CODE(CODE, _UNUSED_CODE, _CV_CODE))
+# define SPEC_LABEL_CV_ANY(OP,CODE) \
+  ZEND_VM_SPEC_LABEL(OP##_CV_ANY, ZEND_VM_CODE(CODE, _CV_CODE, _ANY_CODE))
+# define SPEC_LABEL_CV_CONST(OP,CODE) \
+  ZEND_VM_SPEC_LABEL(OP##_CV_CONST, ZEND_VM_CODE(CODE, _CV_CODE, _CONST_CODE))
+# define SPEC_LABEL_CV_TMP(OP,CODE) \
+  ZEND_VM_SPEC_LABEL(OP##_CV_TMP, ZEND_VM_CODE(CODE, _CV_CODE, _TMP_CODE))
+# define SPEC_LABEL_CV_VAR(OP,CODE) \
+  ZEND_VM_SPEC_LABEL(OP##_CV_VAR, ZEND_VM_CODE(CODE, _CV_CODE, _VAR_CODE))
+# define SPEC_LABEL_CV_UNUSED(OP,CODE) \
+  ZEND_VM_SPEC_LABEL(OP##_CV_UNUSED, ZEND_VM_CODE(CODE, _CV_CODE, _UNUSED_CODE))
+# define SPEC_LABEL_CV_CV(OP,CODE) \
+  ZEND_VM_SPEC_LABEL(OP##_CV_CV, ZEND_VM_CODE(CODE, _CV_CODE, _CV_CODE))
 
 # undef ZEND_VM_NULL_LABEL
 # define ZEND_VM_NULL_LABEL \
   ZEND_VM_SPEC_NULL_LABEL, \
   ZEND_VM_SPEC_NULL_LABEL, \
   ZEND_VM_SPEC_NULL_LABEL, \
+  ZEND_VM_SPEC_NULL_LABEL, \
+  ZEND_VM_SPEC_NULL_LABEL, \
+  ZEND_VM_SPEC_NULL_LABEL, \
+  ZEND_VM_SPEC_NULL_LABEL, \
+  ZEND_VM_SPEC_NULL_LABEL, \
+  ZEND_VM_SPEC_NULL_LABEL, \
+  ZEND_VM_SPEC_NULL_LABEL, \
+  ZEND_VM_SPEC_NULL_LABEL, \
+  ZEND_VM_SPEC_NULL_LABEL, \
   ZEND_VM_SPEC_NULL_LABEL
 
 # undef ZEND_VM_LABEL
 
 #endif
 
-#if defined(ZEND_VM_SPEC) && (ZEND_VM_KIND == ZEND_VM_KIND_CALL)
+#if defined(ZEND_VM_HAVE_OLD_EXECUTOR) && defined(ZEND_VM_SPEC) && (ZEND_VM_KIND == ZEND_VM_KIND_CALL)
 ZEND_VM_NULL_HANDLER();
 #else
 ZEND_VM_NULL_HANDLER()
index a6cf1356d2ae357016f552bc92da0a4efe27ca05..3df802c2b93d4da27bdc2ec21b55ca2f8e1b7fc9 100644 (file)
@@ -526,9 +526,8 @@ static void php_session_track_init(TSRMLS_D)
        zval *session_vars = NULL;
        
        /* Unconditionally destroy existing arrays -- possible dirty data */
-       zend_hash_del(&EG(symbol_table), "HTTP_SESSION_VARS", 
-                       sizeof("HTTP_SESSION_VARS"));
-       zend_hash_del(&EG(symbol_table), "_SESSION", sizeof("_SESSION"));
+       delete_global_variable("HTTP_SESSION_VARS", sizeof("HTTP_SESSION_VARS")-1 TSRMLS_CC);
+       delete_global_variable("_SESSION", sizeof("_SESSION")-1 TSRMLS_CC);
 
        MAKE_STD_ZVAL(session_vars);
        array_init(session_vars);
@@ -1680,7 +1679,7 @@ PHP_FUNCTION(session_unset)
 
                        while (zend_hash_get_current_key_ex(ht, &str, &str_len, &num_key, 
                                                0, &pos) == HASH_KEY_IS_STRING) {
-                               zend_hash_del(&EG(symbol_table), str, str_len);
+                               delete_global_variable(str, str_len-1 TSRMLS_CC);
                                zend_hash_move_forward_ex(ht, &pos);
                        }
                }
index 34645a18efc2e65115503256f9d4978b06397e8a..ecc1bc0a210d73d25f76bfcc3eb8ea58f8c2fb7d 100755 (executable)
@@ -278,8 +278,14 @@ static void spl_array_unset_dimension(zval *object, zval *offset TSRMLS_DC)
 
        switch(Z_TYPE_P(offset)) {
        case IS_STRING:
-               if (zend_symtable_del(HASH_OF(intern->array), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1) == FAILURE) {
-                       zend_error(E_NOTICE,"Undefined index:  %s", Z_STRVAL_P(offset));
+               if (HASH_OF(intern->array) == &EG(symbol_table)) {
+                       if (delete_global_variable(Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC)) {
+                               zend_error(E_NOTICE,"Undefined index:  %s", Z_STRVAL_P(offset));
+                       }
+               } else {
+                       if (zend_symtable_del(HASH_OF(intern->array), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1) == FAILURE) {
+                               zend_error(E_NOTICE,"Undefined index:  %s", Z_STRVAL_P(offset));
+                       }
                }
                return;
        case IS_DOUBLE:
index b491ca42768dc37a24a48d7708b086e1bc1d715d..4ae9205df340a29f12321021f2d453c5bfcfa6bf 100644 (file)
@@ -1914,7 +1914,11 @@ static void _phpi_pop(INTERNAL_FUNCTION_PARAMETERS, int off_the_end)
        
        /* Delete the first or last value */
        zend_hash_get_current_key_ex(Z_ARRVAL_PP(stack), &key, &key_len, &index, 0, NULL);
-       zend_hash_del_key_or_index(Z_ARRVAL_PP(stack), key, key_len, index, (key) ? HASH_DEL_KEY : HASH_DEL_INDEX);
+       if (key && Z_ARRVAL_PP(stack) == &EG(symbol_table)) {
+               delete_global_variable(key, key_len-1 TSRMLS_CC);
+       } else {
+               zend_hash_del_key_or_index(Z_ARRVAL_PP(stack), key, key_len, index, (key) ? HASH_DEL_KEY : HASH_DEL_INDEX);
+       }
        
        /* If we did a shift... re-index like it did before */
        if (!off_the_end) {
@@ -2761,7 +2765,11 @@ PHP_FUNCTION(array_unique)
                                p = cmpdata->b;
                        }
                        if (p->nKeyLength) {
-                               zend_hash_del(Z_ARRVAL_P(return_value), p->arKey, p->nKeyLength);
+                               if (Z_ARRVAL_P(return_value) == &EG(symbol_table)) {
+                                       delete_global_variable(p->arKey, p->nKeyLength-1 TSRMLS_CC);
+                               } else {
+                                       zend_hash_del(Z_ARRVAL_P(return_value), p->arKey, p->nKeyLength);
+                               }
                        } else {
                                zend_hash_index_del(Z_ARRVAL_P(return_value), p->h);
                        }
index ad5104ff5c8aae649d31dc0a880739290c7e7458..331706ad067ae4b0ea7195be76c1175c14f240ab 100644 (file)
@@ -3210,7 +3210,7 @@ static int copy_request_variable(void *pDest, int num_args, va_list args, zend_h
        memcpy(new_key, prefix, prefix_len);
        memcpy(new_key+prefix_len, hash_key->arKey, hash_key->nKeyLength);
 
-       zend_hash_del(&EG(symbol_table), new_key, new_key_len);
+       delete_global_variable(new_key, new_key_len-1 TSRMLS_CC);
        ZEND_SET_SYMBOL_WITH_LENGTH(&EG(symbol_table), new_key, new_key_len, *var, (*var)->refcount+1, 0);
 
        efree(new_key);