Changeset 719 in svn


Ignore:
Timestamp:
2011-04-09T10:22:14Z (4 years ago)
Author:
Xuefer
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.