diff options
author | Andi Gutmans <andi@php.net> | 1999-07-30 11:55:53 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 1999-07-30 11:55:53 +0000 |
commit | e9e7bc6db32ebd0f33d37d85066fb7eda126c7ac (patch) | |
tree | 132199daddac042bca7b0a5a678b5e3d45a902ea | |
parent | 48ffdd79f726a40ed1c330436aa8c8dad224cc6a (diff) | |
download | php-git-e9e7bc6db32ebd0f33d37d85066fb7eda126c7ac.tar.gz |
- 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.
-rw-r--r-- | Zend/zend_execute.c | 7 | ||||
-rw-r--r-- | Zend/zend_ptr_stack.c | 47 | ||||
-rw-r--r-- | Zend/zend_ptr_stack.h | 4 |
3 files changed, 51 insertions, 7 deletions
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 <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; } @@ -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 *)); |