| 1 | define(`pushdefFUNC_NAME', ` |
|---|
| 2 | pushdef(`FUNC_NAME', `xc_`'KIND`'_`'ifelse(`$2', `', `$1', `$2')') |
|---|
| 3 | ') |
|---|
| 4 | |
|---|
| 5 | define(`DECL_STRUCT_P_FUNC', `translit( |
|---|
| 6 | pushdefFUNC_NAME(`$1', `$2') |
|---|
| 7 | define(`DEFINED_'ifelse(`$2', `', `$1', `$2'), `') |
|---|
| 8 | ifdef(`EXPORT_'ifelse(`$2', `', `$1', `$2'), `void', `static void inline') |
|---|
| 9 | FUNC_NAME`'( |
|---|
| 10 | IFDPRINT( `const $1 * const src, int indent') |
|---|
| 11 | IFCALC( `xc_processor_t *processor, const $1 * const src') |
|---|
| 12 | IFSTORE( `xc_processor_t *processor, $1 *dst, const $1 * const src') |
|---|
| 13 | IFRESTORE(`xc_processor_t *processor, $1 *dst, const $1 * const src') |
|---|
| 14 | IFDASM( `zval *dst, const $1 * const src') |
|---|
| 15 | IFASM( `$1 *dst, const $1 * const src') |
|---|
| 16 | TSRMLS_DC |
|---|
| 17 | )ifelse(`$3', `', `;') |
|---|
| 18 | popdef(`FUNC_NAME') |
|---|
| 19 | , ` |
|---|
| 20 | ', ` ')') |
|---|
| 21 | |
|---|
| 22 | |
|---|
| 23 | define(`DEF_STRUCT_P_FUNC', ` |
|---|
| 24 | pushdefFUNC_NAME(`$1', `$2') |
|---|
| 25 | /* {`{'{ FUNC_NAME */ |
|---|
| 26 | ifdef(`EXPORT_'ifelse(`$2', `', `$1', `$2'), ` |
|---|
| 27 | /* export: DECL_STRUCT_P_FUNC(`$1', `$2') :export */ |
|---|
| 28 | ') |
|---|
| 29 | DECL_STRUCT_P_FUNC(`$1', `$2', 1) |
|---|
| 30 | { |
|---|
| 31 | pushdef(`ELEMENTS_DONE') |
|---|
| 32 | ifdef(`SIZEOF_$1', , `m4_errprint(`AUTOCHECK WARN: $1: missing structinfo, dont panic')define(`SIZEOF_$1', 0)') |
|---|
| 33 | IFASSERT(` |
|---|
| 34 | /* {{{ 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)') |
|---|
| 37 | |
|---|
| 38 | ifdef(`SIZEOF_$1', ` |
|---|
| 39 | ifdef(`COUNTOF_$1', , `m4_errprint(`AUTOCHECK WARN: missing COUNTOF_$1')') |
|---|
| 40 | ', ` |
|---|
| 41 | define(`SIZEOF_$1', 0) |
|---|
| 42 | ') |
|---|
| 43 | ifdef(`COUNTOF_$1', ` |
|---|
| 44 | ifdef(`SIZEOF_$1', , `m4_errprint(`AUTOCHECK WARN: missing SIZEOF_$1')') |
|---|
| 45 | ', ` |
|---|
| 46 | define(`COUNTOF_$1', 0) |
|---|
| 47 | ') |
|---|
| 48 | int assert_size = SIZEOF_$1, assert_count = COUNTOF_$1; |
|---|
| 49 | int done_size = 0, done_count = 0; |
|---|
| 50 | /* }}} */ |
|---|
| 51 | IFRESTORE(`assert(xc_is_shm(src));') |
|---|
| 52 | IFCALCSTORE(`assert(!xc_is_shm(src));') |
|---|
| 53 | do { |
|---|
| 54 | ') |
|---|
| 55 | |
|---|
| 56 | ifdef(`USEMEMCPY', `IFCOPY(` |
|---|
| 57 | memcpy(dst, src, sizeof($1)); |
|---|
| 58 | do { |
|---|
| 59 | ')') |
|---|
| 60 | |
|---|
| 61 | IFDPRINT(` |
|---|
| 62 | fprintf(stderr, "%s", " {\n"); |
|---|
| 63 | indent ++; |
|---|
| 64 | ') |
|---|
| 65 | $3`' |
|---|
| 66 | IFDPRINT(` |
|---|
| 67 | indent --; |
|---|
| 68 | INDENT()fprintf(stderr, "}\n"); |
|---|
| 69 | ') |
|---|
| 70 | ifdef(`SKIPASSERT_ONCE', `undefine(`SKIPASSERT_ONCE')', ` |
|---|
| 71 | IFASSERT(` |
|---|
| 72 | /* {{{ check assert */ |
|---|
| 73 | if (done_count != assert_count) { |
|---|
| 74 | fprintf(stderr |
|---|
| 75 | , "count assertion failed at %s ` |
|---|
| 76 | , __FILE__, __LINE__ |
|---|
| 77 | , done_count, assert_count, done_count - assert_count |
|---|
| 78 | ); |
|---|
| 79 | abort(); |
|---|
| 80 | } |
|---|
| 81 | if (done_size != assert_size) { |
|---|
| 82 | fprintf(stderr |
|---|
| 83 | , "size assertion failed at %s ` |
|---|
| 84 | , __FILE__, __LINE__ |
|---|
| 85 | , done_size, assert_size, done_size - assert_size |
|---|
| 86 | ); |
|---|
| 87 | abort(); |
|---|
| 88 | } |
|---|
| 89 | /* }}} */ |
|---|
| 90 | ') |
|---|
| 91 | ifdef(`ELEMENTSOF_$1', ` |
|---|
| 92 | pushdef(`ELEMENTS_UNDONE', LIST_DIFF(defn(`ELEMENTSOF_$1'), defn(`ELEMENTS_DONE'))) |
|---|
| 93 | ifelse(defn(`ELEMENTS_UNDONE'), , `m4_errprint(`AUTOCHECK INFO: $1: processor looks good')', ` |
|---|
| 94 | m4_errprint(`AUTOCHECK ERROR: ====' KIND `$1 =================') |
|---|
| 95 | m4_errprint(`AUTOCHECK expected:' defn(`ELEMENTSOF_$1')) |
|---|
| 96 | m4_errprint(`AUTOCHECK missing :' defn(`ELEMENTS_UNDONE')) |
|---|
| 97 | define(`EXIT_PENDING', 1) |
|---|
| 98 | ') |
|---|
| 99 | popdef(`ELEMENTS_UNDONE') |
|---|
| 100 | ') |
|---|
| 101 | ') |
|---|
| 102 | ifdef(`USEMEMCPY', `IFCOPY(` |
|---|
| 103 | } while (0); |
|---|
| 104 | ')') |
|---|
| 105 | IFASSERT(` |
|---|
| 106 | } while (0); |
|---|
| 107 | ') |
|---|
| 108 | popdef(`ELEMENTS_DONE') |
|---|
| 109 | } |
|---|
| 110 | /* }`}'} */ |
|---|
| 111 | popdef(`FUNC_NAME') |
|---|
| 112 | ') |
|---|
| 113 | |
|---|
| 114 | |
|---|
| 115 | define(`STRUCT_P_EX', ` |
|---|
| 116 | DBG(`$0($*)') |
|---|
| 117 | pushdefFUNC_NAME(`$1', `$5') |
|---|
| 118 | ifdef(`DEFINED_'ifelse(`$5', `', `$1', `$5'), `', `m4_errprint(`Unknown struct "'ifelse(`$5', `', `$1', `$5')`"')') |
|---|
| 119 | assert(sizeof($1) == sizeof(($6 $3)[0])); |
|---|
| 120 | ifelse(`$6', `', `ALLOC(`$2', `$1')') |
|---|
| 121 | IFDASM(`do { |
|---|
| 122 | zval *zv; |
|---|
| 123 | ALLOC_INIT_ZVAL(zv); |
|---|
| 124 | array_init(zv); |
|---|
| 125 | ') |
|---|
| 126 | FUNC_NAME`'( |
|---|
| 127 | IFDPRINT( ` $6 $3, indent') |
|---|
| 128 | IFCALC( `processor, $6 $3') |
|---|
| 129 | IFSTORE( `processor, $6 $2, $6 $3') |
|---|
| 130 | IFRESTORE(`processor, $6 $2, $6 $3') |
|---|
| 131 | IFDASM( `zv, $6 $3') |
|---|
| 132 | IFASM( `$6 $2, $6 $3') |
|---|
| 133 | TSRMLS_CC |
|---|
| 134 | ); |
|---|
| 135 | IFDASM(` |
|---|
| 136 | add_assoc_zval_ex(dst, ZEND_STRS("$4"), zv); |
|---|
| 137 | } while (0); |
|---|
| 138 | ') |
|---|
| 139 | popdef(`FUNC_NAME') |
|---|
| 140 | ifelse(`$6', , `FIXPOINTER_EX(`$1', `$2')') |
|---|
| 141 | ') |
|---|
| 142 | |
|---|
| 143 | |
|---|
| 144 | define(`STRUCT_P', ` |
|---|
| 145 | DBG(`$0($*)') |
|---|
| 146 | if (src->$2) { |
|---|
| 147 | STRUCT_P_EX(`$1', `dst->$2', `src->$2', `$2', `$3') |
|---|
| 148 | IFDPRINT(`INDENT()`'fprintf(stderr, "$1:$2");') |
|---|
| 149 | } |
|---|
| 150 | else { |
|---|
| 151 | COPYNULL_EX(`dst->$2', `$2') |
|---|
| 152 | IFDPRINT(`INDENT()`'fprintf(stderr, "$1:$2:\tNULL\n");') |
|---|
| 153 | } |
|---|
| 154 | DONE(`$2') |
|---|
| 155 | ') |
|---|
| 156 | |
|---|
| 157 | |
|---|
| 158 | define(`STRUCT', ` |
|---|
| 159 | DBG(`$0($*)') |
|---|
| 160 | assert(sizeof($1) == sizeof(src->$2)); |
|---|
| 161 | IFDPRINT(`INDENT()`'fprintf(stderr, "$1:$2");') |
|---|
| 162 | STRUCT_P_EX(`$1', `dst->$2', `src->$2', `$2', `$3', `&') |
|---|
| 163 | DONE(`$2') |
|---|
| 164 | ') |
|---|
| 165 | |
|---|
| 166 | |
|---|
| 167 | define(`STRUCT_ARRAY_I', ` |
|---|
| 168 | pushdef(`i', `ii') |
|---|
| 169 | STRUCT_ARRAY(`$1', `$2', `$3', `$4') |
|---|
| 170 | popdef(`i') |
|---|
| 171 | ') |
|---|
| 172 | |
|---|
| 173 | |
|---|
| 174 | define(`STRUCT_ARRAY', ` |
|---|
| 175 | if (src->$3) { |
|---|
| 176 | pushdefFUNC_NAME(`$2', `$4') |
|---|
| 177 | IFDASM(` |
|---|
| 178 | zval *arr; |
|---|
| 179 | ALLOC_INIT_ZVAL(arr); |
|---|
| 180 | array_init(arr); |
|---|
| 181 | for (i = 0; i < src->$1; i ++) { |
|---|
| 182 | zval *zv; |
|---|
| 183 | |
|---|
| 184 | ALLOC_INIT_ZVAL(zv); |
|---|
| 185 | array_init(zv); |
|---|
| 186 | FUNC_NAME (zv, &(src->$3[i]) TSRMLS_CC); |
|---|
| 187 | add_next_index_zval(arr, zv); |
|---|
| 188 | } |
|---|
| 189 | add_assoc_zval_ex(dst, ZEND_STRS("$3"), arr); |
|---|
| 190 | ', ` |
|---|
| 191 | ALLOC(`dst->$3', `$2', `src->$1') |
|---|
| 192 | ifdef(`AFTER_ALLOC', AFTER_ALLOC) |
|---|
| 193 | for (i = 0; i < src->$1; i ++) { |
|---|
| 194 | DISABLECHECK(` |
|---|
| 195 | ifdef(`BEFORE_LOOP', `BEFORE_LOOP') |
|---|
| 196 | STRUCT(`$2', `$3[i]', `$4') |
|---|
| 197 | ') |
|---|
| 198 | } |
|---|
| 199 | ') |
|---|
| 200 | DONE(`$3') |
|---|
| 201 | popdef(`FUNC_NAME') |
|---|
| 202 | } |
|---|
| 203 | else { |
|---|
| 204 | COPYNULL(`$3') |
|---|
| 205 | ifdef(`AFTER_ALLOC', AFTER_ALLOC) |
|---|
| 206 | } |
|---|
| 207 | ') |
|---|
| 208 | |
|---|