source: trunk/processor/hashtable.m4 @ 1416

Last change on this file since 1416 was 1416, checked in by moo, 13 months ago

remove asm from processor, it just cant be implemented in processor

  • Property svn:eol-style set to native
File size: 4.6 KB
Line 
1dnl DEF_HASH_TABLE_FUNC(1:name, 2:datatype [, 3:dataname] [, 4:check_function])
2define(`DEF_HASH_TABLE_FUNC', `
3    DEF_STRUCT_P_FUNC(`HashTable', `$1', `
4        pushdefFUNC_NAME(`$2', `$3')
5        dnl {{{ dasm
6        IFDASM(`
7            const Bucket *srcBucket;
8            zval *zv;
9            int bufsize = 2;
10            char *buf = emalloc(bufsize);
11            int keysize;
12
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
34
35            DISABLECHECK(`
36            for (srcBucket = SRC(`pListHead'); srcBucket != NULL; srcBucket = srcBucket->pListNext) {
37                ALLOC_INIT_ZVAL(zv);
38                array_init(zv);
39                FUNC_NAME (dasm, zv, (($2*)srcBucket->pData) TSRMLS_CC);
40                keysize = BUCKET_KEY_SIZE(srcBucket) + 2;
41                if (keysize > bufsize) {
42                    do {
43                        bufsize *= 2;
44                    } while (keysize > bufsize);
45                    buf = erealloc(buf, bufsize);
46                }
47                memcpy(buf, BUCKET_KEY_S(srcBucket), keysize);
48                buf[keysize - 2] = buf[keysize - 1] = ""[0];
49                keysize = srcBucket->nKeyLength;
50#ifdef IS_UNICODE
51                if (BUCKET_KEY_TYPE(srcBucket) == IS_UNICODE) {
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                }
62                add_u_assoc_zval_ex(dst, BUCKET_KEY_TYPE(srcBucket), ZSTR(buf), keysize, zv);
63            }
64            ')
65
66            efree(buf);
67        ', `
68        dnl }}}
69        Bucket *srcBucket;
70        IFCOPY(`Bucket *pnew = NULL, *prev = NULL;')
71        zend_bool first = 1;
72        dnl only used for copy
73        IFCOPY(`uint n;')
74        IFCALCCOPY(`size_t bucketsize;')
75
76#if defined(HARDENING_PATCH_HASH_PROTECT) && HARDENING_PATCH_HASH_PROTECT
77        IFRESTORE(`DST(`canary') = zend_hash_canary; DONE(canary)', `
78            dnl else
79            PROCESS(unsigned int, canary)
80        ')
81#endif
82        PROCESS(uint, nTableSize)
83        PROCESS(uint, nTableMask)
84        PROCESS(uint, nNumOfElements)
85        PROCESS(ulong, nNextFreeElement)
86        IFCOPY(`DST(`pInternalPointer') = NULL; /* Used for element traversal */') DONE(pInternalPointer)
87        IFCOPY(`DST(`pListHead') = NULL;') DONE(pListHead)
88#ifdef ZEND_ENGINE_2_4
89    if (SRC(`nTableMask')) {
90#endif
91        CALLOC(`DST(`arBuckets')', Bucket*, SRC(`nTableSize'))
92        DONE(arBuckets)
93        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
104            IFCALCCOPY(`bucketsize = BUCKET_SIZE(srcBucket);')
105            ALLOC(pnew, char, bucketsize, , Bucket)
106            IFCOPY(`
107#ifdef ZEND_ENGINE_2_4
108                memcpy(pnew, srcBucket, BUCKET_HEAD_SIZE(Bucket));
109                if (BUCKET_KEY_SIZE(srcBucket)) {
110                    memcpy((char *) (pnew + 1), srcBucket->arKey, BUCKET_KEY_SIZE(srcBucket));
111                    pnew->arKey = (const char *) (pnew + 1);
112                }
113                else {
114                    pnew->arKey = NULL;
115                }
116#else
117                memcpy(pnew, srcBucket, bucketsize);
118#endif
119                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;
125                }
126                DST(`arBuckets[n]') = pnew;
127            ')
128            IFDPRINT(`
129                INDENT()
130                fprintf(stderr, "$2:\"");
131                xc_dprint_str_len(BUCKET_KEY_S(srcBucket), BUCKET_KEY_SIZE(srcBucket));
132                fprintf(stderr, "\" %d:h=%lu ", BUCKET_KEY_SIZE(srcBucket), srcBucket->h);
133            ')
134            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', ` ')
138            }
139            else {
140                STRUCT_P_EX(`$2', pnew->pData, (($2*)srcBucket->pData), `', `$3')
141                IFCOPY(`pnew->pDataPtr = NULL;')
142            }
143
144            if (first) {
145                IFCOPY(`DST(`pListHead') = pnew;')
146                first = 0;
147            }
148
149            IFCOPY(`
150                /* flat link */
151                pnew->pListLast = prev;
152                pnew->pListNext = NULL;
153                if (prev) {
154                    prev->pListNext = pnew;
155                }
156                prev = pnew;
157            ')
158        }
159        ')
160        dnl TODO: fix pointer on arBuckets[n]
161        FIXPOINTER(Bucket *, arBuckets)
162#ifdef ZEND_ENGINE_2_4
163    }
164    else { /* if (SRC(`nTableMask')) */
165        DONE(arBuckets)
166    }
167#endif
168        IFCOPY(`DST(`pListTail') = pnew;') DONE(pListTail)
169        IFCOPY(`DST(`pDestructor') = SRC(`pDestructor');') DONE(pDestructor)
170        PROCESS(zend_bool, persistent)
171#ifdef IS_UNICODE
172        PROCESS(zend_bool, unicode)
173#endif
174        PROCESS(unsigned char, nApplyCount)
175        PROCESS(zend_bool, bApplyProtection)
176#if ZEND_DEBUG
177        PROCESS(int, inconsistent)
178#endif
179        ')dnl IFDASM
180        popdef(`FUNC_NAME')
181    ')
182')
Note: See TracBrowser for help on using the repository browser.