]> granicus.if.org Git - php/commitdiff
Improved conditions order
authorDmitry Stogov <dmitry@zend.com>
Fri, 30 May 2014 10:40:19 +0000 (14:40 +0400)
committerDmitry Stogov <dmitry@zend.com>
Fri, 30 May 2014 10:40:19 +0000 (14:40 +0400)
Zend/zend.h
Zend/zend_execute.c

index 1a4d301f450370ab3215bf4d766d70225f900b1a..1e592c05c1afd1d556d13284e6a2f623ad386473 100644 (file)
@@ -727,8 +727,11 @@ END_EXTERN_C()
 
 #define SEPARATE_ZVAL(zv) do {                                                 \
                zval *_zv = (zv);                                                               \
-               if (Z_REFCOUNTED_P(_zv)) {                                              \
-                       if (Z_REFCOUNT_P(_zv) > 1) {                            \
+               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)) {                                   \
                                        Z_DELREF_P(_zv);                                        \
                                        ZVAL_DUP(_zv, Z_REFVAL_P(_zv));         \
@@ -737,20 +740,20 @@ END_EXTERN_C()
                                        zval_copy_ctor_func(_zv);                       \
                                }                                                                               \
                        }                                                                                       \
-               } else if (Z_IMMUTABLE_P(_zv)) {                                \
-                       zval_copy_ctor_func(_zv);                                       \
                }                                                                                               \
        } while (0)
 
 #define SEPARATE_ZVAL_IF_NOT_REF(zv) do {                              \
                zval *_zv = (zv);                                                               \
                if (!Z_ISREF_P(_zv)) {                                                  \
-                       if (Z_COPYABLE_P(_zv) &&                                        \
-                           Z_REFCOUNT_P(_zv) > 1) {                            \
-                               Z_DELREF_P(_zv);                                                \
-                               zval_copy_ctor_func(_zv);                               \
-                       } else if (Z_IMMUTABLE_P(_zv)) {                        \
-                               zval_copy_ctor_func(_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);                                        \
+                                       zval_copy_ctor_func(_zv);                       \
+                               }                                                                               \
                        }                                                                                       \
                }                                                                                               \
        } while (0)
index 0cfd8f456c00aae0620f97865d54c0b4881de2b5..b3b7c0a0018eac4bf5ddaded74216766047bff4e 100644 (file)
@@ -1122,11 +1122,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
 
        ZVAL_DEREF(container);
        if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-               if (Z_IMMUTABLE_P(container)) {
-                       zval_copy_ctor(container);
-               } else if (container == container_ptr) {
-                       SEPARATE_ZVAL(container);
-               }
+               SEPARATE_ZVAL(container);
 fetch_from_array:
                if (dim == NULL) {
                        retval = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));