[squeak-dev]
Tests.Compiler.DecompilerTests.testDecompilerInClassesMNtoMZ
Levente Uzonyi
leves at elte.hu
Fri Apr 12 19:03:09 UTC 2013
On Fri, 12 Apr 2013, Nicolas Cellier wrote:
> Once you recompileAll, they do not fail anymore.
Digging into the code a bit I found out that the pushTemp: bytecode is a
hack to duplicate the value which will be assigned.
The generated code could be improved if Binding >> #value: would
always return its argument. In that case the bytecode could follow the
assignment chain directly:
78 <25> pushConstant: ##ActiveWorld
79 <26> pushConstant: ##ActiveHand
80 <27> pushConstant: ##ActiveEvent
81 <73> pushConstant: nil
82 <CA> send: value:
83 <CA> send: value:
84 <CA> send: value:
85 <87> pop
It doesn't seem to be a simple change though.
Levente
> Still the same problem, Compiler recompileAll will leave unbound CompiledMethod here and there.
>
>
> 2013/4/12 Levente Uzonyi <leves at elte.hu>
> On Fri, 12 Apr 2013, Frank Shearar wrote:
>
> This, and the other decompiler test failure, happens because of the
> recent chained assignment work:
>
> original snippet:
>
> ActiveWorld := ActiveHand := ActiveEvent := nil.
>
> decompiled version of sameL
>
> ActiveEvent := nil.
> ActiveHand := nil.
> ActiveWorld := nil.
>
> How to fix?
>
>
> The only method with this assignment chain in my image is MorphicProject
> #saveState . The bytecodes for this line are:
>
>
> 73 <73> pushConstant: nil
> 74 <81 C5> storeIntoLit: ActiveEvent
> 76 <81 C6> storeIntoLit: ActiveHand
> 78 <82 C7> popIntoLit: ActiveWorld
>
> And the decompiler can reproduce the original code.
>
> If I recompile this method (which should have been done due to the Environments changes, but for some reason it hasn't happened yet), then there's a bug in the compiler. The bytecodes will be:
>
> 78 <25> pushConstant: ##ActiveWorld
> 79 <73> pushConstant: nil
> 80 <27> pushConstant: ##ActiveEvent
> 81 <80 41> pushTemp: 1
> 83 <CA> send: value:
> 84 <87> pop
> 85 <26> pushConstant: ##ActiveHand
> 86 <80 41> pushTemp: 1
> 88 <CA> send: value:
> 89 <87> pop
> 90 <CA> send: value:
> 91 <87> pop
>
> Which are obviously wrong.
>
> Creating a new method with just a simple assignment chain:
>
> foo
>
> GlobalA := GlobalB := $a
>
> generetes:
>
> 25 <20> pushConstant: ##GlobalA
> 26 <22> pushConstant: $a
> 27 <21> pushConstant: ##GlobalB
> 28 <80 41> pushTemp: 1
> 30 <CA> send: value:
> 31 <87> pop
> 32 <CA> send: value:
> 33 <87> pop
> 34 <78> returnSelf
>
> Which still has the pushTemp: 1. But this method has 0 temporaries, so it's a compiler bug. I wonder how the decompiler can decompile anything
> meaningful from this, and how the VM doesn't crash.
>
>
> Levente
>
>
> frank
>
>
>
>
>
>
More information about the Squeak-dev
mailing list
|