All pastes #230668 Raw Copy code Copy link Edit

possible fix

public unlisted text v1 · immutable
#230668 ·published 2006-10-31 11:19 UTC
rendered paste body
--- zend_hash.old	2006-08-24 12:30:56.000000000 +0100
+++ zend_hash.new	2006-10-31 10:05:16.102177000 +0000
@@ -656,18 +656,24 @@
 ZEND_API void zend_hash_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC)
 {
 	Bucket *p;
-
+	int retval; 
+    
 	IS_CONSISTENT(ht);
 
 	HASH_PROTECT_RECURSION(ht);
 	p = ht->pListHead;
 	while (p != NULL) {
-		if (apply_func(p->pData TSRMLS_CC)) {
+		retval = apply_func(p->pData TSRMLS_CC);
+
+		if (ZEND_HASH_APPLY_STOP == retval) {
+			break;
+		} else if (retval == ZEND_HASH_APPLY_REMOVE) {
 			p = zend_hash_apply_deleter(ht, p);
 		} else {
 			p = p->pListNext;
 		}
 	}
+
 	HASH_UNPROTECT_RECURSION(ht);
 }
 
@@ -675,13 +681,18 @@
 ZEND_API void zend_hash_apply_with_argument(HashTable *ht, apply_func_arg_t apply_func, void *argument TSRMLS_DC)
 {
 	Bucket *p;
+	int retval;
 
 	IS_CONSISTENT(ht);
 
 	HASH_PROTECT_RECURSION(ht);
 	p = ht->pListHead;
 	while (p != NULL) {
-		if (apply_func(p->pData, argument TSRMLS_CC)) {
+		retval = apply_func(p->pData, argument TSRMLS_CC);
+
+		if (ZEND_HASH_APPLY_STOP == retval) {
+			break;
+		} else if (retval == ZEND_HASH_APPLY_REMOVE) {
 			p = zend_hash_apply_deleter(ht, p);
 		} else {
 			p = p->pListNext;
@@ -691,11 +702,12 @@
 }
 
 
-ZEND_API void zend_hash_apply_with_arguments(HashTable *ht, apply_func_args_t destruct, int num_args, ...)
+ZEND_API void zend_hash_apply_with_arguments(HashTable *ht, apply_func_args_t apply_func, int num_args, ...)
 {
 	Bucket *p;
 	va_list args;
 	zend_hash_key hash_key;
+	int retval;
 
 	IS_CONSISTENT(ht);
 
@@ -707,11 +719,17 @@
 		hash_key.arKey = p->arKey;
 		hash_key.nKeyLength = p->nKeyLength;
 		hash_key.h = p->h;
-		if (destruct(p->pData, num_args, args, &hash_key)) {
+
+		retval =  apply_func(p->pData, num_args, args, &hash_key);
+
+		if (ZEND_HASH_APPLY_STOP == retval) {
+			break;
+		} else if (retval == ZEND_HASH_APPLY_REMOVE) {
 			p = zend_hash_apply_deleter(ht, p);
 		} else {
 			p = p->pListNext;
 		}
+
 		va_end(args);
 	}