Huqiu Liao wrote on 31/03/2016 17:47:
Hi, internals,

I have a question about Assign By Reference and I posted on StackOverflow,
I'd like to know the reason behind it, and I did not get any this kind of
answer, can anyone give me some clues.

---

We have a piece of simple code:

1    <?php
2    $i = 2;
3    $j = &$i;
4    echo (++$i) + (++$i);
On PHP5, it outputs 8, because:

$i is a reference, when we increase $i by ++i, it will change the zval
rather than make a copy, so line 4 will be 4 + 4 = 8. This is Assign By
Reference.

To me, that sounds like a fixed bug. It's noteworthy in the 3v4l results that HHVM also gives 7 as the answer, and I can't see any logical reason for the answer to be 8 - regardless of execution order, the result of the two calls to ++$i should never be the same.

It would be interesting to see the VLD dump in PHP 5, with and without reference, because looking at the PHP 7 one, it's clear that the two increments result in two temp vars so it shouldn't make any difference what type of zval was given as input:

4 2 PRE_INC $2 !0 # !0 is compiled $i, $2 is a new value returned 3 PRE_INC $3 !0 # !0 is referenced again, but $3 is unrelated to $2 4 ADD ~4 $2, $3 # the two values are added, with no reference to !0

Maybe in PHP 5 the opcodes are the same, but $2 and $3 somehow end up as references to !0, rather than new zvals, as though the code were:

$i = 2;
$i++; $temp1 =& $i;
$i++; $temp2 =& $i;
echo $temp1 + $temp2;

rather than, as seems logical to me, HHVM, and PHP7:

$i = 2;
$i++; $temp1 = $i;
$i++; $temp2 = $i;
echo $temp1 + $temp2;

Regards,
--
Rowan Collins
[IMSoP]

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to