]> granicus.if.org Git - php/commitdiff
Fixed IS_REFERENCE separation
authorDmitry Stogov <dmitry@zend.com>
Tue, 4 Mar 2014 20:28:01 +0000 (00:28 +0400)
committerDmitry Stogov <dmitry@zend.com>
Tue, 4 Mar 2014 20:28:01 +0000 (00:28 +0400)
Zend/zend.h
Zend/zend_object_handlers.c

index 27caadc51cb2bd0c45396f87639136a407f155ef..09db94d83660bc21ae64aee015cfa96c75d3cd68 100644 (file)
@@ -696,7 +696,10 @@ END_EXTERN_C()
                zval *_zv = (zv);                                                               \
                if (Z_REFCOUNTED_P(_zv)) {                                              \
                        if (Z_REFCOUNT_P(_zv) > 1) {                            \
-                               if (Z_TYPE_P(_zv) == IS_OBJECT ||               \
+                               if (Z_ISREF_P(_zv)) {                                   \
+                                       Z_DELREF_P(_zv);                                        \
+                                       ZVAL_DUP(_zv, Z_REFVAL_P(_zv));         \
+                               } else if (Z_TYPE_P(_zv) == IS_OBJECT ||\
                                    Z_TYPE_P(_zv) == IS_RESOURCE) {             \
                                        Z_ADDREF_P(_zv);                                        \
                                } else {                                                                \
index de5da28e6a62c8d31259671caf2db5710ae8a391..2205ab2f1e3e079ead3d42e289511a78457bf945 100644 (file)
@@ -638,9 +638,10 @@ found:
        } else if (EXPECTED(property_info != NULL)) {
                /* if we assign referenced variable, we should separate it */
                if (IS_REFCOUNTED(Z_TYPE_P(value))) {
-                       Z_ADDREF_P(value);
                        if (Z_ISREF_P(value)) {
-                               SEPARATE_ZVAL(value);
+                               ZVAL_DUP(value, Z_REFVAL_P(value));
+                       } else {
+                               Z_ADDREF_P(value);
                        }
                }
                if (EXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0) &&