]> granicus.if.org Git - php/commitdiff
Avoid useless merge
authorDmitry Stogov <dmitry@zend.com>
Tue, 3 Jun 2014 22:11:26 +0000 (02:11 +0400)
committerDmitry Stogov <dmitry@zend.com>
Tue, 3 Jun 2014 22:11:26 +0000 (02:11 +0400)
Zend/zend_API.c
Zend/zend_API.h
ext/mysql/php_mysql.c
ext/mysqli/mysqli.c
ext/pgsql/pgsql.c

index 2bafa8586a7fb1d802a4fbae319298fdf08144a4..45e2331518a65506e1a7c0f0911516e169e05b0b 100644 (file)
@@ -1097,7 +1097,7 @@ ZEND_API int _array_init(zval *arg, uint size ZEND_FILE_LINE_DC) /* {{{ */
 
 /* This function should be called after the constructor has been called
  * because it may call __set from the uninitialized object otherwise. */
-ZEND_API void zend_merge_properties(zval *obj, HashTable *properties, int destroy_ht TSRMLS_DC) /* {{{ */
+ZEND_API void zend_merge_properties(zval *obj, HashTable *properties TSRMLS_DC) /* {{{ */
 {
        const zend_object_handlers *obj_ht = Z_OBJ_HT_P(obj);
        zend_class_entry *old_scope = EG(scope);
@@ -1115,11 +1115,6 @@ ZEND_API void zend_merge_properties(zval *obj, HashTable *properties, int destro
                }
        } ZEND_HASH_FOREACH_END();
        EG(scope) = old_scope;
-
-       if (destroy_ht) {
-               zend_hash_destroy(properties);
-               FREE_HASHTABLE(properties);
-       }
 }
 /* }}} */
 
index 73152caa1c4522016230d9ccbf82888bc908b798..0b96db84f1b03808a418e888640a5045cc318ad4 100644 (file)
@@ -370,7 +370,7 @@ ZEND_API void object_properties_init(zend_object *object, zend_class_entry *clas
 ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properties TSRMLS_DC);
 ZEND_API void object_properties_load(zend_object *object, HashTable *properties TSRMLS_DC);
 
-ZEND_API void zend_merge_properties(zval *obj, HashTable *properties, int destroy_ht TSRMLS_DC);
+ZEND_API void zend_merge_properties(zval *obj, HashTable *properties TSRMLS_DC);
 
 /* no longer supported */
 ZEND_API int add_assoc_function(zval *arg, const char *key, void (*function_ptr)(INTERNAL_FUNCTION_PARAMETERS));
index 580296a3cf48c39202363bbe6fb58d10c6676ff1..588eaf0539d76d2a90a9b383f0b0b92a5357d69a 100644 (file)
@@ -2171,8 +2171,14 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type,
 
                ZVAL_COPY_VALUE(&dataset, return_value);
                object_and_properties_init(return_value, ce, NULL);
-               zend_merge_properties(return_value, Z_ARRVAL(dataset), 0 TSRMLS_CC);
-               zval_dtor(&dataset);
+               if (!ce->default_properties_count && !ce->__set) {
+                       ALLOC_HASHTABLE(Z_OBJ_P(return_value)->properties);
+                       *Z_OBJ_P(return_value)->properties = *Z_ARRVAL(dataset);
+                       efree(Z_ARR(dataset));
+               } else {
+                       zend_merge_properties(return_value, Z_ARRVAL(dataset) TSRMLS_CC);
+                       zval_dtor(&dataset);
+               }
 
                if (ce->constructor) {
                        fci.size = sizeof(fci);
index 7684e25765eb83e6d6bdf1f67d232b1befc009f0..0d4683102abd0f6be0d10071f243abd16ad36776 100644 (file)
@@ -1287,8 +1287,14 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags
                ZVAL_COPY_VALUE(&dataset, return_value);
 
                object_and_properties_init(return_value, ce, NULL);
-               zend_merge_properties(return_value, Z_ARRVAL(dataset), 0 TSRMLS_CC);
-               zval_ptr_dtor(&dataset);
+               if (!ce->default_properties_count && !ce->__set) {
+                       ALLOC_HASHTABLE(Z_OBJ_P(return_value)->properties);
+                       *Z_OBJ_P(return_value)->properties = *Z_ARRVAL(dataset);
+                       efree(Z_ARR(dataset));
+               } else {
+                       zend_merge_properties(return_value, Z_ARRVAL(dataset) TSRMLS_CC);
+                       zval_ptr_dtor(&dataset);
+               }
 
                if (ce->constructor) {
                        fci.size = sizeof(fci);
index 331119663848011e64ed5490cdfaa7238bcca682..4381440e8da0f370304eda4389a8d1813ebae3e2 100644 (file)
@@ -2752,8 +2752,14 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type,
 
                ZVAL_COPY_VALUE(&dataset, return_value);
                object_and_properties_init(return_value, ce, NULL);
-               zend_merge_properties(return_value, Z_ARRVAL(dataset), 0 TSRMLS_CC);
-               zval_ptr_dtor(&dataset);
+               if (!ce->default_properties_count && !ce->__set) {
+                       ALLOC_HASHTABLE(Z_OBJ_P(return_value)->properties);
+                       *Z_OBJ_P(return_value)->properties = *Z_ARRVAL(dataset);
+                       efree(Z_ARR(dataset));
+               } else {
+                       zend_merge_properties(return_value, Z_ARRVAL(dataset) TSRMLS_CC);
+                       zval_ptr_dtor(&dataset);
+               }
 
                if (ce->constructor) {
                        fci.size = sizeof(fci);