[squeak-dev] Decompilation problem

Eliot Miranda eliot.miranda at gmail.com
Fri Apr 13 01:08:01 UTC 2012


On Thu, Apr 12, 2012 at 5:51 PM, Bert Freudenberg <bert at freudenbergs.de>wrote:

>
> On 12.04.2012, at 16:40, Eliot Miranda wrote:
>
> Hi Yoshiki,
>
> On Thu, Apr 12, 2012 at 4:27 PM, Yoshiki Ohshima <Yoshiki.Ohshima at acm.org>wrote:
>
>> At Thu, 12 Apr 2012 16:08:53 -0700,
>> Eliot Miranda wrote:
>> >
>> > Hi Yoshiki,
>> >
>> >     what's the image you're using, or at least what is it derived from?
>>  Also, what's the result of (OMeta2 >> #token) symbolic ?
>>
>> The image is one started from "Squeak4.3alpha-11481" and updated by
>> pressing the "update code from server" button.  The result of
>> #symbolic is like this:
>>
>> 37 <71> pushConstant: true
>> 38 <AC 0F> jumpFalse: 55
>> 40 <70> self
>> 41 <21> pushConstant: #anything
>> 42 <E0> send: apply:
>> 43 <68> popIntoTemp: 0
>> 44 <70> self
>> 45 <22> pushConstant: #spaces
>> 46 <E0> send: apply:
>> 47 <87> pop
>> 48 <70> self
>> 49 <24> pushConstant: #seq
>> 50 <10> pushTemp: 0
>> 51 <8A 81> pop 1 into (Array new: 1)
>> 53 <F3> send: apply:withArgs:
>> 54 <90> jumpTo: 56
>> 55 <73> pushConstant: nil
>> 56 <7C> returnTop
>>
>> -- Yoshiki
>>
>
> I can't reproduce this.  When I debug the following doit (which mimics
> your code) and inspect the context  I get a valid decompilation:
>
> | t |
>        ^ true
>                ifTrue: [t := self apply: #anything.
>                        self apply: #spaces.
>                        self apply: #seq withArgs: {t}]
>
> the same code:
>
> method symbolic
> '37 <71> pushConstant: true
> 38 <AC 0F> jumpFalse: 55
> 40 <70> self
> 41 <21> pushConstant: #anything
> 42 <E0> send: apply:
> 43 <68> popIntoTemp: 0
> 44 <70> self
> 45 <22> pushConstant: #spaces
> 46 <E0> send: apply:
> 47 <87> pop
> 48 <70> self
> 49 <24> pushConstant: #seq
> 50 <10> pushTemp: 0
> 51 <8A 81> pop 1 into (Array new: 1)
> 53 <F3> send: apply:withArgs:
> 54 <90> jumpTo: 56
> 55 <73> pushConstant: nil
> 56 <7C> returnTop
> '
>
> and decompileWithTemps returns something correct:
>
> method decompileWithTemps
> DoIt
> | t |
> ^ true
> ifTrue: [t := self apply: #anything.
>  self apply: #spaces.
> self apply: #seq withArgs: {t}]
>
> So has OMeta patched some old bug in the decompiler which is now obsoleted
> by some other fix?
>
>
> The difference appears to be that the OMeta compiler
> answers '(t)[(t)[(t)]]' for the schematicTempNamesString. The regular
> compiler answers 't'. This trips the Decompiler over.
>

Bingo.  OMeta looks to be computing the schematic temps for the method
before inlining and closure analysis, in that the ifTrue: argument is an
actual block according to that string.  Good catch!


>
> - Bert -
>
>
>
>
>
>


-- 
best,
Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20120412/afed76dd/attachment.htm


More information about the Squeak-dev mailing list