# [PATCH] =& doesn't remove "old" references like unset()

- Thread: https://externals.io/message/26401
- Original archive: https://news-web.php.net/php.internals/26401
- Started by Matt Wilmas on 2006-11-07T10:52:39+00:00
- Messages: 3
- Reply by email to internals@lists.php.net
- More for agents: search with https://externals.io/search.md?q={query} · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

---

## #26401 — Matt Wilmas — 2006-11-07T10:52:39+00:00

URL: https://externals.io/message/26401#26401

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(). :-)


Thanks,
Matt

---

## #26402 — Michael Wallner — 2006-11-07T11:08:13+00:00

URL: https://externals.io/message/26401#26402 · In reply to: #26401

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

---

## #26403 — Matt Wilmas — 2006-11-07T11:25:50+00:00

URL: https://externals.io/message/26401#26403 · In reply to: #26402

----- Original Message -----
From: "Michael Wallner"
Sent: Tuesday, November 07, 2006

> Matt Wilmas wrote:
> > […]
other
> > […]
referenced
> > […]
begin
> > […]
the
> > […]
is
> > […]
>
> This looks like it may actually fix a lot of previously bogus'ed bug
reports?

Not sure which ones you mean (searching for "reference" returns many bugs,
and I didn't look very thoroughly), but so everyone knows since I mentioned
foreach(), this doesn't change the behavior reported in Bugs #36240, #37410,
#39307, etc...

> --
> Michael

Matt
