#define SET_INCONSISTENT(n)
#endif
-#define HASH_APPLY_BEGIN(ht) \
+#define HASH_PROTECT_RECURSION(ht) \
if ((ht)->bApplyProtection) { \
- if ((ht)->nApplyCount>=3) { \
- zend_error(E_WARNING, "Nesting level too deep - recursive dependency?"); \
- return; \
+ if ((ht)->nApplyCount++ >= 3) { \
+ zend_error(E_ERROR, "Nesting level too deep - recursive dependency?"); \
} \
- (ht)->nApplyCount++; \
}
-#define HASH_APPLY_END(ht) \
+
+#define HASH_UNPROTECT_RECURSION(ht) \
(ht)->nApplyCount--;
IS_CONSISTENT(ht);
- HASH_APPLY_BEGIN(ht);
+ HASH_PROTECT_RECURSION(ht);
p = ht->pListHead;
while (p != NULL) {
if (apply_func(p->pData)) {
p = p->pListNext;
}
}
- HASH_APPLY_END(ht);
+ HASH_UNPROTECT_RECURSION(ht);
}
IS_CONSISTENT(ht);
- HASH_APPLY_BEGIN(ht);
+ HASH_PROTECT_RECURSION(ht);
p = ht->pListHead;
while (p != NULL) {
if (apply_func(p->pData, argument)) {
p = p->pListNext;
}
}
- HASH_APPLY_END(ht);
+ HASH_UNPROTECT_RECURSION(ht);
}
IS_CONSISTENT(ht);
- HASH_APPLY_BEGIN(ht);
+ HASH_PROTECT_RECURSION(ht);
va_start(args, num_args);
p = ht->pListHead;
}
va_end(args);
- HASH_APPLY_END(ht);
+ HASH_UNPROTECT_RECURSION(ht);
}
IS_CONSISTENT(ht1);
IS_CONSISTENT(ht2);
+ HASH_PROTECT_RECURSION(ht1);
+ HASH_PROTECT_RECURSION(ht2);
+
result = ht1->nNumOfElements - ht2->nNumOfElements;
if (result!=0) {
+ HASH_UNPROTECT_RECURSION(ht1);
+ HASH_UNPROTECT_RECURSION(ht2);
return result;
}
while (p1) {
if (ordered && !p2) {
+ HASH_UNPROTECT_RECURSION(ht1);
+ HASH_UNPROTECT_RECURSION(ht2);
return 1; /* That's not supposed to happen */
}
if (ordered) {
if (p1->nKeyLength==0 && p2->nKeyLength==0) { /* numeric indices */
result = p1->h - p2->h;
if (result!=0) {
+ HASH_UNPROTECT_RECURSION(ht1);
+ HASH_UNPROTECT_RECURSION(ht2);
return result;
}
} else { /* string indices */
result = p1->nKeyLength - p2->nKeyLength;
if (result!=0) {
+ HASH_UNPROTECT_RECURSION(ht1);
+ HASH_UNPROTECT_RECURSION(ht2);
return result;
}
result = memcmp(p1->arKey, p2->arKey, p1->nKeyLength);
if (result!=0) {
+ HASH_UNPROTECT_RECURSION(ht1);
+ HASH_UNPROTECT_RECURSION(ht2);
return result;
}
}
} else {
if (p1->nKeyLength==0) { /* numeric index */
if (zend_hash_index_find(ht2, p1->h, &pData2)==FAILURE) {
+ HASH_UNPROTECT_RECURSION(ht1);
+ HASH_UNPROTECT_RECURSION(ht2);
return 1;
}
} else { /* string index */
if (zend_hash_find(ht2, p1->arKey, p1->nKeyLength, &pData2)==FAILURE) {
+ HASH_UNPROTECT_RECURSION(ht1);
+ HASH_UNPROTECT_RECURSION(ht2);
return 1;
}
}
}
result = compar(p1->pData, pData2);
if (result!=0) {
+ HASH_UNPROTECT_RECURSION(ht1);
+ HASH_UNPROTECT_RECURSION(ht2);
return result;
}
p1 = p1->pListNext;
p2 = p2->pListNext;
}
}
-
+
+ HASH_UNPROTECT_RECURSION(ht1);
+ HASH_UNPROTECT_RECURSION(ht2);
return 0;
}