]> granicus.if.org Git - php/commitdiff
- Break the zend->PHP dependency introduced by the .php extension for use(),
authorZeev Suraski <zeev@php.net>
Sat, 4 Dec 1999 13:26:57 +0000 (13:26 +0000)
committerZeev Suraski <zeev@php.net>
Sat, 4 Dec 1999 13:26:57 +0000 (13:26 +0000)
  by providing an API
- Enable Stig's patch for use() extensions (it wasn't refered to by the parser)
- Fix a memory leak in that code

Zend/zend-parser.y
Zend/zend-scanner.l
Zend/zend.c
Zend/zend.h
Zend/zend_compile.c
Zend/zend_compile.h

index b8eb3239da69f634d0641277de51a99394f6331c..ec23addf7d7112da9cb45d0b96c3b64a4e8cc93d 100644 (file)
@@ -180,8 +180,8 @@ statement:
        |       T_ECHO echo_expr_list ';'
        |       T_INLINE_HTML                   { do_echo(&$1 CLS_CC); }
        |       expr ';'                        { do_free(&$1 CLS_CC); }
-       |       T_REQUIRE expr ';'                      { if ($2.op_type==IS_CONST && $2.u.constant.type==IS_STRING) { require_filename($2.u.constant.value.str.val, 0 CLS_CC); zval_dtor(&$2.u.constant); } else { do_include_or_eval(ZEND_INCLUDE, &$$, &$2 CLS_CC); } }
-       |       T_USE use_filename ';'          { require_filename($2.u.constant.value.str.val, 1 CLS_CC); zval_dtor(&$2.u.constant); }
+       |       T_REQUIRE expr ';'                      { if ($2.op_type==IS_CONST && $2.u.constant.type==IS_STRING) { require_filename($2.u.constant.value.str.val CLS_CC); zval_dtor(&$2.u.constant); } else { do_include_or_eval(ZEND_INCLUDE, &$$, &$2 CLS_CC); } }
+       |       T_USE use_filename ';'          { use_filename($2.u.constant.value.str.val, $2.u.constant.value.str.len CLS_CC); zval_dtor(&$2.u.constant); }
        |       T_UNSET '(' r_cvar ')' ';' { do_unset(&$3 CLS_CC); }
        |       T_FOREACH '(' expr T_AS { do_foreach_begin(&$1, &$3, &$2, &$4 CLS_CC); } w_cvar foreach_optional_arg ')' { do_foreach_cont(&$6, &$7, &$4 CLS_CC); } foreach_statement { do_foreach_end(&$1, &$2 CLS_CC); }
        |       ';'             /* empty statement */
index c228a9fd14b74bd9bb508f1ff90b880c2d1b53de..534bfe746b5d548f17ab1edfaa830d500886c803 100644 (file)
@@ -201,6 +201,12 @@ ZEND_API void zend_open_file_dtor(zend_file_handle *fh)
                        break;
 #endif
        }
+       if (fh->opened_path) {
+               free(fh->opened_path);
+       }
+       if (fh->free_filename && fh->filename) {
+               efree(fh->filename);
+       }
 }
 
 
@@ -383,6 +389,7 @@ zend_op_array *compile_filename(zval *filename, zend_bool unique CLS_DC)
                filename = &tmp;
        }
        file_handle.filename = filename->value.str.val;
+       file_handle.free_filename = 0;
        file_handle.type = ZEND_HANDLE_FILENAME;
        file_handle.opened_path = NULL;
        retval = zend_compile_files(1 CLS_CC, 1, &file_handle);
@@ -467,13 +474,14 @@ zend_op_array *compile_string(zval *source_string CLS_DC)
 
 
 BEGIN_EXTERN_C()
-int require_filename(char *filename, zend_bool unique CLS_DC)
+int require_filename(char *filename CLS_DC)
 {
        zend_file_handle file_handle;
 
        file_handle.type = ZEND_HANDLE_FILENAME;
        file_handle.filename = filename;
-       if (require_file(&file_handle, unique CLS_CC)==FAILURE) {
+       file_handle.free_filename = 0;
+       if (require_file(&file_handle, 0 CLS_CC)==FAILURE) {
                zend_bailout();
                return FAILURE; /* will never get here */
        }
@@ -481,21 +489,19 @@ int require_filename(char *filename, zend_bool unique CLS_DC)
 }
 
 
-int use_filename(char *filename, zend_bool unique CLS_DC)
+int use_filename(char *filename, uint filename_length CLS_DC)
 {
        zend_file_handle file_handle;
-       int filenamelen;
-       char *newfile;
 
-       filenamelen = strlen(filename);
-       newfile = (char *) emalloc(filenamelen + 5);
-       strcpy(newfile, filename);
-       strcpy(newfile+filenamelen, ".php");
-       newfile[filenamelen+4] = '\0';
+       file_handle.filename = (char *) emalloc(filename_length + zend_uv.import_use_extension_length);
+       memcpy(file_handle.filename, filename, filename_length);
+       memcpy(file_handle.filename+filename_length, zend_uv.import_use_extension, zend_uv.import_use_extension_length);
+       file_handle.filename[filename_length+zend_uv.import_use_extension_length] = 0;
+       file_handle.free_filename = 1;
 
        file_handle.type = ZEND_HANDLE_FILENAME;
-       file_handle.filename = newfile;
-       if (require_file(&file_handle, unique CLS_CC)==FAILURE) {
+       if (require_file(&file_handle, 1 CLS_CC)==FAILURE) {
+               efree(file_handle.filename);
                zend_bailout();
                return FAILURE; /* will never get here */
        }
@@ -515,15 +521,12 @@ int require_file(zend_file_handle *file_handle, zend_bool unique CLS_DC)
        }
        if (file_handle->opened_path) {
                if (unique) {
-                       zend_bool exists=1;
-
-                       if (zend_hash_add(&CG(used_files), file_handle->opened_path, strlen(file_handle->opened_path)+1, &exists, sizeof(zend_bool), NULL)==FAILURE) {
+                       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_close_file_handle(file_handle CLS_CC);
                                restore_lexical_state(&original_lex_state CLS_CC);
                                return SUCCESS;
                        }
                }
-               free(file_handle->opened_path);
        }
        compiler_result = zendparse(CLS_C);
        zend_close_file_handle(file_handle CLS_CC);
@@ -543,6 +546,7 @@ int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlight
 
        file_handle.type = ZEND_HANDLE_FILENAME;
        file_handle.filename = filename;
+       file_handle.free_filename = 0;
        file_handle.opened_path = NULL;
        save_lexical_state(&original_lex_state CLS_CC);
        if (open_file_for_scanning(&file_handle CLS_CC)==FAILURE) {
index 34889f76f9fd379650789a61933acfaddb003182..b62eec41b17ad18d6fb1f34f24f77384711d676d 100644 (file)
@@ -377,6 +377,7 @@ void zend_shutdown()
 void zend_set_utility_values(zend_utility_values *utility_values)
 {
        zend_uv = *utility_values;
+       zend_uv.import_use_extension_length = strlen(zend_uv.import_use_extension);
 }
 
 
index c056a8a12e092e81b85f6a0748c2b70d19158d64..212997035295a116642ca81634311f932b5274ce 100644 (file)
@@ -189,6 +189,8 @@ typedef struct _zend_utility_functions {
 typedef struct _zend_utility_values {
        unsigned char short_tags;
        unsigned char asp_tags;
+       char *import_use_extension;
+       uint import_use_extension_length;
 } zend_utility_values;
 
 
@@ -242,13 +244,12 @@ extern ZEND_API void (*zend_block_interruptions)(void);
 extern ZEND_API void (*zend_unblock_interruptions)(void);
 extern ZEND_API void (*zend_message_dispatcher)(long message, void *data);
 extern ZEND_API int (*zend_get_ini_entry)(char *name, uint name_length, zval *contents);
-END_EXTERN_C()
-
-
 void zenderror(char *error);
 
 extern ZEND_API zend_class_entry zend_standard_class_def;
 extern zend_utility_values zend_uv;
+END_EXTERN_C()
 
 #define ZEND_UV(name) (zend_uv.name)
 
index d7d2aec69c22eaddcb19b4f6c61fbe453a475d2b..247ad5567acc10844178c8ef63ed052256643421 100644 (file)
@@ -95,7 +95,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, NULL , 0);
 }
 
 
index c3ae28421e4c9fdbd27d001eec7e4f81191a6273..18748fdabb774c9e3fa3a554aeb7c5b7f3f4a554 100644 (file)
@@ -177,6 +177,7 @@ typedef struct _zend_file_handle {
                istream *is;
 #endif
        } handle;
+       zend_bool free_filename;
 } zend_file_handle;
 
 
@@ -346,8 +347,8 @@ void do_extended_fcall_end(CLS_D);
 /* helper functions in zend-scanner.l */
 BEGIN_EXTERN_C()
 ZEND_API int require_file(zend_file_handle *file_handle, zend_bool unique CLS_DC);     
-ZEND_API int require_filename(char *filename, zend_bool unique CLS_DC);
-ZEND_API int use_filename(char *filename, zend_bool unique CLS_DC);
+ZEND_API int require_filename(char *filename CLS_DC);
+ZEND_API int use_filename(char *filename, uint filename_length CLS_DC);
 ZEND_API zend_op_array *compile_files(int mark_as_ref CLS_DC, int file_count, ...);
 ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count, va_list files);
 ZEND_API zend_op_array *compile_string(zval *source_string CLS_DC);