diff options
| author | Dmitry Stogov <dmitry@php.net> | 2011-02-14 10:52:16 +0000 | 
|---|---|---|
| committer | Dmitry Stogov <dmitry@php.net> | 2011-02-14 10:52:16 +0000 | 
| commit | 9b4ada5c0e014307b7d20abd54f975f34bd0a635 (patch) | |
| tree | 3a1a3ba389653e67b76d2363417d8b543843789a /Zend/zend_closures.c | |
| parent | 8a485c7c9194f9d1cffea7a704c2ecbe7f775fc0 (diff) | |
| download | php-git-9b4ada5c0e014307b7d20abd54f975f34bd0a635.tar.gz | |
Fixed Bug #53958 (Closures can't 'use' shared variables by value and by reference)
Diffstat (limited to 'Zend/zend_closures.c')
| -rw-r--r-- | Zend/zend_closures.c | 19 | 
1 files changed, 13 insertions, 6 deletions
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 5d34a05c13..d460416e6c 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -323,6 +323,7 @@ static int zval_copy_static_var(zval **p TSRMLS_DC, int num_args, va_list args,  {  	HashTable *target = va_arg(args, HashTable*);  	zend_bool is_ref; +	zval *tmp;  	if (Z_TYPE_PP(p) & (IS_LEXICAL_VAR|IS_LEXICAL_REF)) {  		is_ref = Z_TYPE_PP(p) & IS_LEXICAL_REF; @@ -332,25 +333,31 @@ static int zval_copy_static_var(zval **p TSRMLS_DC, int num_args, va_list args,  		}  		if (zend_hash_quick_find(EG(active_symbol_table), key->arKey, key->nKeyLength, key->h, (void **) &p) == FAILURE) {  			if (is_ref) { -				zval *tmp; -  				ALLOC_INIT_ZVAL(tmp);  				Z_SET_ISREF_P(tmp);  				zend_hash_quick_add(EG(active_symbol_table), key->arKey, key->nKeyLength, key->h, &tmp, sizeof(zval*), (void**)&p);  			} else { -				p = &EG(uninitialized_zval_ptr); +				tmp = EG(uninitialized_zval_ptr);  				zend_error(E_NOTICE,"Undefined variable: %s", key->arKey);  			}  		} else {  			if (is_ref) {  				SEPARATE_ZVAL_TO_MAKE_IS_REF(p); +				tmp = *p;  			} else if (Z_ISREF_PP(p)) { -				SEPARATE_ZVAL(p); +				ALLOC_INIT_ZVAL(tmp); +				*tmp = **p; +				Z_SET_REFCOUNT_P(tmp, 0); +				Z_UNSET_ISREF_P(tmp); +			} else { +				tmp = *p;  			}  		} +	} else { +		tmp = *p;  	} -	if (zend_hash_quick_add(target, key->arKey, key->nKeyLength, key->h, p, sizeof(zval*), NULL) == SUCCESS) { -		Z_ADDREF_PP(p); +	if (zend_hash_quick_add(target, key->arKey, key->nKeyLength, key->h, &tmp, sizeof(zval*), NULL) == SUCCESS) { +		Z_ADDREF_P(tmp);  	}  	return ZEND_HASH_APPLY_KEEP;  }  | 
