On Thu, Aug 14, 2014 at 12:19 PM, Rowan Collins <rowan.coll...@gmail.com> wrote:
> Julien Pauli wrote (on 14/08/2014):
>
>> On Thu, Aug 14, 2014 at 8:26 AM, Tjerk Meesters
>> <tjerk.meest...@gmail.com> wrote:
>>>
>>> Hi internals,
>>>
>>> I was sifting through the bucket o’ bugs and found these two related
>>> issues:
>>> https://bugs.php.net/bug.php?id=67829
>>> https://bugs.php.net/bug.php?id=54162 (closed)
>>>
>>> They concern the behaviour of the engine when a class defines no
>>> constructor or if the class to be instantiated doesn’t exist, which can be
>>> seen here: http://3v4l.org/jOQY0
>>>
>>> This is obviously a design decision, but doesn’t seem to have a mention
>>> in the documentation nor the spec (I couldn’t find it under the ‘new’
>>> operator).
>>>
>>> I can add a paragraph in the documentation for it; the question is
>>> whether it should also be added to the spec, seeing how HHVM and PHP behave
>>> differently in this respect? It could be added as implementation dependent
>>> behaviour I suppose?
>>
>> This is a known behavior which is part of the VM.
>> It is designed at http://lxr.php.net/xref/PHP_5_5/Zend/zend_vm_def.h#3383
>>
>> I guess its an optimisation that prevents the compiler from compiling
>> a ZEND_DO_FCALL for constructors, which optimizes a bit the VM path
>> for object construction.
>> Dmitry should have more informations.
>>
>> I'm +1 for a documentation or spec mention.
>>
>>
>> Julien.Pauli
>>
>
> When it came up on StackOverflow chat, it was cheekily dubbed "Rasmus
> evaluation", because nobody could find any theory matching that particular
> optimisation: https://chat.stackoverflow.com/transcript/11/2013/9/28/14-17
>
> I'm still not entirely sure it's a good idea, and can't imagine how anyone
> would rely on it (if you have a look at that trasnscript, you'll find some
> fun attempts at finding an esoteric use). Is it really that big an
> optimisation that it's worth such surprising behaviour?

Well, in fact the INIT_FCALL and DO_FCALL are generated by the
compiler, but the executor optimizes by jumping over all the opline of
the constructor if this latter is not declared at compile time.
As a side effect, if the argument is to be IS_VAR or IS_CV , it won't
be interpreted, thus this behavior.

It may be possible to interpret the argument, but I think it will need
new OPCodes, like ZEND_NEW_WITH_CTOR and ZEND_NEW_WITHOUT_CTOR , and a
compiler patch to support those.
This may be thought for PHP7, and I think will benefit from the
ast-compiler RFC if its voted.

Dmitry or Nikita could bring more information about this as well.

Julien.Pauli

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

Reply via email to