]> granicus.if.org Git - php/commitdiff
Make zend_array_destroy() to free the corresponding zend_array
authorDmitry Stogov <dmitry@zend.com>
Tue, 24 Feb 2015 15:34:37 +0000 (18:34 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 24 Feb 2015 15:34:37 +0000 (18:34 +0300)
Zend/zend_execute.c
Zend/zend_hash.c
Zend/zend_objects.c
Zend/zend_opcode.c
Zend/zend_variables.c

index 00a68613fcbb58517422d4e68dde11eb356e52a3..9e3d9f10d1a25b2ead29056f263c3063dccb5b8e 100644 (file)
@@ -1694,7 +1694,6 @@ ZEND_API void zend_clean_and_cache_symbol_table(zend_array *symbol_table) /* {{{
 {
        if (EG(symtable_cache_ptr) >= EG(symtable_cache_limit)) {
                zend_array_destroy(symbol_table);
-               efree_size(symbol_table, sizeof(zend_array));
        } else {
                /* clean before putting into the cache, since clean
                   could call dtors, which could use cached hash */
index 96e8cb2788ab377f067303f705a6cac22821b7d8..afc8f9b54667612bb1835fee48eed46e4ae716e1 100644 (file)
@@ -1113,7 +1113,7 @@ ZEND_API void zend_array_destroy(HashTable *ht)
                /* In some rare cases destructors of regular arrays may be changed */
                if (UNEXPECTED(ht->pDestructor != ZVAL_PTR_DTOR)) {
                        zend_hash_destroy(ht);
-                       return;
+                       goto free_ht;
                }
 
                p = ht->arData;
@@ -1139,9 +1139,11 @@ ZEND_API void zend_array_destroy(HashTable *ht)
                zend_hash_iterators_remove(ht);
                SET_INCONSISTENT(HT_DESTROYED);
        } else if (EXPECTED(!(ht->u.flags & HASH_FLAG_INITIALIZED))) {
-               return;
+               goto free_ht;
        }
        pefree(ht->arData, ht->u.flags & HASH_FLAG_PERSISTENT);
+free_ht:
+       FREE_HASHTABLE(ht);
 }
 
 ZEND_API void zend_hash_clean(HashTable *ht)
index 60e446b4fd6ff041e4a0de29040e11d9081f662a..aec3811087640650cba14f4b5952584de3b04a20 100644 (file)
@@ -55,7 +55,6 @@ ZEND_API void zend_object_std_dtor(zend_object *object)
 
        if (object->properties) {
                zend_array_destroy(object->properties);
-               FREE_HASHTABLE(object->properties);
        }
        count = object->ce->default_properties_count;
        for (i = 0; i < count; i++) {
index 9e79697589c33d288bb77827a7617b1d5469f4bc..6c3483a25062aedd089c132dcfe19240c471d02b 100644 (file)
@@ -322,7 +322,6 @@ ZEND_API void destroy_op_array(zend_op_array *op_array)
            !(GC_FLAGS(op_array->static_variables) & IS_ARRAY_IMMUTABLE)) {
            if (--GC_REFCOUNT(op_array->static_variables) == 0) {
                        zend_array_destroy(op_array->static_variables);
-                       FREE_HASHTABLE(op_array->static_variables);
                }
        }
 
index de0fa1285b8bd8e923d048caabe655237ee1ebbb..2f0c40314309c0507cb12046f28d85e9d73ae36a 100644 (file)
@@ -46,7 +46,6 @@ ZEND_API void _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC)
                                GC_TYPE(arr) = IS_NULL;
                                GC_REMOVE_FROM_BUFFER(arr);
                                zend_array_destroy(arr);
-                               efree_size(arr, sizeof(zend_array));
                                break;
                        }
                case IS_CONSTANT_AST: {
@@ -102,7 +101,6 @@ ZEND_API void _zval_dtor_func_for_ptr(zend_refcounted *p ZEND_FILE_LINE_DC)
                                GC_TYPE(arr) = IS_NULL;
                                GC_REMOVE_FROM_BUFFER(arr);
                                zend_array_destroy(arr);
-                               efree_size(arr, sizeof(zend_array));
                                break;
                        }
                case IS_CONSTANT_AST: {