summaryrefslogtreecommitdiff
path: root/Zend/zend_stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_stack.c')
-rw-r--r--Zend/zend_stack.c55
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;
}