Changeset 1460 in svn for trunk/processor/hashtable.m4


Ignore:
Timestamp:
2013-11-09T03:17:15+01:00 (21 months ago)
Author:
Xuefer
Message:

relocate: fix handling hash table, TODO: fix dst/src stuff

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/processor/hashtable.m4

    r1459 r1460  
    4848    dnl }}}
    4949    Bucket *srcBucket;
    50     IFCOPY(`Bucket *dstBucket = NULL, *prev = NULL;')
    51     zend_bool first = 1;
     50    IFFIXPOINTER(`Bucket *next;')
     51    IFRELOCATE(`Bucket *dstBucket = NULL;')
     52    IFCOPY(`Bucket *dstBucket = NULL, *first = NULL, *last = NULL;')
    5253    dnl only used for copy
    5354    IFCOPY(`uint n;')
    54     IFCALCCOPY(`size_t bucketsize;')
     55    IFRELOCATE(`uint n;')
     56    IFCALCCOPY(`size_t bucketSize;')
    5557
    5658#if defined(HARDENING_PATCH_HASH_PROTECT) && HARDENING_PATCH_HASH_PROTECT
     
    6769    PROCESS(ulong, nNextFreeElement)
    6870    IFCOPY(`DST(`pInternalPointer') = NULL; /* Used for element traversal */') DONE(pInternalPointer)
    69     IFCOPY(`DST(`pListHead') = NULL;') DONE(pListHead)
    7071#ifdef ZEND_ENGINE_2_4
    7172    if (SRC(`nTableMask')) {
     
    7576        DISABLECHECK(`
    7677        for (srcBucket = SRCPTR_EX(`Bucket', SRC(`pListHead')); srcBucket != NULL; srcBucket = SRCPTR_EX(`Bucket', `srcBucket->pListNext')) {
    77             IFCALCCOPY(`bucketsize = BUCKET_SIZE(srcBucket);')
    78             ALLOC(dstBucket, char, bucketsize, , Bucket)
     78            IFCALCCOPY(`bucketSize = BUCKET_SIZE(srcBucket);')
     79            ALLOC(dstBucket, char, bucketSize, , Bucket)
    7980            IFCOPY(`
    8081#ifdef ZEND_ENGINE_2_4
     
    8889                }
    8990#else
    90                 memcpy(dstBucket, srcBucket, bucketsize);
     91                memcpy(dstBucket, srcBucket, bucketSize);
    9192#endif
    9293                n = srcBucket->h & SRC(`nTableMask');
     
    9899                }
    99100            ')
     101
    100102            IFDPRINT(`
    101103                INDENT()
     
    116118            }
    117119
    118             if (first) {
    119                 IFCOPY(`DST(`pListHead') = dstBucket;')
    120                 first = 0;
    121             }
     120            IFCOPY(`
     121                if (!first) {
     122                    first = dstBucket;
     123                }
    122124
    123             IFCOPY(`
    124125                /* flat link */
    125                 dstBucket->pListLast = prev;
     126                dstBucket->pListLast = last;
    126127                dstBucket->pListNext = NULL;
    127                 if (prev) {
    128                     prev->pListNext = dstBucket;
     128                if (last) {
     129                    last->pListNext = dstBucket;
    129130                }
    130                 prev = dstBucket;
    131             ')
    132             FIXPOINTER_EX(`Bucket', `dstBucket')
    133             IFCOPY(`
     131                last = dstBucket;
     132
     133                n = srcBucket->h & SRC(`nTableMask');
     134                /* dstBucket into hash node chain */
     135                dstBucket->pLast = NULL;
     136                dstBucket->pNext = DST(`arBuckets[n]');
     137                if (dstBucket->pNext) {
     138                    dstBucket->pNext->pLast = dstBucket;
     139                }
    134140                DST(`arBuckets[n]') = dstBucket;
    135141            ')
    136142        }
    137143        ') dnl DISABLECHECK
     144        IFCOPY(`DST(`pListHead') = first;') DONE(pListHead)
     145        IFCOPY(`DST(`pListTail') = dstBucket;') DONE(pListTail)
     146
     147        IFFIXPOINTER(`
     148        for (n = 0; n < SRC(`nTableSize'); ++n) {
     149            if (SRC(`arBuckets[n]')) {
     150                next = DSTPTR_EX(`Bucket', `DST(`arBuckets[n]')');
     151                do {
     152                        dstBucket = next;
     153                        next = DSTPTR_EX(`Bucket', `next->pNext');
     154                        if (dstBucket->pListLast) {
     155                            FIXPOINTER_EX(Bucket, dstBucket->pListLast)
     156                        }
     157                        if (dstBucket->pListNext) {
     158                            FIXPOINTER_EX(Bucket, dstBucket->pListNext)
     159                        }
     160                        if (dstBucket->pNext) {
     161                            FIXPOINTER_EX(Bucket, dstBucket->pNext)
     162                        }
     163                        if (dstBucket->pLast) {
     164                            FIXPOINTER_EX(Bucket, dstBucket->pLast)
     165                        }
     166                } while (next);
     167
     168                FIXPOINTER(Bucket, arBuckets[n])
     169            }
     170        }
     171        ')
     172        FIXPOINTER(Bucket, pListHead)
     173        FIXPOINTER(Bucket, pListTail)
    138174        FIXPOINTER(Bucket *, arBuckets)
    139175#ifdef ZEND_ENGINE_2_4
    140176    }
    141177    else { /* if (SRC(`nTableMask')) */
     178        IFCOPY(`DST(`pListHead') = NULL;') DONE(pListHead)
     179        IFCOPY(`DST(`pListTail') = NULL;') DONE(pListTail)
    142180        DONE(arBuckets)
    143181    }
    144182#endif
    145     IFCOPY(`DST(`pListTail') = dstBucket;') DONE(pListTail)
    146183    IFCOPY(`DST(`pDestructor') = SRC(`pDestructor');') DONE(pDestructor)
    147184    PROCESS(zend_bool, persistent)
Note: See TracChangeset for help on using the changeset viewer.