Re: cvs: php-src(PHP_5_3) /main php.h ZendEngine2 zend_execute_API.c
| From: | Marcus Boerger | Date: | Fri, 08 Aug 2008 18:32:05 +0000 |
| Subject: | Re: cvs: php-src(PHP_5_3) /main php.h ZendEngine2 zend_execute_API.c | ||
| References: | 1 2 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-52149@lists.php.net to get a copy of this message | ||
Hello Hannes,
Friday, August 8, 2008, 3:57:16 PM, you wrote:
> On Fri, Aug 8, 2008 at 15:21, Marcus Boerger <helly@php.net> wrote:
>> helly Fri Aug 8 13:21:52 2008 UTC
>>
>> Modified files: (Branch: PHP_5_3)
>> /ZendEngine2 zend_execute_API.c
>> /php-src/main php.h
>> Log:
>> - MFH store error handling mode on stack when executing internal
>> or overloaded functions and methods. [...]
>>
>>
>>
>> http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute_API.c?r1=1.331.2.20.2.24.2.50&r2=1.331.2.20.2.24.2.51&diff_format=u
>> Index: ZendEngine2/zend_execute_API.c
>> diff -u ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.50
>> ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.51
>> --- ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.50 Fri Aug 1 14:22:03 2008
>> +++ ZendEngine2/zend_execute_API.c Fri Aug 8 13:21:52 2008
>> @@ -17,7 +17,7 @@
>> +----------------------------------------------------------------------+
>> */
>>
>> -/* $Id: zend_execute_API.c,v 1.331.2.20.2.24.2.50 2008/08/01 14:22:03 dmitry Exp $ */
>> +/* $Id: zend_execute_API.c,v 1.331.2.20.2.24.2.51 2008/08/08 13:21:52 helly Exp $ */
>>
>> #include <stdio.h>
>> #include <signal.h>
>> @@ -890,12 +890,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)
>> @@ -912,12 +916,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
>> */
>> + /* 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.221.2.4.2.8.2.5&r2=1.221.2.4.2.8.2.6&diff_format=u
>> Index: php-src/main/php.h
>> diff -u php-src/main/php.h:1.221.2.4.2.8.2.5 php-src/main/php.h:1.221.2.4.2.8.2.6
>> --- php-src/main/php.h:1.221.2.4.2.8.2.5 Tue Jun 24 05:59:53 2008
>> +++ php-src/main/php.h Fri Aug 8 13:21:52 2008
>> @@ -17,7 +17,7 @@
>> +----------------------------------------------------------------------+
>> */
>>
>> -/* $Id: php.h,v 1.221.2.4.2.8.2.5 2008/06/24 05:59:53 kalle Exp $ */
>> +/* $Id: php.h,v 1.221.2.4.2.8.2.6 2008/08/08 13:21:52 helly Exp $ */
>>
>> #ifndef PHP_H
>> #define PHP_H
>> @@ -288,7 +288,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() {}
> This doesn't look right...
> $ sapi/cli/php -r 'try { new DOMAttr();} catch(Exception $e) {} strpos();'
> Fatal error: Uncaught exception 'DOMException' with message 'strpos()
> expects at least 2 parameters, 0 given' in Command line code:1
I figured out that the VM has a short path through this and needed to
change that as well. We further more realized that the easiy solution won't
work for all cases anyway. So I provided a full version with save, replace
and restore function that Etienne and I will be using to replace all
php_*_error_handling() calls. Once agina a time when one thinks, cool I
found an easy solution and quite soon gets disillusioned.
Best regards,
Marcus