Skip to content

Commit

Permalink
- Add ptr_stack_n_{push,pop} in order to speed up function calls a bit.
Browse files Browse the repository at this point in the history
  There seems to be no reason for stack->top in the ptr_stack except for
  when realloc()'in the stack. I think I'll remove it.
  • Loading branch information
Andi Gutmans committed Jul 30, 1999
1 parent 48ffdd7 commit e9e7bc6
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 7 deletions.
7 changes: 6 additions & 1 deletion Zend/zend_execute.c
Original file line number Diff line number Diff line change
Expand Up @@ -1304,10 +1304,12 @@ binary_assign_op_addr: {
HashTable *active_function_table;
zval tmp;

zend_ptr_stack_n_push(&EG(arg_types_stack), 3, function_being_called, object.ptr, object.ptr_ptr);
/*
zend_ptr_stack_push(&EG(arg_types_stack), function_being_called);
zend_ptr_stack_push(&EG(arg_types_stack), object.ptr);
zend_ptr_stack_push(&EG(arg_types_stack), object.ptr_ptr);

*/
if (opline->extended_value & ZEND_CTOR_CALL) {
/* constructor call */

Expand Down Expand Up @@ -1465,9 +1467,12 @@ binary_assign_op_addr: {
efree(function_being_called);
}
if (opline->opcode == ZEND_DO_FCALL_BY_NAME) {
zend_ptr_stack_n_pop(&EG(arg_types_stack), 3, &object.ptr_ptr, &object.ptr, &function_being_called);
/*
object.ptr_ptr = zend_ptr_stack_pop(&EG(arg_types_stack));
object.ptr = zend_ptr_stack_pop(&EG(arg_types_stack));
function_being_called = zend_ptr_stack_pop(&EG(arg_types_stack));
*/
}
function_state.function = (zend_function *) op_array;
EG(function_state_ptr) = &function_state;
Expand Down
47 changes: 42 additions & 5 deletions Zend/zend_ptr_stack.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,28 +20,65 @@

#include "zend.h"
#include "zend_ptr_stack.h"
#if HAVE_STDARG_H
#include <stdarg.h>
#endif


ZEND_API void zend_ptr_stack_init(zend_ptr_stack *stack)
{
stack->top_element = stack->elements = (void **) emalloc(sizeof(void *)*STACK_BLOCK_SIZE);
stack->max = STACK_BLOCK_SIZE;
stack->top_element = stack->elements = (void **) emalloc(sizeof(void *)*PTR_STACK_BLOCK_SIZE);
stack->max = PTR_STACK_BLOCK_SIZE;
stack->top = 0;
}


ZEND_API inline void zend_ptr_stack_push(zend_ptr_stack *stack, void *ptr)
{
if (stack->top >= stack->max) { /* we need to allocate more memory */
short diff = stack->top_element-stack->elements;

stack->elements = (void **) erealloc(stack->elements, (sizeof(void *) * (stack->max *= 2 )));
stack->top_element = stack->elements+diff;
stack->top_element = stack->elements+stack->top;
}
stack->top++;
*(stack->top_element++) = ptr;
}

ZEND_API inline void zend_ptr_stack_n_push(zend_ptr_stack *stack, int count,...)
{
va_list ptr;
void *elem;

if (stack->top+count > stack->max) { /* we need to allocate more memory */
stack->max *= 2;
stack->max += count;
stack->elements = (void **) erealloc(stack->elements, (sizeof(void *) * (stack->max)));
stack->top_element = stack->elements+stack->top;
}
va_start(ptr, count);
while (count>0) {
elem = va_arg(ptr, void *);
stack->top++;
*(stack->top_element++) = elem;
count--;
}
va_end(ptr);
}


ZEND_API inline void zend_ptr_stack_n_pop(zend_ptr_stack *stack, int count,...)
{
va_list ptr;
void **elem;

va_start(ptr, count);
while (count>0) {
elem = va_arg(ptr, void **);
*elem = *(stack->top_element--) = elem;
stack->top--;
count--;
}
va_end(ptr);
}

ZEND_API inline void *zend_ptr_stack_pop(zend_ptr_stack *stack)
{
Expand Down
4 changes: 3 additions & 1 deletion Zend/zend_ptr_stack.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,13 @@ typedef struct _zend_ptr_stack {
} zend_ptr_stack;


#define STACK_BLOCK_SIZE 64
#define PTR_STACK_BLOCK_SIZE 64

ZEND_API void zend_ptr_stack_init(zend_ptr_stack *stack);
ZEND_API void zend_ptr_stack_push(zend_ptr_stack *stack, void *ptr);
ZEND_API void zend_ptr_stack_n_push(zend_ptr_stack *stack, int count,...);
ZEND_API void *zend_ptr_stack_pop(zend_ptr_stack *stack);
ZEND_API void zend_ptr_stack_n_pop(zend_ptr_stack *stack, int count,...);
ZEND_API void zend_ptr_stack_destroy(zend_ptr_stack *stack);
ZEND_API void zend_ptr_stack_apply(zend_ptr_stack *stack, void (*func)(void *));
ZEND_API void zend_ptr_stack_clean(zend_ptr_stack *stack, void (*func)(void *));
Expand Down

0 comments on commit e9e7bc6

Please sign in to comment.