source: trunk/processor/hashtable.m4 @ 930

Last change on this file since 930 was 930, checked in by moo, 2 years ago

fix disassembler for 2.4 literal

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