diff options
author | Marcus Boerger <helly@php.net> | 2003-08-24 13:10:03 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2003-08-24 13:10:03 +0000 |
commit | d3473d1f58c3801805ceac5c6c7df839d12c2a04 (patch) | |
tree | d6894bbf5392bc02eaca1ecb81a90546bb38d73a | |
parent | 669603f69d7133053e5c1b888caa229c7e5b276a (diff) | |
download | php-git-d3473d1f58c3801805ceac5c6c7df839d12c2a04.tar.gz |
- Provide a unified way to display uncaught exceptions, which shows
file/line/message info if possible.
- Add zend_eval_string_ex() to be able to handle exceptions in eval'd code.
- Use above function to fix memleaks in CLI.
-rw-r--r-- | Zend/zend.c | 6 | ||||
-rw-r--r-- | Zend/zend_default_classes.c | 21 | ||||
-rw-r--r-- | Zend/zend_default_classes.h | 1 | ||||
-rw-r--r-- | Zend/zend_exceptions.c | 21 | ||||
-rw-r--r-- | Zend/zend_exceptions.h | 1 | ||||
-rw-r--r-- | Zend/zend_execute.h | 1 | ||||
-rw-r--r-- | Zend/zend_execute_API.c | 21 | ||||
-rw-r--r-- | sapi/cli/php_cli.c | 8 |
8 files changed, 73 insertions, 7 deletions
diff --git a/Zend/zend.c b/Zend/zend.c index 9bd65bb9fd..3cfd46a27e 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1052,9 +1052,9 @@ ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_co zval_ptr_dtor(&retval2); } } else { + zend_exception_error(EG(exception) TSRMLS_CC); zval_ptr_dtor(&EG(exception)); EG(exception) = NULL; - zend_error(E_ERROR, "Uncaught exception '%s'!", ex_class_name); } efree(params); zval_ptr_dtor(&old_exception); @@ -1063,17 +1063,17 @@ ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_co EG(exception) = NULL; } } else { + zend_exception_error(EG(exception) TSRMLS_CC); zval_ptr_dtor(&EG(exception)); EG(exception) = NULL; - zend_error(E_ERROR, "Uncaught exception '%s'!", ex_class_name); } if (retval == NULL && *EG(return_value_ptr_ptr) != NULL) { zval_ptr_dtor(EG(return_value_ptr_ptr)); local_retval = NULL; } #else + zend_exception_error(EG(exception) TSRMLS_CC); zval_ptr_dtor(&EG(exception)); - zend_error(E_ERROR, "Uncaught exception '%s'!", ex_class_name); #endif } else if (!retval) { zval_ptr_dtor(EG(return_value_ptr_ptr)); diff --git a/Zend/zend_default_classes.c b/Zend/zend_default_classes.c index 73a78d8fd6..a00d261ea7 100644 --- a/Zend/zend_default_classes.c +++ b/Zend/zend_default_classes.c @@ -153,6 +153,27 @@ ZEND_API void zend_throw_exception(char *message, long code TSRMLS_DC) EG(exception) = ex; } +static void zend_error_va(int type, const char *file, uint lineno, const char *format, ...) +{ + va_list args; + + va_start(args, format); + zend_error_cb(E_ERROR, file, lineno, format, args); + va_end(args); +} + +ZEND_API void zend_exception_error(zval *exception TSRMLS_DC) +{ + if (instanceof_function(Z_OBJCE_P(exception), default_exception_ptr TSRMLS_CC)) { + zval *message = zend_read_property(default_exception_ptr, exception, "message", sizeof("message")-1, 1 TSRMLS_CC); + zval *file = zend_read_property(default_exception_ptr, exception, "file", sizeof("file")-1, 1 TSRMLS_CC); + zval *lineno = zend_read_property(default_exception_ptr, exception, "line", sizeof("line")-1, 1 TSRMLS_CC); + zend_error_va(E_ERROR, Z_STRVAL_P(file), Z_LVAL_P(lineno), "Uncaught exception '%s' with message '%s'", Z_OBJCE_P(exception)->name, Z_STRVAL_P(message)); + } else { + zend_error(E_ERROR, "Uncaught exception '%s'!", Z_OBJCE_P(exception)->name); + } +} + ZEND_API void zend_register_default_classes(TSRMLS_D) { zend_register_default_exception(TSRMLS_C); diff --git a/Zend/zend_default_classes.h b/Zend/zend_default_classes.h index 36ebb7725f..31b1b4365c 100644 --- a/Zend/zend_default_classes.h +++ b/Zend/zend_default_classes.h @@ -26,6 +26,7 @@ BEGIN_EXTERN_C() ZEND_API zend_class_entry *zend_exception_get_default(void); ZEND_API void zend_throw_exception(char *message, long code TSRMLS_DC); ZEND_API void zend_register_default_classes(TSRMLS_D); +ZEND_API void zend_exception_error(zval *exception TSRMLS_DC); END_EXTERN_C() diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 73a78d8fd6..a00d261ea7 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -153,6 +153,27 @@ ZEND_API void zend_throw_exception(char *message, long code TSRMLS_DC) EG(exception) = ex; } +static void zend_error_va(int type, const char *file, uint lineno, const char *format, ...) +{ + va_list args; + + va_start(args, format); + zend_error_cb(E_ERROR, file, lineno, format, args); + va_end(args); +} + +ZEND_API void zend_exception_error(zval *exception TSRMLS_DC) +{ + if (instanceof_function(Z_OBJCE_P(exception), default_exception_ptr TSRMLS_CC)) { + zval *message = zend_read_property(default_exception_ptr, exception, "message", sizeof("message")-1, 1 TSRMLS_CC); + zval *file = zend_read_property(default_exception_ptr, exception, "file", sizeof("file")-1, 1 TSRMLS_CC); + zval *lineno = zend_read_property(default_exception_ptr, exception, "line", sizeof("line")-1, 1 TSRMLS_CC); + zend_error_va(E_ERROR, Z_STRVAL_P(file), Z_LVAL_P(lineno), "Uncaught exception '%s' with message '%s'", Z_OBJCE_P(exception)->name, Z_STRVAL_P(message)); + } else { + zend_error(E_ERROR, "Uncaught exception '%s'!", Z_OBJCE_P(exception)->name); + } +} + ZEND_API void zend_register_default_classes(TSRMLS_D) { zend_register_default_exception(TSRMLS_C); diff --git a/Zend/zend_exceptions.h b/Zend/zend_exceptions.h index 36ebb7725f..31b1b4365c 100644 --- a/Zend/zend_exceptions.h +++ b/Zend/zend_exceptions.h @@ -26,6 +26,7 @@ BEGIN_EXTERN_C() ZEND_API zend_class_entry *zend_exception_get_default(void); ZEND_API void zend_throw_exception(char *message, long code TSRMLS_DC); ZEND_API void zend_register_default_classes(TSRMLS_D); +ZEND_API void zend_exception_error(zval *exception TSRMLS_DC); END_EXTERN_C() diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 39b2ee6e87..62bb09fb71 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -69,6 +69,7 @@ static inline void safe_free_zval_ptr(zval *p) } ZEND_API int zend_lookup_class(char *name, int name_length, zend_class_entry ***ce TSRMLS_DC); ZEND_API int zend_eval_string(char *str, zval *retval_ptr, char *string_name TSRMLS_DC); +ZEND_API int zend_eval_string_ex(char *str, zval *retval_ptr, char *string_name, int handle_exceptions TSRMLS_DC); static inline int i_zend_is_true(zval *op) { diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index b623fdbf87..28f7347b30 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -29,6 +29,7 @@ #include "zend_ptr_stack.h" #include "zend_constants.h" #include "zend_extensions.h" +#include "zend_default_classes.h" #ifdef HAVE_SYS_TIME_H #include <sys/time.h> #endif @@ -860,6 +861,26 @@ ZEND_API int zend_eval_string(char *str, zval *retval_ptr, char *string_name TSR } +ZEND_API int zend_eval_string_ex(char *str, zval *retval_ptr, char *string_name, int handle_exceptions TSRMLS_DC) +{ + int result; + zval *exception = EG(exception); + + + if (handle_exceptions) { + EG(exception) = NULL; + } + result = zend_eval_string(str, retval_ptr, string_name TSRMLS_CC); + if (handle_exceptions && EG(exception)) { + zend_exception_error(EG(exception) TSRMLS_CC); + zval_ptr_dtor(&EG(exception)); + EG(exception) = exception; + result = FAILURE; + } + return result; +} + + void execute_new_code(TSRMLS_D) { zend_op *opline, *end; diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index 093621ea3e..864d018cfa 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -945,7 +945,7 @@ int main(int argc, char *argv[]) #endif case PHP_MODE_CLI_DIRECT: cli_register_file_handles(TSRMLS_C); - if (zend_eval_string(exec_direct, NULL, "Command line code" TSRMLS_CC) == FAILURE) { + if (zend_eval_string_ex(exec_direct, NULL, "Command line code", 1 TSRMLS_CC) == FAILURE) { exit_status=254; } break; @@ -958,7 +958,7 @@ int main(int argc, char *argv[]) cli_register_file_handles(TSRMLS_C); - if (exec_begin && zend_eval_string(exec_begin, NULL, "Command line begin code" TSRMLS_CC) == FAILURE) { + if (exec_begin && zend_eval_string_ex(exec_begin, NULL, "Command line begin code", 1 TSRMLS_CC) == FAILURE) { exit_status=254; } ALLOC_ZVAL(argi); @@ -979,7 +979,7 @@ int main(int argc, char *argv[]) zend_hash_update(&EG(symbol_table), "argn", sizeof("argn"), &argn, sizeof(pval *), NULL); Z_LVAL_P(argi) = ++index; if (exec_run) { - if (zend_eval_string(exec_run, NULL, "Command line run code" TSRMLS_CC) == FAILURE) { + if (zend_eval_string_ex(exec_run, NULL, "Command line run code", 1 TSRMLS_CC) == FAILURE) { exit_status=254; } } else { @@ -995,7 +995,7 @@ int main(int argc, char *argv[]) } efree(input); } - if (exec_end && zend_eval_string(exec_end, NULL, "Command line end code" TSRMLS_CC) == FAILURE) { + if (exec_end && zend_eval_string_ex(exec_end, NULL, "Command line end code", 1 TSRMLS_CC) == FAILURE) { exit_status=254; } |