Changeset 834 in svn for trunk/optimizer.c


Ignore:
Timestamp:
2012-03-23T17:17:10Z (3 years ago)
Author:
Xuefer
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.