- finalize nexted exception fix
authorMichael Wallner <mike@php.net>
Thu, 24 Aug 2006 08:01:16 +0000 (08:01 +0000)
committerMichael Wallner <mike@php.net>
Thu, 24 Aug 2006 08:01:16 +0000 (08:01 +0000)
http_api.c
package2.xml

index 9e2fd18cfb857cd810a1c51a6962b82851c30e9f..372265a04052ce482568da9f8f44ff862b1a8b7e 100644 (file)
@@ -113,34 +113,15 @@ void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...)
 /* }}} */
 
 #ifdef ZEND_ENGINE_2
-/* {{{ 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)
+static inline void copy_bt_args(zval *from, zval *to TSRMLS_DC)
 {
-       zval **args, **trace_0, *old_trace_0, *trace = NULL, *sub_exception, *tmp_exception;
+       zval **args, **trace_0, *old_trace_0, *trace = NULL;
        
-       if (!new_exception) {
-               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 ((trace = zend_read_property(ZEND_EXCEPTION_GET_DEFAULT(), from, "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 ((trace = zend_read_property(ZEND_EXCEPTION_GET_DEFAULT(), to, "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);
@@ -149,9 +130,46 @@ zval *_http_exception_wrap(zval *old_exception, zval *new_exception, zend_class_
                        }
                }
        }
+}
+
+/* {{{ 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)
+{
+       int inner = 1;
+       char *message;
+       zval *sub_exception, *tmp_exception;
+       
+       if (!new_exception) {
+               MAKE_STD_ZVAL(new_exception);
+               object_init_ex(new_exception, ce);
+               
+               zend_update_property(ce, new_exception, "innerException", lenof("innerException"), old_exception TSRMLS_CC);
+               copy_bt_args(old_exception, new_exception TSRMLS_CC);
+               
+               sub_exception = old_exception;
+               
+               while ((sub_exception = zend_read_property(Z_OBJCE_P(sub_exception), sub_exception, "innerException", lenof("innerException"), 0 TSRMLS_CC)) && Z_TYPE_P(sub_exception) == IS_OBJECT) {
+                       ++inner;
+               }
+               
+               spprintf(&message, 0, "Exception caused by %d inner exception(s)", inner);
+               zend_update_property_string(ZEND_EXCEPTION_GET_DEFAULT(), new_exception, "message", lenof("message"), message TSRMLS_CC);
+               efree(message);
+       } 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;
+               }
+               
+               zend_update_property(Z_OBJCE_P(sub_exception), sub_exception, "innerException", lenof("innerException"), old_exception TSRMLS_CC);
+               copy_bt_args(old_exception, new_exception TSRMLS_CC);
+               copy_bt_args(old_exception, sub_exception TSRMLS_CC);
+       }
        
        zval_ptr_dtor(&old_exception);
-       return tmp_exception;
+       return new_exception;
 }
 /* }}} */
 #endif /* ZEND_ENGINE_2 */
index 3880fc4debc8c2fb09bd3d73faf285a0b47c2b3b..5773d4d8a3cf949a8fe8c505b6752c0b9ea3eaf4 100644 (file)
@@ -41,6 +41,7 @@ support. Parallel requests are available for PHP 5 and greater.
  <notes><![CDATA[
 * Fixed issues with inheritance and cloning of HttpDeflateStream, HttpInflateStream and HttpMessage
   (Extending classes lose default properties on instantiation; Complex members ignored during cloning)
+* Fixed suppression of nested exceptions in e.g. HttpRequestPool::send()
 ]]></notes>
  <contents>
   <dir name="/">