felipe                                   Sat, 12 Jun 2010 16:11:10 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=300409

Log:
- Allow write context on array dereferencing from method return
- New tests

Changed paths:
    U   php/php-src/trunk/Zend/tests/dereference_007.phpt
    A   php/php-src/trunk/Zend/tests/dereference_012.phpt
    A   php/php-src/trunk/Zend/tests/dereference_013.phpt
    A   php/php-src/trunk/Zend/tests/dereference_014.phpt
    U   php/php-src/trunk/Zend/zend_language_parser.y

Modified: php/php-src/trunk/Zend/tests/dereference_007.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/dereference_007.phpt   2010-06-12 16:07:20 UTC 
(rev 300408)
+++ php/php-src/trunk/Zend/tests/dereference_007.phpt   2010-06-12 16:11:10 UTC 
(rev 300409)
@@ -11,12 +11,27 @@
        public function b() {
                return $this->x;
        }
+
+       public function c() {
+               return $x;
+       }
+
+       static public function d() {
+
+       }
 }

 $foo = new foo;

 $foo->b()[0] = 1;

+$foo->c()[100] = 2;
+
+foo::d()[] = 3;
+
+print "ok\n";
+
 ?>
 --EXPECTF--
-Fatal error: Can't use method return value in write context in %s on line %d
+Notice: Undefined variable: x in %s on line %d
+ok

Added: php/php-src/trunk/Zend/tests/dereference_012.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/dereference_012.phpt                           
(rev 0)
+++ php/php-src/trunk/Zend/tests/dereference_012.phpt   2010-06-12 16:11:10 UTC 
(rev 300409)
@@ -0,0 +1,56 @@
+--TEST--
+Testing array dereferencing on return of a method with and without reference
+--FILE--
+<?php
+
+class foo {
+       static $x = array();
+
+       public function &a() {
+               self::$x = array(1, 2, 3);
+               return self::$x;
+       }
+
+       public function b() {
+               $x = array(1);
+               $x[] = 2;
+               return $x;
+       }
+}
+
+$foo = new foo;
+
+// Changing the static variable
+$foo->a()[0] = 2;
+var_dump($foo::$x);
+
+$foo->b()[] = new stdClass;
+
+$h = $foo->b();
+var_dump($h);
+
+$h[0] = 3;
+var_dump($h);
+
+?>
+--EXPECT--
+array(3) {
+  [0]=>
+  int(2)
+  [1]=>
+  int(2)
+  [2]=>
+  int(3)
+}
+array(2) {
+  [0]=>
+  int(1)
+  [1]=>
+  int(2)
+}
+array(2) {
+  [0]=>
+  int(3)
+  [1]=>
+  int(2)
+}


Property changes on: php/php-src/trunk/Zend/tests/dereference_012.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Added: php/php-src/trunk/Zend/tests/dereference_013.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/dereference_013.phpt                           
(rev 0)
+++ php/php-src/trunk/Zend/tests/dereference_013.phpt   2010-06-12 16:11:10 UTC 
(rev 300409)
@@ -0,0 +1,38 @@
+--TEST--
+Testing array dereferencing on array returned from __call method
+--FILE--
+<?php
+
+error_reporting(E_ALL);
+
+class foo {
+       public $x = array(2);
+
+       public function __call($x, $y) {
+               if (count($this->x) == 1) {
+                       $this->x[] = $y[0];
+               }
+               return $this->x;
+       }
+}
+
+$foo = new foo;
+
+$x = array(1);
+
+$foo->b($x)[1] = 3;
+
+var_dump($foo->b()[0]);
+var_dump($foo->b()[1]);
+var_dump($foo->b()[2]);
+
+?>
+--EXPECTF--
+int(2)
+array(1) {
+  [0]=>
+  int(1)
+}
+
+Notice: Undefined offset: %d in %s on line %d
+NULL


Property changes on: php/php-src/trunk/Zend/tests/dereference_013.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Added: php/php-src/trunk/Zend/tests/dereference_014.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/dereference_014.phpt                           
(rev 0)
+++ php/php-src/trunk/Zend/tests/dereference_014.phpt   2010-06-12 16:11:10 UTC 
(rev 300409)
@@ -0,0 +1,34 @@
+--TEST--
+Trying to create an object from dereferencing uninitialized variable
+--FILE--
+<?php
+
+error_reporting(E_ALL);
+
+class foo {
+       public $x;
+       static public $y;
+
+       public function a() {
+               return $this->x;
+       }
+
+       static public function b() {
+               return self::$y;
+       }
+}
+
+$foo = new foo;
+$h = $foo->a()[0]->a;
+var_dump($h);
+
+$h = foo::b()[1]->b;
+var_dump($h);
+
+?>
+--EXPECTF--
+Notice: Trying to get property of non-object in %s on line %d
+NULL
+
+Notice: Trying to get property of non-object in %s on line %d
+NULL


Property changes on: php/php-src/trunk/Zend/tests/dereference_014.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/trunk/Zend/zend_language_parser.y
===================================================================
--- php/php-src/trunk/Zend/zend_language_parser.y       2010-06-12 16:07:20 UTC 
(rev 300408)
+++ php/php-src/trunk/Zend/zend_language_parser.y       2010-06-12 16:11:10 UTC 
(rev 300409)
@@ -943,7 +943,7 @@

 method_or_not:
                method                                          { $$ = $1; 
zend_do_push_object(&$$ TSRMLS_CC); $$.EA = ZEND_PARSED_METHOD_CALL; }
-       |       array_method_dereference        { $$ = $1; 
zend_do_push_object(&$$ TSRMLS_CC); $$.EA = ZEND_PARSED_METHOD_CALL; }
+       |       array_method_dereference        { $$ = $1; 
zend_do_push_object(&$$ TSRMLS_CC); }
        |       /* empty */ { $$.EA = ZEND_PARSED_MEMBER; }
 ;


-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to