From: Dmitry Stogov Date: Fri, 28 Feb 2014 07:03:05 +0000 (+0400) Subject: Converting from reference to regular value X-Git-Tag: POST_PHPNG_MERGE~412^2~492^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=54095e8c564e1a5ddb4457cfa47874523e6eda6e;p=php Converting from reference to regular value --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index c370a05189..435ab517ad 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3076,7 +3076,7 @@ ZEND_API void function_add_ref(zend_function *function) /* {{{ */ ALLOC_HASHTABLE(op_array->static_variables); zend_hash_init(op_array->static_variables, zend_hash_num_elements(static_variables), NULL, ZVAL_PTR_DTOR, 0); - zend_hash_copy(op_array->static_variables, static_variables, zval_add_ref); + zend_hash_copy(op_array->static_variables, static_variables, zval_add_ref_unref); } op_array->run_time_cache = NULL; } diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 5b6bd5ebb8..6ac237a5ea 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -150,7 +150,7 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *o ALLOC_HASHTABLE(new_object->properties); zend_hash_init(new_object->properties, 0, NULL, ZVAL_PTR_DTOR, 0); } - zend_hash_copy(new_object->properties, old_object->properties, zval_add_ref); + zend_hash_copy(new_object->properties, old_object->properties, zval_add_ref_unref); if (old_object->properties_table) { HashPosition pos; zval *prop; diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index a3d768d6d3..5292cf9f0c 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -187,11 +187,26 @@ ZEND_API void _zval_internal_dtor_for_ptr(zval *zvalue ZEND_FILE_LINE_DC) ZEND_API void zval_add_ref(zval *p) { - if (Z_REFCOUNTED_P(p)) { + if (Z_REFCOUNTED_P(p)) { Z_ADDREF_P(p); } } +ZEND_API void zval_add_ref_unref(zval *p) +{ + if (Z_REFCOUNTED_P(p)) { + if (Z_ISREF_P(p)) { + if (Z_REFCOUNT_P(p) == 1) { + zval *q = Z_REFVAL_P(p); + ZVAL_DUP(p, q); + } else { + Z_ADDREF_P(p); + } + } else { + Z_ADDREF_P(p); + } + } +} ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC) { diff --git a/Zend/zend_variables.h b/Zend/zend_variables.h index ab5c5b38b8..2e2b183d76 100644 --- a/Zend/zend_variables.h +++ b/Zend/zend_variables.h @@ -78,6 +78,8 @@ ZEND_API void _zval_internal_ptr_dtor_wrapper(zval *zvalue); #endif ZEND_API void zval_add_ref(zval *p); +//??? previously references become regular values when refcount became 1 +ZEND_API void zval_add_ref_unref(zval *p); END_EXTERN_C()