]> granicus.if.org Git - php/commitdiff
- PHP 5.3 todo, store error handling mode on stack when executing internal
authorMarcus Boerger <helly@php.net>
Fri, 8 Aug 2008 13:18:31 +0000 (13:18 +0000)
committerMarcus Boerger <helly@php.net>
Fri, 8 Aug 2008 13:18:31 +0000 (13:18 +0000)
  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.

Zend/zend_execute_API.c
main/php.h

index ce63cabcf7fb738b2cf18e97a02a7a4d56f24a98..94a5d3427c4959e8c8b1bac0ca4877300023e893 100644 (file)
@@ -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");
                }
index 45674db98bac9a5c56f0945d3918b8ea7a594b65..3c5204d7fc4dff6b8e53955df4776d951be10c3d 100644 (file)
@@ -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);