Ignore:
Timestamp:
2013-11-05T18:17:07+01:00 (10 months ago)
Author:
moo
Message:

adds ptrmove

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/processor/hashtable.m4

    r1416 r1440  
    1 dnl DEF_HASH_TABLE_FUNC(1:name, 2:datatype [, 3:dataname] [, 4:check_function]) 
     1dnl DEF_HASH_TABLE_FUNC(1:name, 2:datatype [, 3:dataname]) 
    22define(`DEF_HASH_TABLE_FUNC', ` 
    33    DEF_STRUCT_P_FUNC(`HashTable', `$1', ` 
     
    1111            int keysize; 
    1212 
    13 #if defined(HARDENING_PATCH_HASH_PROTECT) && HARDENING_PATCH_HASH_PROTECT 
    14             DONE(canary) 
    15 #endif 
    16             DONE(nTableSize) 
    17             DONE(nTableMask) 
    18             DONE(nNumOfElements) 
    19             DONE(nNextFreeElement) 
    20             DONE(pInternalPointer) 
    21             DONE(pListHead) 
    22             DONE(pListTail) 
    23             DONE(arBuckets) 
    24             DONE(pDestructor) 
    25             DONE(persistent) 
    26             DONE(nApplyCount) 
    27             DONE(bApplyProtection) 
    28 #if ZEND_DEBUG 
    29             DONE(inconsistent) 
    30 #endif 
    31 #ifdef IS_UNICODE 
    32             DONE(unicode) 
    33 #endif 
     13            define(`AUTOCHECK_SKIP') 
     14            IFAUTOCHECK(`xc_autocheck_skip = 1;') 
    3415 
    3516            DISABLECHECK(` 
     
    6546 
    6647            efree(buf); 
    67         ', ` 
     48        ', ` dnl IFDASM else 
    6849        dnl }}} 
    6950        Bucket *srcBucket; 
    70         IFCOPY(`Bucket *pnew = NULL, *prev = NULL;') 
     51        IFCOPY(`Bucket *dstBucket = NULL, *prev = NULL;') 
    7152        zend_bool first = 1; 
    7253        dnl only used for copy 
     
    9273        DONE(arBuckets) 
    9374        DISABLECHECK(` 
    94         for (srcBucket = SRC(`pListHead'); srcBucket != NULL; srcBucket = srcBucket->pListNext) { 
    95             ifelse($4, `', `', ` 
    96                 pushdef(`BUCKET', `srcBucket') 
    97                 if ($4 == ZEND_HASH_APPLY_REMOVE) { 
    98                     IFCOPY(`DST(`nNumOfElements') --;') 
    99                     continue; 
    100                 } 
    101                 popdef(`BUCKET') 
    102             ') 
    103  
     75        for (srcBucket = SRCPTR(`Bucket', `pListHead'); srcBucket != NULL; srcBucket = SRCPTR_EX(`Bucket', `srcBucket->pListNext')) { 
     76            IFPTRMOVE(`Bucket *dstBucket = srcBucket;') 
    10477            IFCALCCOPY(`bucketsize = BUCKET_SIZE(srcBucket);') 
    105             ALLOC(pnew, char, bucketsize, , Bucket) 
     78            ALLOC(dstBucket, char, bucketsize, , Bucket) 
    10679            IFCOPY(` 
    10780#ifdef ZEND_ENGINE_2_4 
    108                 memcpy(pnew, srcBucket, BUCKET_HEAD_SIZE(Bucket)); 
     81                memcpy(dstBucket, srcBucket, BUCKET_HEAD_SIZE(Bucket)); 
    10982                if (BUCKET_KEY_SIZE(srcBucket)) { 
    110                     memcpy((char *) (pnew + 1), srcBucket->arKey, BUCKET_KEY_SIZE(srcBucket)); 
    111                     pnew->arKey = (const char *) (pnew + 1); 
     83                    memcpy((char *) (dstBucket + 1), srcBucket->arKey, BUCKET_KEY_SIZE(srcBucket)); 
     84                    dstBucket->arKey = (const char *) (dstBucket + 1); 
    11285                } 
    11386                else { 
    114                     pnew->arKey = NULL; 
     87                    dstBucket->arKey = NULL; 
    11588                } 
    11689#else 
    117                 memcpy(pnew, srcBucket, bucketsize); 
     90                memcpy(dstBucket, srcBucket, bucketsize); 
    11891#endif 
    11992                n = srcBucket->h & SRC(`nTableMask'); 
    120                 /* pnew into hash node chain */ 
    121                 pnew->pLast = NULL; 
    122                 pnew->pNext = DST(`arBuckets[n]'); 
    123                 if (pnew->pNext) { 
    124                     pnew->pNext->pLast = pnew; 
     93                /* dstBucket into hash node chain */ 
     94                dstBucket->pLast = NULL; 
     95                dstBucket->pNext = DST(`arBuckets[n]'); 
     96                if (dstBucket->pNext) { 
     97                    dstBucket->pNext->pLast = dstBucket; 
    12598                } 
    126                 DST(`arBuckets[n]') = pnew; 
    12799            ') 
    128100            IFDPRINT(` 
     
    133105            ') 
    134106            if (sizeof(void *) == sizeof($2)) { 
    135                 IFCOPY(`pnew->pData = &pnew->pDataPtr;') 
    136                 dnl no alloc 
    137                 STRUCT_P_EX(`$2', pnew->pData, (($2*)srcBucket->pData), `', `$3', ` ') 
     107                IFCOPY(`dstBucket->pData = &dstBucket->pDataPtr;') 
     108                dnl $6 = `' to skip alloc 
     109                STRUCT_P_EX(`$2', dstBucket->pData, (($2*)srcBucket->pData), `', `$3', ` ') 
     110                FIXPOINTER_EX(`$2', dstBucket->pData, srcBucket->pData) 
    138111            } 
    139112            else { 
    140                 STRUCT_P_EX(`$2', pnew->pData, (($2*)srcBucket->pData), `', `$3') 
    141                 IFCOPY(`pnew->pDataPtr = NULL;') 
     113                STRUCT_P_EX(`$2', dstBucket->pData, (($2*)srcBucket->pData), `', `$3') 
     114                IFCOPY(`dstBucket->pDataPtr = NULL;') 
    142115            } 
    143116 
    144117            if (first) { 
    145                 IFCOPY(`DST(`pListHead') = pnew;') 
     118                IFCOPY(`DST(`pListHead') = dstBucket;') 
    146119                first = 0; 
    147120            } 
     
    149122            IFCOPY(` 
    150123                /* flat link */ 
    151                 pnew->pListLast = prev; 
    152                 pnew->pListNext = NULL; 
     124                dstBucket->pListLast = prev; 
     125                dstBucket->pListNext = NULL; 
    153126                if (prev) { 
    154                     prev->pListNext = pnew; 
     127                    prev->pListNext = dstBucket; 
    155128                } 
    156                 prev = pnew; 
     129                prev = dstBucket; 
     130            ') 
     131            FIXPOINTER_EX(`Bucket', `dstBucket', `srcBucket') 
     132            IFCOPY(` 
     133                DST(`arBuckets[n]') = dstBucket; 
    157134            ') 
    158135        } 
    159         ') 
    160         dnl TODO: fix pointer on arBuckets[n] 
     136        ') dnl DISABLECHECK 
    161137        FIXPOINTER(Bucket *, arBuckets) 
    162138#ifdef ZEND_ENGINE_2_4 
     
    166142    } 
    167143#endif 
    168         IFCOPY(`DST(`pListTail') = pnew;') DONE(pListTail) 
     144        IFCOPY(`DST(`pListTail') = dstBucket;') DONE(pListTail) 
    169145        IFCOPY(`DST(`pDestructor') = SRC(`pDestructor');') DONE(pDestructor) 
    170146        PROCESS(zend_bool, persistent) 
Note: See TracChangeset for help on using the changeset viewer.