dmitry Fri, 08 Apr 2011 10:02:07 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=310050
Log: - Fixed bug #54358 (Closure, use and reference) - Fixed bug #54039 (use() of static variables in lambda functions can break staticness) Bugs: http://bugs.php.net/54358 (Assigned) Closure, use and reference http://bugs.php.net/54039 (Assigned) use() of static variables in lambda functions can break staticness Changed paths: U php/php-src/branches/PHP_5_3/NEWS A php/php-src/branches/PHP_5_3/Zend/tests/bug54039.phpt A php/php-src/branches/PHP_5_3/Zend/tests/bug54358.phpt U php/php-src/branches/PHP_5_3/Zend/zend_closures.c A php/php-src/trunk/Zend/tests/bug54039.phpt A php/php-src/trunk/Zend/tests/bug54358.phpt U php/php-src/trunk/Zend/zend_variables.c Modified: php/php-src/branches/PHP_5_3/NEWS =================================================================== --- php/php-src/branches/PHP_5_3/NEWS 2011-04-08 09:39:09 UTC (rev 310049) +++ php/php-src/branches/PHP_5_3/NEWS 2011-04-08 10:02:07 UTC (rev 310050) @@ -6,6 +6,9 @@ (Tony, Dmitry) . Fixed bug #54372 (Crash accessing global object itself returned from its __get() handle). (Dmitry) + . Fixed bug #54358 (Closure, use and reference). (Dmitry) + . Fixed bug #54039 (use() of static variables in lambda functions can break + staticness). (Dmitry) . Fixed bug #54262 (Crash when assigning value to a dimension in a non-array). (Dmitry) Added: php/php-src/branches/PHP_5_3/Zend/tests/bug54039.phpt =================================================================== --- php/php-src/branches/PHP_5_3/Zend/tests/bug54039.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/Zend/tests/bug54039.phpt 2011-04-08 10:02:07 UTC (rev 310050) @@ -0,0 +1,58 @@ +--TEST-- +Bug #54039 (use() of static variables in lambda functions can break staticness) +--FILE-- +<?php +function test_1() { + static $v = 0; + ++$v; + echo "Outer function increments \$v to $v\n"; + $f = function() use($v) { + echo "Inner function reckons \$v is $v\n"; + }; + return $f; +} + +$f = test_1(); $f(); +$f = test_1(); $f(); + +function test_2() { + static $v = 0; + $f = function() use($v) { + echo "Inner function reckons \$v is $v\n"; + }; + ++$v; + echo "Outer function increments \$v to $v\n"; + return $f; +} + +$f = test_2(); $f(); +$f = test_2(); $f(); + +function test_3() { + static $v = ""; + $v .= 'b'; + echo "Outer function catenates 'b' onto \$v to give $v\n"; + $f = function() use($v) { + echo "Inner function reckons \$v is $v\n"; + }; + $v .= 'a'; + echo "Outer function catenates 'a' onto \$v to give $v\n"; + return $f; +} +$f = test_3(); $f(); +$f = test_3(); $f(); +--EXPECT-- +Outer function increments $v to 1 +Inner function reckons $v is 1 +Outer function increments $v to 2 +Inner function reckons $v is 2 +Outer function increments $v to 1 +Inner function reckons $v is 0 +Outer function increments $v to 2 +Inner function reckons $v is 1 +Outer function catenates 'b' onto $v to give b +Outer function catenates 'a' onto $v to give ba +Inner function reckons $v is b +Outer function catenates 'b' onto $v to give bab +Outer function catenates 'a' onto $v to give baba +Inner function reckons $v is bab Added: php/php-src/branches/PHP_5_3/Zend/tests/bug54358.phpt =================================================================== --- php/php-src/branches/PHP_5_3/Zend/tests/bug54358.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/Zend/tests/bug54358.phpt 2011-04-08 10:02:07 UTC (rev 310050) @@ -0,0 +1,39 @@ +--TEST-- +Bug #54358 (Closure, use and reference) +--FILE-- +<?php +class asserter { + public function call($function) { + } +} + +$asserter = new asserter(); + +$closure = function() use ($asserter, &$function) { + $asserter->call($function = 'md5'); +}; + +$closure(); + +var_dump($function); + +$closure = function() use ($asserter, $function) { + $asserter->call($function); +}; + +$closure(); + +var_dump($function); + +$closure = function() use ($asserter, $function) { + $asserter->call($function); +}; + +$closure(); + +var_dump($function); +?> +--EXPECT-- +string(3) "md5" +string(3) "md5" +string(3) "md5" Modified: php/php-src/branches/PHP_5_3/Zend/zend_closures.c =================================================================== --- php/php-src/branches/PHP_5_3/Zend/zend_closures.c 2011-04-08 09:39:09 UTC (rev 310049) +++ php/php-src/branches/PHP_5_3/Zend/zend_closures.c 2011-04-08 10:02:07 UTC (rev 310050) @@ -347,6 +347,7 @@ } else if (Z_ISREF_PP(p)) { ALLOC_INIT_ZVAL(tmp); *tmp = **p; + zval_copy_ctor(tmp); Z_SET_REFCOUNT_P(tmp, 0); Z_UNSET_ISREF_P(tmp); } else { Added: php/php-src/trunk/Zend/tests/bug54039.phpt =================================================================== --- php/php-src/trunk/Zend/tests/bug54039.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/bug54039.phpt 2011-04-08 10:02:07 UTC (rev 310050) @@ -0,0 +1,58 @@ +--TEST-- +Bug #54039 (use() of static variables in lambda functions can break staticness) +--FILE-- +<?php +function test_1() { + static $v = 0; + ++$v; + echo "Outer function increments \$v to $v\n"; + $f = function() use($v) { + echo "Inner function reckons \$v is $v\n"; + }; + return $f; +} + +$f = test_1(); $f(); +$f = test_1(); $f(); + +function test_2() { + static $v = 0; + $f = function() use($v) { + echo "Inner function reckons \$v is $v\n"; + }; + ++$v; + echo "Outer function increments \$v to $v\n"; + return $f; +} + +$f = test_2(); $f(); +$f = test_2(); $f(); + +function test_3() { + static $v = ""; + $v .= 'b'; + echo "Outer function catenates 'b' onto \$v to give $v\n"; + $f = function() use($v) { + echo "Inner function reckons \$v is $v\n"; + }; + $v .= 'a'; + echo "Outer function catenates 'a' onto \$v to give $v\n"; + return $f; +} +$f = test_3(); $f(); +$f = test_3(); $f(); +--EXPECT-- +Outer function increments $v to 1 +Inner function reckons $v is 1 +Outer function increments $v to 2 +Inner function reckons $v is 2 +Outer function increments $v to 1 +Inner function reckons $v is 0 +Outer function increments $v to 2 +Inner function reckons $v is 1 +Outer function catenates 'b' onto $v to give b +Outer function catenates 'a' onto $v to give ba +Inner function reckons $v is b +Outer function catenates 'b' onto $v to give bab +Outer function catenates 'a' onto $v to give baba +Inner function reckons $v is bab Added: php/php-src/trunk/Zend/tests/bug54358.phpt =================================================================== --- php/php-src/trunk/Zend/tests/bug54358.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/bug54358.phpt 2011-04-08 10:02:07 UTC (rev 310050) @@ -0,0 +1,39 @@ +--TEST-- +Bug #54358 (Closure, use and reference) +--FILE-- +<?php +class asserter { + public function call($function) { + } +} + +$asserter = new asserter(); + +$closure = function() use ($asserter, &$function) { + $asserter->call($function = 'md5'); +}; + +$closure(); + +var_dump($function); + +$closure = function() use ($asserter, $function) { + $asserter->call($function); +}; + +$closure(); + +var_dump($function); + +$closure = function() use ($asserter, $function) { + $asserter->call($function); +}; + +$closure(); + +var_dump($function); +?> +--EXPECT-- +string(3) "md5" +string(3) "md5" +string(3) "md5" Modified: php/php-src/trunk/Zend/zend_variables.c =================================================================== --- php/php-src/trunk/Zend/zend_variables.c 2011-04-08 09:39:09 UTC (rev 310049) +++ php/php-src/trunk/Zend/zend_variables.c 2011-04-08 10:02:07 UTC (rev 310050) @@ -216,6 +216,7 @@ } else if (Z_ISREF_PP(p)) { ALLOC_INIT_ZVAL(tmp); ZVAL_COPY_VALUE(tmp, *p); + zval_copy_ctor(tmp); Z_SET_REFCOUNT_P(tmp, 0); Z_UNSET_ISREF_P(tmp); } else {
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php