On Jun 27, 2013, at 5:17 PM, Levente Uzonyi <[email protected]> wrote:

> On Thu, 27 Jun 2013, Marcus Denker wrote:
> 
>> 
>> On Jun 27, 2013, at 8:16 AM, Clément Bera <[email protected]> wrote:
>>> 
>>> In Pharo 3 we will support conditional optimized messages ( #ifTrue:, 
>>> #ifFalse:, #ifTrue:ifFalse: and #ifFalse:ifTrue: ) sent on non boolean 
>>> receiver. However, this feature will be slow, so one should not use it too 
>>> much (as #become:, #isKindOf:, ...). Basically Opal compiles on the fly 
>>> without optimizing it the conditional messageNode as a DoIt, run it, and 
>>> jump in the context to the pc corresponding to the next ast node. We don't 
>>> generate extra bytecode as you suggested, because it will grow the size of 
>>> the image a lot and slow down the system with extra conditions.
>>> 
>> 
>> It's actually not a lot of code. We need to debug/fix it for all the cases, 
>> though, this might add some more complexity:
> 
> So Opal generates the same code as the old compiler. It's just a different 
> implementation of #mustBeBoolean, what makes the difference.
> IIUC whenever the receiver of the optimized conditional message is not true 
> or false, the code is decompiled, then a new CompiledMethod is created 
> without the optimization, it's injected onto the stack, and the execution is 
> continued from before where the jumpTrue: or jumpFalse: was in the original 
> method.
> 
> As Clément wrote, this is rather slow. Maybe even too slow to be useful. A 
> possible improvement would be to permanently replace the original compiled 
> method with the deoptimized one, since the receiver is likely to be not one 
> of the unique Boolean instances during futher executions of the method. This 
> way the decompilation has to be done only once.
> Though these kind of code mutations behind the scene can cause some headache 
> for someone who's trying to optimize the code.

The question is if it makes sense to invest in these things on top of the 
current infrastructure.

        Marcus

Reply via email to