From eb0ba9068d8b82b7059868469265c6d8d9aa4d7f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 12 Jun 2010 16:11:10 +0000 Subject: [PATCH] - Allow write context on array dereferencing from method return - New tests --- Zend/tests/dereference_007.phpt | 17 +++++++++- Zend/tests/dereference_012.phpt | 56 +++++++++++++++++++++++++++++++++ Zend/tests/dereference_013.phpt | 38 ++++++++++++++++++++++ Zend/tests/dereference_014.phpt | 34 ++++++++++++++++++++ Zend/zend_language_parser.y | 2 +- 5 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 Zend/tests/dereference_012.phpt create mode 100644 Zend/tests/dereference_013.phpt create mode 100644 Zend/tests/dereference_014.phpt diff --git a/Zend/tests/dereference_007.phpt b/Zend/tests/dereference_007.phpt index 05eca6fb480..2f7d66fd2e6 100644 --- a/Zend/tests/dereference_007.phpt +++ b/Zend/tests/dereference_007.phpt @@ -11,12 +11,27 @@ class foo { 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 diff --git a/Zend/tests/dereference_012.phpt b/Zend/tests/dereference_012.phpt new file mode 100644 index 00000000000..f3ba774f064 --- /dev/null +++ b/Zend/tests/dereference_012.phpt @@ -0,0 +1,56 @@ +--TEST-- +Testing array dereferencing on return of a method with and without reference +--FILE-- +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) +} diff --git a/Zend/tests/dereference_013.phpt b/Zend/tests/dereference_013.phpt new file mode 100644 index 00000000000..cfd89e71b53 --- /dev/null +++ b/Zend/tests/dereference_013.phpt @@ -0,0 +1,38 @@ +--TEST-- +Testing array dereferencing on array returned from __call method +--FILE-- +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 diff --git a/Zend/tests/dereference_014.phpt b/Zend/tests/dereference_014.phpt new file mode 100644 index 00000000000..62dffd36980 --- /dev/null +++ b/Zend/tests/dereference_014.phpt @@ -0,0 +1,34 @@ +--TEST-- +Trying to create an object from dereferencing uninitialized variable +--FILE-- +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 diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index ddda7f3aa3f..5e448462a0b 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -943,7 +943,7 @@ method: 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; } ;