diff options
author | Andi Gutmans <andi@php.net> | 1999-07-26 19:32:13 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 1999-07-26 19:32:13 +0000 |
commit | 7d77a63342c6c5794c649e7a00ebf4471d48c5a4 (patch) | |
tree | ccbde8a21934fd6c0e9b56700aed2e8c6291e9c9 /Zend | |
parent | fe0fbdc5b646c3ffa827e45a03db8a8da4dc7bb5 (diff) | |
download | php-git-7d77a63342c6c5794c649e7a00ebf4471d48c5a4.tar.gz |
- Should be a complete fix now. This break away code should maybe be made
somewhat generic
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/zend_execute.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index a1c77bdb59..57351f7ec2 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1410,12 +1410,24 @@ do_fcall_common: && object_ptr && function_being_called->type!=ZEND_OVERLOADED_FUNCTION) { zval **this_ptr; + zval *tmp; zend_hash_update_ptr(function_state.function_symbol_table, "this", sizeof("this"), NULL, sizeof(zval *), (void **) &this_ptr); + if (!PZVAL_IS_REF(object_ptr)) { + /* break it away */ + object_ptr->refcount--; + if (object_ptr->refcount>0) { + tmp = (zval *) emalloc(sizeof(zval)); + *tmp = *object_ptr; + zendi_zval_copy_ctor(*tmp); + object_ptr = tmp; + } + object_ptr->refcount = 1; + object_ptr->EA.is_ref = 1; + object_ptr->EA.locks = 0; + } *this_ptr = object_ptr; - object_ptr->EA.is_ref=1; object_ptr->refcount++; - object_ptr = NULL; } original_return_value = EG(return_value); EG(return_value) = &Ts[opline->result.u.var].tmp_var; |