diff options
| author | Zeev Suraski <zeev@php.net> | 1999-12-04 13:26:57 +0000 |
|---|---|---|
| committer | Zeev Suraski <zeev@php.net> | 1999-12-04 13:26:57 +0000 |
| commit | 9baad804595a97e47baf3f75836fcc9596f2351e (patch) | |
| tree | e19df22a56f05958ab5ab540c964a9f60ef95931 /Zend/zend-scanner.l | |
| parent | da5464b145be141a4b9a7130d554f73e022acc85 (diff) | |
| download | php-git-9baad804595a97e47baf3f75836fcc9596f2351e.tar.gz | |
- Break the zend->PHP dependency introduced by the .php extension for use(),
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
Diffstat (limited to 'Zend/zend-scanner.l')
| -rw-r--r-- | Zend/zend-scanner.l | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/Zend/zend-scanner.l b/Zend/zend-scanner.l index c228a9fd14..534bfe746b 100644 --- a/Zend/zend-scanner.l +++ b/Zend/zend-scanner.l @@ -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) { |
