Hi Michael, I think the patch is correct. Really you can just call zval_ptr_dtor() to make the magic in one place.
Thanks. Dmitry. > -----Original Message----- > From: Michael Wallner [mailto:[EMAIL PROTECTED] > Sent: Tuesday, November 07, 2006 2:08 PM > To: internals@lists.php.net; Dmitry Stogov > Subject: [PHP-DEV] Re: [PATCH] =& doesn't remove "old" > references like unset() > > > 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 > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php