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


Ignore:
Timestamp:
2013-11-05T18:17:07+01:00 (20 months ago)
Author:
Xuefer
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.