Changeset 719 for trunk


Ignore:
Timestamp:
2011-04-09T12:22:14+02:00 (4 years ago)
Author:
moo
Message:

runtime check for field list assertion to tell which is mismatch

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/mkstructinfo.awk

    r393 r719  
    5050 
    5151            if (i == 0) { 
    52                 elms = buffer[i]; 
     52                elms = "\"" buffer[i] "\""; 
    5353            } 
    5454            else { 
    55                 elms = elms "," buffer[i]; 
     55                elms = elms "," "\"" buffer[i] "\""; 
    5656            } 
    5757        } 
  • trunk/processor/head.m4

    r690 r719  
    306306} 
    307307/* }}} */ 
     308/* {{{ field name checker */ 
     309IFASSERT(`dnl 
     310int xc_check_names(const char *file, int line, const char *functionName, const char **assert_names, int assert_names_count, HashTable *done_names) 
     311{ 
     312    int errors = 0; 
     313    if (assert_names_count) { 
     314        int i; 
     315        Bucket *b; 
     316 
     317        for (i = 0; i < assert_names_count; ++i) { 
     318            if (!zend_hash_exists(done_names, assert_names[i], strlen(assert_names[i]) + 1)) { 
     319                fprintf(stderr 
     320                    , "missing field at %s `#'%d %s`' : %s\n" 
     321                    , file, line, functionName 
     322                    , assert_names[i] 
     323                    ); 
     324                ++errors; 
     325            } 
     326        } 
     327 
     328        for (b = done_names->pListHead; b != NULL; b = b->pListNext) { 
     329            int known = 0; 
     330            int i; 
     331            for (i = 0; i < assert_names_count; ++i) { 
     332                if (strcmp(assert_names[i], BUCKET_KEY_S(b)) == 0) { 
     333                    known = 1; 
     334                    break; 
     335                } 
     336            } 
     337            if (!known) { 
     338                fprintf(stderr 
     339                    , "unknown field at %s `#'%d %s`' : %s\n" 
     340                    , file, line, functionName 
     341                    , BUCKET_KEY_S(b) 
     342                    ); 
     343                ++errors; 
     344            } 
     345        } 
     346    } 
     347    return errors; 
     348} 
     349') 
     350/* }}} */ 
    308351dnl ================ export API 
    309352define(`DEFINE_STORE_API', ` 
  • trunk/processor/main.m4

    r715 r719  
    206206dnl }}} 
    207207dnl {{{ DONE_* 
    208 define(`DONE_SIZE', `IFASSERT(` 
     208define(`DONE_SIZE', `IFASSERT(`dnl 
    209209    done_size += $1`'; 
    210210    done_count ++; 
    211211')') 
    212212define(`DONE', ` 
    213     define(`ELEMENTS_DONE', defn(`ELEMENTS_DONE')`,$1') 
     213    define(`ELEMENTS_DONE', defn(`ELEMENTS_DONE')`,"$1"') 
     214    IFASSERT(`dnl 
     215        if (zend_hash_exists(&done_names, "$1", sizeof("$1"))) { 
     216            fprintf(stderr 
     217                , "duplicate field at %s `#'%d FUNC_NAME`' : %s\n" 
     218                , __FILE__, __LINE__ 
     219                , "$1" 
     220                ); 
     221        } 
     222        else { 
     223            zend_uchar b = 1; 
     224            zend_hash_add(&done_names, "$1", sizeof("$1"), (void*)&b, sizeof(b), NULL); 
     225        } 
     226    ') 
    214227    DONE_SIZE(`sizeof(src->$1)') 
    215228') 
  • trunk/processor/struct.m4

    r662 r719  
    3030    { 
    3131        pushdef(`ELEMENTS_DONE') 
    32         ifdef(`SIZEOF_$1', , `m4_errprint(`AUTOCHECK WARN: $1: missing structinfo, dont panic')define(`SIZEOF_$1', 0)') 
    3332        IFASSERT(` 
    3433            /* {{{ init assert */ 
    35             ifdef(`SIZEOF_$1', , `m4_errprint(`missing SIZEOF_$1, safe to ignore')define(`SIZEOF_$1', 0)') 
    36             ifdef(`COUNTOF_$1', , `m4_errprint(`missing COUNTOF_$1, safe to ignore')define(`COUNTOF_$1', 0)') 
     34            ifdef(`SIZEOF_$1', , `m4_errprint(`missing SIZEOF_$1, safe to ignore')') 
     35            ifdef(`COUNTOF_$1', , `m4_errprint(`missing COUNTOF_$1, safe to ignore'))') 
    3736            dnl SIZEOF_x COUNTOF_x can be both defined or both not 
    3837            ifdef(`SIZEOF_$1', ` 
     
    4847            int assert_size = SIZEOF_$1, assert_count = COUNTOF_$1; 
    4948            int done_size = 0, done_count = 0; 
     49            const char *assert_names[] = { ifdef(`ELEMENTSOF_$1', `ELEMENTSOF_$1') }; 
     50            HashTable done_names; 
     51            zend_hash_init(&done_names, 0, NULL, NULL, 0); 
    5052            /* }}} */ 
    5153            IFRESTORE(`assert(xc_is_shm(src));') 
     
    5355            do { 
    5456        ') 
     57        ifdef(`SIZEOF_$1', , `m4_errprint(`AUTOCHECK WARN: $1: missing structinfo, dont panic')') 
    5558 
    5659        ifdef(`USEMEMCPY', `IFCOPY(` 
     
    6871            INDENT()fprintf(stderr, "}\n"); 
    6972        ') 
    70         ifdef(`SKIPASSERT_ONCE', `undefine(`SKIPASSERT_ONCE')', ` 
     73        ifdef(`SKIPASSERT_ONCE', ` 
     74            undefine(`SKIPASSERT_ONCE') 
    7175            IFASSERT(` 
    72                 /* {{{ check assert */ 
     76                zend_hash_destroy(&done_names); 
     77            ') 
     78        ', ` 
     79            IFASSERT(` 
     80            /* {{{ check assert */ do { 
     81                int name_check_errors = xc_check_names(__FILE__, __LINE__, "FUNC_NAME", assert_names, sizeof(assert_names) / sizeof(assert_names[0]), &done_names); 
     82                zend_hash_destroy(&done_names); 
     83 
    7384                if (done_count != assert_count) { 
    7485                    fprintf(stderr 
     
    8596                        ); 
    8697                } 
    87                 if (done_count != assert_count || done_size != assert_size) { 
     98                if (name_check_errors || done_count != assert_count || done_size != assert_size) { 
    8899                    assert(0); 
    89100                } 
    90                 /* }}} */ 
     101            } while (0); /* }}} */ 
    91102            ') 
    92103            ifdef(`ELEMENTSOF_$1', ` 
Note: See TracChangeset for help on using the changeset viewer.