]> granicus.if.org Git - php/commitdiff
Fixed refcounting
authorDmitry Stogov <dmitry@zend.com>
Fri, 7 Mar 2014 11:58:09 +0000 (15:58 +0400)
committerDmitry Stogov <dmitry@zend.com>
Fri, 7 Mar 2014 11:58:09 +0000 (15:58 +0400)
Zend/zend.h

index e2aaf1a1034fc6039926c97788d3f521daf395c4..bb883b40cbba7954ecccdba20aca8f3a0949f12a 100644 (file)
@@ -699,7 +699,7 @@ END_EXTERN_C()
                                        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);                                        \
+                                       /*Z_ADDREF_P(_zv);*/                            \
                                } else {                                                                \
                                        Z_DELREF_P(_zv);                                        \
                                        zval_copy_ctor(_zv);                            \
@@ -734,10 +734,17 @@ END_EXTERN_C()
 #define SEPARATE_ZVAL_TO_MAKE_IS_REF(zv) do {                  \
                zval *__zv = (zv);                                                              \
                if (!Z_ISREF_P(__zv)) {                                                 \
-                       zval ref;                                                                       \
-                       ZVAL_COPY_VALUE(&ref, __zv);                            \
-                       SEPARATE_ZVAL(&ref);                                            \
-                       ZVAL_NEW_REF(__zv, &ref);                                       \
+                       if (!Z_REFCOUNTED_P(__zv) ||                            \
+                           Z_REFCOUNT_P(__zv) == 1) {                          \
+                               ZVAL_NEW_REF(__zv, __zv);                               \
+                       } else if (Z_TYPE_P(__zv) == IS_OBJECT ||       \
+                           Z_TYPE_P(__zv) == IS_RESOURCE) {            \
+                       } else {                                                                        \
+                               zval ref;                                                               \
+                               ZVAL_COPY_VALUE(&ref, __zv);                    \
+                               SEPARATE_ZVAL(&ref);                                    \
+                               ZVAL_NEW_REF(__zv, &ref);                               \
+                       }                                                                                       \
                }                                                                                               \
        } while (0)