Edit report at http://bugs.php.net/bug.php?id=52940&edit=1
ID: 52940 Updated by: dmi...@php.net Reported by: cataphr...@php.net Summary: call_user_func_array still allows call-time pass-by-reference -Status: Assigned +Status: Closed Type: Bug Package: Scripting Engine problem Operating System: Windows 7 x64; Debian Lenny x64 PHP Version: trunk-SVN-2010-09-28 (SVN) Assigned To: dmitry Block user comment: N New Comment: This bug has been fixed in SVN. Snapshots of the sources are packaged every three hours; this change will be in the next snapshot. You can grab the snapshot at http://snaps.php.net/. Thank you for the report, and for helping us make PHP better. Previous Comments: ------------------------------------------------------------------------ [2010-10-01 13:53:07] dmi...@php.net Automatic comment from SVN on behalf of dmitry Revision: http://svn.php.net/viewvc/?view=revision&revision=303919 Log: Fixed bug #52940 (call_user_func_array still allows call-time pass-by-reference). (cataphr...@php.net) ------------------------------------------------------------------------ [2010-09-29 23:13:54] cataphr...@php.net Fixing this would also fix bug #51986. ------------------------------------------------------------------------ [2010-09-28 11:44:29] paj...@php.net hi Dmitry, Can you look at this pls? ------------------------------------------------------------------------ [2010-09-28 07:11:54] cataphr...@php.net I've left the exception that was introduced for bug #50394, though I think it should be removed for trunk. It makes no sense to disallow this: <?php class A { function __call($name, $args) { var_dump($args); } } $a = new A; $b = 6; $a->foobar(&$a); yet allow this: <?php class A { function __call($name, $args) { var_dump($args); } } $a = new A; $b = 6; call_user_func_array(array($a, 'foobar'), array(&$b)); The problem described in bug #50394 could easily be worked around by, instead of passing by reference to __call, give the argument in an array instead: <?php function foo( &$x ) { $x++; } class Proxy { function __call( $name, $args ) { call_user_func_array( 'foo', $args[0] ); } } $arg = 1; $args = array( &$arg ); $proxy = new Proxy; call_user_func_array( array( $proxy, 'bar' ), array($args) ); var_dump($arg); ------------------------------------------------------------------------ [2010-09-28 06:51:01] cataphr...@php.net I ended up implemented a better strategy than separate+clear flag, as that broke a few tests that expected the fci.params's zvals not to have the reference flag changed. This patch breaks only two tests that explicitly tested for the previous behavior. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/bug.php?id=52940 -- Edit this bug report at http://bugs.php.net/bug.php?id=52940&edit=1