Changeset 1284


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

PHP_5_5: optimizer: support for finally

Location:
trunk
Files:
2 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; 
  • trunk/xcache.c

    r1281 r1284  
    207207/* {{{ proto bool  xcache_dprint(mixed value) 
    208208   Prints variable (or value) internal struct (debug only) */ 
     209#include "xc_processor.h" 
    209210PHP_FUNCTION(xcache_dprint) 
    210211{ 
     
    809810    xcache_zend_extension_add(&xc_zend_extension_entry, 1); 
    810811#ifdef HAVE_XCACHE_OPTIMIZER 
    811 #   ifndef ZEND_ENGINE_2_5 
    812812    xc_optimizer_startup_module(); 
    813 #   endif 
    814813#endif 
    815814#ifdef HAVE_XCACHE_CACHER 
Note: See TracChangeset for help on using the changeset viewer.