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 */
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;
#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)
{
} 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 *));