helly Fri Aug 8 13:18:31 2008 UTC Modified files: /ZendEngine2 zend_execute_API.c /php-src/main php.h Log: - PHP 5.3 todo, store error handling mode on stack when executing internal or overloaded functions and methods. The issue is that a function might set and rely on a certain mode and then calls another internal function which changes it again, probably changing it back to the normal mode. With this change we need to drop all calls that change the mode back to normal using php_std_error_handling(). However there might be places where someone wants to restore the last mode. If there is such a case we need to add two functions one to save and one to restore. I briefly on this and not all cases are clear, especially one in sqlite but that seems to be a rather misleading comment. Eitherway I chose to not drop and mark as deprecated for now. http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute_API.c?r1=1.456&r2=1.457&diff_format=u Index: ZendEngine2/zend_execute_API.c diff -u ZendEngine2/zend_execute_API.c:1.456 ZendEngine2/zend_execute_API.c:1.457 --- ZendEngine2/zend_execute_API.c:1.456 Fri Aug 1 14:21:45 2008 +++ ZendEngine2/zend_execute_API.c Fri Aug 8 13:18:30 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute_API.c,v 1.456 2008/08/01 14:21:45 dmitry Exp $ */ +/* $Id: zend_execute_API.c,v 1.457 2008/08/08 13:18:30 helly Exp $ */ #include <stdio.h> #include <signal.h> @@ -947,12 +947,16 @@ EG(opline_ptr) = original_opline_ptr; } else if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) { int call_via_handler = (EX(function_state).function->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0; + zend_error_handling_t error_handling = EG(error_handling); + zend_class_entry *exception_class = EG(exception_class); ALLOC_INIT_ZVAL(*fci->retval_ptr_ptr); if (EX(function_state).function->common.scope) { EG(scope) = EX(function_state).function->common.scope; } ((zend_internal_function *) EX(function_state).function)->handler(fci->param_count, *fci->retval_ptr_ptr, fci->retval_ptr_ptr, (fci->object_pp?*fci->object_pp:NULL), 1 TSRMLS_CC); + EG(error_handling) = error_handling; + EG(exception_class) = exception_class; /* We shouldn't fix bad extensions here, because it can break proper ones (Bug #34045) if (!EX(function_state).function->common.return_reference) @@ -969,12 +973,15 @@ fci_cache->initialized = 0; } } else { /* ZEND_OVERLOADED_FUNCTION */ - ALLOC_INIT_ZVAL(*fci->retval_ptr_ptr); /* Not sure what should be done here if it's a static method */ if (fci->object_pp) { + zend_error_handling_t error_handling = EG(error_handling); + zend_class_entry *exception_class = EG(exception_class); Z_OBJ_HT_PP(fci->object_pp)->call_method(EX(function_state).function->common.function_name, fci->param_count, *fci->retval_ptr_ptr, fci->retval_ptr_ptr, *fci->object_pp, 1 TSRMLS_CC); + EG(error_handling) = error_handling; + EG(exception_class) = exception_class; } else { zend_error_noreturn(E_ERROR, "Cannot call overloaded function for non-object"); } http://cvs.php.net/viewvc.cgi/php-src/main/php.h?r1=1.244&r2=1.245&diff_format=u Index: php-src/main/php.h diff -u php-src/main/php.h:1.244 php-src/main/php.h:1.245 --- php-src/main/php.h:1.244 Tue Jun 24 05:59:11 2008 +++ php-src/main/php.h Fri Aug 8 13:18:31 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php.h,v 1.244 2008/06/24 05:59:11 kalle Exp $ */ +/* $Id: php.h,v 1.245 2008/08/08 13:18:31 helly Exp $ */ #ifndef PHP_H #define PHP_H @@ -287,7 +287,7 @@ BEGIN_EXTERN_C() PHPAPI void php_set_error_handling(error_handling_t error_handling, zend_class_entry *exception_class TSRMLS_DC); -#define php_std_error_handling() php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC) +static ZEND_ATTRIBUTE_DEPRECATED void php_std_error_handling() {} PHPAPI void php_verror(const char *docref, const char *params, int type, const char *format, va_list args TSRMLS_DC);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php