]> granicus.if.org Git - php/commitdiff
Fixed SEPARATE_ZVAL() to support objects and resources
authorDmitry Stogov <dmitry@zend.com>
Fri, 28 Feb 2014 07:21:15 +0000 (11:21 +0400)
committerDmitry Stogov <dmitry@zend.com>
Fri, 28 Feb 2014 07:21:15 +0000 (11:21 +0400)
Zend/zend.h

index b62a022e42d4e3b3ecd908184df5ce12a21bef39..1ac7914c756a5732592f2836c8cc46157b5dac69 100644 (file)
@@ -680,15 +680,20 @@ END_EXTERN_C()
                Z_UNSET_ISREF_P(z);                                             \
        } while (0)
 
-// TODO: support objects and resources???
-#define SEPARATE_ZVAL(zv) do {                                 \
-               if (Z_REFCOUNTED_P(zv)) {                               \
-                       if (Z_REFCOUNT_P(zv) > 1) {                     \
-                               Z_DELREF_P(zv);                                 \
-                               zval_copy_ctor(zv);                             \
-                               Z_SET_REFCOUNT_P(zv, 1);                \
-                       }                                                                       \
-               }                                                                               \
+// TODO: support objects and resources in more optimal way ???
+#define SEPARATE_ZVAL(zv) do {                                         \
+               if (Z_REFCOUNTED_P(zv)) {                                       \
+                       if (Z_REFCOUNT_P(zv) > 1) {                             \
+                               if (Z_TYPE_P(zv) == IS_OBJECT ||    \
+                                   Z_TYPE_P(zv) == IS_RESOURCE) {      \
+                                       Z_ADDREF_P(zv);                                 \
+                               } else {                                                        \
+                                       Z_DELREF_P(zv);                                 \
+                                       zval_copy_ctor(zv);                             \
+                                       Z_SET_REFCOUNT_P(zv, 1);                \
+                               }                                                                       \
+                       }                                                                               \
+               }                                                                                       \
        } while (0)
 
 #define SEPARATE_ZVAL_IF_NOT_REF(zv)                   \