From ef6919e6f2ffc951b9014778f74e79c7a6fbe3eb Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 21 Mar 2014 13:51:18 +0400 Subject: [PATCH] Fixed static data cleanup --- Zend/zend_compile.h | 8 ++++---- Zend/zend_execute_API.c | 16 ++++++++-------- Zend/zend_opcode.c | 28 ++++++++++++++++++---------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 45bbb4a563..e48f5e57c9 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -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); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 613f4a1e29..a90dade139 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -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)) { diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index f54bcb2455..222baae0d5 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -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; } -- 2.50.1