From 776d5d5c4fa782176a5a6bd6e0de12479782a1eb Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 23 Aug 2006 21:58:14 +0000 Subject: [PATCH] - nested exception order was fine --- http_api.c | 59 ++++++++++++++++++++++++------------------------ http_functions.c | 14 ------------ 2 files changed, 29 insertions(+), 44 deletions(-) diff --git a/http_api.c b/http_api.c index fef2930..9e2fd18 100644 --- a/http_api.c +++ b/http_api.c @@ -116,43 +116,42 @@ void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...) /* {{{ zval *http_exception_wrap(zval *, zval *, zend_class_entry *) */ zval *_http_exception_wrap(zval *old_exception, zval *new_exception, zend_class_entry *ce TSRMLS_DC) { - /* create wrapping exception if requested */ + zval **args, **trace_0, *old_trace_0, *trace = NULL, *sub_exception, *tmp_exception; + if (!new_exception) { - zval **args, **trace_0, *old_trace_0, *trace = NULL; - - MAKE_STD_ZVAL(new_exception); - object_init_ex(new_exception, ce); - zend_update_property_string(ce, new_exception, "message", lenof("message"), "Exception caused by inner exception(s)" TSRMLS_CC); - zend_update_property(Z_OBJCE_P(new_exception), new_exception, "innerException", lenof("innerException"), old_exception TSRMLS_CC); + MAKE_STD_ZVAL(tmp_exception); + object_init_ex(tmp_exception, ce); + zend_update_property_string(ZEND_EXCEPTION_GET_DEFAULT(), tmp_exception, "message", lenof("message"), "Exception caused by inner exception(s)" TSRMLS_CC); + new_exception = tmp_exception; + } else { + sub_exception = new_exception; + tmp_exception = new_exception; + while ((tmp_exception = zend_read_property(Z_OBJCE_P(tmp_exception), tmp_exception, "innerException", lenof("innerException"), 0 TSRMLS_CC)) && Z_TYPE_P(tmp_exception) == IS_OBJECT) { + sub_exception = tmp_exception; + } + tmp_exception = new_exception; + new_exception = sub_exception; + } - /* copy bt arguments */ - if ((trace = zend_read_property(ZEND_EXCEPTION_GET_DEFAULT(), old_exception, "trace", lenof("trace"), 0 TSRMLS_CC))) { - if (Z_TYPE_P(trace) == IS_ARRAY && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(trace), 0, (void *) &trace_0)) { - old_trace_0 = *trace_0; - if (Z_TYPE_PP(trace_0) == IS_ARRAY && SUCCESS == zend_hash_find(Z_ARRVAL_PP(trace_0), "args", sizeof("args"), (void *) &args)) { - if ((trace = zend_read_property(ZEND_EXCEPTION_GET_DEFAULT(), new_exception, "trace", lenof("trace"), 0 TSRMLS_CC))) { - if (Z_TYPE_P(trace) == IS_ARRAY && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(trace), 0, (void *) &trace_0)) { - ZVAL_ADDREF(*args); - add_assoc_zval(*trace_0, "args", *args); - } + zend_update_property(Z_OBJCE_P(new_exception), new_exception, "innerException", lenof("innerException"), old_exception TSRMLS_CC); + + /* copy bt arguments */ + if ((trace = zend_read_property(ZEND_EXCEPTION_GET_DEFAULT(), old_exception, "trace", lenof("trace"), 0 TSRMLS_CC))) { + if (Z_TYPE_P(trace) == IS_ARRAY && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(trace), 0, (void *) &trace_0)) { + old_trace_0 = *trace_0; + if (Z_TYPE_PP(trace_0) == IS_ARRAY && SUCCESS == zend_hash_find(Z_ARRVAL_PP(trace_0), "args", sizeof("args"), (void *) &args)) { + if ((trace = zend_read_property(ZEND_EXCEPTION_GET_DEFAULT(), new_exception, "trace", lenof("trace"), 0 TSRMLS_CC))) { + if (Z_TYPE_P(trace) == IS_ARRAY && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(trace), 0, (void *) &trace_0)) { + ZVAL_ADDREF(*args); + add_assoc_zval(*trace_0, "args", *args); } } } } - - zval_ptr_dtor(&old_exception); - return new_exception; - } else { - zval *sub_exception = old_exception, *top_exception = old_exception; - - while ((sub_exception = zend_read_property(ZEND_EXCEPTION_GET_DEFAULT(), sub_exception, "innerException", lenof("innerException"), 0 TSRMLS_CC)) && Z_TYPE_P(sub_exception) == IS_OBJECT) { - top_exception = sub_exception; - } - zend_update_property(Z_OBJCE_P(top_exception), top_exception, "innerException", lenof("innerException"), new_exception TSRMLS_CC); - - zval_ptr_dtor(&new_exception); - return old_exception; } + + zval_ptr_dtor(&old_exception); + return tmp_exception; } /* }}} */ #endif /* ZEND_ENGINE_2 */ diff --git a/http_functions.c b/http_functions.c index a22bea3..82597f4 100644 --- a/http_functions.c +++ b/http_functions.c @@ -1983,22 +1983,8 @@ PHP_FUNCTION(http_support) } /* }}} */ -#include "zend_exceptions.h" PHP_FUNCTION(http_test) { - int i; - - for (i = 0; i < 3; ++i) { - http_try { - fprintf(stderr, "Throwing Ex %d\n", i); - http_error_ex(HE_THROW, HTTP_E_RUNTIME, "Ex %d", i); - http_try { - fprintf(stderr, "Throwing SubEx %d\n", i); - http_error_ex(HE_THROW, HTTP_E_RUNTIME, "SubEx %d", i); - } http_catch(ZEND_EXCEPTION_GET_DEFAULT()); - } http_catch(ZEND_EXCEPTION_GET_DEFAULT()); - } - http_final(ZEND_EXCEPTION_GET_DEFAULT()); } /* -- 2.30.2