From: Andi Gutmans Date: Fri, 30 Jul 1999 11:55:53 +0000 (+0000) Subject: - Add ptr_stack_n_{push,pop} in order to speed up function calls a bit. X-Git-Tag: php-4.0b2~79 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e9e7bc6db32ebd0f33d37d85066fb7eda126c7ac;p=php - Add ptr_stack_n_{push,pop} in order to speed up function calls a bit. 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. --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index e0bc6c8936..362b3a8c85 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -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 */ @@ -1465,9 +1467,12 @@ do_fcall_common: 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; diff --git a/Zend/zend_ptr_stack.c b/Zend/zend_ptr_stack.c index 35e5be2239..8cbba37eb0 100644 --- a/Zend/zend_ptr_stack.c +++ b/Zend/zend_ptr_stack.c @@ -20,12 +20,15 @@ #include "zend.h" #include "zend_ptr_stack.h" +#if HAVE_STDARG_H +#include +#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; } @@ -33,15 +36,49 @@ ZEND_API void zend_ptr_stack_init(zend_ptr_stack *stack) 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) { diff --git a/Zend/zend_ptr_stack.h b/Zend/zend_ptr_stack.h index 599c4c454a..fd0770c647 100644 --- a/Zend/zend_ptr_stack.h +++ b/Zend/zend_ptr_stack.h @@ -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 *));