cvs: ZendEngine2 / zend.c zend_exceptions.c zend_exceptions.h zend_execute_API.c zend_globals.h zend_objects.c zend_vm_def.h zend_vm_execute.h php-src/ext/spl php_spl.c

"Marcus Boerger" <[email protected]>
Newsgroups gmane.comp.php.cvs.zend
Message-ID <cvshelly1218708400@cvsserver>
helly		Thu Aug 14 10:06:40 2008 UTC

  Modified files:              
    /php-src/ext/spl	php_spl.c 
    /ZendEngine2	zend.c zend_exceptions.c zend_exceptions.h 
                	zend_execute_API.c zend_globals.h zend_objects.c 
                	zend_vm_def.h zend_vm_execute.h 
  Log:
  - Improved exception linking

-- 
Zend Engine CVS Mailing List (http://cvs.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
helly-20080814100640.txt (text/plain, 14.8 KB)
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/php_spl.c?r1=1.139&r2=1.140&diff_format=u
Index: php-src/ext/spl/php_spl.c
diff -u php-src/ext/spl/php_spl.c:1.139 php-src/ext/spl/php_spl.c:1.140
--- php-src/ext/spl/php_spl.c:1.139	Sat Jul 26 13:14:56 2008
+++ php-src/ext/spl/php_spl.c	Thu Aug 14 10:06:39 2008
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_spl.c,v 1.139 2008/07/26 13:14:56 dmitry Exp $ */
+/* $Id: php_spl.c,v 1.140 2008/08/14 10:06:39 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -381,11 +381,7 @@
 			func_name_type = zend_hash_get_current_key_ex(SPL_G(autoload_functions), &func_name, &func_name_len, &dummy, 0, &function_pos);
 			zend_hash_get_current_data_ex(SPL_G(autoload_functions), (void **) &alfi, &function_pos);
 			zend_u_call_method(alfi->obj ? &alfi->obj : NULL, alfi->ce, &alfi->func_ptr, func_name_type, func_name, func_name_len, &retval, 1, zclass_name, NULL TSRMLS_CC);
-			if (EG(exception)) {
-				zend_exception_set_previous(exception TSRMLS_CC);
-				exception = EG(exception);
-				EG(exception) = NULL;
-			}
+			zend_exception_save(TSRMLS_C);
 			if (retval) {
 				zval_ptr_dtor(&retval);					
 			}
@@ -394,7 +390,7 @@
 			}
 			zend_hash_move_forward_ex(SPL_G(autoload_functions), &function_pos);
 		}
-		EG(exception) = exception;
+		zend_exception_restore(TSRMLS_C);
 		efree(lc_name.v);
 		SPL_G(autoload_running) = l_autoload_running;
 	} else {
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend.c?r1=1.421&r2=1.422&diff_format=u
Index: ZendEngine2/zend.c
diff -u ZendEngine2/zend.c:1.421 ZendEngine2/zend.c:1.422
--- ZendEngine2/zend.c:1.421	Tue Aug 12 17:15:58 2008
+++ ZendEngine2/zend.c	Thu Aug 14 10:06:39 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend.c,v 1.421 2008/08/12 17:15:58 felipe Exp $ */
+/* $Id: zend.c,v 1.422 2008/08/14 10:06:39 helly Exp $ */
 
 #include "zend.h"
 #include "zend_extensions.h"
@@ -1723,32 +1723,29 @@
 		if (EG(active_op_array)) {
 			EG(return_value_ptr_ptr) = retval ? retval : NULL;
 			zend_execute(EG(active_op_array) TSRMLS_CC);
+			zend_exception_restore(TSRMLS_C);
 			if (EG(exception)) {
 				EG(opline_ptr) = NULL;
 				if (EG(user_exception_handler)) {
 					zval *orig_user_exception_handler;
-					zval ***params, *retval2, *old_exception;
-					params = (zval ***)emalloc(sizeof(zval **));
+					zval **params[1], *retval2, *old_exception;
 					old_exception = EG(exception);
-					EG(exception) = NULL;
+					zend_exception_save(TSRMLS_C);
 					params[0] = &old_exception;
 					orig_user_exception_handler = EG(user_exception_handler);
 					if (call_user_function_ex(CG(function_table), NULL, orig_user_exception_handler, &retval2, 1, params, 1, NULL TSRMLS_CC) == SUCCESS) {
 						if (retval2 != NULL) {
 							zval_ptr_dtor(&retval2);
 						}
+						zend_exception_restore(TSRMLS_C);
+						if (EG(exception)) {
+							zval_ptr_dtor(&EG(exception));
+							EG(exception) = NULL;
+ 						}
 					} else {
-						if (!EG(exception)) {
-							EG(exception) = old_exception;
-						}
+						zend_exception_restore(TSRMLS_C);
 						zend_exception_error(EG(exception) TSRMLS_CC);
 					}
-					efree(params);
-					zval_ptr_dtor(&old_exception);
-					if (EG(exception)) {
-						zval_ptr_dtor(&EG(exception));
-						EG(exception) = NULL;
-					}
 				} else {
 					zend_exception_error(EG(exception) TSRMLS_CC);
 				}
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_exceptions.c?r1=1.124&r2=1.125&diff_format=u
Index: ZendEngine2/zend_exceptions.c
diff -u ZendEngine2/zend_exceptions.c:1.124 ZendEngine2/zend_exceptions.c:1.125
--- ZendEngine2/zend_exceptions.c:1.124	Tue Jul 29 14:27:31 2008
+++ ZendEngine2/zend_exceptions.c	Thu Aug 14 10:06:39 2008
@@ -19,7 +19,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_exceptions.c,v 1.124 2008/07/29 14:27:31 dmitry Exp $ */
+/* $Id: zend_exceptions.c,v 1.125 2008/08/14 10:06:39 helly Exp $ */
 
 #include "zend.h"
 #include "zend_API.h"
@@ -33,21 +33,17 @@
 static zend_object_handlers default_exception_handlers;
 ZEND_API void (*zend_throw_exception_hook)(zval *ex TSRMLS_DC);
 
-void zend_exception_set_previous(zval *add_previous TSRMLS_DC)
+void zend_exception_set_previous(zval *exception, zval *add_previous TSRMLS_DC)
 {
-	zval *exception = EG(exception), *previous;
+	zval *previous;
 
-	if (exception == add_previous || !add_previous) {
+	if (exception == add_previous || !add_previous || !exception) {
 		return;
 	}	
 	if (Z_TYPE_P(add_previous) != IS_OBJECT && !instanceof_function(Z_OBJCE_P(add_previous), default_exception_ce TSRMLS_CC)) {
 		zend_error(E_ERROR, "Cannot set non exception as previous exception");
 		return;
 	}
-	if (!exception) {
-		EG(exception) = add_previous;
-		return;
-	}
 	while (exception && exception != add_previous && Z_OBJ_HANDLE_P(exception) != Z_OBJ_HANDLE_P(add_previous)) {
 		previous = zend_read_property(default_exception_ce, exception, "previous", sizeof("previous")-1, 1 TSRMLS_CC);
 		if (Z_TYPE_P(previous) == IS_NULL) {
@@ -59,12 +55,40 @@
 	}
 }
 
+void zend_exception_save(TSRMLS_D) /* {{{ */
+{
+	if (EG(prev_exception)) {
+		zend_exception_set_previous(EG(exception), EG(prev_exception) TSRMLS_CC);
+	}
+	if (EG(exception)) {
+		EG(prev_exception) = EG(exception);
+	}
+	EG(exception) = NULL;
+}
+/* }}} */
+
+void zend_exception_restore(TSRMLS_D) /* {{{ */
+{
+	if (EG(prev_exception)) {
+		if (EG(exception)) {
+			zend_exception_set_previous(EG(exception), EG(prev_exception) TSRMLS_CC);
+		} else {
+			EG(exception) = EG(prev_exception);
+		}
+		EG(prev_exception) = NULL;
+	}
+}
+/* }}} */
+
 void zend_throw_exception_internal(zval *exception TSRMLS_DC) /* {{{ */
 {
 	if (exception != NULL) {
 		zval *previous = EG(exception);
+		zend_exception_set_previous(exception, EG(exception) TSRMLS_CC);
 		EG(exception) = exception;
-		zend_exception_set_previous(previous TSRMLS_CC);
+		if (previous) {
+			return;
+		}
 	}
 	if (!EG(current_execute_data)) {
 		zend_error(E_ERROR, "Exception thrown without a stack frame");
@@ -86,6 +110,10 @@
 
 ZEND_API void zend_clear_exception(TSRMLS_D) /* {{{ */
 {
+	if (EG(prev_exception)) {
+		zval_ptr_dtor(&EG(prev_exception));
+		EG(prev_exception) = NULL;
+	}
 	if (!EG(exception)) {
 		return;
 	}
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_exceptions.h?r1=1.30&r2=1.31&diff_format=u
Index: ZendEngine2/zend_exceptions.h
diff -u ZendEngine2/zend_exceptions.h:1.30 ZendEngine2/zend_exceptions.h:1.31
--- ZendEngine2/zend_exceptions.h:1.30	Sun Jul 13 21:35:23 2008
+++ ZendEngine2/zend_exceptions.h	Thu Aug 14 10:06:39 2008
@@ -19,14 +19,16 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_exceptions.h,v 1.30 2008/07/13 21:35:23 helly Exp $ */
+/* $Id: zend_exceptions.h,v 1.31 2008/08/14 10:06:39 helly Exp $ */
 
 #ifndef ZEND_EXCEPTIONS_H
 #define ZEND_EXCEPTIONS_H
 
 BEGIN_EXTERN_C()
 
-ZEND_API void zend_exception_set_previous(zval *add_previous TSRMLS_DC);
+ZEND_API void zend_exception_set_previous(zval *exception, zval *add_previous TSRMLS_DC);
+ZEND_API void zend_exception_save(TSRMLS_D);
+ZEND_API void zend_exception_restore(TSRMLS_D);
 
 void zend_throw_exception_internal(zval *exception TSRMLS_DC);
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute_API.c?r1=1.460&r2=1.461&diff_format=u
Index: ZendEngine2/zend_execute_API.c
diff -u ZendEngine2/zend_execute_API.c:1.460 ZendEngine2/zend_execute_API.c:1.461
--- ZendEngine2/zend_execute_API.c:1.460	Tue Aug 12 21:52:54 2008
+++ ZendEngine2/zend_execute_API.c	Thu Aug 14 10:06:39 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_execute_API.c,v 1.460 2008/08/12 21:52:54 nlopess Exp $ */
+/* $Id: zend_execute_API.c,v 1.461 2008/08/14 10:06:39 helly Exp $ */
 
 #include <stdio.h>
 #include <signal.h>
@@ -200,6 +200,7 @@
 #endif
 
 	EG(exception) = NULL;
+	EG(prev_exception) = NULL;
 
 	EG(scope) = NULL;
 	EG(called_scope) = NULL;
@@ -1110,7 +1111,7 @@
 	fcall_cache.object_pp = NULL;
 
 	exception = EG(exception);
-	EG(exception) = NULL;
+	zend_exception_save(TSRMLS_C);
 	retval = zend_call_function(&fcall_info, &fcall_cache TSRMLS_CC);
 	EG(autoload_func) = fcall_cache.function_handler;
 
@@ -1123,7 +1124,7 @@
 	zend_u_hash_del(EG(in_autoload), type, lc_name, lc_name_len + 1);
 
 	if (retval == FAILURE) {
-		EG(exception) = exception;
+		zend_exception_restore(TSRMLS_C);
 		if (do_normalize) {
 			efree(lc_free.v);
 		}
@@ -1131,15 +1132,14 @@
 	}
 
 	if (EG(exception) && exception) {
+		zend_exception_restore(TSRMLS_C);
 		if (do_normalize) {
 			efree(lc_free.v);
 		}
 		zend_error(E_ERROR, "Function %s(%R) threw an exception of type '%v'", ZEND_AUTOLOAD_FUNC_NAME, type, name, Z_OBJCE_P(EG(exception))->name);
 		return FAILURE;
 	}
-	if (!EG(exception)) {
-		EG(exception) = exception;
-	}
+	zend_exception_restore(TSRMLS_C);
 	if (retval_ptr) {
 		zval_ptr_dtor(&retval_ptr);
 	}
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_globals.h?r1=1.180&r2=1.181&diff_format=u
Index: ZendEngine2/zend_globals.h
diff -u ZendEngine2/zend_globals.h:1.180 ZendEngine2/zend_globals.h:1.181
--- ZendEngine2/zend_globals.h:1.180	Mon Aug 11 17:19:01 2008
+++ ZendEngine2/zend_globals.h	Thu Aug 14 10:06:39 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_globals.h,v 1.180 2008/08/11 17:19:01 helly Exp $ */
+/* $Id: zend_globals.h,v 1.181 2008/08/14 10:06:39 helly Exp $ */
 
 #ifndef ZEND_GLOBALS_H
 #define ZEND_GLOBALS_H
@@ -227,7 +227,7 @@
 	HashTable *modified_ini_directives;
 
 	zend_objects_store objects_store;
-	zval *exception;
+	zval *exception, *prev_exception;
 	zend_op *opline_before_exception;
 	zend_op exception_op[3];
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_objects.c?r1=1.78&r2=1.79&diff_format=u
Index: ZendEngine2/zend_objects.c
diff -u ZendEngine2/zend_objects.c:1.78 ZendEngine2/zend_objects.c:1.79
--- ZendEngine2/zend_objects.c:1.78	Tue Aug 12 17:15:59 2008
+++ ZendEngine2/zend_objects.c	Thu Aug 14 10:06:39 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_objects.c,v 1.78 2008/08/12 17:15:59 felipe Exp $ */
+/* $Id: zend_objects.c,v 1.79 2008/08/14 10:06:39 helly Exp $ */
 
 #include "zend.h"
 #include "zend_globals.h"
@@ -55,7 +55,6 @@
 
 	if (destructor) {
 		zval *obj;
-		zval *old_exception;
 
 		if (destructor->op_array.fn_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) {
 			if (destructor->op_array.fn_flags & ZEND_ACC_PRIVATE) {
@@ -97,10 +96,12 @@
 		 * For example, if an exception was thrown in a function and when the function's
 		 * local variable destruction results in a destructor being called.
 		 */
-		old_exception = EG(exception);
-		EG(exception) = NULL;
+		if (EG(exception) && Z_OBJ_HANDLE_P(EG(exception)) == handle) {
+			zend_error(E_ERROR, "Attempt to destruct pending exception");
+		}
+		zend_exception_save(TSRMLS_C);
 		zend_call_method_with_0_params(&obj, object->ce, &destructor, ZEND_DESTRUCTOR_FUNC_NAME, NULL);
-		zend_exception_set_previous(old_exception TSRMLS_CC);
+		zend_exception_restore(TSRMLS_C);
 		zval_ptr_dtor(&obj);
 	}
 }
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.243&r2=1.244&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.243 ZendEngine2/zend_vm_def.h:1.244
--- ZendEngine2/zend_vm_def.h:1.243	Wed Aug 13 07:22:39 2008
+++ ZendEngine2/zend_vm_def.h	Thu Aug 14 10:06:39 2008
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_vm_def.h,v 1.243 2008/08/13 07:22:39 dmitry Exp $ */
+/* $Id: zend_vm_def.h,v 1.244 2008/08/14 10:06:39 helly Exp $ */
 
 /* If you change this file, please regenerate the zend_vm_execute.h and
  * zend_vm_opcodes.h files by running:
@@ -2581,6 +2581,7 @@
 	if (Z_TYPE_P(value) != IS_OBJECT) {
 		zend_error_noreturn(E_ERROR, "Can only throw objects");
 	}
+	zend_exception_save(TSRMLS_C);
 	/* Not sure if a complete copy is what we want here */
 	ALLOC_ZVAL(exception);
 	INIT_PZVAL_COPY(exception, value);
@@ -2589,6 +2590,7 @@
 	}
 
 	zend_throw_exception_object(exception TSRMLS_CC);
+	zend_exception_restore(TSRMLS_C);
 	FREE_OP1_IF_VAR();
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -2599,6 +2601,7 @@
 	zend_class_entry *ce;
 
 	/* Check whether an exception has been thrown, if not, jump over code */
+	zend_exception_restore(TSRMLS_C);
 	if (EG(exception) == NULL) {
 		ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
 		ZEND_VM_CONTINUE(); /* CHECK_ME */
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.247&r2=1.248&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.247 ZendEngine2/zend_vm_execute.h:1.248
--- ZendEngine2/zend_vm_execute.h:1.247	Wed Aug 13 07:22:39 2008
+++ ZendEngine2/zend_vm_execute.h	Thu Aug 14 10:06:39 2008
@@ -1209,6 +1209,7 @@
 	zend_class_entry *ce;
 
 	/* Check whether an exception has been thrown, if not, jump over code */
+	zend_exception_restore(TSRMLS_C);
 	if (EG(exception) == NULL) {
 		ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
 		ZEND_VM_CONTINUE(); /* CHECK_ME */
@@ -1649,6 +1650,7 @@
 	if (Z_TYPE_P(value) != IS_OBJECT) {
 		zend_error_noreturn(E_ERROR, "Can only throw objects");
 	}
+	zend_exception_save(TSRMLS_C);
 	/* Not sure if a complete copy is what we want here */
 	ALLOC_ZVAL(exception);
 	INIT_PZVAL_COPY(exception, value);
@@ -1657,6 +1659,7 @@
 	}
 
 	zend_throw_exception_object(exception TSRMLS_CC);
+	zend_exception_restore(TSRMLS_C);
 
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -5073,6 +5076,7 @@
 	if (Z_TYPE_P(value) != IS_OBJECT) {
 		zend_error_noreturn(E_ERROR, "Can only throw objects");
 	}
+	zend_exception_save(TSRMLS_C);
 	/* Not sure if a complete copy is what we want here */
 	ALLOC_ZVAL(exception);
 	INIT_PZVAL_COPY(exception, value);
@@ -5081,6 +5085,7 @@
 	}
 
 	zend_throw_exception_object(exception TSRMLS_CC);
+	zend_exception_restore(TSRMLS_C);
 
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -8402,6 +8407,7 @@
 	if (Z_TYPE_P(value) != IS_OBJECT) {
 		zend_error_noreturn(E_ERROR, "Can only throw objects");
 	}
+	zend_exception_save(TSRMLS_C);
 	/* Not sure if a complete copy is what we want here */
 	ALLOC_ZVAL(exception);
 	INIT_PZVAL_COPY(exception, value);
@@ -8410,6 +8416,7 @@
 	}
 
 	zend_throw_exception_object(exception TSRMLS_CC);
+	zend_exception_restore(TSRMLS_C);
 	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -23099,6 +23106,7 @@
 	if (Z_TYPE_P(value) != IS_OBJECT) {
 		zend_error_noreturn(E_ERROR, "Can only throw objects");
 	}
+	zend_exception_save(TSRMLS_C);
 	/* Not sure if a complete copy is what we want here */
 	ALLOC_ZVAL(exception);
 	INIT_PZVAL_COPY(exception, value);
@@ -23107,6 +23115,7 @@
 	}
 
 	zend_throw_exception_object(exception TSRMLS_CC);
+	zend_exception_restore(TSRMLS_C);
 
 	ZEND_VM_NEXT_OPCODE();
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.