Hi Nikita,

I would suggest using the proposal for the by-value case and sticking with the 
current behavior for the by-reference case as you suggested. Granted, we then 
cannot remove the internal pointer all together, but we would just use it for 
the less common by-reference case as well as for the legacy reset/next 
functions, of course. This would still improve most for-each traversals. At 
least we then wouldn't have to find a replacement solution for 
rest/prev/next/end. Moreover we can then move the internal position pointer out 
of the hashtable structure into zend_array because it is only used for userland 
arrays, not other hash tables (such as object properties or internal structures 
that build upon the hashtable struct).

Thanks,

Ben

========== Original ==========
From: Nikita Popov <nikita....@gmail.com>
To: Benjamin Coutu <ben.co...@zeyos.com>
Date: Thu, 22 Jan 2015 10:53:19 +0100
Subject: Re: [PHP-DEV] Improvements to for-each implementation

Doing this was the idea I had in mind as well, i.e. change the semantics of
foreach to say that it will always work on a copy for by-value iteration
(which ironically avoids having to actually copy it). Note that this will
differ from the current behavior in a number of ways. In particular it
means that changes to arrays that were references prior to iteration will
not influence the iteration.

The real question is what we should do in the by-reference case. Given that
we need to acquire references to elements of the original array we can't
reasonably work with copy-semantics (at least I don't see how). So would we
just stick with the previous behavior (using the hash position hack) for
that?

Nikita


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

Reply via email to