]> granicus.if.org Git - php/commitdiff
code optimization
authorDmitry Stogov <dmitry@zend.com>
Tue, 16 Sep 2014 09:52:50 +0000 (13:52 +0400)
committerDmitry Stogov <dmitry@zend.com>
Tue, 16 Sep 2014 09:52:50 +0000 (13:52 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index d2b3c72269a283cb099b57514fd93f58017c24ff..a3ae246579f112fea8998a951d52a25017f4b491 100644 (file)
@@ -4466,17 +4466,15 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
                ZVAL_DEREF(array_ptr);
                if (Z_TYPE_P(array_ptr) == IS_ARRAY) {
                        if (!Z_ISREF_P(array_ref)) {
-                               SEPARATE_ZVAL_NOREF(array_ptr);
+                               SEPARATE_ARRAY(array_ptr);
                                array_ref = array_ptr;
                                if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
                                        ZVAL_NEW_REF(array_ptr, array_ptr);
                                        array_ref = array_ptr;
                                        array_ptr = Z_REFVAL_P(array_ptr);                                              
                                }
-                       } else if (Z_IMMUTABLE_P(array_ptr)) {
+                       } else if (Z_IMMUTABLE_P(array_ptr) || Z_REFCOUNT_P(array_ptr) > 1) {
                                zval_copy_ctor(array_ptr);
-                       } else {
-                               SEPARATE_ZVAL_NOREF(array_ptr);
                        }
                        if (Z_REFCOUNTED_P(array_ref)) Z_ADDREF_P(array_ref);
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
@@ -4487,9 +4485,6 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
 
                        ce = Z_OBJCE_P(array_ptr);
                        if (!ce || ce->get_iterator == NULL) {
-                               if (!Z_ISREF_P(array_ref)) {
-                                       SEPARATE_ZVAL_NOREF(array_ptr);
-                               }
                                Z_ADDREF_P(array_ptr);
                        }
                        array_ref = array_ptr;
index 94aa9662b7b6816a79d43bb359ec2fa89d8502b0..1a2defd5849896dff70820b2dcbc0bd427efc83b 100644 (file)
@@ -3070,17 +3070,15 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                ZVAL_DEREF(array_ptr);
                if (Z_TYPE_P(array_ptr) == IS_ARRAY) {
                        if (!Z_ISREF_P(array_ref)) {
-                               SEPARATE_ZVAL_NOREF(array_ptr);
+                               SEPARATE_ARRAY(array_ptr);
                                array_ref = array_ptr;
                                if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
                                        ZVAL_NEW_REF(array_ptr, array_ptr);
                                        array_ref = array_ptr;
                                        array_ptr = Z_REFVAL_P(array_ptr);
                                }
-                       } else if (Z_IMMUTABLE_P(array_ptr)) {
+                       } else if (Z_IMMUTABLE_P(array_ptr) || Z_REFCOUNT_P(array_ptr) > 1) {
                                zval_copy_ctor(array_ptr);
-                       } else {
-                               SEPARATE_ZVAL_NOREF(array_ptr);
                        }
                        if (Z_REFCOUNTED_P(array_ref)) Z_ADDREF_P(array_ref);
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
@@ -3091,9 +3089,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
 
                        ce = Z_OBJCE_P(array_ptr);
                        if (!ce || ce->get_iterator == NULL) {
-                               if (!Z_ISREF_P(array_ref)) {
-                                       SEPARATE_ZVAL_NOREF(array_ptr);
-                               }
                                Z_ADDREF_P(array_ptr);
                        }
                        array_ref = array_ptr;
@@ -9796,17 +9791,15 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                ZVAL_DEREF(array_ptr);
                if (Z_TYPE_P(array_ptr) == IS_ARRAY) {
                        if (!Z_ISREF_P(array_ref)) {
-                               SEPARATE_ZVAL_NOREF(array_ptr);
+                               SEPARATE_ARRAY(array_ptr);
                                array_ref = array_ptr;
                                if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
                                        ZVAL_NEW_REF(array_ptr, array_ptr);
                                        array_ref = array_ptr;
                                        array_ptr = Z_REFVAL_P(array_ptr);
                                }
-                       } else if (Z_IMMUTABLE_P(array_ptr)) {
+                       } else if (Z_IMMUTABLE_P(array_ptr) || Z_REFCOUNT_P(array_ptr) > 1) {
                                zval_copy_ctor(array_ptr);
-                       } else {
-                               SEPARATE_ZVAL_NOREF(array_ptr);
                        }
                        if (Z_REFCOUNTED_P(array_ref)) Z_ADDREF_P(array_ref);
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
@@ -9817,9 +9810,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
                        ce = Z_OBJCE_P(array_ptr);
                        if (!ce || ce->get_iterator == NULL) {
-                               if (!Z_ISREF_P(array_ref)) {
-                                       SEPARATE_ZVAL_NOREF(array_ptr);
-                               }
                                Z_ADDREF_P(array_ptr);
                        }
                        array_ref = array_ptr;
@@ -16436,17 +16426,15 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                ZVAL_DEREF(array_ptr);
                if (Z_TYPE_P(array_ptr) == IS_ARRAY) {
                        if (!Z_ISREF_P(array_ref)) {
-                               SEPARATE_ZVAL_NOREF(array_ptr);
+                               SEPARATE_ARRAY(array_ptr);
                                array_ref = array_ptr;
                                if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
                                        ZVAL_NEW_REF(array_ptr, array_ptr);
                                        array_ref = array_ptr;
                                        array_ptr = Z_REFVAL_P(array_ptr);
                                }
-                       } else if (Z_IMMUTABLE_P(array_ptr)) {
+                       } else if (Z_IMMUTABLE_P(array_ptr) || Z_REFCOUNT_P(array_ptr) > 1) {
                                zval_copy_ctor(array_ptr);
-                       } else {
-                               SEPARATE_ZVAL_NOREF(array_ptr);
                        }
                        if (Z_REFCOUNTED_P(array_ref)) Z_ADDREF_P(array_ref);
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
@@ -16457,9 +16445,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
                        ce = Z_OBJCE_P(array_ptr);
                        if (!ce || ce->get_iterator == NULL) {
-                               if (!Z_ISREF_P(array_ref)) {
-                                       SEPARATE_ZVAL_NOREF(array_ptr);
-                               }
                                Z_ADDREF_P(array_ptr);
                        }
                        array_ref = array_ptr;
@@ -33881,17 +33866,15 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                ZVAL_DEREF(array_ptr);
                if (Z_TYPE_P(array_ptr) == IS_ARRAY) {
                        if (!Z_ISREF_P(array_ref)) {
-                               SEPARATE_ZVAL_NOREF(array_ptr);
+                               SEPARATE_ARRAY(array_ptr);
                                array_ref = array_ptr;
                                if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
                                        ZVAL_NEW_REF(array_ptr, array_ptr);
                                        array_ref = array_ptr;
                                        array_ptr = Z_REFVAL_P(array_ptr);
                                }
-                       } else if (Z_IMMUTABLE_P(array_ptr)) {
+                       } else if (Z_IMMUTABLE_P(array_ptr) || Z_REFCOUNT_P(array_ptr) > 1) {
                                zval_copy_ctor(array_ptr);
-                       } else {
-                               SEPARATE_ZVAL_NOREF(array_ptr);
                        }
                        if (Z_REFCOUNTED_P(array_ref)) Z_ADDREF_P(array_ref);
                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
@@ -33902,9 +33885,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
 
                        ce = Z_OBJCE_P(array_ptr);
                        if (!ce || ce->get_iterator == NULL) {
-                               if (!Z_ISREF_P(array_ref)) {
-                                       SEPARATE_ZVAL_NOREF(array_ptr);
-                               }
                                Z_ADDREF_P(array_ptr);
                        }
                        array_ref = array_ptr;