if (Z_TYPE(EG(user_error_handler)) != IS_UNDEF) {
RETVAL_ZVAL(&EG(user_error_handler), 1, 0);
- zend_stack_push(&EG(user_error_handlers_error_reporting), &EG(user_error_handler_error_reporting), sizeof(EG(user_error_handler_error_reporting)));
- zend_stack_push(&EG(user_error_handlers), &EG(user_error_handler), sizeof(zval));
+ zend_stack_push(&EG(user_error_handlers_error_reporting), &EG(user_error_handler_error_reporting));
+ zend_stack_push(&EG(user_error_handlers), &EG(user_error_handler));
}
if (Z_TYPE_P(error_handler) == IS_NULL) { /* unset user-defined handler */
if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) {
RETVAL_ZVAL(&EG(user_exception_handler), 1, 0);
- zend_stack_push(&EG(user_exception_handlers), &EG(user_exception_handler), sizeof(zval));
+ zend_stack_push(&EG(user_exception_handlers), &EG(user_exception_handler));
}
if (Z_TYPE_P(exception_handler) == IS_NULL) { /* unset user-defined handler */
static void zend_push_function_call_entry(zend_function *fbc TSRMLS_DC) /* {{{ */
{
zend_function_call_entry fcall = { fbc };
- zend_stack_push(&CG(function_call_stack), &fcall, sizeof(zend_function_call_entry));
+ zend_stack_push(&CG(function_call_stack), &fcall);
}
/* }}} */
void zend_init_compiler_data_structures(TSRMLS_D) /* {{{ */
{
- zend_stack_init(&CG(bp_stack));
- zend_stack_init(&CG(function_call_stack));
- zend_stack_init(&CG(switch_cond_stack));
- zend_stack_init(&CG(foreach_copy_stack));
- zend_stack_init(&CG(object_stack));
- zend_stack_init(&CG(declare_stack));
+ zend_stack_init(&CG(bp_stack), sizeof(zend_llist));
+ zend_stack_init(&CG(function_call_stack), sizeof(zend_function_call_entry));
+ zend_stack_init(&CG(switch_cond_stack), sizeof(zend_switch_entry));
+ zend_stack_init(&CG(foreach_copy_stack), sizeof(zend_op));
+ zend_stack_init(&CG(object_stack), sizeof(znode));
+ zend_stack_init(&CG(declare_stack), sizeof(zend_declarables));
CG(active_class_entry) = NULL;
zend_llist_init(&CG(list_llist), sizeof(list_llist_element), NULL, 0);
zend_llist_init(&CG(dimension_llist), sizeof(int), NULL, 0);
- zend_stack_init(&CG(list_stack));
+ zend_stack_init(&CG(list_stack), sizeof(zend_llist));
CG(in_compilation) = 0;
CG(start_lineno) = 0;
ZVAL_UNDEF(&CG(current_namespace));
CG(current_import_const) = NULL;
zend_hash_init(&CG(const_filenames), 8, NULL, NULL, 0);
init_compiler_declarables(TSRMLS_C);
- zend_stack_init(&CG(context_stack));
+ zend_stack_init(&CG(context_stack), sizeof(CG(context)));
CG(encoding_declared) = 0;
}
zend_llist jmp_list;
zend_llist_init(&jmp_list, sizeof(int), NULL, 0);
- zend_stack_push(&CG(bp_stack), (void *) &jmp_list, sizeof(zend_llist));
+ zend_stack_push(&CG(bp_stack), (void *) &jmp_list);
}
zend_stack_top(&CG(bp_stack), (void **) &jmp_list_ptr);
zend_llist_add_element(jmp_list_ptr, &if_end_op_number);
zend_llist fetch_list;
zend_llist_init(&fetch_list, sizeof(zend_op), NULL, 0);
- zend_stack_push(&CG(bp_stack), (void *) &fetch_list, sizeof(zend_llist));
+ zend_stack_push(&CG(bp_stack), (void *) &fetch_list);
}
/* }}} */
zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s::%s()", CG(active_class_entry)->name->val, name->val);
}
- zend_stack_push(&CG(context_stack), (void *) &CG(context), sizeof(CG(context)));
+ zend_stack_push(&CG(context_stack), (void *) &CG(context));
zend_init_compiler_context(TSRMLS_C);
if (fn_flags & ZEND_ACC_ABSTRACT) {
CG(active_op_array) = emalloc(sizeof(zend_op_array));
memcpy(CG(active_op_array), &op_array, sizeof(zend_op_array));
zend_hash_update_ptr(CG(function_table), Z_STR(key), CG(active_op_array));
- zend_stack_push(&CG(context_stack), (void *) &CG(context), sizeof(CG(context)));
+ zend_stack_push(&CG(context_stack), (void *) &CG(context));
zend_init_compiler_context(TSRMLS_C);
STR_RELEASE(lcname);
}
switch_entry.default_case = 0;
switch_entry.control_var = 0;
- zend_stack_push(&CG(switch_cond_stack), (void *) &switch_entry, sizeof(switch_entry));
+ zend_stack_push(&CG(switch_cond_stack), (void *) &switch_entry);
}
{
dummy_opline.result_type = IS_UNUSED;
- zend_stack_push(&CG(foreach_copy_stack), (void *) &dummy_opline, sizeof(zend_op));
+ zend_stack_push(&CG(foreach_copy_stack), (void *) &dummy_opline);
}
if (CG(doc_comment)) {
/* save for backpatching */
zend_llist_init(&jmp_list, sizeof(int), NULL, 0);
- zend_stack_push(&CG(bp_stack), (void *) &jmp_list, sizeof(zend_llist));
+ zend_stack_push(&CG(bp_stack), (void *) &jmp_list);
zend_stack_top(&CG(bp_stack), (void **) &jmp_list_ptr);
zend_llist_add_element(jmp_list_ptr, &jmp_op_number);
switch_entry.cond = *cond;
switch_entry.default_case = -1;
switch_entry.control_var = -1;
- zend_stack_push(&CG(switch_cond_stack), (void *) &switch_entry, sizeof(switch_entry));
+ zend_stack_push(&CG(switch_cond_stack), (void *) &switch_entry);
do_begin_loop(TSRMLS_C);
void zend_do_push_object(const znode *object TSRMLS_DC) /* {{{ */
{
- zend_stack_push(&CG(object_stack), object, sizeof(znode));
+ zend_stack_push(&CG(object_stack), object);
}
/* }}} */
void zend_do_list_init(TSRMLS_D) /* {{{ */
{
- zend_stack_push(&CG(list_stack), &CG(list_llist), sizeof(zend_llist));
- zend_stack_push(&CG(list_stack), &CG(dimension_llist), sizeof(zend_llist));
+ zend_stack_push(&CG(list_stack), &CG(list_llist));
+ zend_stack_push(&CG(list_stack), &CG(dimension_llist));
zend_llist_init(&CG(list_llist), sizeof(list_llist_element), NULL, 0);
zend_llist_init(&CG(dimension_llist), sizeof(int), NULL, 0);
zend_do_new_list_begin(TSRMLS_C);
opline->extended_value = is_variable ? ZEND_FE_RESET_VARIABLE : 0;
COPY_NODE(dummy_opline.result, opline->result);
- zend_stack_push(&CG(foreach_copy_stack), (void *) &dummy_opline, sizeof(zend_op));
+ zend_stack_push(&CG(foreach_copy_stack), (void *) &dummy_opline);
/* save the location of FE_FETCH */
as_token->u.op.opline_num = get_next_op_number(CG(active_op_array));
void zend_do_declare_begin(TSRMLS_D) /* {{{ */
{
- zend_stack_push(&CG(declare_stack), &CG(declarables), sizeof(zend_declarables));
+ zend_stack_push(&CG(declare_stack), &CG(declarables));
}
/* }}} */
EG(current_execute_data) = NULL;
- zend_stack_init(&EG(user_error_handlers_error_reporting));
- zend_stack_init(&EG(user_error_handlers));
- zend_stack_init(&EG(user_exception_handlers));
+ zend_stack_init(&EG(user_error_handlers_error_reporting), sizeof(int));
+ zend_stack_init(&EG(user_error_handlers), sizeof(zval));
+ zend_stack_init(&EG(user_exception_handlers), sizeof(zval));
zend_objects_store_init(&EG(objects_store), 1024);
ZVAL_UNDEF(&EG(user_exception_handler));
}
- zend_stack_destroy(&EG(user_error_handlers_error_reporting));
- zend_stack_init(&EG(user_error_handlers_error_reporting));
+ zend_stack_clean(&EG(user_error_handlers_error_reporting), NULL, 1);
zend_stack_clean(&EG(user_error_handlers), (void (*)(void *))ZVAL_DESTRUCTOR, 1);
zend_stack_clean(&EG(user_exception_handlers), (void (*)(void *))ZVAL_DESTRUCTOR, 1);
} zend_end_try();
static void _yy_push_state(int new_state TSRMLS_DC)
{
- zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));
+ zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION());
YYSETCONDITION(new_state);
}
ini_filename = NULL;
}
- zend_stack_init(&SCNG(state_stack));
+ zend_stack_init(&SCNG(state_stack), sizeof(int));
BEGIN(INITIAL);
return SUCCESS;
static void _yy_push_state(int new_state TSRMLS_DC)
{
- zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));
+ zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION());
YYSETCONDITION(new_state);
}
ini_filename = NULL;
}
- zend_stack_init(&SCNG(state_stack));
+ zend_stack_init(&SCNG(state_stack), sizeof(int));
BEGIN(INITIAL);
return SUCCESS;
static void _yy_push_state(int new_state TSRMLS_DC)
{
- zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));
+ zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION());
YYSETCONDITION(new_state);
}
{
CG(parse_error) = 0;
CG(doc_comment) = NULL;
- zend_stack_init(&SCNG(state_stack));
+ zend_stack_init(&SCNG(state_stack), sizeof(int));
zend_ptr_stack_init(&SCNG(heredoc_label_stack));
}
lex_state->yy_limit = SCNG(yy_limit);
lex_state->state_stack = SCNG(state_stack);
- zend_stack_init(&SCNG(state_stack));
+ zend_stack_init(&SCNG(state_stack), sizeof(int));
lex_state->heredoc_label_stack = SCNG(heredoc_label_stack);
zend_ptr_stack_init(&SCNG(heredoc_label_stack));
init_op_array(op_array, ZEND_USER_FUNCTION, INITIAL_OP_ARRAY_SIZE TSRMLS_CC);
CG(in_compilation) = 1;
CG(active_op_array) = op_array;
- zend_stack_push(&CG(context_stack), (void *) &CG(context), sizeof(CG(context)));
+ zend_stack_push(&CG(context_stack), (void *) &CG(context));
zend_init_compiler_context(TSRMLS_C);
compiler_result = zendparse(TSRMLS_C);
zend_do_return(&retval_znode, 0 TSRMLS_CC);
init_op_array(op_array, ZEND_EVAL_CODE, INITIAL_OP_ARRAY_SIZE TSRMLS_CC);
CG(interactive) = orig_interactive;
CG(active_op_array) = op_array;
- zend_stack_push(&CG(context_stack), (void *) &CG(context), sizeof(CG(context)));
+ zend_stack_push(&CG(context_stack), (void *) &CG(context));
zend_init_compiler_context(TSRMLS_C);
BEGIN(ST_IN_SCRIPTING);
compiler_result = zendparse(TSRMLS_C);
static void _yy_push_state(int new_state TSRMLS_DC)
{
- zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));
+ zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION());
YYSETCONDITION(new_state);
}
{
CG(parse_error) = 0;
CG(doc_comment) = NULL;
- zend_stack_init(&SCNG(state_stack));
+ zend_stack_init(&SCNG(state_stack), sizeof(int));
zend_ptr_stack_init(&SCNG(heredoc_label_stack));
}
lex_state->yy_limit = SCNG(yy_limit);
lex_state->state_stack = SCNG(state_stack);
- zend_stack_init(&SCNG(state_stack));
+ zend_stack_init(&SCNG(state_stack), sizeof(int));
lex_state->heredoc_label_stack = SCNG(heredoc_label_stack);
zend_ptr_stack_init(&SCNG(heredoc_label_stack));
init_op_array(op_array, ZEND_USER_FUNCTION, INITIAL_OP_ARRAY_SIZE TSRMLS_CC);
CG(in_compilation) = 1;
CG(active_op_array) = op_array;
- zend_stack_push(&CG(context_stack), (void *) &CG(context), sizeof(CG(context)));
+ zend_stack_push(&CG(context_stack), (void *) &CG(context));
zend_init_compiler_context(TSRMLS_C);
compiler_result = zendparse(TSRMLS_C);
zend_do_return(&retval_znode, 0 TSRMLS_CC);
init_op_array(op_array, ZEND_EVAL_CODE, INITIAL_OP_ARRAY_SIZE TSRMLS_CC);
CG(interactive) = orig_interactive;
CG(active_op_array) = op_array;
- zend_stack_push(&CG(context_stack), (void *) &CG(context), sizeof(CG(context)));
+ zend_stack_push(&CG(context_stack), (void *) &CG(context));
zend_init_compiler_context(TSRMLS_C);
BEGIN(ST_IN_SCRIPTING);
compiler_result = zendparse(TSRMLS_C);
#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++;
}
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;
ZEND_API int zend_stack_del_top(zend_stack *stack)
{
- if (stack->top > 0) {
- efree(stack->elements[--stack->top]);
- }
+ --stack->top;
return SUCCESS;
}
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;
}
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;
}
}
-ZEND_API void **zend_stack_base(const zend_stack *stack)
+ZEND_API void *zend_stack_base(const zend_stack *stack)
{
return stack->elements;
}
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;
}
}
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;
}
}
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;
}
#define ZEND_STACK_H
typedef struct _zend_stack {
- int top, max;
- void **elements;
+ int size, top, max;
+ void *elements;
} zend_stack;
-#define STACK_BLOCK_SIZE 64
+#define STACK_BLOCK_SIZE 16
BEGIN_EXTERN_C()
-ZEND_API int zend_stack_init(zend_stack *stack);
-ZEND_API int zend_stack_push(zend_stack *stack, const void *element, int size);
+ZEND_API int zend_stack_init(zend_stack *stack, int size);
+ZEND_API int zend_stack_push(zend_stack *stack, const void *element);
ZEND_API int zend_stack_top(const zend_stack *stack, void **element);
ZEND_API int zend_stack_del_top(zend_stack *stack);
ZEND_API int zend_stack_int_top(const zend_stack *stack);
ZEND_API int zend_stack_is_empty(const zend_stack *stack);
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);
ZEND_API int zend_stack_count(const zend_stack *stack);
ZEND_API void zend_stack_apply(zend_stack *stack, int type, int (*apply_function)(void *element));
ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (*apply_function)(void *element, void *arg), void *arg);
memset(&output_globals, 0, sizeof(zend_output_globals));
#endif
- zend_stack_init(&OG(handlers));
+ zend_stack_init(&OG(handlers), sizeof(php_output_handler *));
OG(flags) |= PHP_OUTPUT_ACTIVATED;
return SUCCESS;
if (context.out.data && context.out.used) {
zend_stack_del_top(&OG(handlers));
php_output_write(context.out.data, context.out.used TSRMLS_CC);
- zend_stack_push(&OG(handlers), &OG(active), sizeof(php_output_handler *));
+ zend_stack_push(&OG(handlers), &OG(active));
}
php_output_context_dtor(&context);
return SUCCESS;
}
}
}
- /* zend_stack_push never returns SUCCESS but FAILURE or stack level */
- if (FAILURE == (handler->level = zend_stack_push(&OG(handlers), &handler, sizeof(php_output_handler *)))) {
- return FAILURE;
- }
+ /* zend_stack_push returns stack level */
+ handler->level = zend_stack_push(&OG(handlers), &handler);
OG(active) = handler;
return SUCCESS;
}
* Check whether a certain output handler is in use */
PHPAPI int php_output_handler_started(const char *name, size_t name_len TSRMLS_DC)
{
- php_output_handler ***handlers;
+ php_output_handler **handlers;
int i, count = php_output_get_level(TSRMLS_C);
if (count) {
- handlers = (php_output_handler ***) zend_stack_base(&OG(handlers));
+ handlers = (php_output_handler **) zend_stack_base(&OG(handlers));
for (i = 0; i < count; ++i) {
- if (name_len == (*(handlers[i]))->name_len && !memcmp((*(handlers[i]))->name, name, name_len)) {
+ if (name_len == handlers[i]->name_len && !memcmp(handlers[i]->name, name, name_len)) {
return 1;
}
}