summaryrefslogtreecommitdiff
path: root/Zend/zend_ptr_stack.c
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2012-09-22 19:12:21 +0200
committerNikita Popov <nikic@php.net>2012-09-22 19:15:53 +0200
commita31fa55b44bcb342c00e9ab2f4a851d054897a39 (patch)
treec1dfe040f3d51b7ab97d16094772d0b24e170f3f /Zend/zend_ptr_stack.c
parent6c135dff975f111ec5a84af93c1b98e9ae84fcd1 (diff)
downloadphp-git-a31fa55b44bcb342c00e9ab2f4a851d054897a39.tar.gz
Fixed bug #63132
EG(arg_types_stack) is now also backed up when generators are used. This allows the use of yield in nested method calls. This commit adds two new functions to the zend_ptr_stack API: zend_ptr_stack_push_from_memory zend_ptr_stack_pop_into_memory both taking the following arguments: zend_ptr_stack *stack, int count, void **pointers
Diffstat (limited to 'Zend/zend_ptr_stack.c')
-rw-r--r--Zend/zend_ptr_stack.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/Zend/zend_ptr_stack.c b/Zend/zend_ptr_stack.c
index aefa91f73d..d178cc0184 100644
--- a/Zend/zend_ptr_stack.c
+++ b/Zend/zend_ptr_stack.c
@@ -111,6 +111,22 @@ ZEND_API int zend_ptr_stack_num_elements(zend_ptr_stack *stack)
return stack->top;
}
+ZEND_API void zend_ptr_stack_push_from_memory(zend_ptr_stack *stack, int count, void **pointers)
+{
+ ZEND_PTR_STACK_RESIZE_IF_NEEDED(stack, count);
+
+ memcpy(stack->top_element, pointers, count * sizeof(void *));
+ stack->top_element += count;
+ stack->top += count;
+}
+
+ZEND_API void zend_ptr_stack_pop_into_memory(zend_ptr_stack *stack, int count, void **pointers)
+{
+ memcpy(pointers, stack->top_element - count, count * sizeof(void *));
+ stack->top_element -= count;
+ stack->top -= count;
+}
+
/*
* Local variables:
* tab-width: 4