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

Reply via email to