Changeset 662 in svn for trunk/processor


Ignore:
Timestamp:
2009-08-03T08:15:53Z (10 years ago)
Author:
Xuefer
Message:

back patch __FILE and __DIR on cache restore

Location:
trunk/processor
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/processor/dispatch.m4

    r484 r662  
    2828    )
    2929')
     30dnl {{{ DISPATCH_ARRAY(1:count, 2:type, 3:elm)
     31define(`DISPATCH_ARRAY', `
     32    if (src->$3) {
     33        int i;
     34        IFDASM(`
     35            zval *arr;
     36            ALLOC_INIT_ZVAL(arr);
     37            array_init(arr);
     38            for (i = 0; i < src->$1; i ++) {
     39                ifelse(
     40                    `$2', `zend_bool', `add_assoc_bool_ex(arr, ZEND_STRS("$3"), src->$3[i] ? 1 : 0);'
     41                , `', `', `add_assoc_long_ex(arr, ZEND_STRS("$3"), src->$3[i]);')
     42            }
     43            add_assoc_zval_ex(dst, ZEND_STRS("$3"), arr);
     44        ', `
     45            COPY_N_EX($@)
     46            for (i = 0; i < src->$1; i ++) {
     47                DISABLECHECK(`
     48                    DISPATCH(`$2', `$3[i]', `$4')
     49                ')
     50            }
     51        ')dnl IFDASM
     52        DONE(`$3')
     53    }
     54    else {
     55        COPYNULL(`$3')
     56    }
     57')
     58dnl }}}
  • trunk/processor/head.m4

    r645 r662  
    6969    const xc_cache_t          *cache;
    7070    const zend_class_entry *cache_ce;
    71     zend_uint cache_class_num;
     71    zend_uint cache_class_index;
    7272
    7373    const zend_op          *active_opcodes_src;
     
    7575    const zend_class_entry *active_class_entry_src;
    7676    zend_class_entry       *active_class_entry_dst;
    77     zend_uint               active_class_num;
     77    zend_uint                 active_class_index;
     78    zend_uint                 active_op_array_index;
     79    const xc_op_array_info_t *active_op_array_infos_src;
    7880
    7981    zend_bool readonly_protection; /* wheather it's present */
     
    186188
    187189    if (processor->cache_ce == ce) {
    188         return processor->cache_class_num;
     190        return processor->cache_class_index + 1;
    189191    }
    190192    for (i = 0; i < php->classinfo_cnt; i ++) {
     
    192194        if (ZCEP_REFCOUNT_PTR(ceptr) == ZCEP_REFCOUNT_PTR(ce)) {
    193195            processor->cache_ce = ceptr;
    194             processor->cache_class_num = i + 1;
     196            processor->cache_class_index = i + 1;
    195197            return i + 1;
    196198        }
     
    199201    return (zend_ulong) -1;
    200202}
     203define(`xc_get_class_num', `xc_get_class_numNOTDEFINED')
    201204/* }}} */
    202205/* {{{ xc_get_class */
     
    204207static zend_class_entry *xc_get_class(xc_processor_t *processor, zend_ulong class_num) {
    205208    /* must be parent or currrent class */
    206     assert(class_num <= processor->active_class_num);
     209    assert(class_num <= processor->active_class_index + 1);
    207210    return CestToCePtr(processor->php_dst->classinfos[class_num - 1].cest);
    208211}
    209212#endif
     213define(`xc_get_class', `xc_get_classNOTDEFINED')
    210214/* }}} */
    211215#ifdef ZEND_ENGINE_2
  • trunk/processor/main.m4

    r569 r662  
    150150define(`COPY', `IFNOTMEMCPY(`IFCOPY(`dst->$1 = src->$1;')')DONE(`$1')')
    151151dnl }}}
     152dnl {{{ COPY_N_EX
     153define(`COPY_N_EX', `
     154    ALLOC(`dst->$3', `$2', `src->$1')
     155    IFCOPY(`
     156        memcpy(dst->$3, src->$3, sizeof(dst->$3[0]) * src->$1);
     157        ')
     158')
     159dnl }}}
     160dnl {{{ COPY_N
     161define(`COPY_N', `COPY_N_EX(`$1',`$2')DONE(`$1')')
     162dnl }}}
    152163dnl {{{ COPYPOINTER
    153164define(`COPYPOINTER', `COPY(`$1')')
    154165dnl }}}
     166dnl {{{ COPYARRAY_EX
     167define(`COPYARRAY_EX', `IFNOTMEMCPY(`IFCOPY(`memcpy(dst->$1, src->$1, sizeof(dst->$1));')')')
     168dnl }}}
    155169dnl {{{ COPYARRAY
    156 define(`COPYARRAY', `IFNOTMEMCPY(`IFCOPY(`memcpy(dst->$1, src->$1, sizeof(dst->$1));')')DONE(`$1')')
     170define(`COPYARRAY', `COPYARRAY_EX(`$1',`$2')DONE(`$1')')
    157171dnl }}}
    158172dnl {{{ SETNULL_EX
     
    244258define(`IFNOTMEMCPY', `ifdef(`USEMEMCPY', `', `$1')')
    245259REDEF(`KIND', `calc') include(srcdir`/processor/processor.m4')
     260pushdef(`xc_get_class_num', ``xc_get_class_num'($@)')
    246261REDEF(`KIND', `store') include(srcdir`/processor/processor.m4')
     262popdef(`xc_get_class_num')
     263pushdef(`xc_get_class', ``xc_get_class'($@)')
    247264REDEF(`KIND', `restore') include(srcdir`/processor/processor.m4')
     265popdef(`xc_get_class')
    248266
    249267REDEF(`IFNOTMEMCPY', `$1')
  • trunk/processor/processor.m4

    r648 r662  
    339339        if (src->num_interfaces) {
    340340            /*
     341            int i;
    341342            zval *arr;
    342343            ALLOC_INIT_ZVAL(arr);
     
    499500DEF_STRUCT_P_FUNC(`zend_op_array', , `dnl {{{
    500501    IFRESTORE(`
     502    const xc_op_array_info_t *op_array_info = &processor->active_op_array_infos_src[processor->active_op_array_index];
    501503    dnl shadow copy must NOT meet:
    502504    dnl readonly_protection=on
    503505    dnl main op_array && have early binding
    504     zend_uint ii;
    505506#ifdef ZEND_COMPILE_DELAYED_BINDING
    506507    zend_bool need_early_binding = 0;
     
    508509    zend_bool need_early_binding = processor->php_src->have_early_binding;
    509510#endif
    510     if (!processor->readonly_protection && !(src == processor->php_src->op_array && need_early_binding)) {
     511    zend_bool shallow_copy = !processor->readonly_protection && !(src == processor->php_src->op_array && need_early_binding);
     512    if (shallow_copy) {
     513        zend_bool gc_arg_info = 0;
     514        int gc_opcodes        = 0;
    511515        /* really fast shallow copy */
    512516        memcpy(dst, src, sizeof(src[0]));
     
    515519        STRUCT_P(HashTable, static_variables, HashTable_zval_ptr)
    516520#ifdef ZEND_ENGINE_2
    517         STRUCT_ARRAY_I(num_args, zend_arg_info, arg_info)
    518         xc_gc_add_op_array(dst TSRMLS_CC);
    519 #endif
     521        STRUCT_ARRAY(num_args, zend_arg_info, arg_info)
     522        gc_arg_info = 1;
     523#endif
     524        if (op_array_info->oplineinfo_cnt) {
     525            gc_opcodes = 1;
     526            COPY_N_EX(last, zend_op, opcodes)
     527        }
     528        if (gc_arg_info || gc_opcodes) {
     529            xc_gc_op_array_t gc_op_array;
     530#ifdef ZEND_ENGINE_2
     531            gc_op_array.num_args = gc_arg_info ? dst->num_args : 0;
     532            gc_op_array.arg_info = gc_arg_info ? dst->arg_info : NULL;
     533#endif
     534            gc_op_array.last     = gc_opcodes > 1 ? dst->last : 0;
     535            gc_op_array.opcodes  = gc_opcodes ? dst->opcodes : NULL;
     536            xc_gc_add_op_array(&gc_op_array TSRMLS_CC);
     537        }
    520538        define(`SKIPASSERT_ONCE')
    521539    }
     
    524542    do {
    525543    dnl RESTORE is done above!
    526     zend_uint ii;
    527     int i;
    528544
    529545    /* Common elements */
     
    532548#ifdef ZEND_ENGINE_2
    533549    DISPATCH(zend_uint, fn_flags)
    534     STRUCT_ARRAY_I(num_args, zend_arg_info, arg_info)
     550    STRUCT_ARRAY(num_args, zend_arg_info, arg_info)
    535551    DISPATCH(zend_uint, num_args)
    536552    DISPATCH(zend_uint, required_num_args)
     
    541557        IFCOPY(`memcpy(dst->arg_types, src->arg_types, sizeof(src->arg_types[0]) * (src->arg_types[0]+1));')
    542558        IFDASM(`do {
    543             zend_uint ii;
    544559            int i;
    545560            zval *zv;
     
    581596        processor->active_opcodes_src = src->opcodes;
    582597    ')')
    583     STRUCT_ARRAY_I(last, zend_op, opcodes)
     598    STRUCT_ARRAY(last, zend_op, opcodes)
    584599    popdef(`AFTER_ALLOC')
    585600    DISPATCH(zend_uint, last)
     
    599614    DISPATCH(zend_uint, T)
    600615
    601     STRUCT_ARRAY_I(last_brk_cont, zend_brk_cont_element, brk_cont_array)
     616    STRUCT_ARRAY(last_brk_cont, zend_brk_cont_element, brk_cont_array)
    602617    DISPATCH(zend_uint, last_brk_cont)
    603618    DISPATCH(zend_uint, current_brk_cont)
     
    649664#endif
    650665    } while (0);
     666    IFRESTORE(`xc_fix_op_array_info(processor->php_src, dst, !shallow_copy, op_array_info TSRMLS_CC);')
    651667
    652668#ifdef ZEND_ENGINE_2
     
    713729dnl }}}
    714730#endif
     731DEF_STRUCT_P_FUNC(`xc_op_array_info_t', , `dnl {{{
     732    DISPATCH(zend_uint, oplineinfo_cnt)
     733    DISPATCH_ARRAY(oplineinfo_cnt, int, oplineinfos)
     734')
     735dnl }}}
    715736DEF_STRUCT_P_FUNC(`xc_funcinfo_t', , `dnl {{{
    716737    DISPATCH(zend_uint, key_size)
     
    722743    ')
    723744    DISPATCH(ulong, h)
     745    IFRESTORE(`COPY(op_array_info)', `
     746        STRUCT(xc_op_array_info_t, op_array_info)
     747    ')
     748    IFRESTORE(`
     749        processor->active_op_array_infos_src = &dst->op_array_info;
     750        processor->active_op_array_index = 0;
     751    ')
    724752    STRUCT(zend_function, func)
    725753')
     
    734762    ')
    735763    DISPATCH(ulong, h)
     764    DISPATCH(zend_uint, methodinfo_cnt)
     765    IFRESTORE(`COPY(methodinfos)', `
     766        STRUCT_ARRAY(methodinfo_cnt, xc_op_array_info_t, methodinfos)
     767    ')
     768    IFRESTORE(`
     769        processor->active_op_array_infos_src = dst->methodinfos;
     770        processor->active_op_array_index = 0;
     771    ')
    736772#ifdef ZEND_ENGINE_2
    737773    STRUCT_P(zend_class_entry, cest)
     
    767803#endif
    768804DEF_STRUCT_P_FUNC(`xc_entry_data_php_t', , `dnl {{{
    769     zend_uint i;
    770 
    771805    IFCOPY(`
    772806        processor->php_dst = dst;
     
    785819    DISPATCH(size_t, size)
    786820
     821    DISPATCH(int, filepath_len)
     822    IFRESTORE(`COPY(filepath)', `PROC_STRING_L(filepath, filepath_len)')
     823    DISPATCH(int, dirpath_len)
     824    IFRESTORE(`COPY(dirpath)', `PROC_STRING_L(dirpath, dirpath_len)')
     825#ifdef IS_UNICODE
     826    DISPATCH(int, ufilepath_len)
     827    IFRESTORE(`COPY(ufilepath)', `PROC_USTRING_L(ufilepath, ufilepath_len)')
     828    DISPATCH(int, udirpath_len)
     829    IFRESTORE(`COPY(udirpath)', `PROC_USTRING_L(udirpath, udirpath_len)')
     830#endif
     831
     832    IFRESTORE(`COPY(op_array_info)', `
     833        STRUCT(xc_op_array_info_t, op_array_info)
     834    ')
     835    IFRESTORE(`
     836        processor->active_op_array_infos_src = &dst->op_array_info;
     837        processor->active_op_array_index = 0;
     838    ')
    787839    STRUCT_P(zend_op_array, op_array)
    788840
     
    796848
    797849    DISPATCH(zend_uint, classinfo_cnt)
    798     pushdef(`BEFORE_LOOP', `
    799         IFCOPY(`
    800             processor->active_class_num = i + 1;
    801         ')
    802     ')
    803     STRUCT_ARRAY(classinfo_cnt, xc_classinfo_t, classinfos)
    804     popdef(`BEFORE_LOOP')
     850    STRUCT_ARRAY(classinfo_cnt, xc_classinfo_t, classinfos, , IFRESTORE(`processor->active_class_index'))
    805851#ifdef ZEND_ENGINE_2_1
    806852    DISPATCH(zend_uint, autoglobal_cnt)
     
    879925        switch (src->type) {
    880926        case XC_TYPE_PHP:
    881             IFCALCCOPY(`DONE(data.php)', `STRUCT_P(xc_entry_data_php_t, data.php)')
     927            IFCALCCOPY(`COPY(data.php)', `STRUCT_P(xc_entry_data_php_t, data.php)')
    882928            break;
    883929
  • trunk/processor/string.m4

    r658 r662  
    77            STRTYPE, `zstr_char', `char',
    88            `',      `',          `UChar'))
    9     pushdef(`ISTYPE', ifelse(STRTYPE,`zstr_uchar',IS_UNICODE,IS_STRING))
     9    pushdef(`ISTYPE', ifelse(PTRTYPE,`UChar',IS_UNICODE,IS_STRING))
    1010    pushdef(`UNI_STRLEN', ifelse(
    1111            STRTYPE, `zstr_uchar', `xc_zstrlen_uchar',
    1212            STRTYPE, `zstr_char',  `xc_zstrlen_char',
    1313            `',      `',           `strlen'))
    14     pushdef(`SRCSTR', ifelse(STRTYPE,`char',`ZSTR($2)',`$2'))
     14    pushdef(`SRCSTR', ifelse(STRTYPE,`char',`ZSTR($2)',STRTYPE,`UChar',`ZSTR($2)',`$2'))
    1515    pushdef(`SRCPTR', ifelse(
    1616            STRTYPE, `zstr_uchar', `ZSTR_U($2)',
     
    8888dnl PROC_STRING_N(1:name, 2:size, 3:type)
    8989define(`PROC_STRING_N', `DBG(`$0($*)') DONE(`$1')`'PROC_STRING_N_EX(`dst->$1', `src->$1', `src->$2', `$1', `char')')
     90define(`PROC_USTRING_N', `DBG(`$0($*)') DONE(`$1')`'PROC_STRING_N_EX(`dst->$1', `src->$1', `src->$2', `$1', `UChar')')
    9091
    9192define(`PROC_STRING_L', `DBG(`$0($*)') PROC_STRING_N(`$1', `$2 + 1')')
     93define(`PROC_USTRING_L', `DBG(`$0($*)') PROC_USTRING_N(`$1', `$2 + 1')')
    9294define(`PROC_STRING',   `DBG(`$0($*)') DONE(`$1')`'PROC_STRING_N_EX(`dst->$1', `src->$1', `strlen(src->$1) + 1', `$1', `char')')
     95define(`PROC_USTRING',  `DBG(`$0($*)') DONE(`$1')`'PROC_STRING_N_EX(`dst->$1', `src->$1', `strlen(src->$1) + 1', `$1', `UChar')')
    9396
    9497dnl {{{ PROC_ZSTRING_N(1:type, 2:name, 3:size, 4:size_type)
  • trunk/processor/struct.m4

    r534 r662  
    165165')
    166166dnl }}}
    167 dnl {{{ STRUCT_ARRAY_I(1:count, 2:type, 3:elm, 4:name=type)
    168 define(`STRUCT_ARRAY_I', `
    169 pushdef(`i', `ii')
    170 STRUCT_ARRAY(`$1', `$2', `$3', `$4')
    171 popdef(`i')
    172 ')
    173 dnl }}}
    174 dnl {{{ STRUCT_ARRAY(1:count, 2:type, 3:elm, 4:name=type)
     167dnl {{{ STRUCT_ARRAY(1:count, 2:type, 3:elm, 4:name=type, 5:loopcounter)
    175168define(`STRUCT_ARRAY', `
    176169    if (src->$3) {
     170        ifelse(
     171            `$5', `', `int i; pushdef(`LOOPCOUNTER', `i')',
     172            `', `', `pushdef(`LOOPCOUNTER', `$5')')
    177173        pushdefFUNC_NAME(`$2', `$4')
    178174        IFDASM(`
     
    180176            ALLOC_INIT_ZVAL(arr);
    181177            array_init(arr);
    182             for (i = 0; i < src->$1; i ++) {
     178            for (LOOPCOUNTER = 0; LOOPCOUNTER < src->$1; LOOPCOUNTER ++) {
    183179                zval *zv;
    184180
    185181                ALLOC_INIT_ZVAL(zv);
    186182                array_init(zv);
    187                 FUNC_NAME (zv, &(src->$3[i]) TSRMLS_CC);
     183                FUNC_NAME (zv, &(src->$3[LOOPCOUNTER]) TSRMLS_CC);
    188184                add_next_index_zval(arr, zv);
    189185            }
     
    192188            ALLOC(`dst->$3', `$2', `src->$1')
    193189            ifdef(`AFTER_ALLOC', AFTER_ALLOC)
    194             for (i = 0; i < src->$1; i ++) {
     190            for (LOOPCOUNTER = 0; LOOPCOUNTER < src->$1; LOOPCOUNTER ++) {
    195191                DISABLECHECK(`
    196                     ifdef(`BEFORE_LOOP', `BEFORE_LOOP')
    197                     STRUCT(`$2', `$3[i]', `$4')
     192                    STRUCT(`$2', `$3[LOOPCOUNTER]', `$4')
    198193                ')
    199194            }
     
    201196        DONE(`$3')
    202197        popdef(`FUNC_NAME')
     198        popdef(`LOOPCOUNTER')
    203199    }
    204200    else {
Note: See TracChangeset for help on using the changeset viewer.