summaryrefslogtreecommitdiff
path: root/Zend/zend_stack.c
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>1999-09-09 14:15:17 +0000
committerAndi Gutmans <andi@php.net>1999-09-09 14:15:17 +0000
commit22f066e708e95debf48065563671d78619807651 (patch)
treed26c963f7c7f09488a1cc975620e05ec868d0f0b /Zend/zend_stack.c
parent7567b96c22734d27f12c9737deb91dcd2c4b41bd (diff)
downloadphp-git-22f066e708e95debf48065563671d78619807651.tar.gz
- Add foreach() freeing code.
- Fix switch() freeing code to only free current function's switch expressions. - I have a feeling break expr; in a switch where expr > 1 leaks because it won't free all of the expressions. Fix is probably not trivial.
Diffstat (limited to 'Zend/zend_stack.c')
-rw-r--r--Zend/zend_stack.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/Zend/zend_stack.c b/Zend/zend_stack.c
index 0f3b0f6aac..011e8519c9 100644
--- a/Zend/zend_stack.c
+++ b/Zend/zend_stack.c
@@ -118,38 +118,46 @@ ZEND_API int zend_stack_count(zend_stack *stack)
}
-ZEND_API void zend_stack_apply(zend_stack *stack, void (*apply_function)(void *element), int type)
+ZEND_API void zend_stack_apply(zend_stack *stack, int (*apply_function)(void *element), int type)
{
int i;
switch (type) {
case ZEND_STACK_APPLY_TOPDOWN:
for (i=stack->top-1; i>=0; i--) {
- apply_function(stack->elements[i]);
+ if (apply_function(stack->elements[i])) {
+ break;
+ }
}
break;
case ZEND_STACK_APPLY_BOTTOMUP:
for (i=0; i<stack->top; i++) {
- apply_function(stack->elements[i]);
+ if (apply_function(stack->elements[i])) {
+ break;
+ }
}
break;
}
}
-ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, void (*apply_function)(void *element, void *arg), int type, void *arg)
+ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int (*apply_function)(void *element, void *arg), int type, void *arg)
{
int i;
switch (type) {
case ZEND_STACK_APPLY_TOPDOWN:
for (i=stack->top-1; i>=0; i--) {
- apply_function(stack->elements[i], arg);
+ if (apply_function(stack->elements[i], arg)) {
+ break;
+ }
}
break;
case ZEND_STACK_APPLY_BOTTOMUP:
for (i=0; i<stack->top; i++) {
- apply_function(stack->elements[i], arg);
+ if (apply_function(stack->elements[i], arg)) {
+ break;
+ }
}
break;
}