From 5cb454a8ad212f7d3ededc650466a087ffde2ffe Mon Sep 17 00:00:00 2001 From: Andi Gutmans Date: Wed, 26 Dec 2001 20:17:34 +0000 Subject: [PATCH] - Fix scoping issue. The following works now: id = self::$id++; } function _clone() { $this->name = $clone->name; $this->address = "New York"; $this->id = self::$id++; } } $obj = new MyClass(); $obj->name = "Hello"; $obj->address = "Tel-Aviv"; print $obj->id; print "\n"; $obj = $obj->_clone(); print $obj->id; print "\n"; print $obj->name; print "\n"; print $obj->address; print "\n"; --- Zend/zend_execute.c | 1 + Zend/zend_execute_API.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 5af6971af1..cf9c4b42e4 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1556,6 +1556,7 @@ binary_assign_op_addr: { EX(object).ptr = this_ptr; } EX(fbc) = Z_OBJCE_P(EX(object).ptr)->constructor; + EX(calling_namespace) = Z_OBJCE_P(EX(object).ptr); NEXT_OPCODE(); } function_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index e9719e0287..834ec351ee 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -440,6 +440,8 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun int (*orig_unary_op)(zval *result, zval *op1); int (*orig_binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC); zval function_name_copy; + zend_class_entry *current_namespace; + zend_class_entry *calling_namespace = NULL; *retval_ptr_ptr = NULL; @@ -464,6 +466,7 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun if (object_pp) { if (Z_TYPE_PP(object_pp) == IS_OBJECT) { function_table = &Z_OBJCE_PP(object_pp)->function_table; + calling_namespace = Z_OBJCE_PP(object_pp); } else if (Z_TYPE_PP(object_pp) == IS_STRING) { zend_class_entry *ce; char *lc_class; @@ -477,6 +480,7 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun return FAILURE; function_table = &ce->function_table; + calling_namespace = ce; object_pp = NULL; } else return FAILURE; @@ -535,6 +539,9 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun EG(function_state_ptr) = &function_state; + current_namespace = EG(namespace); + EG(namespace) = calling_namespace; + if (function_state.function->type == ZEND_USER_FUNCTION) { calling_symbol_table = EG(active_symbol_table); if (symbol_table) { @@ -581,6 +588,8 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun zend_ptr_stack_clear_multiple(TSRMLS_C); EG(function_state_ptr) = original_function_state_ptr; + EG(namespace) = current_namespace; + return SUCCESS; } -- 2.40.0