- nested exception order was fine
authorMichael Wallner <mike@php.net>
Wed, 23 Aug 2006 21:58:14 +0000 (21:58 +0000)
committerMichael Wallner <mike@php.net>
Wed, 23 Aug 2006 21:58:14 +0000 (21:58 +0000)
http_api.c
http_functions.c

index fef29305672e645a80fa4503f9ccae59c1a4cdae..9e2fd18cfb857cd810a1c51a6962b82851c30e9f 100644 (file)
@@ -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 */
index a22bea3d98219f597588cd0b73b2063fa50c4137..82597f4517f4d22aa91d79d8426878065fdcdc3a 100644 (file)
@@ -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());
 }
 
 /*