On Fri, Aug 30, 2013 at 2:30 AM, Terry Ellison <ellison.te...@gmail.com>wrote:

> On 27/08/13 10:40, Nikita Popov wrote:
>
>> On Sat, Aug 3, 2013 at 8:16 PM, Nikita Popov <nikita....@gmail.com>
>> wrote:
>>
>>  Hi internals!
>>>
>>> Is there any particular reason why we only pass return_value_ptr to
>>> internal functions if they have the ACC_RETURN_REFERENCE flag set?
>>>
>>> Why can't we always provide the retval ptr, even for functions that don't
>>> return by reference? This would allow returning zvals without having to
>>> copy them first (what RETVAL_ZVAL does).
>>>
>>> Motivation for this is the following SO question:
>>> http://stackoverflow.com/q/**17844379/385378<http://stackoverflow.com/q/17844379/385378>
>>>
>>>  Patch for this change can be found here:
>> https://github.com/php/php-**src/pull/420<https://github.com/php/php-src/pull/420>
>>
>> The patch also adds new macros to allow easy use of this feature called
>> RETVAL_ZVAL_FAST/RETURN_ZVAL_**FAST (anyone got a better name?)
>>
>> If no one objects I'll merge this sometime soon.
>>
> +1 Though looking through the ext uses, most functions returning an array
> build it directly in return_value and thus avoid the copy.  I also see that
> you've picked up all of the cases in ext/standard/array.c where these
> macros can be applied.
>
> There's another one in string.c, in PHP_FUNCTION(pathinfo), that could be
> applied as well, though there's little performance gain in avoiding the
> copy of a 4 element string array.
>
> BTW, looking at this pathinfo code, it doesn't do what the documentation
> says it does -- or at least this states that the optional argument if
> present should be _one_ of PATHINFO_DIRNAME, PATHINFO_BASENAME,
> PATHINFO_EXTENSION or PATHINFO_FILENAME. However, if a bitmask is supplied
> then this function returns the element corresponding to the lowest bit
> value rather than an error return, for example:
>
> $ php -r 'echo pathinfo("/tmp/x.fred", PATHINFO_FILENAME|PATHINFO_**
> EXTENSION),"\n";'
> fred
>
> This is a bizarre behaviour.   At a minimum the documentation should
> actually state what the function does. Or do we bother to raise a patch to
> fix this sort of thing, given that returning an empty string (or more
> consistently with other functions, NULL) in this case could create a BC
> break with existing buggy code?
>

This is weird, yes.
It's not the lowest bit value that is returned, but the first element put
in the array (as zend_hash_get_current_data() is used with no HashPosition)
, which is even more confusing.

How to explain that in the documentation ? :|

Julien.Pauli

Reply via email to