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


Ignore:
Timestamp:
2012-06-26T17:27:35Z (3 years ago)
Author:
Xuefer
Message:

arKey should be NULL for numeric index

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/processor/hashtable.m4

    r930 r932  
    55        dnl {{{ dasm
    66        IFDASM(`
    7             Bucket *b;
     7            const Bucket *srcBucket;
    88            zval *zv;
    99            int bufsize = 2;
     
    3434
    3535            DISABLECHECK(`
    36             for (b = src->pListHead; b != NULL; b = b->pListNext) {
     36            for (srcBucket = src->pListHead; srcBucket != NULL; srcBucket = srcBucket->pListNext) {
    3737                ALLOC_INIT_ZVAL(zv);
    3838                array_init(zv);
    39                 FUNC_NAME (dasm, zv, (($2*)b->pData) TSRMLS_CC);
    40                 keysize = BUCKET_KEY_SIZE(b) + 2;
     39                FUNC_NAME (dasm, zv, (($2*)srcBucket->pData) TSRMLS_CC);
     40                keysize = BUCKET_KEY_SIZE(srcBucket) + 2;
    4141                if (keysize > bufsize) {
    4242                    do {
     
    4545                    buf = erealloc(buf, bufsize);
    4646                }
    47                 memcpy(buf, BUCKET_KEY_S(b), keysize);
     47                memcpy(buf, BUCKET_KEY_S(srcBucket), keysize);
    4848                buf[keysize - 2] = buf[keysize - 1] = ""[0];
    49                 keysize = b->nKeyLength;
     49                keysize = srcBucket->nKeyLength;
    5050#ifdef IS_UNICODE
    51                 if (BUCKET_KEY_TYPE(b) == IS_UNICODE) {
     51                if (BUCKET_KEY_TYPE(srcBucket) == IS_UNICODE) {
    5252                    if (buf[0] == ""[0] && buf[1] == ""[0]) {
    5353                        keysize ++;
     
    6060                    }
    6161                }
    62                 add_u_assoc_zval_ex(dst, BUCKET_KEY_TYPE(b), ZSTR(buf), keysize, zv);
     62                add_u_assoc_zval_ex(dst, BUCKET_KEY_TYPE(srcBucket), ZSTR(buf), keysize, zv);
    6363            }
    6464            ')
     
    6767        ', `
    6868        dnl }}}
    69         Bucket *b, *pnew = NULL, *prev = NULL;
     69        Bucket *srcBucket;
     70        Bucket *pnew = NULL, *prev = NULL;
    7071        zend_bool first = 1;
    7172        dnl only used for copy
     
    9495        DONE(arBuckets)
    9596        DISABLECHECK(`
    96         for (b = src->pListHead; b != NULL; b = b->pListNext) {
     97        for (srcBucket = src->pListHead; srcBucket != NULL; srcBucket = srcBucket->pListNext) {
    9798            ifelse($4, `', `', `
    98                 pushdef(`BUCKET', `b')
     99                pushdef(`BUCKET', `srcBucket')
    99100                if ($4 == ZEND_HASH_APPLY_REMOVE) {
    100101                    IFCOPY(`dst->nNumOfElements --;')
     
    104105            ')
    105106
    106             IFCALCCOPY(`bucketsize = BUCKET_SIZE(b);')
     107            IFCALCCOPY(`bucketsize = BUCKET_SIZE(srcBucket);')
    107108            ALLOC(pnew, char, bucketsize, , Bucket)
    108109            IFCOPY(`
    109110#ifdef ZEND_ENGINE_2_4
    110             memcpy(pnew, b, BUCKET_HEAD_SIZE(Bucket));
    111             memcpy((char *) (pnew + 1), b->arKey, BUCKET_KEY_SIZE(b));
    112             pnew->arKey = (const char *) (pnew + 1);
     111            memcpy(pnew, srcBucket, BUCKET_HEAD_SIZE(Bucket));
     112            if (BUCKET_KEY_SIZE(srcBucket)) {
     113                memcpy((char *) (pnew + 1), srcBucket->arKey, BUCKET_KEY_SIZE(srcBucket));
     114                pnew->arKey = (const char *) (pnew + 1);
     115            }
     116            else {
     117                pnew->arKey = NULL;
     118            }
    113119#else
    114             memcpy(pnew, b, bucketsize);
    115     #endif
     120            memcpy(pnew, srcBucket, bucketsize);
     121#endif
    116122            ')
    117123            IFCOPY(`
    118                 n = b->h & src->nTableMask;
     124                n = srcBucket->h & src->nTableMask;
    119125                /* pnew into hash node chain */
    120126                pnew->pLast = NULL;
     
    128134                INDENT()
    129135                fprintf(stderr, "$2:\"");
    130                 xc_dprint_str_len(BUCKET_KEY_S(b), BUCKET_KEY_SIZE(b));
    131                 fprintf(stderr, "\" %d:h=%lu ", BUCKET_KEY_SIZE(b), b->h);
     136                xc_dprint_str_len(BUCKET_KEY_S(srcBucket), BUCKET_KEY_SIZE(srcBucket));
     137                fprintf(stderr, "\" %d:h=%lu ", BUCKET_KEY_SIZE(srcBucket), srcBucket->h);
    132138            ')
    133139            if (sizeof(void *) == sizeof($2)) {
    134140                IFCOPY(`pnew->pData = &pnew->pDataPtr;')
    135141                dnl no alloc
    136                 STRUCT_P_EX(`$2', pnew->pData, (($2*)b->pData), `', `$3', ` ')
     142                STRUCT_P_EX(`$2', pnew->pData, (($2*)srcBucket->pData), `', `$3', ` ')
    137143            }
    138144            else {
    139                 STRUCT_P_EX(`$2', pnew->pData, (($2*)b->pData), `', `$3')
     145                STRUCT_P_EX(`$2', pnew->pData, (($2*)srcBucket->pData), `', `$3')
    140146                IFCOPY(`pnew->pDataPtr = NULL;')
    141147            }
Note: See TracChangeset for help on using the changeset viewer.