diff options
Diffstat (limited to 'Zend/zend_stack.c')
-rw-r--r-- | Zend/zend_stack.c | 55 |
1 files changed, 21 insertions, 34 deletions
diff --git a/Zend/zend_stack.c b/Zend/zend_stack.c index 31bb8afec5..a3c8759f1c 100644 --- a/Zend/zend_stack.c +++ b/Zend/zend_stack.c @@ -22,25 +22,25 @@ #include "zend.h" #include "zend_stack.h" -ZEND_API int zend_stack_init(zend_stack *stack) +#define ZEND_STACK_ELEMENT(stack, n) ((void *)((char *) (stack)->elements + (stack)->size * (n))) + +ZEND_API int zend_stack_init(zend_stack *stack, int size) { + stack->size = size; stack->top = 0; stack->max = 0; stack->elements = NULL; return SUCCESS; } -ZEND_API int zend_stack_push(zend_stack *stack, const void *element, int size) +ZEND_API int zend_stack_push(zend_stack *stack, const void *element) { - if (stack->top >= stack->max) { /* we need to allocate more memory */ - stack->elements = (void **) erealloc(stack->elements, - (sizeof(void **) * (stack->max += STACK_BLOCK_SIZE))); - if (!stack->elements) { - return FAILURE; - } + /* We need to allocate more memory */ + if (stack->top >= stack->max) { + stack->max += STACK_BLOCK_SIZE; + stack->elements = safe_erealloc(stack->elements, stack->size, stack->max, 0); } - stack->elements[stack->top] = (void *) emalloc(size); - memcpy(stack->elements[stack->top], element, size); + memcpy(ZEND_STACK_ELEMENT(stack, stack->top), element, stack->size); return stack->top++; } @@ -48,7 +48,7 @@ ZEND_API int zend_stack_push(zend_stack *stack, const void *element, int size) ZEND_API int zend_stack_top(const zend_stack *stack, void **element) { if (stack->top > 0) { - *element = stack->elements[stack->top - 1]; + *element = ZEND_STACK_ELEMENT(stack, stack->top - 1); return SUCCESS; } else { *element = NULL; @@ -59,9 +59,7 @@ ZEND_API int zend_stack_top(const zend_stack *stack, void **element) ZEND_API int zend_stack_del_top(zend_stack *stack) { - if (stack->top > 0) { - efree(stack->elements[--stack->top]); - } + --stack->top; return SUCCESS; } @@ -71,7 +69,8 @@ ZEND_API int zend_stack_int_top(const zend_stack *stack) int *e; if (zend_stack_top(stack, (void **) &e) == FAILURE) { - return FAILURE; /* this must be a negative number, since negative numbers can't be address numbers */ + /* this must be a negative number, since negative numbers can't be address numbers */ + return FAILURE; } else { return *e; } @@ -80,22 +79,13 @@ ZEND_API int zend_stack_int_top(const zend_stack *stack) ZEND_API int zend_stack_is_empty(const zend_stack *stack) { - if (stack->top == 0) { - return 1; - } else { - return 0; - } + return stack->top == 0; } ZEND_API int zend_stack_destroy(zend_stack *stack) { - int i; - if (stack->elements) { - for (i = 0; i < stack->top; i++) { - efree(stack->elements[i]); - } efree(stack->elements); stack->elements = NULL; } @@ -104,7 +94,7 @@ ZEND_API int zend_stack_destroy(zend_stack *stack) } -ZEND_API void **zend_stack_base(const zend_stack *stack) +ZEND_API void *zend_stack_base(const zend_stack *stack) { return stack->elements; } @@ -123,14 +113,14 @@ ZEND_API void zend_stack_apply(zend_stack *stack, int type, int (*apply_function switch (type) { case ZEND_STACK_APPLY_TOPDOWN: for (i=stack->top-1; i>=0; i--) { - if (apply_function(stack->elements[i])) { + if (apply_function(ZEND_STACK_ELEMENT(stack, i))) { break; } } break; case ZEND_STACK_APPLY_BOTTOMUP: for (i=0; i<stack->top; i++) { - if (apply_function(stack->elements[i])) { + if (apply_function(ZEND_STACK_ELEMENT(stack, i))) { break; } } @@ -146,14 +136,14 @@ ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (* switch (type) { case ZEND_STACK_APPLY_TOPDOWN: for (i=stack->top-1; i>=0; i--) { - if (apply_function(stack->elements[i], arg)) { + if (apply_function(ZEND_STACK_ELEMENT(stack, i), arg)) { break; } } break; case ZEND_STACK_APPLY_BOTTOMUP: for (i=0; i<stack->top; i++) { - if (apply_function(stack->elements[i], arg)) { + if (apply_function(ZEND_STACK_ELEMENT(stack, i), arg)) { break; } } @@ -167,14 +157,11 @@ ZEND_API void zend_stack_clean(zend_stack *stack, void (*func)(void *), zend_boo if (func) { for (i = 0; i < stack->top; i++) { - func(stack->elements[i]); + func(ZEND_STACK_ELEMENT(stack, i)); } } if (free_elements) { if (stack->elements) { - for (i = 0; i < stack->top; i++) { - efree(stack->elements[i]); - } efree(stack->elements); stack->elements = NULL; } |