Skip to content

Commit 3fcc651

Browse files
author
Andi Gutmans
committed
* Optimize argument_stack top lookup
* Fix a nasty bug in zend_ptr_stack_clean()
1 parent 533f135 commit 3fcc651

File tree

4 files changed

+7
-4
lines changed

4 files changed

+7
-4
lines changed

Zend/libzend.dsp

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Zend/zend_API.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ HashTable list_destructors, module_registry;
3333
/* this function doesn't check for too many parameters */
3434
int getParameters(int ht, int param_count,...)
3535
{
36-
void **p = EG(argument_stack).elements+EG(argument_stack).top-1;
36+
void **p = EG(argument_stack).top_element-1;
3737
int arg_count = (ulong) *p;
3838
va_list ptr;
3939
zval **param, *param_ptr;
@@ -57,6 +57,7 @@ int getParameters(int ht, int param_count,...)
5757
new_tmp->refcount = 1;
5858
new_tmp->is_ref = 0;
5959
param_ptr = new_tmp;
60+
((zval *) *(p-param_count))->refcount--;
6061
*(p-param_count) = param_ptr;
6162
}
6263
*param = param_ptr;
@@ -70,7 +71,7 @@ int getParameters(int ht, int param_count,...)
7071

7172
int getParametersArray(int ht, int param_count, zval **argument_array)
7273
{
73-
void **p = EG(argument_stack).elements+EG(argument_stack).top-1;
74+
void **p = EG(argument_stack).top_element-1;
7475
int arg_count = (ulong) *p;
7576
zval *param_ptr;
7677
ELS_FETCH();
@@ -91,6 +92,7 @@ int getParametersArray(int ht, int param_count, zval **argument_array)
9192
new_tmp->refcount = 1;
9293
new_tmp->is_ref = 0;
9394
param_ptr = new_tmp;
95+
((zval *) *(p-param_count))->refcount--;
9496
*(p-param_count) = param_ptr;
9597
}
9698
*(argument_array++) = param_ptr;

Zend/zend_execute_API.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ ZEND_API inline void zend_ptr_stack_clear_multiple(ELS_D)
466466

467467
ZEND_API int zend_ptr_stack_get_arg(int requested_arg, void **data)
468468
{
469-
void **p = EG(argument_stack).elements+EG(argument_stack).top-1;
469+
void **p = EG(argument_stack).top_element-1;
470470
int arg_count = (ulong) *p;
471471

472472
if (requested_arg>arg_count) {

Zend/zend_ptr_stack.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ ZEND_API void zend_ptr_stack_clean(zend_ptr_stack *stack, void (*func)(void *))
6868
{
6969
zend_ptr_stack_apply(stack, func);
7070
stack->top = 0;
71+
stack->top_element = stack->elements;
7172
}
7273

7374

0 commit comments

Comments
 (0)