On Fri, May 28, 2021 at 9:00 PM Mark Randall <marand...@php.net> wrote:

> On 28/05/2021 15:31, Nikita Popov wrote:
> > This is a more complex case. In this case the compiler doesn't know in
> > advance whether the argument is passed by value or by reference. What
> > happens here is:
>
>
> I'm trying to wrap my head around this, but if a function arg can handle
> this, does something internal to the engine preclude fetching in write
> context, after already fetching in read context, other than performance?
>
> So can the initial fetch be performed with FETCH_DIM_R, handling the
> object case + any other scalars, and if and only if the value is an
> array and operating on what would traditionally be a by-ref, repeating
> the previous lookup with FETCH_DIM_W?
>

This is theoretically possible, in that this is exactly how $a[$b][$c] ??=
$d is implemented. Everything is first fetched as FETCH_DIM_IS and then
again as FETCH_DIM_W if an assignment is necessary. However, this does
require emitting both fetch sequences, with one guarded by a branch,
together with temporary copies to allow re-fetching without re-evaluating
side-effecting operands. Of course, it also has fun interactions with magic
ArrayAccess/__get, in which case both fetches may produce different
results. All this is something we can live with for the ??= operator, but
not for every single method call.

Regards,
Nikita

Reply via email to