source: branches/3.0/processor/hashtable.m4 @ 1356

Last change on this file since 1356 was 1356, checked in by moo, 11 months ago

processor: merge [1352] from trunk: fix warning

  • Property svn:eol-style set to native
File size: 4.6 KB
RevLine 
[196]1dnl DEF_HASH_TABLE_FUNC(1:name, 2:datatype [, 3:dataname] [, 4:check_function])
[1]2define(`DEF_HASH_TABLE_FUNC', `
3    DEF_STRUCT_P_FUNC(`HashTable', `$1', `
4        pushdefFUNC_NAME(`$2', `$3')
5        dnl {{{ dasm
6        IFDASM(`
[932]7            const Bucket *srcBucket;
[1]8            zval *zv;
9            int bufsize = 2;
10            char *buf = emalloc(bufsize);
11            int keysize;
12
[50]13#if defined(HARDENING_PATCH_HASH_PROTECT) && HARDENING_PATCH_HASH_PROTECT
14            DONE(canary)
15#endif
[1]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
34
35            DISABLECHECK(`
[932]36            for (srcBucket = src->pListHead; srcBucket != NULL; srcBucket = srcBucket->pListNext) {
[1]37                ALLOC_INIT_ZVAL(zv);
38                array_init(zv);
[932]39                FUNC_NAME (dasm, zv, (($2*)srcBucket->pData) TSRMLS_CC);
40                keysize = BUCKET_KEY_SIZE(srcBucket) + 2;
[1]41                if (keysize > bufsize) {
42                    do {
43                        bufsize *= 2;
44                    } while (keysize > bufsize);
45                    buf = erealloc(buf, bufsize);
46                }
[932]47                memcpy(buf, BUCKET_KEY_S(srcBucket), keysize);
[1]48                buf[keysize - 2] = buf[keysize - 1] = ""[0];
[932]49                keysize = srcBucket->nKeyLength;
[1]50#ifdef IS_UNICODE
[932]51                if (BUCKET_KEY_TYPE(srcBucket) == IS_UNICODE) {
[1]52                    if (buf[0] == ""[0] && buf[1] == ""[0]) {
53                        keysize ++;
54                    }
55                } else
56#endif
57                {
58                    if (buf[0] == ""[0]) {
59                        keysize ++;
60                    }
61                }
[932]62                add_u_assoc_zval_ex(dst, BUCKET_KEY_TYPE(srcBucket), ZSTR(buf), keysize, zv);
[1]63            }
64            ')
65
66            efree(buf);
67        ', `
68        dnl }}}
[932]69        Bucket *srcBucket;
[1356]70        IFCOPY(`Bucket *pnew = NULL, *prev = NULL;')
[1]71        zend_bool first = 1;
72        dnl only used for copy
73        IFCOPY(`uint n;')
[1201]74        IFCALCCOPY(`size_t bucketsize;')
[1]75
[50]76#if defined(HARDENING_PATCH_HASH_PROTECT) && HARDENING_PATCH_HASH_PROTECT
[58]77        IFASM(`dst->canary = zend_hash_canary; DONE(canary)', `
78        dnl elseif
79            IFRESTORE(`dst->canary = zend_hash_canary; DONE(canary)', `
80                dnl else
[843]81                PROCESS(unsigned int, canary)
[58]82            ')
83        ')
[50]84#endif
[843]85        PROCESS(uint, nTableSize)
86        PROCESS(uint, nTableMask)
87        PROCESS(uint, nNumOfElements)
88        PROCESS(ulong, nNextFreeElement)
[1]89        IFCOPY(`dst->pInternalPointer = NULL;   /* Used for element traversal */') DONE(pInternalPointer)
90        IFCOPY(`dst->pListHead = NULL;') DONE(pListHead)
[824]91#ifdef ZEND_ENGINE_2_4
92        if (src->nTableMask) {
93#endif
[1]94        CALLOC(dst->arBuckets, Bucket*, src->nTableSize)
95        DONE(arBuckets)
96        DISABLECHECK(`
[932]97        for (srcBucket = src->pListHead; srcBucket != NULL; srcBucket = srcBucket->pListNext) {
[232]98            ifelse($4, `', `', `
[932]99                pushdef(`BUCKET', `srcBucket')
[196]100                if ($4 == ZEND_HASH_APPLY_REMOVE) {
101                    IFCOPY(`dst->nNumOfElements --;')
102                    continue;
103                }
104                popdef(`BUCKET')
[284]105            ')
106
[932]107            IFCALCCOPY(`bucketsize = BUCKET_SIZE(srcBucket);')
[1]108            ALLOC(pnew, char, bucketsize, , Bucket)
109            IFCOPY(`
[823]110#ifdef ZEND_ENGINE_2_4
[1356]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                }
[823]119#else
[1356]120                memcpy(pnew, srcBucket, bucketsize);
[932]121#endif
122                n = srcBucket->h & src->nTableMask;
[1]123                /* pnew into hash node chain */
124                pnew->pLast = NULL;
[822]125                pnew->pNext = dst->arBuckets[n];
126                if (pnew->pNext) {
[1]127                    pnew->pNext->pLast = pnew;
128                }
129                dst->arBuckets[n] = pnew;
130            ')
[230]131            IFDPRINT(`
132                INDENT()
133                fprintf(stderr, "$2:\"");
[932]134                xc_dprint_str_len(BUCKET_KEY_S(srcBucket), BUCKET_KEY_SIZE(srcBucket));
135                fprintf(stderr, "\" %d:h=%lu ", BUCKET_KEY_SIZE(srcBucket), srcBucket->h);
[230]136            ')
[1]137            if (sizeof(void *) == sizeof($2)) {
138                IFCOPY(`pnew->pData = &pnew->pDataPtr;')
139                dnl no alloc
[932]140                STRUCT_P_EX(`$2', pnew->pData, (($2*)srcBucket->pData), `', `$3', ` ')
[1]141            }
142            else {
[932]143                STRUCT_P_EX(`$2', pnew->pData, (($2*)srcBucket->pData), `', `$3')
[1]144                IFCOPY(`pnew->pDataPtr = NULL;')
145            }
146
147            if (first) {
148                IFCOPY(`dst->pListHead = pnew;')
149                first = 0;
150            }
151
152            IFCOPY(`
153                /* flat link */
154                pnew->pListLast = prev;
155                pnew->pListNext = NULL;
156                if (prev) {
157                    prev->pListNext = pnew;
158                }
[1356]159                prev = pnew;
[1]160            ')
161        }
162        ')
[824]163#ifdef ZEND_ENGINE_2_4
164    }
165    else { /* if (src->nTableMask) */
166        DONE(arBuckets)
167    }
168#endif
[1]169        IFCOPY(`dst->pListTail = pnew;') DONE(pListTail)
170        IFCOPY(`dst->pDestructor = src->pDestructor;') DONE(pDestructor)
[843]171        PROCESS(zend_bool, persistent)
[1]172#ifdef IS_UNICODE
[843]173        PROCESS(zend_bool, unicode)
[1]174#endif
[843]175        PROCESS(unsigned char, nApplyCount)
176        PROCESS(zend_bool, bApplyProtection)
[1]177#if ZEND_DEBUG
[843]178        PROCESS(int, inconsistent)
[1]179#endif
180        ')dnl IFDASM
181        popdef(`FUNC_NAME')
182    ')
183')
Note: See TracBrowser for help on using the repository browser.