From: Marcus Boerger Date: Fri, 8 Aug 2008 13:18:31 +0000 (+0000) Subject: - PHP 5.3 todo, store error handling mode on stack when executing internal X-Git-Tag: BEFORE_HEAD_NS_CHANGE~812 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=805cc4bf50ed319a914700b6ff53f5b562e9178c;p=php - 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. --- diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index ce63cabcf7..94a5d3427c 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -947,12 +947,16 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS 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 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS 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"); } diff --git a/main/php.h b/main/php.h index 45674db98b..3c5204d7fc 100644 --- a/main/php.h +++ b/main/php.h @@ -287,7 +287,7 @@ END_EXTERN_C() 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);