mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
- 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.
This commit is contained in:
parent
48ffdd79f7
commit
e9e7bc6db3
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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 *));
|
||||
|
Loading…
Reference in New Issue
Block a user