Yes, abstracting such additional checks through something like 
zend_hash_duplicate() would make sense, but IMHO it should be named 
differently, e.g. zend_hash_copy_lazy. So to be analogous to 
zend_string_copy(), but not to be confused with the existing zend_hash_copy().

By the way: array_pad() in L4320, array_unique() in L4476 and array_diff() in 
L5415 also return the array without those kind of checks (analougous to what I 
have proposed for the array_slice() case). These existing bugs would have to be 
fixed as well.

- Ben -

========== Original ==========
From: Sara Golemon <poll...@php.net>
To: Nikita Popov <nikita....@gmail.com>
Date: Fri, 27 Oct 2017 18:34:15 +0200
Subject: Re: [PHP-DEV] Apply substr() optimization to array_slice()

> 
> 
> On Fri, Oct 27, 2017 at 12:10 PM, Nikita Popov <nikita....@gmail.com> wrote:
> > On Fri, Oct 27, 2017 at 4:16 PM, Sara Golemon <poll...@php.net> wrote:
> >>
> >> On Fri, Oct 27, 2017 at 8:12 AM, Benjamin Coutu <ben.co...@zeyos.com>
> >> wrote:
> >> > Now, array_slice() could be optimized similarly, but currently
> >> > (unless the resulting array is expected to be empty) we always
> >> > create a new array no matter if we actually have to.
> >> >
> >> Pushed, with an additional escape hatch for vector-like arrays (which
> >> are implicitly like preserve_keys).  In the future though, please use
> >> the PR process. Thanks.
> >
> >
> > Unfortunately these optimizations are subtly incorrect in the current form,
> > because arrays have a bunch of additional hidden state. See
> > https://bugs.php.net/bug.php?id=75433 for a (not yet fixed) issue that
> > resulted from similar optimizations in 7.2. We'll have to review all the
> > places where we apply optimizations like these and make sure that we're not
> > introducing incorrect behavior wrt the next free element or internal array
> > pointer.
> >
> It took awhile to unwind the repro case given in the bug report, but
> this seems to be a simpler example:
> https://3v4l.org/rqphD
> 
> Basically, that next insert index for the output of array_values()
> should be reset, and with the optimization it's not.
> 
> For array_values() the quick and dirty fix is adding "&& nextIndex ==
> num_elements" psuedocode.  In the case of array_slice, the same will
> be true, so I agree we should be careful about applying such
> optimizations.
> 
> I'll clean up these uses now, and would suggest something like:
> 
> zend_array* zend_hash_duplicate(zend_array* input, zend_bool
> preserve_keys); type API which can be a certral place for making that
> kind of short-circuit versus slow-copy decision when called from
> places like array_values() and array_slice().
> 
> -Sara


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

Reply via email to