From: Andi Gutmans Date: Fri, 30 Jul 2004 21:00:37 +0000 (+0000) Subject: - More ptr_stack optimizations and cleanups X-Git-Tag: PRE_ZEND_VM_DISPATCH_PATCH~301 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d7c839d54f73c6649a13bc5f2178ec5a81ce930f;p=php - More ptr_stack optimizations and cleanups --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9b78925491..686c71eb4a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2646,7 +2646,7 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS) NEXT_OPCODE(); /* Never reached */ } - zend_ptr_stack_n_push(&EG(argument_stack), 2, (void *) opline->extended_value, NULL); + zend_ptr_stack_2_push(&EG(argument_stack), (void *) opline->extended_value, NULL); EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; @@ -2790,7 +2790,7 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS) EG(This) = current_this; EG(scope) = current_scope; } - zend_ptr_stack_n_pop(&EG(arg_types_stack), 3, &EX(calling_scope), &EX(object), &EX(fbc)); + zend_ptr_stack_3_pop(&EG(arg_types_stack), &EX(calling_scope), &EX(object), &EX(fbc)); EX(function_state).function = (zend_function *) op_array; EG(function_state_ptr) = &EX(function_state); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 11786e9450..ff540a0965 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -781,7 +781,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS fci->param_count = 2; } - zend_ptr_stack_n_push(&EG(argument_stack), 2, (void *) (long) fci->param_count, NULL); + zend_ptr_stack_2_push(&EG(argument_stack), (void *) (long) fci->param_count, NULL); original_function_state_ptr = EG(function_state_ptr); EG(function_state_ptr) = &EX(function_state); diff --git a/Zend/zend_ptr_stack.c b/Zend/zend_ptr_stack.c index f1e554e10d..e15979d9fd 100644 --- a/Zend/zend_ptr_stack.c +++ b/Zend/zend_ptr_stack.c @@ -38,12 +38,8 @@ ZEND_API 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; - } + ZEND_PTR_STACK_RESIZE_IF_NEEDED(stack, count) + va_start(ptr, count); while (count>0) { elem = va_arg(ptr, void *); diff --git a/Zend/zend_ptr_stack.h b/Zend/zend_ptr_stack.h index d94be35257..d970568436 100644 --- a/Zend/zend_ptr_stack.h +++ b/Zend/zend_ptr_stack.h @@ -39,7 +39,16 @@ 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 *), zend_bool free_elements); ZEND_API int zend_ptr_stack_num_elements(zend_ptr_stack *stack); +END_EXTERN_C() +#define ZEND_PTR_STACK_RESIZE_IF_NEEDED(stack, count) \ + 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; \ + } /* Not doing this with a macro because of the loop unrolling in the element assignment. Just using a macro for 3 in the body for readability sake. */ @@ -47,12 +56,7 @@ static inline void zend_ptr_stack_3_push(zend_ptr_stack *stack, void *a, void *b { #define ZEND_PTR_STACK_NUM_ARGS 3 - if (stack->top+ZEND_PTR_STACK_NUM_ARGS > stack->max) { /* we need to allocate more memory */ - stack->max *= 2; - stack->max += ZEND_PTR_STACK_NUM_ARGS; - stack->elements = (void **) erealloc(stack->elements, (sizeof(void *) * (stack->max))); - stack->top_element = stack->elements+stack->top; - } + ZEND_PTR_STACK_RESIZE_IF_NEEDED(stack, ZEND_PTR_STACK_NUM_ARGS) stack->top += ZEND_PTR_STACK_NUM_ARGS; *(stack->top_element++) = a; @@ -62,31 +66,31 @@ static inline void zend_ptr_stack_3_push(zend_ptr_stack *stack, void *a, void *b #undef ZEND_PTR_STACK_NUM_ARGS } -/* -ZEND_API void zend_ptr_stack_n_pop(zend_ptr_stack *stack, int count, ...) +static inline void zend_ptr_stack_2_push(zend_ptr_stack *stack, void *a, void *b) { - va_list ptr; - void **elem; - - va_start(ptr, count); - while (count>0) { - elem = va_arg(ptr, void **); - *elem = *(--stack->top_element); - stack->top--; - count--; - } - va_end(ptr); +#define ZEND_PTR_STACK_NUM_ARGS 2 + + ZEND_PTR_STACK_RESIZE_IF_NEEDED(stack, ZEND_PTR_STACK_NUM_ARGS) + + stack->top += ZEND_PTR_STACK_NUM_ARGS; + *(stack->top_element++) = a; + *(stack->top_element++) = b; + +#undef ZEND_PTR_STACK_NUM_ARGS } -*/ -END_EXTERN_C() +static inline void zend_ptr_stack_3_pop(zend_ptr_stack *stack, void **a, void **b, void **c) +{ + *a = *(--stack->top_element); + *b = *(--stack->top_element); + *c = *(--stack->top_element); + stack->top -= 3;; +} static inline void zend_ptr_stack_push(zend_ptr_stack *stack, void *ptr) { - if (stack->top >= stack->max) { /* we need to allocate more memory */ - stack->elements = (void **) erealloc(stack->elements, (sizeof(void *) * (stack->max *= 2 ))); - stack->top_element = stack->elements+stack->top; - } + ZEND_PTR_STACK_RESIZE_IF_NEEDED(stack, 1) + stack->top++; *(stack->top_element++) = ptr; }