svn: /php/php-src/ branches/PHP_5_3/NEWS branches/PHP_5_3/Zend/tests/bug54039.phpt branches/PHP_5_3/Zend/tests/bug54358.phpt
branches/PHP_5_3/Zend/zend_closures.c trunk/Zend/tests/bug54039.phpt trunk/Zend/tests/bug54358.phpt trunk/Zend/zend_variables.c
| From: | Dmitry Stogov | Date: | Fri, 08 Apr 2011 10:02:07 +0000 |
| Subject: | svn: /php/php-src/ branches/PHP_5_3/NEWS branches/PHP_5_3/Zend/tests/bug54039.phpt branches/PHP_5_3/Zend/tests/bug54358.phpt branches/PHP_5_3/Zend/zend_closures.c trunk/Zend/tests/bug54039.phpt trunk/Zend/tests/bug54358.phpt trunk/Zend/zend_variables.c |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-64803@lists.php.net to get a copy of this message | ||
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 {