Changeset 837 in svn


Ignore:
Timestamp:
2012-03-25T02:14:44Z (3 years ago)
Author:
Xuefer
Message:

PHP_5_4: improves traits support

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/mkstructinfo.awk

    r719 r837  
    55    incomment = 0;
    66    buffer_len = 0;
     7}
     8function printstruct(structname) {
     9    printf "define(`ELEMENTSOF_%s', `%s')\n", structname, ELEMENTSOF[structname];
     10    printf "define(`COUNTOF_%s', `%s')\n", structname, COUNTOF[structname];
     11    printf "define(`SIZEOF_%s', `(  %s  )')\n", structname, SIZEOF[structname];
    712}
    813
     
    3540    if (instruct) {
    3641        sub(";", "");
    37         if (instruct == 1 && $2) {
    38             instruct = $2;
     42        structname = instruct;
     43        if (structname == 1 && $2) {
     44            structname = $2;
    3945        }
    40         if (instruct in typedefs) {
    41             instruct = typedefs[instruct];
     46        if (structname in typedefs) {
     47            structname = typedefs[structname];
    4248        }
    4349        sizeinfo = "";
     
    4753                sizeinfo = sizeinfo " + ";
    4854            }
    49             sizeinfo = sizeinfo "sizeof(((" instruct "*)NULL)->" buffer[i] ")";
     55            sizeinfo = sizeinfo "sizeof(((" structname "*)NULL)->" buffer[i] ")";
    5056
    5157            if (i == 0) {
     
    5662            }
    5763        }
    58         printf "define(`ELEMENTSOF_%s', `%s')\n", instruct, elms;
    59         printf "define(`COUNTOF_%s', `%s')\n", instruct, i;
    60         printf "define(`SIZEOF_%s', `(  %s  )')\n", instruct, sizeinfo;
     64        ELEMENTSOF[structname] = elms;
     65        COUNTOF[structname]    = i;
     66        SIZEOF[structname]     = sizeinfo;
     67        printstruct(structname);
    6168        print "\n";
    6269        for (i in buffer) {
     
    149156/^typedef struct [^{]*;/ {
    150157    sub(";", "");
    151     typedefs[$3] = $4;
     158    typename=$3;
     159    newtypename=$4;
     160    typedefs[typename] = newtypename;
     161    if (ELEMENTSOF[typename]) {
     162        ELEMENTSOF[newtypename] = ELEMENTSOF[typename];
     163        COUNTOF[newtypename]    = COUNTOF[typename];
     164        sub(/.*/, SIZEOF[typename]);
     165        gsub(typename, newtypename);
     166        SIZEOF[newtypename]     = $0;
     167        printstruct(newtypename);
     168    }
    152169    next;
    153170}
  • trunk/processor/main.m4

    r836 r837  
    181181    IFDASM(`add_assoc_null_ex(dst, ZEND_STRS("$2"));')
    182182    IFNOTMEMCPY(`IFCOPY(`$1 = NULL;')')
     183    assert(patsubst($1, dst, src) == NULL);
    183184')
    184185dnl }}}
  • trunk/processor/processor.m4

    r833 r837  
    1616/* }}} */
    1717dnl ====================================================
    18 dnl {{{ zend_compiled_variable
    1918#ifdef IS_CV
    20 DEF_STRUCT_P_FUNC(`zend_compiled_variable', , `
     19DEF_STRUCT_P_FUNC(`zend_compiled_variable', , `dnl {{{
    2120    DISPATCH(int, name_len)
    2221    PROC_ZSTRING_L(, name, name_len)
    2322    DISPATCH(ulong, hash_value)
    2423')
    25 #endif
    26 dnl }}}
    27 dnl {{{ zend_uint
    28 DEF_STRUCT_P_FUNC(`zend_uint', , `
     24dnl }}}
     25#endif
     26DEF_STRUCT_P_FUNC(`zend_uint', , `dnl {{{
    2927    IFCOPY(`dst[0] = src[0];')
    3028    IFDPRINT(`
     
    3533')
    3634dnl }}}
    37 dnl {{{ int
    3835#ifndef ZEND_ENGINE_2
    39 DEF_STRUCT_P_FUNC(`int', , `
     36DEF_STRUCT_P_FUNC(`int', , `dnl {{{
    4037    IFCOPY(`*dst = *src;')
    4138    IFDPRINT(`
     
    4542    DONE_SIZE(sizeof(src[0]))
    4643')
    47 #endif
    48 dnl }}}
    49 dnl {{{ zend_try_catch_element
    50 #ifdef ZEND_ENGINE_2
    51 DEF_STRUCT_P_FUNC(`zend_try_catch_element', , `
     44dnl }}}
     45#endif
     46#ifdef ZEND_ENGINE_2
     47DEF_STRUCT_P_FUNC(`zend_try_catch_element', , `dnl {{{
    5248    DISPATCH(zend_uint, try_op)
    5349    DISPATCH(zend_uint, catch_op)
    5450')
    55 #endif /* ifdef ZEND_ENGINE_2 */
    56 dnl }}}
    57 dnl {{{ zend_brk_cont_element
    58 DEF_STRUCT_P_FUNC(`zend_brk_cont_element', , `
     51dnl }}}
     52#endif
     53DEF_STRUCT_P_FUNC(`zend_brk_cont_element', , `dnl {{{
    5954#ifdef ZEND_ENGINE_2_2
    6055    DISPATCH(int, start)
     
    227222')
    228223dnl }}}
    229 dnl {{{ zend_arg_info
    230 #ifdef ZEND_ENGINE_2
    231 DEF_STRUCT_P_FUNC(`zend_arg_info', , `
     224#ifdef ZEND_ENGINE_2
     225DEF_STRUCT_P_FUNC(`zend_arg_info', , `dnl {{{
    232226    DISPATCH(zend_uint, name_len)
    233227    PROC_ZSTRING_L(, name, name_len)
     
    246240#endif
    247241')
    248 #endif
    249 dnl }}}
     242dnl }}}
     243#endif
    250244#ifdef HAVE_XCACHE_CONSTANT
    251245DEF_STRUCT_P_FUNC(`zend_constant', , `dnl {{{
     
    281275')
    282276dnl }}}
    283 dnl {{{ zend_property_info
    284 #ifdef ZEND_ENGINE_2
    285 DEF_STRUCT_P_FUNC(`zend_property_info', , `
     277#ifdef ZEND_ENGINE_2
     278DEF_STRUCT_P_FUNC(`zend_property_info', , `dnl {{{
    286279    DISPATCH(zend_uint, flags)
    287280    DISPATCH(int, name_length)
     
    300293#endif
    301294')
    302 #endif
    303 dnl }}}
     295dnl }}}
     296#endif
     297#ifdef ZEND_ENGINE_2_4
     298DEF_STRUCT_P_FUNC(`zend_trait_method_reference', , `dnl {{{
     299    DISPATCH(unsigned int, mname_len)
     300    PROC_STRING_L(method_name, mname_len)
     301    COPYNULL(ce)
     302    DISPATCH(unsigned int, cname_len)
     303    PROC_STRING_L(class_name, cname_len)
     304')
     305dnl }}}
     306DEF_STRUCT_P_FUNC(`zend_trait_alias', , `dnl {{{
     307    STRUCT_P(zend_trait_method_reference, trait_method)
     308    DISPATCH(unsigned int, alias_len)
     309    PROC_STRING_L(alias, alias_len)
     310    DISPATCH(zend_uint, modifiers)
     311    COPYNULL(function)
     312')
     313dnl }}}
     314DEF_STRUCT_P_FUNC(`zend_trait_precedence', , `dnl {{{
     315    STRUCT_P(zend_trait_method_reference, trait_method)
     316    COPYNULL(exclude_from_classes)
     317    COPYNULL(function)
     318')
     319dnl }}}
     320DEF_STRUCT_P_FUNC(`zend_trait_alias_ptr', , `dnl {{{
     321    IFDASM(`
     322        pushdefFUNC_NAME(`zend_trait_alias')
     323        FUNC_NAME (dst, src[0] TSRMLS_CC);
     324        popdef(`FUNC_NAME')
     325    ', `
     326        ALLOC(dst[0], zend_trait_alias)
     327        STRUCT_P_EX(zend_trait_alias, dst[0], src[0], `[0]', `', ` ')
     328        FIXPOINTER_EX(zend_trait_alias, dst[0])
     329    ')
     330    DONE_SIZE(sizeof(zend_trait_alias))
     331')
     332dnl }}}
     333DEF_STRUCT_P_FUNC(`zend_trait_precedence_ptr', , `dnl {{{
     334    IFDASM(`
     335        pushdefFUNC_NAME(`zend_trait_precedence')
     336        FUNC_NAME (dst, src[0] TSRMLS_CC);
     337        popdef(`FUNC_NAME')
     338    ', `
     339        ALLOC(dst[0], zend_trait_precedence)
     340        STRUCT_P_EX(zend_trait_precedence, dst[0], src[0], `[0]', `', ` ')
     341        FIXPOINTER_EX(zend_trait_precedence, dst[0])
     342    ')
     343    DONE_SIZE(sizeof(zend_trait_precedence))
     344')
     345dnl }}}
     346#endif
    304347DEF_STRUCT_P_FUNC(`zend_class_entry', , `dnl {{{
    305348    IFCALCCOPY(`
     
    359402    STRUCT(HashTable, constants_table, HashTable_zval_ptr)
    360403
     404#ifdef ZEND_ENGINE_2_2
    361405    dnl runtime binding: ADD_INTERFACE will deal with it
     406    COPYNULL(`interfaces')
     407    COPYNULL(`num_interfaces')
     408
     409#   ifdef ZEND_ENGINE_2_4
    362410    dnl runtime binding: ADD_TRAIT will deal with it
     411    COPYNULL(traits)
     412    COPYNULL(num_traits)
     413#   endif
     414#else
    363415    IFRESTORE(`
    364416        if (src->num_interfaces) {
     
    369421            COPYNULL(`interfaces')
    370422        }
    371 #   ifdef ZEND_ENGINE_2_4
    372         if (src->num_traits) {
    373             CALLOC(dst->traits, zend_class_entry*, src->num_traits)
    374             DONE(`traits')
    375             DONE(`trait_aliases')
    376             DONE(`trait_precedences')
    377         }
    378         else {
    379             COPYNULL(`traits')
    380             COPYNULL(`trait_aliases')
    381             COPYNULL(`trait_precedences')
    382         }
    383 #   endif
    384     ')
    385     IFDASM(`
    386         if (src->num_interfaces) {
    387             /*
    388             int i;
    389             zval *arr;
    390             ALLOC_INIT_ZVAL(arr);
    391             array_init(arr);
    392             for (i = 0; i < src->num_interfaces; i ++) {
    393                 zval *zv;
    394                 ALLOC_INIT_ZVAL(zv);
    395                 ZVAL_STRING(src->num_interfaces);
    396             }
    397             add_assoc_zval_ex(dst, ZEND_STRS("interfaces"), arr);
    398             */
    399             DONE(`interfaces')
    400         }
    401         else {
    402             COPYNULL(`interfaces')
    403         }
    404 #   ifdef ZEND_ENGINE_2_4
    405         if (src->num_traits) {
    406             DONE(`traits')
    407             DONE(`trait_aliases')
    408             DONE(`trait_precedences')
    409         }
    410         else {
    411             COPYNULL(`traits')
    412             COPYNULL(`trait_aliases')
    413             COPYNULL(`trait_precedences')
    414         }
    415 #   endif
    416     ')
    417     IFRESTORE(`', `
    418         IFDASM(`', `
    419             DONE(`interfaces')
    420 #   ifdef ZEND_ENGINE_2_4
    421             DONE(`traits')
    422             DONE(`trait_aliases')
    423             DONE(`trait_precedences')
    424 #   endif
    425         ')
     423    ', `
     424        DONE(`interfaces')
    426425    ')
    427426    DISPATCH(zend_uint, num_interfaces)
    428 #   ifdef ZEND_ENGINE_2_4
    429     DISPATCH(zend_uint, num_traits)
    430 #   endif
     427#endif
     428    STRUCT_ARRAY(, zend_trait_alias_ptr, trait_aliases)
     429    STRUCT_ARRAY(, zend_trait_precedence_ptr, trait_precedences)
    431430
    432431#   ifdef ZEND_ENGINE_2_4
     
    11391138')
    11401139dnl }}}
    1141 dnl {{{ xc_entry_t
    1142 DEF_STRUCT_P_FUNC(`xc_entry_t', , `
     1140DEF_STRUCT_P_FUNC(`xc_entry_t', , `dnl {{{
    11431141    DISPATCH(xc_entry_type_t, type)
    11441142    DISPATCH(size_t, size)
Note: See TracChangeset for help on using the changeset viewer.