]> granicus.if.org Git - php/commitdiff
- Implement get_used_files() and get_imported_files()
authorZeev Suraski <zeev@php.net>
Sat, 4 Dec 1999 14:26:26 +0000 (14:26 +0000)
committerZeev Suraski <zeev@php.net>
Sat, 4 Dec 1999 14:26:26 +0000 (14:26 +0000)
Zend/zend-scanner.l
Zend/zend_builtin_functions.c
Zend/zend_compile.c

index 534bfe746b5d548f17ab1edfaa830d500886c803..e2595856a2ce3ac548eec21b6e4026c5cdc854b5 100644 (file)
@@ -189,6 +189,11 @@ ZEND_API void zend_open_file_dtor(zend_file_handle *fh)
                case ZEND_HANDLE_FP:
                        fclose(fh->handle.fp);
                        break;
+               case ZEND_HANDLE_FILENAME:
+                       /* We're only supposed to get here when destructing the used_files hash,
+                        * which doesn't really contain open files, but references to their names/paths
+                        */
+                       break;
 #ifdef ZTS
                case ZEND_HANDLE_FSTREAM:
                        delete ((ifstream *) fh->handle.is);
@@ -521,10 +526,21 @@ int require_file(zend_file_handle *file_handle, zend_bool unique CLS_DC)
        }
        if (file_handle->opened_path) {
                if (unique) {
-                       if (zend_hash_add(&CG(used_files), file_handle->opened_path, strlen(file_handle->opened_path)+1, file_handle, sizeof(zend_file_handle), NULL)==FAILURE) {
+                       zend_file_handle *pfh;
+
+                       if (zend_hash_add(&CG(used_files), file_handle->opened_path, strlen(file_handle->opened_path)+1, file_handle, sizeof(zend_file_handle), (void **) &pfh)==FAILURE) {
                                zend_close_file_handle(file_handle CLS_CC);
                                restore_lexical_state(&original_lex_state CLS_CC);
                                return SUCCESS;
+                       } else {
+                               /* pfh is a copy we only save for get_used_files() */
+                               pfh->type = ZEND_HANDLE_FILENAME;
+                               if (pfh->filename) {
+                                       pfh->filename = estrdup(pfh->filename);
+                               }
+                               if (pfh->opened_path) {
+                                       pfh->opened_path = strdup(pfh->opened_path);
+                               }
                        }
                }
        }
index 1f7c498660149a087f34471d8283867c299ccc47..4e70e460a2d5b2d87adac12f1f2e24624bb928e0 100644 (file)
@@ -40,6 +40,8 @@ static ZEND_FUNCTION(get_class);
 static ZEND_FUNCTION(get_parent_class);
 static ZEND_FUNCTION(method_exists);
 static ZEND_FUNCTION(leak);
+static ZEND_FUNCTION(get_used_files);
+static ZEND_FUNCTION(get_imported_files);
 
 extern unsigned char first_arg_force_ref[];
 
@@ -59,6 +61,8 @@ static zend_function_entry builtin_functions[] = {
        ZEND_FE(get_parent_class,       NULL)
        ZEND_FE(method_exists,          NULL)
        ZEND_FE(leak,                           NULL)
+       ZEND_FE(get_used_files,         NULL)
+       ZEND_FE(get_imported_files,     NULL)
        { NULL, NULL, NULL }
 };
 
@@ -421,3 +425,41 @@ ZEND_FUNCTION(leak)
        
        emalloc(leakbytes);
 }
+
+
+static int copy_import_use_file(zend_file_handle *fh, zval *array)
+{
+       if (fh->filename) {
+               char *extension_start;
+
+               extension_start = strstr(fh->filename, zend_uv.import_use_extension);
+               if (extension_start) {
+                       *extension_start = 0;
+                       if (fh->opened_path) {
+                               add_assoc_string(array, fh->filename, fh->opened_path, 1);
+                       } else {
+                               add_assoc_stringl(array, fh->filename, "N/A", sizeof("N/A")-1, 1);
+                       }
+                       *extension_start = zend_uv.import_use_extension[0];
+               }
+       }
+       return 0;
+}
+
+
+ZEND_FUNCTION(get_used_files)
+{
+       CLS_FETCH();
+
+       array_init(return_value);
+       zend_hash_apply_with_argument(&CG(used_files), (int (*)(void *, void *)) copy_import_use_file, return_value);
+}
+
+
+ZEND_FUNCTION(get_imported_files)
+{
+       ELS_FETCH();
+
+       array_init(return_value);
+       zend_hash_apply_with_argument(&EG(imported_files), (int (*)(void *, void *)) copy_import_use_file, return_value);
+}
index 247ad5567acc10844178c8ef63ed052256643421..a21c2ed16e192cea457884f78fe8a51fbf1428e9 100644 (file)
@@ -77,6 +77,13 @@ static void build_runtime_defined_function_key(zval *result, zval *name, zend_op
 }
 
 
+static int zend_open_file_dtor_wrapper(zend_file_handle *fh)
+{
+       zend_open_file_dtor(fh);
+       return 1;
+}
+
+
 void init_compiler(CLS_D ELS_DC)
 {
        zend_stack_init(&CG(bp_stack));
@@ -95,7 +102,7 @@ void init_compiler(CLS_D ELS_DC)
        init_resource_list(ELS_C);
        CG(unclean_shutdown) = 0;
        zend_llist_init(&CG(open_files), sizeof(zend_file_handle), (void (*)(void *)) zend_open_file_dtor, 0);
-       zend_hash_init(&CG(used_files), 5, NULL, NULL , 0);
+       zend_hash_init(&CG(used_files), 5, NULL, (int (*)(void *)) zend_open_file_dtor_wrapper, 0);
 }