Matt Wilmas wrote:
> Hi (Dmitry?),
>
> See Bug #33282 -- I saw it in the Bug Summary; don't know if there are other
> related ones... Same applies to foreach ($arr ... &$v) which is where I
> noticed it last week with var_dump($arr). All elements that WERE referenced
> but aren't anymore still have is_ref=1 (when refcount=1). Only the last
> referenced element should be a reference (unless the others were to begin
> with). unset()'ing the reference variable removes the reference from the
> last element. Example:
>
> $a = array(1, 2, 3);
> $r = &$a[0];
> $r = &$a[1];
> $r = &$a[2];
> var_dump($a);
>
> array(3) {
> [0]=>
> &int(1)
> [1]=>
> &int(2)
> [2]=>
> &int(3) // unset($r) will take care of this one
> }
>
> The reference (&) should no longer be on the first 2 elements, right?
> Setting is_ref=0 when refcount=1 in zend_assign_to_variable_reference()
> fixes it. I assume it won't cause other problems since the same thing is
> done in zval_ptr_dtor(). :-)
>
This looks like it may actually fix a lot of previously bogus'ed bug reports?
>
> ------------------------------------------------------------------------
>
> Index: zend_execute.c
> ===================================================================
> RCS file: /repository/ZendEngine2/zend_execute.c,v
> retrieving revision 1.752
> diff -u -r1.752 zend_execute.c
> --- zend_execute.c 2 Oct 2006 11:05:02 -0000 1.752
> +++ zend_execute.c 7 Nov 2006 05:24:38 -0000
> @@ -438,6 +438,8 @@
> if (variable_ptr->refcount==0) {
> zendi_zval_dtor(*variable_ptr);
> FREE_ZVAL(variable_ptr);
> + } else if (variable_ptr->refcount == 1) {
> + variable_ptr->is_ref = 0;
> }
> } else if (!variable_ptr->is_ref) {
> if (variable_ptr_ptr == value_ptr_ptr) {
>
>
> ------------------------------------------------------------------------
>
> Index: zend_execute.c
> ===================================================================
> RCS file: /repository/ZendEngine2/zend_execute.c,v
> retrieving revision 1.716.2.12.2.12
> diff -u -r1.716.2.12.2.12 zend_execute.c
> --- zend_execute.c 2 Oct 2006 11:09:52 -0000 1.716.2.12.2.12
> +++ zend_execute.c 7 Nov 2006 05:24:40 -0000
> @@ -415,6 +415,8 @@
> if (variable_ptr->refcount==0) {
> zendi_zval_dtor(*variable_ptr);
> FREE_ZVAL(variable_ptr);
> + } else if (variable_ptr->refcount == 1) {
> + variable_ptr->is_ref = 0;
> }
> } else if (!variable_ptr->is_ref) {
> if (variable_ptr_ptr == value_ptr_ptr) {
--
Michael
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php