From: Marcus Boerger Date: Sun, 24 Aug 2003 15:07:00 +0000 (+0000) Subject: Allow to throw instances of classes derived from exception X-Git-Tag: RELEASE_0_7~482 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e5e7502b8801f889962c514803071d71362a092;p=php Allow to throw instances of classes derived from exception --- diff --git a/Zend/zend_default_classes.c b/Zend/zend_default_classes.c index a00d261ea7..116dbabe19 100644 --- a/Zend/zend_default_classes.c +++ b/Zend/zend_default_classes.c @@ -136,18 +136,27 @@ ZEND_API zend_class_entry *zend_exception_get_default(void) return default_exception_ptr; } -ZEND_API void zend_throw_exception(char *message, long code TSRMLS_DC) +ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC) { zval *ex; MAKE_STD_ZVAL(ex); - object_init_ex(ex, default_exception_ptr); + if (exception_ce) { + if (!instanceof_function(exception_ce, default_exception_ptr TSRMLS_CC)) { + zend_error(E_NOTICE, "Exceptions must be derived from exception"); + exception_ce = default_exception_ptr; + } + } else { + exception_ce = default_exception_ptr; + } + object_init_ex(ex, exception_ce); + if (message) { - zend_update_property_string(default_exception_ptr, ex, "message", sizeof("message")-1, message TSRMLS_CC); + zend_update_property_string(exception_ce, ex, "message", sizeof("message")-1, message TSRMLS_CC); } if (code) { - zend_update_property_long(default_exception_ptr, ex, "code", sizeof("code")-1, code TSRMLS_CC); + zend_update_property_long(exception_ce, ex, "code", sizeof("code")-1, code TSRMLS_CC); } EG(exception) = ex; diff --git a/Zend/zend_default_classes.h b/Zend/zend_default_classes.h index 31b1b4365c..0e1d70f26a 100644 --- a/Zend/zend_default_classes.h +++ b/Zend/zend_default_classes.h @@ -13,6 +13,7 @@ | license@zend.com so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Sterling Hughes | + | Marcus Boerger | +----------------------------------------------------------------------+ */ @@ -24,10 +25,15 @@ 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); + +/* exception_ce NULL or zend_exception_get_default() or a derived class + * message NULL or the message of the exception */ +ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC); + +/* show an exception using zend_error(E_ERROR,...) */ ZEND_API void zend_exception_error(zval *exception TSRMLS_DC); - + END_EXTERN_C() #endif diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index a00d261ea7..116dbabe19 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -136,18 +136,27 @@ ZEND_API zend_class_entry *zend_exception_get_default(void) return default_exception_ptr; } -ZEND_API void zend_throw_exception(char *message, long code TSRMLS_DC) +ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC) { zval *ex; MAKE_STD_ZVAL(ex); - object_init_ex(ex, default_exception_ptr); + if (exception_ce) { + if (!instanceof_function(exception_ce, default_exception_ptr TSRMLS_CC)) { + zend_error(E_NOTICE, "Exceptions must be derived from exception"); + exception_ce = default_exception_ptr; + } + } else { + exception_ce = default_exception_ptr; + } + object_init_ex(ex, exception_ce); + if (message) { - zend_update_property_string(default_exception_ptr, ex, "message", sizeof("message")-1, message TSRMLS_CC); + zend_update_property_string(exception_ce, ex, "message", sizeof("message")-1, message TSRMLS_CC); } if (code) { - zend_update_property_long(default_exception_ptr, ex, "code", sizeof("code")-1, code TSRMLS_CC); + zend_update_property_long(exception_ce, ex, "code", sizeof("code")-1, code TSRMLS_CC); } EG(exception) = ex; diff --git a/Zend/zend_exceptions.h b/Zend/zend_exceptions.h index 31b1b4365c..0e1d70f26a 100644 --- a/Zend/zend_exceptions.h +++ b/Zend/zend_exceptions.h @@ -13,6 +13,7 @@ | license@zend.com so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Sterling Hughes | + | Marcus Boerger | +----------------------------------------------------------------------+ */ @@ -24,10 +25,15 @@ 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); + +/* exception_ce NULL or zend_exception_get_default() or a derived class + * message NULL or the message of the exception */ +ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC); + +/* show an exception using zend_error(E_ERROR,...) */ ZEND_API void zend_exception_error(zval *exception TSRMLS_DC); - + END_EXTERN_C() #endif