]> granicus.if.org Git - php/commitdiff
Converting from reference to regular value
authorDmitry Stogov <dmitry@zend.com>
Fri, 28 Feb 2014 07:03:05 +0000 (11:03 +0400)
committerDmitry Stogov <dmitry@zend.com>
Fri, 28 Feb 2014 07:03:05 +0000 (11:03 +0400)
Zend/zend_compile.c
Zend/zend_objects.c
Zend/zend_variables.c
Zend/zend_variables.h

index c370a0518958fa2333057b968204f9e7f2a53121..435ab517ad46b12a7048b2c8b71a8675b69cc7d6 100644 (file)
@@ -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;
        }
index 5b6bd5ebb84f59ca4643f1ad77c18e48a62a05d6..6ac237a5ea0572d7a2415f9bc2849ee271c63629 100644 (file)
@@ -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;
index a3d768d6d395626067243f694aec832ae25791d0..5292cf9f0c60df02ac3bab81e625462753c36751 100644 (file)
@@ -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)
 {
index ab5c5b38b887fc40a0eb893f45978d51c5e0c1d8..2e2b183d761c45cd6d685ae16c4467973affad98 100644 (file)
@@ -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()