/* {{{ 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)
{
- zval **args, **trace_0, *old_trace_0, *trace = NULL;
+ zval **args, **trace_0, *old_trace_0, *trace = NULL, *sub_exception, *tmp_exception;
- /* create wrapping exception if requested */
if (!new_exception) {
- 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);
+ 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;
}
+ 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)) {
}
}
- zend_update_property(Z_OBJCE_P(new_exception), new_exception, "innerException", lenof("innerException"), old_exception TSRMLS_CC);
zval_ptr_dtor(&old_exception);
- return new_exception;
+ return tmp_exception;
}
/* }}} */
#endif /* ZEND_ENGINE_2 */