Ignore:
Timestamp:
2013-11-09T03:17:15+01:00 (5 months ago)
Author:
moo
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.