]> granicus.if.org Git - php/commitdiff
Fixed static data cleanup
authorDmitry Stogov <dmitry@zend.com>
Fri, 21 Mar 2014 09:51:18 +0000 (13:51 +0400)
committerDmitry Stogov <dmitry@zend.com>
Fri, 21 Mar 2014 09:51:18 +0000 (13:51 +0400)
Zend/zend_compile.h
Zend/zend_execute_API.c
Zend/zend_opcode.c

index 45bbb4a563ae0cb0311abc475a1e6ab87a11d973..e48f5e57c9eebde66dfc86f09c4a3bf98f55c16c 100644 (file)
@@ -662,12 +662,12 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle TSRMLS_DC);
 ZEND_API void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_size TSRMLS_DC);
 ZEND_API void destroy_op_array(zend_op_array *op_array TSRMLS_DC);
 ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle TSRMLS_DC);
-ZEND_API int zend_cleanup_class_data(zend_class_entry **pce TSRMLS_DC);
-ZEND_API int zend_cleanup_user_class_data(zend_class_entry **pce TSRMLS_DC);
+ZEND_API int zend_cleanup_class_data(zval *zv TSRMLS_DC);
+ZEND_API int zend_cleanup_user_class_data(zval *zv TSRMLS_DC);
 ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce TSRMLS_DC);
 ZEND_API void zend_cleanup_internal_classes(TSRMLS_D);
-ZEND_API int zend_cleanup_function_data(zend_function *function TSRMLS_DC);
-ZEND_API int zend_cleanup_function_data_full(zend_function *function TSRMLS_DC);
+ZEND_API int zend_cleanup_function_data(zval *zv TSRMLS_DC);
+ZEND_API int zend_cleanup_function_data_full(zval *zv TSRMLS_DC);
 
 ZEND_API void destroy_zend_function(zend_function *function TSRMLS_DC);
 ZEND_API void zend_function_dtor(zval *zv);
index 613f4a1e2900427ddc4780d9c2872d3b7e41ed34..a90dade13981677e4ef1221e69148cbfe47e3ba9 100644 (file)
@@ -282,11 +282,11 @@ void shutdown_executor(TSRMLS_D) /* {{{ */
                 * Note that only run-time accessed data need to be cleaned up, pre-defined data can
                 * not contain objects and thus are not probelmatic */
                if (EG(full_tables_cleanup)) {
-                       zend_hash_apply(EG(function_table), (apply_func_t) zend_cleanup_function_data_full TSRMLS_CC);
-                       zend_hash_apply(EG(class_table), (apply_func_t) zend_cleanup_class_data TSRMLS_CC);
+                       zend_hash_apply(EG(function_table), zend_cleanup_function_data_full TSRMLS_CC);
+                       zend_hash_apply(EG(class_table), zend_cleanup_class_data TSRMLS_CC);
                } else {
-                       zend_hash_reverse_apply(EG(function_table), (apply_func_t) zend_cleanup_function_data TSRMLS_CC);
-                       zend_hash_reverse_apply(EG(class_table), (apply_func_t) zend_cleanup_user_class_data TSRMLS_CC);
+                       zend_hash_reverse_apply(EG(function_table), zend_cleanup_function_data TSRMLS_CC);
+                       zend_hash_reverse_apply(EG(class_table), zend_cleanup_user_class_data TSRMLS_CC);
                        zend_cleanup_internal_classes(TSRMLS_C);
                }
        } zend_end_try();
@@ -298,11 +298,11 @@ void shutdown_executor(TSRMLS_D) /* {{{ */
 
                /* Destroy all op arrays */
                if (EG(full_tables_cleanup)) {
-                       zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC);
-                       zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC);
+                       zend_hash_reverse_apply(EG(function_table), clean_non_persistent_function_full TSRMLS_CC);
+                       zend_hash_reverse_apply(EG(class_table), clean_non_persistent_class_full TSRMLS_CC);
                } else {
-                       zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function TSRMLS_CC);
-                       zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class TSRMLS_CC);
+                       zend_hash_reverse_apply(EG(function_table), clean_non_persistent_function TSRMLS_CC);
+                       zend_hash_reverse_apply(EG(class_table), clean_non_persistent_class TSRMLS_CC);
                }
 
                while (EG(symtable_cache_ptr)>=EG(symtable_cache)) {
index f54bcb245537e343317f5b20d96bf84579791000..222baae0d5c4d7ce46d6f7af394abfd734f6c149 100644 (file)
@@ -136,8 +136,10 @@ static void zend_cleanup_op_array_data(zend_op_array *op_array)
        }
 }
 
-ZEND_API int zend_cleanup_function_data(zend_function *function TSRMLS_DC)
+ZEND_API int zend_cleanup_function_data(zval *zv TSRMLS_DC)
 {
+       zend_function *function = Z_PTR_P(zv);
+
        if (function->type == ZEND_USER_FUNCTION) {
                zend_cleanup_op_array_data((zend_op_array *) function);
                return ZEND_HASH_APPLY_KEEP;
@@ -146,8 +148,10 @@ ZEND_API int zend_cleanup_function_data(zend_function *function TSRMLS_DC)
        }
 }
 
-ZEND_API int zend_cleanup_function_data_full(zend_function *function TSRMLS_DC)
+ZEND_API int zend_cleanup_function_data_full(zval *zv TSRMLS_DC)
 {
+       zend_function *function = Z_PTR_P(zv);
+
        if (function->type == ZEND_USER_FUNCTION) {
                zend_cleanup_op_array_data((zend_op_array *) function);
        }
@@ -160,7 +164,7 @@ static inline void cleanup_user_class_data(zend_class_entry *ce TSRMLS_DC)
        /* Note that only run-time accessed data need to be cleaned up, pre-defined data can
           not contain objects and thus are not probelmatic */
        if (ce->ce_flags & ZEND_HAS_STATIC_IN_METHODS) {
-               zend_hash_apply(&ce->function_table, (apply_func_t) zend_cleanup_function_data_full TSRMLS_CC);
+               zend_hash_apply(&ce->function_table, zend_cleanup_function_data_full TSRMLS_CC);
        }
        if (ce->static_members_table) {
                int i;
@@ -200,22 +204,26 @@ ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce TSRMLS_DC)
        cleanup_internal_class_data(ce TSRMLS_CC);
 }
 
-ZEND_API int zend_cleanup_user_class_data(zend_class_entry **pce TSRMLS_DC)
+ZEND_API int zend_cleanup_user_class_data(zval *zv TSRMLS_DC)
 {
-       if ((*pce)->type == ZEND_USER_CLASS) {
-               cleanup_user_class_data(*pce TSRMLS_CC);
+       zend_class_entry *ce = Z_PTR_P(zv);
+
+       if (ce->type == ZEND_USER_CLASS) {
+               cleanup_user_class_data(ce TSRMLS_CC);
                return ZEND_HASH_APPLY_KEEP;
        } else {
                return ZEND_HASH_APPLY_STOP;
        }
 }
 
-ZEND_API int zend_cleanup_class_data(zend_class_entry **pce TSRMLS_DC)
+ZEND_API int zend_cleanup_class_data(zval *zv TSRMLS_DC)
 {
-       if ((*pce)->type == ZEND_USER_CLASS) {
-               cleanup_user_class_data(*pce TSRMLS_CC);
+       zend_class_entry *ce = Z_PTR_P(zv);
+
+       if (ce->type == ZEND_USER_CLASS) {
+               cleanup_user_class_data(ce TSRMLS_CC);
        } else {
-               cleanup_internal_class_data(*pce TSRMLS_CC);
+               cleanup_internal_class_data(ce TSRMLS_CC);
        }
        return 0;
 }