Ignore:
Timestamp:
2013-07-10T08:59:45+02:00 (23 months ago)
Author:
Xuefer
Message:

PHP_5_5: optimizer: support for finally

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/mod_optimizer/xc_optimizer.c

    r1281 r1284  
    1616#   include "xc_processor.h"
    1717#   include "xcache/xc_const_string.h"
     18#   include "xcache/xc_opcode_spec.h"
    1819#   include "ext/standard/php_var.h"
    1920#endif
     
    227228/* }}} */
    228229#ifdef XCACHE_DEBUG
    229 static void op_snprint(zend_op_array *op_array, char *buf, int size, zend_uchar op_type, znode_op *op) /* {{{ */
    230 {
    231     switch (op_type) {
     230static void op_snprint(zend_op_array *op_array, char *buf, int size, zend_uchar op_type, znode_op *op, xc_op_spec_t op_spec) /* {{{ */
     231{
     232    switch ((op_spec & OPSPEC_UNUSED) ? IS_UNUSED : op_type) {
    232233    case IS_CONST:
    233234        {
     
    276277        char buf_1[20];
    277278        char buf_2[20];
    278         op_snprint(op_array, buf_r, sizeof(buf_r), Z_OP_TYPE(opline->result), &opline->result);
    279         op_snprint(op_array, buf_1, sizeof(buf_1), Z_OP_TYPE(opline->op1),    &opline->op1);
    280         op_snprint(op_array, buf_2, sizeof(buf_2), Z_OP_TYPE(opline->op2),    &opline->op2);
     279        const xc_opcode_spec_t *opcode_spec = xc_get_opcode_spec(opline->opcode);
     280        op_snprint(op_array, buf_r, sizeof(buf_r), Z_OP_TYPE(opline->result), &opline->result, opcode_spec->res);
     281        op_snprint(op_array, buf_1, sizeof(buf_1), Z_OP_TYPE(opline->op1),    &opline->op1,    opcode_spec->op1);
     282        op_snprint(op_array, buf_2, sizeof(buf_2), Z_OP_TYPE(opline->op2),    &opline->op2,    opcode_spec->op2);
    281283        fprintf(stderr,
    282284                "%3d %3lu"
    283                 " %-25s%-5s%-20s%-20s%5lu\r\n"
     285                " %-25s%-8s%-20s%-20s%5lu\n"
    284286                , opline->lineno, (long) (opline - first + line)
    285287                , xc_get_opcode(opline->opcode), buf_r, buf_1, buf_2, opline->extended_value);
     288    }
     289}
     290/* }}} */
     291static void op_array_print_try_catch(zend_op_array *op_array TSRMLS_DC) /* {{{ */
     292{
     293    int i;
     294    for (i = 0; i < op_array->last_try_catch; i ++) {
     295        zend_try_catch_element *element = &op_array->try_catch_array[i];
     296#   ifdef ZEND_ENGINE_2_5
     297        fprintf(stderr, "try_catch[%d] = %u, %u, %u, %u\n", i, element->try_op, element->catch_op, element->finally_op, element->finally_end);
     298#   else
     299        fprintf(stderr, "try_catch[%d] = %u, %u\n", i, element->try_op, element->catch_op);
     300#   endif
    286301    }
    287302}
     
    343358
    344359    fprintf(stderr,
    345             "\r\n==== #%-3d cnt:%-3d lno:%-3d"
     360            "\n==== #%-3d cnt:%-3d lno:%-3d"
    346361            " %c%c"
    347             " op1:%-3d op2:%-3d ext:%-3d fal:%-3d cat:%-3d fnl:%-3d %s ====\r\n"
     362            " op1:%-3d op2:%-3d ext:%-3d fal:%-3d cat:%-3d fnl:%-3d %s ====\n"
    348363            , bb->id, bb->count, bb->alloc ? -1 : line
    349364            , bb->used ? 'U' : ' ', bb->alloc ? 'A' : ' '
     
    468483        for (j = e->try_op; j < e->catch_op; j ++) {
    469484            oplineinfos[j].catchbbid = oplineinfos[e->catch_op].bbid;
    470         }
    471485#   ifdef ZEND_ENGINE_2_5
    472         for (j = e->finally_op; j < e->finally_end; j ++) {
    473486            oplineinfos[j].finallybbid = oplineinfos[e->finally_op].bbid;
    474         }
    475487#   endif
     488        }
    476489    }
    477490#ifdef XCACHE_DEBUG
     
    536549static void bbs_restore_opnum(bbs_t *bbs, zend_op_array *op_array) /* {{{ */
    537550{
    538     int i;
     551    int bbid;
    539552    bbid_t lasttrybbid;
    540553    bbid_t lastcatchbbid;
     
    543556#endif
    544557
    545     for (i = 0; i < bbs_count(bbs); i ++) {
     558    for (bbid = 0; bbid < bbs_count(bbs); bbid ++) {
    546559        op_flowinfo_t fi;
    547         bb_t *bb = bbs_get(bbs, i);
     560        bb_t *bb = bbs_get(bbs, bbid);
    548561        zend_op *last = bb->opcodes + bb->count - 1;
    549562
     
    570583#endif
    571584    op_array->last_try_catch = 0;
    572     for (i = 0; i < bbs_count(bbs); i ++) {
    573         bb_t *bb = bbs_get(bbs, i);
    574 
    575         if (lastcatchbbid != bb->catch) {
    576             if (lasttrybbid != BBID_INVALID) {
    577                 int try_catch_offset = op_array->last_try_catch ++;
    578 
    579                 op_array->try_catch_array = erealloc(op_array->try_catch_array, sizeof(zend_try_catch_element) * op_array->last_try_catch);
    580                 op_array->try_catch_array[try_catch_offset].try_op = bbs_get(bbs, lasttrybbid)->opnum;
    581                 op_array->try_catch_array[try_catch_offset].catch_op = lastcatchbbid != BBID_INVALID ? bbs_get(bbs, lastcatchbbid)->opnum : 0;
    582                 assert(lastcatchbbid != BBID_INVALID);
    583 #ifdef ZEND_ENGINE_2_5
    584                 op_array->try_catch_array[try_catch_offset].finally_op = lastfinallybbid != BBID_INVALID ? bbs_get(bbs, lastfinallybbid)->opnum : 0;
    585 #endif
    586             }
    587             lasttrybbid   = i;
     585    for (bbid = 0; bbid < bbs_count(bbs); bbid ++) {
     586        bb_t *bb = bbs_get(bbs, bbid);
     587
     588        if (lastcatchbbid != bb->catch
     589#ifdef ZEND_ENGINE_2_5
     590         || lastfinallybbid != bb->finally
     591#endif
     592        ) {
     593            if (bb->catch != BBID_INVALID
     594#ifdef ZEND_ENGINE_2_5
     595             && bb->finally != BBID_INVALID
     596#endif
     597            ) {
     598                int try_op = bbs_get(bbs, bbid)->opnum;
     599                int catch_op = bbs_get(bbs, bb->catch)->opnum;
     600#ifdef ZEND_ENGINE_2_5
     601                int finally_op = bbs_get(bbs, bb->finally)->opnum;
     602#endif
     603
     604                zend_bool already_in_try_catch = 0;
     605                zend_uint j;
     606
     607                for (j = 0; j < op_array->last_try_catch; ++j) {
     608                    zend_try_catch_element *element = &op_array->try_catch_array[j];
     609                    if (try_op >= element->try_op && try_op < element->catch_op
     610                     && catch_op == element->catch_op
     611#ifdef ZEND_ENGINE_2_5
     612                     && finally_op == element->finally_op
     613#endif
     614                    ) {
     615                        already_in_try_catch = 1;
     616                        break;
     617                    }
     618                }
     619                if (!already_in_try_catch) {
     620                    int try_catch_offset = op_array->last_try_catch ++;
     621
     622                    op_array->try_catch_array = erealloc(op_array->try_catch_array, sizeof(zend_try_catch_element) * op_array->last_try_catch);
     623                    op_array->try_catch_array[try_catch_offset].try_op = try_op;
     624                    op_array->try_catch_array[try_catch_offset].catch_op = catch_op;
     625#ifdef ZEND_ENGINE_2_5
     626                    op_array->try_catch_array[try_catch_offset].finally_op = finally_op;
     627#endif
     628                }
     629            }
     630            lasttrybbid   = bbid;
    588631            lastcatchbbid = bb->catch;
    589632#ifdef ZEND_ENGINE_2_5
     
    608651
    609652#ifdef XCACHE_DEBUG
    610     xc_fix_opcode(op_array TSRMLS_CC);
    611 #   if 0
    612653    TRACE("optimize file: %s", op_array->filename);
     654#   if 0 && HAVE_XCACHE_DPRINT
    613655    xc_dprint_zend_op_array(op_array, 0 TSRMLS_CC);
    614656#   endif
     657    op_array_print_try_catch(op_array TSRMLS_CC);
    615658    op_print(op_array, 0, op_array->opcodes, op_array->opcodes + op_array->last);
    616659#endif
     
    634677
    635678#ifdef XCACHE_DEBUG
     679    TRACE("%s", "after compiles");
    636680#   if 0
    637     TRACE("%s", "after compiles");
    638681    xc_dprint_zend_op_array(op_array, 0 TSRMLS_CC);
    639682#   endif
     683    op_array_print_try_catch(op_array TSRMLS_CC);
    640684    op_print(op_array, 0, op_array->opcodes, op_array->opcodes + op_array->last);
    641     xc_undo_fix_opcode(op_array TSRMLS_CC);
    642685#endif
    643686    return 0;
Note: See TracChangeset for help on using the changeset viewer.