diff --git a/zend.c b/zend.c index 9f9f496..0066fe1 100644 --- a/zend.c +++ b/zend.c @@ -1004,7 +1004,8 @@ ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */ /* if we don't have a user defined error handler */ if (!EG(user_error_handler) - || !(EG(user_error_handler_error_reporting) & type)) { + || !(EG(user_error_handler_error_reporting) & type) + || EG(error_handling) != EH_NORMAL) { zend_error_cb(type, error_filename, error_lineno, format, args); } else switch (type) { case E_ERROR: diff --git a/zend.h b/zend.h index 9e44a79..e0390d9 100644 --- a/zend.h +++ b/zend.h @@ -713,6 +713,12 @@ END_EXTERN_C() #include "zend_operators.h" #include "zend_variables.h" +typedef enum { + EH_NORMAL = 0, + EH_SUPPRESS, + EH_THROW +} zend_error_handling_t; + #endif /* ZEND_H */ /* diff --git a/zend_globals.h b/zend_globals.h index 25f2482..9293715 100644 --- a/zend_globals.h +++ b/zend_globals.h @@ -218,11 +218,15 @@ struct _zend_executor_globals { int user_error_handler_error_reporting; zval *user_error_handler; + zval *user_error_handler_old; zval *user_exception_handler; zend_stack user_error_handlers_error_reporting; zend_ptr_stack user_error_handlers; zend_ptr_stack user_exception_handlers; + zend_error_handling_t error_handling; + zend_class_entry *exception_class; + /* timeout support */ int timeout_seconds;