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();
}