Coverage Report

Created: 2022-10-14 11:20

/src/php-src/Zend/zend_stack.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
   +----------------------------------------------------------------------+
3
   | Zend Engine                                                          |
4
   +----------------------------------------------------------------------+
5
   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
6
   +----------------------------------------------------------------------+
7
   | This source file is subject to version 2.00 of the Zend license,     |
8
   | that is bundled with this package in the file LICENSE, and is        |
9
   | available through the world-wide-web at the following url:           |
10
   | http://www.zend.com/license/2_00.txt.                                |
11
   | If you did not receive a copy of the Zend license and are unable to  |
12
   | obtain it through the world-wide-web, please send a note to          |
13
   | license@zend.com so we can mail you a copy immediately.              |
14
   +----------------------------------------------------------------------+
15
   | Authors: Andi Gutmans <andi@php.net>                                 |
16
   |          Zeev Suraski <zeev@php.net>                                 |
17
   +----------------------------------------------------------------------+
18
*/
19
20
#include "zend.h"
21
#include "zend_stack.h"
22
23
1.12G
#define ZEND_STACK_ELEMENT(stack, n) ((void *)((char *) (stack)->elements + (stack)->size * (n)))
24
25
ZEND_API int zend_stack_init(zend_stack *stack, int size)
26
8.46M
{
27
8.46M
  stack->size = size;
28
8.46M
  stack->top = 0;
29
8.46M
  stack->max = 0;
30
8.46M
  stack->elements = NULL;
31
8.46M
  return SUCCESS;
32
8.46M
}
33
34
ZEND_API int zend_stack_push(zend_stack *stack, const void *element)
35
942M
{
36
  /* We need to allocate more memory */
37
942M
  if (stack->top >= stack->max) {
38
50.9M
    stack->max += STACK_BLOCK_SIZE;
39
50.9M
    stack->elements = safe_erealloc(stack->elements, stack->size, stack->max, 0);
40
50.9M
  }
41
942M
  memcpy(ZEND_STACK_ELEMENT(stack, stack->top), element, stack->size);
42
942M
  return stack->top++;
43
942M
}
44
45
46
ZEND_API void *zend_stack_top(const zend_stack *stack)
47
178M
{
48
178M
  if (stack->top > 0) {
49
178M
    return ZEND_STACK_ELEMENT(stack, stack->top - 1);
50
1.39k
  } else {
51
1.39k
    return NULL;
52
1.39k
  }
53
178M
}
54
55
56
ZEND_API int zend_stack_del_top(zend_stack *stack)
57
175M
{
58
175M
  --stack->top;
59
175M
  return SUCCESS;
60
175M
}
61
62
63
ZEND_API int zend_stack_int_top(const zend_stack *stack)
64
0
{
65
0
  int *e = zend_stack_top(stack);
66
0
  if (e) {
67
0
    return *e;
68
0
  } else {
69
0
    return FAILURE;
70
0
  }
71
0
}
72
73
74
ZEND_API int zend_stack_is_empty(const zend_stack *stack)
75
49.4M
{
76
49.4M
  return stack->top == 0;
77
49.4M
}
78
79
80
ZEND_API int zend_stack_destroy(zend_stack *stack)
81
8.42M
{
82
8.42M
  if (stack->elements) {
83
5.33M
    efree(stack->elements);
84
5.33M
    stack->elements = NULL;
85
5.33M
  }
86
87
8.42M
  return SUCCESS;
88
8.42M
}
89
90
91
ZEND_API void *zend_stack_base(const zend_stack *stack)
92
975k
{
93
975k
  return stack->elements;
94
975k
}
95
96
97
ZEND_API int zend_stack_count(const zend_stack *stack)
98
1.82M
{
99
1.82M
  return stack->top;
100
1.82M
}
101
102
103
ZEND_API void zend_stack_apply(zend_stack *stack, int type, int (*apply_function)(void *element))
104
0
{
105
0
  int i;
106
107
0
  switch (type) {
108
0
    case ZEND_STACK_APPLY_TOPDOWN:
109
0
      for (i=stack->top-1; i>=0; i--) {
110
0
        if (apply_function(ZEND_STACK_ELEMENT(stack, i))) {
111
0
          break;
112
0
        }
113
0
      }
114
0
      break;
115
0
    case ZEND_STACK_APPLY_BOTTOMUP:
116
0
      for (i=0; i<stack->top; i++) {
117
0
        if (apply_function(ZEND_STACK_ELEMENT(stack, i))) {
118
0
          break;
119
0
        }
120
0
      }
121
0
      break;
122
0
  }
123
0
}
124
125
126
ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (*apply_function)(void *element, void *arg), void *arg)
127
0
{
128
0
  int i;
129
130
0
  switch (type) {
131
0
    case ZEND_STACK_APPLY_TOPDOWN:
132
0
      for (i=stack->top-1; i>=0; i--) {
133
0
        if (apply_function(ZEND_STACK_ELEMENT(stack, i), arg)) {
134
0
          break;
135
0
        }
136
0
      }
137
0
      break;
138
0
    case ZEND_STACK_APPLY_BOTTOMUP:
139
0
      for (i=0; i<stack->top; i++) {
140
0
        if (apply_function(ZEND_STACK_ELEMENT(stack, i), arg)) {
141
0
          break;
142
0
        }
143
0
      }
144
0
      break;
145
0
  }
146
0
}
147
148
ZEND_API void zend_stack_clean(zend_stack *stack, void (*func)(void *), zend_bool free_elements)
149
1.15M
{
150
1.15M
  int i;
151
152
1.15M
  if (func) {
153
766k
    for (i = 0; i < stack->top; i++) {
154
0
      func(ZEND_STACK_ELEMENT(stack, i));
155
0
    }
156
766k
  }
157
1.15M
  if (free_elements) {
158
1.15M
    if (stack->elements) {
159
0
      efree(stack->elements);
160
0
      stack->elements = NULL;
161
0
    }
162
1.15M
    stack->top = stack->max = 0;
163
1.15M
  }
164
1.15M
}