]> granicus.if.org Git - php/commitdiff
Avoid useless duplication
authorDmitry Stogov <dmitry@zend.com>
Fri, 19 Jan 2018 10:14:15 +0000 (13:14 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 19 Jan 2018 10:14:15 +0000 (13:14 +0300)
Zend/zend.c
ext/spl/spl_array.c

index ba84f84def2d0ed7e1f19157c8a8319f25017795..f42a9875426bbdc3d5e958f9e7cae54353034d77 100644 (file)
@@ -732,8 +732,9 @@ static zend_bool php_auto_globals_create_globals(zend_string *name) /* {{{ */
 {
        zval globals;
 
+       /* IS_TYPE_COPYABLE, but with ref-counter 1 and not IS_TYPE_REFCOUNTED */
        ZVAL_ARR(&globals, &EG(symbol_table));
-       Z_TYPE_INFO_P(&globals) = IS_ARRAY;
+       Z_TYPE_FLAGS_P(&globals) = IS_TYPE_COPYABLE;
        ZVAL_NEW_REF(&globals, &globals);
        zend_hash_update(&EG(symbol_table), name, &globals);
        return 0;
index f98f11106b0e40690f45c1558ed92ad2918c4acc..01001f2da781b3381da7953cf97ea107895159dc 100644 (file)
@@ -1118,9 +1118,13 @@ static void spl_array_set_array(zval *object, spl_array_object *intern, zval *ar
        }
 
        if (Z_TYPE_P(array) == IS_ARRAY) {
-               //??? TODO: try to avoid array duplication
                zval_ptr_dtor(&intern->array);
-               ZVAL_DUP(&intern->array, array);
+               if (Z_REFCOUNT_P(array) == 1) {
+                       ZVAL_COPY(&intern->array, array);
+               } else {
+                       //??? TODO: try to avoid array duplication
+                       ZVAL_ARR(&intern->array, zend_array_dup(Z_ARR_P(array)));
+               }
        } else {
                if (Z_OBJ_HT_P(array) == &spl_handler_ArrayObject || Z_OBJ_HT_P(array) == &spl_handler_ArrayIterator) {
                        zval_ptr_dtor(&intern->array);