summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2002-07-06 17:44:45 +0000
committerAndi Gutmans <andi@php.net>2002-07-06 17:44:45 +0000
commit677a9e87516dffd335a952da064584f2ce8138e9 (patch)
tree598cea2657a5352382b1019c4910da60c4a99155 /Zend/zend_execute.c
parent0ae66bd6599e58b0ba4ff660c40c1a6cbd38d550 (diff)
downloadphp-git-677a9e87516dffd335a952da064584f2ce8138e9.tar.gz
- Fix problem where scope was lost in nested function calls.
- Thanks to Timm Friebe for diving into this one.
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 0686326480..f2f70e375f 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1864,7 +1864,7 @@ binary_assign_op_addr_obj:
}
case ZEND_INIT_CTOR_CALL:
{
- zend_ptr_stack_n_push(&EG(arg_types_stack), 2, EX(fbc), EX(object));
+ zend_ptr_stack_n_push(&EG(arg_types_stack), 3, EX(fbc), EX(object), EX(calling_scope));
if (EX(opline)->op1.op_type == IS_VAR) {
SELECTIVE_PZVAL_LOCK(*EX(Ts)[EX(opline)->op1.u.var].var.ptr_ptr, &EX(opline)->op1);
@@ -1901,7 +1901,7 @@ binary_assign_op_addr_obj:
char *function_name_strval;
int function_name_strlen;
- zend_ptr_stack_n_push(&EG(arg_types_stack), 2, EX(fbc), EX(object));
+ zend_ptr_stack_n_push(&EG(arg_types_stack), 3, EX(fbc), EX(object), EX(calling_scope));
function_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R);
function_name_strval = function_name->value.str.val;
@@ -1958,7 +1958,7 @@ binary_assign_op_addr_obj:
char *function_name_strval;
int function_name_strlen;
- zend_ptr_stack_n_push(&EG(arg_types_stack), 2, EX(fbc), EX(object));
+ zend_ptr_stack_n_push(&EG(arg_types_stack), 3, EX(fbc), EX(object), EX(calling_scope));
is_const = (EX(opline)->op2.op_type == IS_CONST);
@@ -2007,7 +2007,7 @@ binary_assign_op_addr_obj:
char *function_name_strval;
int function_name_strlen;
- zend_ptr_stack_n_push(&EG(arg_types_stack), 2, EX(fbc), EX(object));
+ zend_ptr_stack_n_push(&EG(arg_types_stack), 3, EX(fbc), EX(object), EX(calling_scope));
is_const = (EX(opline)->op2.op_type == IS_CONST);
@@ -2058,7 +2058,7 @@ binary_assign_op_addr_obj:
case ZEND_DO_FCALL: {
zval *fname = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R);
- zend_ptr_stack_push(&EG(arg_types_stack), EX(object));
+ zend_ptr_stack_n_push(&EG(arg_types_stack), 3, EX(fbc), EX(object), EX(calling_scope));
do {
if (EG(scope)) {
@@ -2161,11 +2161,8 @@ do_fcall_common:
zval_ptr_dtor(&EX(Ts)[EX(opline)->result.u.var].var.ptr);
}
}
- if (EX(opline)->opcode == ZEND_DO_FCALL_BY_NAME) {
- zend_ptr_stack_n_pop(&EG(arg_types_stack), 2, &EX(object), &EX(fbc));
- } else {
- EX(object) = zend_ptr_stack_pop(&EG(arg_types_stack));
- }
+ zend_ptr_stack_n_pop(&EG(arg_types_stack), 3, &EX(calling_scope), &EX(object), &EX(fbc));
+
EX(function_state).function = (zend_function *) op_array;
EG(function_state_ptr) = &EX(function_state);
zend_ptr_stack_clear_multiple(TSRMLS_C);