Bug #16227 Updated: Wrong zval allocation? while(list() = each()) behavior is inconsistent due to th
| From: | yohgaki@php.net | Date: | Sat, 23 Mar 2002 11:39:15 +0000 |
| Subject: | Bug #16227 Updated: Wrong zval allocation? while(list() = each()) behavior is inconsistent due to th | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-3191@lists.php.net to get a copy of this message | ||
ID: 16227
Updated by: yohgaki@php.net
Reported By: php.net@alienbill.com
-Status: Bogus
+Status: Analyzed
Bug Type: Arrays related
-Operating System: Tru64 UNIX 5.0a
+Operating System: ANY
-PHP Version: 4.0.6
+PHP Version: 4.2.0-dev
Assigned To: hholzgra
New Comment:
Derick,
foreach() does not solve this bug.
ZendEngine is resetting internal hash position by an
assignment. Therefore, foreach() does does not work.
i.e. The issue is _not_ "Not resetting hash posisiton", but
"Incorrectly resetting RVALUE hash position by an assignment".
This is serious flaw in language.
Previous Comments:
------------------------------------------------------------------------
[2002-03-23 06:01:49] derick@php.net
Not a bug, but intended behavior. Use foreach().
Derick
------------------------------------------------------------------------
[2002-03-22 20:55:39] yohgaki@php.net
BTW, I haven't check the exact behavior.
Zend might be resetting internal hash position due to the
assignment.
------------------------------------------------------------------------
[2002-03-22 20:48:18] yohgaki@php.net
I forgot about reset() since behavior is inconsistent :(
Anyway, this is still not right.
Zend engine is allocating new zval for $insidearray while
it should allocate $placeholder.
---
$placeholder = $insidearray;
while(list(,$innerval) = each($insidearray)){
print "inloop $innerval for $outerval<br>";
---
This bug causes nasty bug in script.
If it is not easy to fix, may be we should suspend this bug?
------------------------------------------------------------------------
[2002-03-22 20:29:04] hholzgra@php.net
ever heard of reset() ?
------------------------------------------------------------------------
[2002-03-22 20:19:56] yohgaki@php.net
Thanks for reporting. I verified with 4.2.0-dev & 4.0.6.
This is _VERY_ bad bug...
[root@dev etc]# php
<?php
$outsidearray = array("key1","key2");
$insidearray = array("0","1");
while(list(,$outerval) = each($outsidearray)){
//$placeholder = $insidearray;
while(list(,$innerval) = each($insidearray)){
print "inloop $innerval for $outerval<br>";
}
}
?>
inloop 0 for key1<br>
inloop 1 for key1<br>
[root@dev etc]# php
<?php
$outsidearray = array("key1","key2");
$insidearray = array("0","1");
while(list(,$outerval) = each($outsidearray)){
$placeholder = $insidearray;
while(list(,$innerval) = each($insidearray)){
print "inloop $innerval for $outerval<br>";
}
}
?>
inloop 0 for key1<br>
inloop 1 for key1<br>
inloop 0 for key2<br>
inloop 1 for key2<br>
[root@dev etc]#
[root@dev etc]# php -v
4.2.0-dev
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/16227
--
Edit this bug report at http://bugs.php.net/?id=16227&edit=1