]> granicus.if.org Git - php/commitdiff
Improved conditions order
authorDmitry Stogov <dmitry@zend.com>
Tue, 10 Jun 2014 22:46:50 +0000 (02:46 +0400)
committerDmitry Stogov <dmitry@zend.com>
Tue, 10 Jun 2014 22:46:50 +0000 (02:46 +0400)
Zend/zend.h
Zend/zend_compile.c

index c346c023c1cad0c367c629498d6100b113492556..ea2c8f7a3337468a074f29a5cdee52a8971647e4 100644 (file)
@@ -379,7 +379,7 @@ void zend_error_noreturn(int type, const char *format, ...) __attribute__ ((nore
 #include "zend_string.h"
 
 static zend_always_inline zend_uint zval_refcount_p(zval* pz) {
-       ZEND_ASSERT(Z_REFCOUNTED_P(pz));
+       ZEND_ASSERT(Z_REFCOUNTED_P(pz) || Z_IMMUTABLE_P(pz));
        return GC_REFCOUNT(Z_COUNTED_P(pz));
 }
 
@@ -734,10 +734,10 @@ END_EXTERN_C()
 
 #define SEPARATE_ARRAY(zv) do {                                                        \
                zval *_zv = (zv);                                                               \
-               if (Z_IMMUTABLE_P(_zv)) {                                               \
-                       zval_copy_ctor_func(_zv);                                       \
-               } else if (Z_REFCOUNT_P(_zv) > 1) {                             \
-                       Z_DELREF_P(_zv);                                                        \
+               if (Z_REFCOUNT_P(_zv) > 1) {                                    \
+                       if (!Z_IMMUTABLE_P(_zv)) {                                      \
+                               Z_DELREF_P(_zv);                                                \
+                       }                                                                                       \
                        zval_copy_ctor_func(_zv);                                       \
                }                                                                                               \
        } while (0)
@@ -746,10 +746,10 @@ END_EXTERN_C()
                zval *_zv = (zv);                                                               \
                if (Z_COPYABLE_P(_zv) ||                                                \
                    Z_IMMUTABLE_P(_zv)) {                                               \
-                       if (Z_IMMUTABLE_P(_zv)) {                                       \
-                               zval_copy_ctor_func(_zv);                               \
-                       } else if (Z_REFCOUNT_P(_zv) > 1) {                     \
-                               Z_DELREF_P(_zv);                                                \
+                       if (Z_REFCOUNT_P(_zv) > 1) {                            \
+                               if (!Z_IMMUTABLE_P(_zv)) {                              \
+                                       Z_DELREF_P(_zv);                                        \
+                               }                                                                               \
                                zval_copy_ctor_func(_zv);                               \
                        }                                                                                       \
                }                                                                                               \
@@ -759,15 +759,16 @@ END_EXTERN_C()
                zval *_zv = (zv);                                                               \
                if (Z_REFCOUNTED_P(_zv) ||                                              \
                    Z_IMMUTABLE_P(_zv)) {                                               \
-                       if (Z_IMMUTABLE_P(_zv)) {                                       \
-                               zval_copy_ctor_func(_zv);                               \
-                       } else if (Z_REFCOUNT_P(_zv) > 1) {                     \
-                               if (Z_ISREF_P(_zv)) {                                   \
+                       if (Z_REFCOUNT_P(_zv) > 1) {                            \
+                               if (Z_COPYABLE_P(_zv) ||                                \
+                                   Z_IMMUTABLE_P(_zv)) {                               \
+                                       if (!Z_IMMUTABLE_P(_zv)) {                      \
+                                               Z_DELREF_P(_zv);                                \
+                                       }                                                                       \
+                                       zval_copy_ctor_func(_zv);                       \
+                               } else if (Z_ISREF_P(_zv)) {                    \
                                        Z_DELREF_P(_zv);                                        \
                                        ZVAL_DUP(_zv, Z_REFVAL_P(_zv));         \
-                               } else if (Z_COPYABLE_P(_zv)) {                 \
-                                       Z_DELREF_P(_zv);                                        \
-                                       zval_copy_ctor_func(_zv);                       \
                                }                                                                               \
                        }                                                                                       \
                }                                                                                               \
@@ -775,15 +776,13 @@ END_EXTERN_C()
 
 #define SEPARATE_ZVAL_IF_NOT_REF(zv) do {                              \
                zval *_zv = (zv);                                                               \
-               if (!Z_ISREF_P(_zv)) {                                                  \
-                       if (Z_COPYABLE_P(_zv) ||                    \
-                           Z_IMMUTABLE_P(_zv)) {                                       \
-                               if (Z_IMMUTABLE_P(_zv)) {                               \
-                                       zval_copy_ctor_func(_zv);                       \
-                               } else if (Z_REFCOUNT_P(_zv) > 1) {             \
+               if (Z_COPYABLE_P(_zv) ||                        \
+                   Z_IMMUTABLE_P(_zv)) {                                               \
+                       if (Z_REFCOUNT_P(_zv) > 1) {                            \
+                               if (!Z_IMMUTABLE_P(_zv)) {                              \
                                        Z_DELREF_P(_zv);                                        \
-                                       zval_copy_ctor_func(_zv);                       \
                                }                                                                               \
+                               zval_copy_ctor_func(_zv);                               \
                        }                                                                                       \
                }                                                                                               \
        } while (0)
index de45b5a683f36b7471307ed1d5b083eee6930ebe..ada6c873a10da2ed0634f6ba3a897d59cc231224 100644 (file)
@@ -7501,6 +7501,7 @@ ZEND_API void zend_make_immutable_array(zval *zv TSRMLS_DC) /* {{{ */
        }
 
        Z_TYPE_FLAGS_P(zv) = IS_TYPE_IMMUTABLE;
+       GC_REFCOUNT(Z_COUNTED_P(zv)) = 2;
        Z_ARRVAL_P(zv)->u.flags &= ~HASH_FLAG_APPLY_PROTECTION;
 
        /* store as an anonymous constant */