source: trunk/processor/hashtable.m4 @ 1459

Last change on this file since 1459 was 1459, checked in by moo, 9 months ago

ws fix

  • Property svn:eol-style set to native
File size: 4.3 KB
Line 
1dnl DEF_HASH_TABLE_FUNC(1:name, 2:datatype [, 3:dataname])
2define(`DEF_HASH_TABLE_FUNC', `DEF_STRUCT_P_FUNC(`HashTable', `$1', `
3    pushdefFUNC_NAME(`$2', `$3')
4    dnl {{{ dasm
5    IFDASM(`
6        const Bucket *srcBucket;
7        zval *zv;
8        int bufsize = 2;
9        char *buf = emalloc(bufsize);
10        int keysize;
11
12        define(`AUTOCHECK_SKIP')
13        IFAUTOCHECK(`xc_autocheck_skip = 1;')
14
15        DISABLECHECK(`
16        for (srcBucket = SRC(`pListHead'); srcBucket != NULL; srcBucket = srcBucket->pListNext) {
17            ALLOC_INIT_ZVAL(zv);
18            array_init(zv);
19            FUNC_NAME (dasm, zv, (($2*)srcBucket->pData) TSRMLS_CC);
20            keysize = BUCKET_KEY_SIZE(srcBucket) + 2;
21            if (keysize > bufsize) {
22                do {
23                    bufsize *= 2;
24                } while (keysize > bufsize);
25                buf = erealloc(buf, bufsize);
26            }
27            memcpy(buf, BUCKET_KEY_S(srcBucket), keysize);
28            buf[keysize - 2] = buf[keysize - 1] = ""[0];
29            keysize = srcBucket->nKeyLength;
30#ifdef IS_UNICODE
31            if (BUCKET_KEY_TYPE(srcBucket) == IS_UNICODE) {
32                if (buf[0] == ""[0] && buf[1] == ""[0]) {
33                    keysize ++;
34                }
35            } else
36#endif
37            {
38                if (buf[0] == ""[0]) {
39                    keysize ++;
40                }
41            }
42            add_u_assoc_zval_ex(dst, BUCKET_KEY_TYPE(srcBucket), ZSTR(buf), keysize, zv);
43        }
44        ')
45
46        efree(buf);
47    ', ` dnl IFDASM else
48    dnl }}}
49    Bucket *srcBucket;
50    IFCOPY(`Bucket *dstBucket = NULL, *prev = NULL;')
51    zend_bool first = 1;
52    dnl only used for copy
53    IFCOPY(`uint n;')
54    IFCALCCOPY(`size_t bucketsize;')
55
56#if defined(HARDENING_PATCH_HASH_PROTECT) && HARDENING_PATCH_HASH_PROTECT
57    IFRESTORE(`
58        DST(`canary') = zend_hash_canary;
59        DONE(canary)
60    ', `
61        PROCESS(unsigned int, canary)
62    ')
63#endif
64    PROCESS(uint, nTableSize)
65    PROCESS(uint, nTableMask)
66    PROCESS(uint, nNumOfElements)
67    PROCESS(ulong, nNextFreeElement)
68    IFCOPY(`DST(`pInternalPointer') = NULL; /* Used for element traversal */') DONE(pInternalPointer)
69    IFCOPY(`DST(`pListHead') = NULL;') DONE(pListHead)
70#ifdef ZEND_ENGINE_2_4
71    if (SRC(`nTableMask')) {
72#endif
73        CALLOC(`DST(`arBuckets')', Bucket*, SRC(`nTableSize'))
74        DONE(arBuckets)
75        DISABLECHECK(`
76        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)
79            IFCOPY(`
80#ifdef ZEND_ENGINE_2_4
81                memcpy(dstBucket, srcBucket, BUCKET_HEAD_SIZE(Bucket));
82                if (BUCKET_KEY_SIZE(srcBucket)) {
83                    memcpy((char *) (dstBucket + 1), srcBucket->arKey, BUCKET_KEY_SIZE(srcBucket));
84                    dstBucket->arKey = (const char *) (dstBucket + 1);
85                }
86                else {
87                    dstBucket->arKey = NULL;
88                }
89#else
90                memcpy(dstBucket, srcBucket, bucketsize);
91#endif
92                n = srcBucket->h & SRC(`nTableMask');
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;
98                }
99            ')
100            IFDPRINT(`
101                INDENT()
102                fprintf(stderr, "$2:\"");
103                xc_dprint_str_len(BUCKET_KEY_S(srcBucket), BUCKET_KEY_SIZE(srcBucket));
104                fprintf(stderr, "\" %d:h=%lu ", BUCKET_KEY_SIZE(srcBucket), srcBucket->h);
105            ')
106            if (sizeof(void *) == sizeof($2)) {
107                IFCOPY(`dstBucket->pData = &dstBucket->pDataPtr;')
108                IFRELOCATE(`srcBucket->pData = &srcBucket->pDataPtr;')
109                dnl $6 = ` ' to skip alloc, skip pointer fix
110                STRUCT_P_EX(`$2', dstBucket->pData, (($2*)srcBucket->pData), `', `$3', ` ')
111                FIXPOINTER_EX(`$2', dstBucket->pData)
112            }
113            else {
114                STRUCT_P_EX(`$2', dstBucket->pData, (($2*)srcBucket->pData), `', `$3')
115                IFCOPY(`dstBucket->pDataPtr = NULL;')
116            }
117
118            if (first) {
119                IFCOPY(`DST(`pListHead') = dstBucket;')
120                first = 0;
121            }
122
123            IFCOPY(`
124                /* flat link */
125                dstBucket->pListLast = prev;
126                dstBucket->pListNext = NULL;
127                if (prev) {
128                    prev->pListNext = dstBucket;
129                }
130                prev = dstBucket;
131            ')
132            FIXPOINTER_EX(`Bucket', `dstBucket')
133            IFCOPY(`
134                DST(`arBuckets[n]') = dstBucket;
135            ')
136        }
137        ') dnl DISABLECHECK
138        FIXPOINTER(Bucket *, arBuckets)
139#ifdef ZEND_ENGINE_2_4
140    }
141    else { /* if (SRC(`nTableMask')) */
142        DONE(arBuckets)
143    }
144#endif
145    IFCOPY(`DST(`pListTail') = dstBucket;') DONE(pListTail)
146    IFCOPY(`DST(`pDestructor') = SRC(`pDestructor');') DONE(pDestructor)
147    PROCESS(zend_bool, persistent)
148#ifdef IS_UNICODE
149    PROCESS(zend_bool, unicode)
150#endif
151    PROCESS(unsigned char, nApplyCount)
152    PROCESS(zend_bool, bApplyProtection)
153#if ZEND_DEBUG
154    PROCESS(int, inconsistent)
155#endif
156    ')dnl IFDASM
157    popdef(`FUNC_NAME')
158')')
Note: See TracBrowser for help on using the repository browser.