Changeset 834


Ignore:
Timestamp:
2012-03-23T18:17:10+01:00 (3 years ago)
Author:
moo
Message:

optimizer: handle goto in convert_switch optimization

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/optimizer.c

    r822 r834  
    5757{ 
    5858    int i; 
     59    zend_bool preserve_brk_cont_array = 0; 
    5960 
    6061    if (op_array->brk_cont_array == NULL) { 
     
    6566        zend_op *opline = &op_array->opcodes[i]; 
    6667        zend_brk_cont_element *jmp_to; 
     68        zend_bool can_convert = 1; 
    6769        int array_offset, nest_levels, original_nest_levels; 
    6870 
    69         if (opline->opcode != ZEND_BRK && opline->opcode != ZEND_CONT) { 
     71        switch (opline->opcode) { 
     72        case ZEND_BRK: 
     73        case ZEND_CONT: 
     74            break; 
     75 
     76#ifdef ZEND_GOTO 
     77        case ZEND_GOTO: 
     78            preserve_brk_cont_array = 1; 
    7079            continue; 
    71         } 
     80#endif 
     81 
     82        default: 
     83            continue; 
     84        } 
     85 
    7286        if (Z_OP_TYPE(opline->op2) != IS_CONST 
    7387         || Z_OP_CONSTANT(opline->op2).type != IS_LONG) { 
     
    92106                switch (brk_opline->opcode) { 
    93107                case ZEND_SWITCH_FREE: 
    94                     break; 
    95108                case ZEND_FREE: 
     109                    if (!(brk_opline->extended_value & EXT_TYPE_FREE_ON_RETURN)) { 
     110                        can_convert = 0; 
     111                        preserve_brk_cont_array = 1; 
     112                    } 
    96113                    break; 
    97114                } 
     
    100117        } while (--nest_levels > 0); 
    101118 
    102         /* rewrite to jmp */ 
    103         if (opline->opcode == ZEND_BRK) { 
    104             Z_OP(opline->op1).opline_num = jmp_to->brk; 
    105         } 
    106         else { 
    107             Z_OP(opline->op1).opline_num = jmp_to->cont; 
    108         } 
    109         Z_OP_TYPE(opline->op2) = IS_UNUSED; 
    110         opline->opcode = ZEND_JMP; 
    111     } 
    112  
    113     if (op_array->brk_cont_array != NULL) { 
    114         efree(op_array->brk_cont_array); 
    115         op_array->brk_cont_array = NULL; 
    116     } 
    117     op_array->last_brk_cont = 0; 
     119        if (can_convert) { 
     120            /* rewrite to jmp */ 
     121            switch (opline->opcode) { 
     122            case ZEND_BRK: 
     123                Z_OP(opline->op1).opline_num = jmp_to->brk; 
     124                break; 
     125 
     126            case ZEND_CONT: 
     127                Z_OP(opline->op1).opline_num = jmp_to->cont; 
     128                break; 
     129            } 
     130            Z_OP_TYPE(opline->op2) = IS_UNUSED; 
     131            opline->opcode = ZEND_JMP; 
     132        } 
     133    } 
     134 
     135    if (!preserve_brk_cont_array) { 
     136        if (op_array->brk_cont_array != NULL) { 
     137            efree(op_array->brk_cont_array); 
     138            op_array->brk_cont_array = NULL; 
     139        } 
     140        op_array->last_brk_cont = 0; 
     141    } 
    118142    return SUCCESS; 
    119143} 
Note: See TracChangeset for help on using the changeset viewer.