]> granicus.if.org Git - php/commitdiff
- Make the argument order for the stack applies more consistent with other Zend
authorZeev Suraski <zeev@php.net>
Wed, 29 Mar 2000 22:28:04 +0000 (22:28 +0000)
committerZeev Suraski <zeev@php.net>
Wed, 29 Mar 2000 22:28:04 +0000 (22:28 +0000)
  data structures
- Fix a possible corruption problem due to switch() C-level optimization

Zend/zend_compile.c
Zend/zend_stack.c
Zend/zend_stack.h

index 85c0a0bb654daa734707156cd5948c8f1304dfa2..f2831dfcedc5d80be5c9963493f65cf35fa9aeac 100644 (file)
@@ -976,7 +976,7 @@ static int generate_free_switch_expr(zend_switch_entry *switch_entry CLS_DC)
 {
        zend_op *opline;
        
-       if (switch_entry->cond.op_type == IS_UNUSED) {
+       if (switch_entry->cond.op_type!=IS_VAR && switch_entry->cond.op_type!=IS_TMP_VAR) {
                return 1;
        }
        
@@ -993,7 +993,7 @@ static int generate_free_foreach_copy(znode *foreach_copy CLS_DC)
 {
        zend_op *opline;
        
-       if (foreach_copy->op_type == IS_UNUSED) {
+       if (foreach_copy->op_type!=IS_VAR && foreach_copy->op_type!=IS_TMP_VAR) {
                return 1;
        }
 
@@ -1018,11 +1018,11 @@ void do_return(znode *expr, int do_end_vparse CLS_DC)
                }
        }
 #ifdef ZTS
-       zend_stack_apply_with_argument(&CG(switch_cond_stack), (int (*)(void *element, void *)) generate_free_switch_expr, ZEND_STACK_APPLY_TOPDOWN CLS_CC);
-       zend_stack_apply_with_argument(&CG(foreach_copy_stack), (int (*)(void *element, void *)) generate_free_foreach_copy, ZEND_STACK_APPLY_TOPDOWN CLS_CC);
+       zend_stack_apply_with_argument(&CG(switch_cond_stack), ZEND_STACK_APPLY_TOPDOWN, (int (*)(void *element, void *)) generate_free_switch_expr CLS_CC);
+       zend_stack_apply_with_argument(&CG(foreach_copy_stack), ZEND_STACK_APPLY_TOPDOWN, (int (*)(void *element, void *)) generate_free_foreach_copy CLS_CC);
 #else
-       zend_stack_apply(&CG(switch_cond_stack), (int (*)(void *element)) generate_free_switch_expr, ZEND_STACK_APPLY_TOPDOWN);
-       zend_stack_apply(&CG(foreach_copy_stack), (int (*)(void *element)) generate_free_foreach_copy, ZEND_STACK_APPLY_TOPDOWN);
+       zend_stack_apply(&CG(switch_cond_stack), ZEND_STACK_APPLY_TOPDOWN, (int (*)(void *element)) generate_free_switch_expr);
+       zend_stack_apply(&CG(foreach_copy_stack), ZEND_STACK_APPLY_TOPDOWN, (int (*)(void *element)) generate_free_foreach_copy);
 #endif
 
        opline = get_next_op(CG(active_op_array) CLS_CC);
@@ -1340,11 +1340,13 @@ void do_switch_end(znode *case_list CLS_DC)
        CG(active_op_array)->brk_cont_array[CG(active_op_array)->current_brk_cont].cont = CG(active_op_array)->brk_cont_array[CG(active_op_array)->current_brk_cont].brk = get_next_op_number(CG(active_op_array));
        CG(active_op_array)->current_brk_cont = CG(active_op_array)->brk_cont_array[CG(active_op_array)->current_brk_cont].parent;
 
-       /* emit free for the switch condition*/
-       opline = get_next_op(CG(active_op_array) CLS_CC);
-       opline->opcode = ZEND_SWITCH_FREE;
-       opline->op1 = switch_entry_ptr->cond;
-       SET_UNUSED(opline->op2);
+       if (switch_entry_ptr->cond.op_type==IS_VAR || switch_entry_ptr->cond.op_type==IS_TMP_VAR) {
+               /* emit free for the switch condition*/
+               opline = get_next_op(CG(active_op_array) CLS_CC);
+               opline->opcode = ZEND_SWITCH_FREE;
+               opline->op1 = switch_entry_ptr->cond;
+               SET_UNUSED(opline->op2);
+       }
        if (switch_entry_ptr->cond.op_type == IS_CONST) {
                zval_dtor(&switch_entry_ptr->cond.u.constant);
        }
index 231f6bc0c51904c54bfe873acf5b94ee3f523d9a..3618fb1bbd817dc911c7d0c7d057ab66ad6c4b09 100644 (file)
@@ -118,7 +118,7 @@ ZEND_API int zend_stack_count(zend_stack *stack)
 }
 
 
-ZEND_API void zend_stack_apply(zend_stack *stack, int (*apply_function)(void *element), int type)
+ZEND_API void zend_stack_apply(zend_stack *stack, int type, int (*apply_function)(void *element))
 {
        int i;
 
@@ -141,7 +141,7 @@ ZEND_API void zend_stack_apply(zend_stack *stack, int (*apply_function)(void *el
 }
 
 
-ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int (*apply_function)(void *element, void *arg), int type, void *arg)
+ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (*apply_function)(void *element, void *arg), void *arg)
 {
        int i;
 
index 09daeba61583e525bb6793160344d95b8201a9f9..9304f647d98c1f4e104fea81ceac49a5ffaa7324 100644 (file)
@@ -38,8 +38,8 @@ ZEND_API int zend_stack_is_empty(zend_stack *stack);
 ZEND_API int zend_stack_destroy(zend_stack *stack);
 ZEND_API void **zend_stack_base(zend_stack *stack);
 ZEND_API int zend_stack_count(zend_stack *stack);
-ZEND_API void zend_stack_apply(zend_stack *stack, int (*apply_function)(void *element), int type);
-ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int (*apply_function)(void *element, void *arg), int type, void *arg);
+ZEND_API void zend_stack_apply(zend_stack *stack, int type, int (*apply_function)(void *element));
+ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (*apply_function)(void *element, void *arg), void *arg);
 
 #define ZEND_STACK_APPLY_TOPDOWN       1
 #define ZEND_STACK_APPLY_BOTTOMUP      2