19#ifndef _ZEND_WORKLIST_H_
20#define _ZEND_WORKLIST_H_
31#define ZEND_WORKLIST_STACK_ALLOCA(s, _len, use_heap) do { \
32 (s)->buf = (int*)do_alloca(sizeof(int) * _len, use_heap); \
34 (s)->capacity = _len; \
37#define ZEND_WORKLIST_STACK_FREE_ALLOCA(s, use_heap) \
38 free_alloca((s)->buf, use_heap)
44 stack->
buf = (
int*)zend_arena_calloc(
arena,
sizeof(*stack->
buf),
len);
52 stack->
buf[stack->
len++] = i;
58 return stack->
buf[stack->
len - 1];
64 return stack->
buf[--stack->
len];
72#define ZEND_WORKLIST_ALLOCA(w, _len, use_heap) do { \
73 (w)->stack.buf = (int*)do_alloca(ZEND_MM_ALIGNED_SIZE(sizeof(int) * _len) + sizeof(zend_ulong) * zend_bitset_len(_len), use_heap); \
75 (w)->stack.capacity = _len; \
76 (w)->visited = (zend_bitset)((char*)(w)->stack.buf + ZEND_MM_ALIGNED_SIZE(sizeof(int) * _len)); \
77 memset((w)->visited, 0, sizeof(zend_ulong) * zend_bitset_len(_len)); \
80#define ZEND_WORKLIST_FREE_ALLOCA(w, use_heap) \
81 free_alloca((w)->stack.buf, use_heap)
90static inline int zend_worklist_len(
const zend_worklist *worklist)
95static inline bool zend_worklist_push(
zend_worklist *worklist,
int i)
97 ZEND_ASSERT(i >= 0 && i < worklist->stack.capacity);
99 if (zend_bitset_in(worklist->
visited, i)) {
103 zend_bitset_incl(worklist->
visited, i);
104 zend_worklist_stack_push(&worklist->
stack, i);
108static inline int zend_worklist_peek(
const zend_worklist *worklist)
110 return zend_worklist_stack_peek(&worklist->
stack);
116 return zend_worklist_stack_pop(&worklist->
stack);
zend_worklist_stack stack
struct _zend_arena zend_arena
struct _zend_worklist_stack zend_worklist_stack
struct _zend_worklist zend_worklist