From 58153dfed0ead589cb7f69fd0a53058a1f76c375 Mon Sep 17 00:00:00 2001 From: Zeev Suraski Date: Fri, 26 Nov 1999 23:45:22 +0000 Subject: [PATCH] - Improve the file handle closing code --- Zend/zend-scanner.l | 48 ++++++++++++++++++++++++++++++++++----------- Zend/zend_compile.c | 2 +- Zend/zend_compile.h | 11 ++++++----- 3 files changed, 44 insertions(+), 17 deletions(-) diff --git a/Zend/zend-scanner.l b/Zend/zend-scanner.l index 9cbe91ecae..b8ed223936 100644 --- a/Zend/zend-scanner.l +++ b/Zend/zend-scanner.l @@ -183,23 +183,47 @@ inline void restore_lexical_state(zend_lex_state *lex_state CLS_DC) BEGIN_EXTERN_C() -ZEND_API void zend_open_file_dtor(void *f) +ZEND_API void zend_open_file_dtor(zend_file_handle *fh) { + switch (fh->type) { + case ZEND_HANDLE_FP: + fclose(fh->handle.fp); + break; #ifdef ZTS - delete *((ifstream **) f); -#else - fclose(*((FILE **) f)); + case ZEND_HANDLE_FSTREAM: + delete ((ifstream *) fh->handle.is); + break; + case ZEND_HANDLE_STDIOSTREAM: + delete ((istdiostream *) fh->handle.is); + break; #endif + } } -ZEND_API void zend_close_file_handle(zend_file_handle *file_handle CLS_DC) +int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *fh2) { + if (fh1->type != fh2->type) { + return 0; + } + switch (fh1->type) { + case ZEND_HANDLE_FP: + return fh1->handle.fp==fh2->handle.fp; + break; #ifdef ZTS - zend_llist_del_element(&CG(open_files), &file_handle->handle.is); -#else - zend_llist_del_element(&CG(open_files), &file_handle->handle.fp); + case ZEND_HANDLE_FSTREAM: + case ZEND_HANDLE_STDIOSTREAM: + return fh1->handle.is==fh2->handle.is; + break; + } #endif + return 0; +} + + +ZEND_API void zend_close_file_handle(zend_file_handle *file_handle CLS_DC) +{ + zend_llist_del_element(&CG(open_files), file_handle, (int (*)(void *, void *)) zend_compare_file_handles); } @@ -221,7 +245,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC) return FAILURE; } if (file_handle->handle.fp != stdin) { - zend_llist_add_element(&CG(open_files), &file_handle->handle.fp); + zend_llist_add_element(&CG(open_files), file_handle); } file_handle->type = ZEND_HANDLE_FP; /* Reset the scanner for scanning the new file */ @@ -232,6 +256,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC) switch (file_handle->type) { case ZEND_HANDLE_FD: file_handle->handle.is = new ifstream(file_handle->handle.fd); + file_handle->type = ZEND_HANDLE_FSTREAM; break; case ZEND_HANDLE_FILENAME: { @@ -240,6 +265,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC) return FAILURE; } file_handle->handle.is = new istdiostream(file_handle->handle.fp); + file_handle->type = ZEND_HANDLE_STDIOSTREAM; break; } case ZEND_HANDLE_FP: @@ -250,6 +276,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC) return FAILURE; } file_handle->handle.is = new istdiostream(file_handle->handle.fp); + file_handle->type = ZEND_HANDLE_STDIOSTREAM; } break; } @@ -258,9 +285,8 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC) return FAILURE; } if (file_handle->handle.is != &cin) { - zend_llist_add_element(&CG(open_files), &file_handle->handle.is); + zend_llist_add_element(&CG(open_files), file_handle); } - file_handle->type = ZEND_HANDLE_ISTREAM; CG(ZFL) = new ZendFlexLexer; CG(ZFL)->switch_streams(file_handle->handle.is, &cout); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index f33593619e..59cc8d402b 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -94,7 +94,7 @@ void init_compiler(CLS_D ELS_DC) zend_hash_apply(&module_registry, (int (*)(void *)) module_registry_request_startup); init_resource_list(ELS_C); CG(unclean_shutdown) = 0; - zend_llist_init(&CG(open_files), sizeof(void *), zend_open_file_dtor, 0); + zend_llist_init(&CG(open_files), sizeof(zend_file_handle), zend_open_file_dtor, 0); } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index f9b11e5525..1d96cf9559 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -354,7 +354,7 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC); ZEND_API void init_op_array(zend_op_array *op_array, int initial_ops_size); ZEND_API void destroy_op_array(zend_op_array *op_array); ZEND_API void zend_close_file_handle(zend_file_handle *file_handle CLS_DC); -ZEND_API void zend_open_file_dtor(void *f); +ZEND_API void zend_open_file_dtor(zend_file_handle *fh); END_EXTERN_C() ZEND_API int destroy_zend_function(zend_function *function); @@ -543,10 +543,11 @@ int zendlex(znode *zendlval CLS_DC); #define ZEND_RT (1<<1) -#define ZEND_HANDLE_FILENAME 0 -#define ZEND_HANDLE_FD 1 -#define ZEND_HANDLE_FP 2 -#define ZEND_HANDLE_ISTREAM 3 +#define ZEND_HANDLE_FILENAME 0 +#define ZEND_HANDLE_FD 1 +#define ZEND_HANDLE_FP 2 +#define ZEND_HANDLE_STDIOSTREAM 3 +#define ZEND_HANDLE_FSTREAM 4 #define ZEND_DECLARE_CLASS 1 #define ZEND_DECLARE_FUNCTION 2 -- 2.40.0