Hi! > Nowadays (since PHP 5.0) the code was moved from > call_user_function_ex to zend_call_function and just looks like > this: > > ((zend_internal_function *) > EX(function_state).function)->handler(fci->param_count, > *fci->retval_ptr_ptr, fci->retval_ptr_ptr, fci->object_ptr, 1 > TSRMLS_CC); > > > While this has no immediate impact for average PHP users, it > basically kills the possibility for an extension like Suhosin to > catch all function starts. This should also be a problem for your > DTRACE support. And IIRC Xdebug was hooking this point (at least in > the past), too. > > My suggestion is to change the code to call the hook again.
There's a bit of a problem there. The problem is that execute_internal looks like this: zval **return_value_ptr = &(*(temp_variable *)((char *) execute_data_ptr->Ts + execute_data_ptr->opline->result.var)).var.ptr; ((zend_internal_function *) execute_data_ptr->function_state.function)->handler(execute_data_ptr->opline->extended_value, *return_value_ptr, (execute_data_ptr->function_state.function->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)?return_value_ptr:NULL, execute_data_ptr->object, return_value_used TSRMLS_CC); You note it takes return values from opline. Which is fine when running PHP code, but when running internal function from internal function, there's no opline. So zend_call_function calls this: ((zend_internal_function *) EX(function_state).function)->handler(fci->param_count, *fci->retval_ptr_ptr, fci->retval_ptr_ptr, fci->object_ptr, 1 TSRMLS_CC); I.e. it uses data from fci. But if we use zend_execute_internal we have only execute_data_ptr to work with, which has wrong return values. So we need to either make fake opline somehow or find a way to pass correct return vars to the handler via execute_internal. I'll see how it can be done but that'd be probably in 5.5 since it may require some engine changes, which is not an option for stable versions. -- Stanislav Malyshev, Software Architect SugarCRM: http://www.sugarcrm.com/ (408)454-6900 ext. 227 -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php