Edit report at http://bugs.php.net/bug.php?id=52939&edit=1
ID: 52939 Patch added by: cataphr...@php.net Reported by: cataphr...@php.net Summary: zend_call_function does not respect ZEND_SEND_PREFER_REF Status: Open Type: Bug Package: Scripting Engine problem Operating System: Windows 7 x64 PHP Version: trunk-SVN-2010-09-28 (SVN) Block user comment: N New Comment: The following patch has been added/updated: Patch Name: zend_call_user_function_prefer_ref Revision: 1285638612 URL: http://bugs.php.net/patch-display.php?bug=52939&patch=zend_call_user_function_prefer_ref&revision=1285638612 Previous Comments: ------------------------------------------------------------------------ [2010-09-28 03:44:24] cataphr...@php.net Description: ------------ The function zend_call_function interprets ZEND_SEND_PREFER_REF as if it were ZEND_SEND_BY_REF. Test script: --------------- <?php $a = 'a'; $b = 7; echo "direct call\n"; test_passing(1, $a, 7); echo "call via zend_call_function\n"; //separate definition to put the refcount of the third parameter=2. //If it were 1, zend_call_function would use its special "convert //into reference" case and wouldn't error out //i.e., this works: call_user_func_array('test_passing', array(1, &$a, 7)); $arguments = array(1, &$a, 7); call_user_func_array('test_passing', $arguments); ------ PHP_FUNCTION(test_passing) { zval ***params; unsigned param_count; int i; param_count = ZEND_NUM_ARGS(); params = emalloc(param_count * sizeof *params); for (i = 0; i < (int) param_count; i++) { params[i] = (zval **) (zend_vm_stack_top(TSRMLS_C) - 1 - (param_count - i)); php_printf("[%p, refcount=%u] ", *params[i], (*params[i])->refcount__gc); php_var_dump(params[i], 0 TSRMLS_CC); } efree(params); } ZEND_BEGIN_ARG_INFO_EX(arginfo_test_passing, 0, 0, 3) ZEND_ARG_INFO(0, req_pass_by_val) ZEND_ARG_INFO(1, req_pass_by_ref) ZEND_ARG_INFO(2, req_prefer_ pass_by_ref) ZEND_END_ARG_INFO() Expected result: ---------------- Both calls would be successful. Actual result: -------------- Only the direct call is successful: direct call [0x5ddbed0, refcount=1] int(1) [0x5ddc530, refcount=2] &string(1) "a" [0x5ddbf20, refcount=1] int(7) call via zend_call_function PHP Warning: Parameter 3 to test_passing() expected to be a reference, value gi ven in - on line 12 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=52939&edit=1