[Vm-dev] (Squeak) Compiler bug?

Florin Mateoc florin.mateoc at gmail.com
Tue Jan 10 05:19:16 UTC 2023


To be more precise, I do agree with you that the bug has nothing to do with
Compiler-eem.483, and it is rather related to the perturbations that the
new bytecode set and the full blocks have introduced into the delicate
machinery of the decompiler.
I am pretty sure that, in a parallel universe, someone wrote or generated a
method that is triggering the same bug without the compiler changes, we
have just not stumbled upon it yet :)

On Mon, Jan 9, 2023 at 8:45 PM Florin Mateoc <florin.mateoc at gmail.com>
wrote:

> It's weirder than that.
> I don't think Compiler-eem.483 itself introduces any bug, but the changes
> it introduces are enough to make the bug appear.
> Compile with SistaV1 bytecode set and full blocks in the stable 6.0
> release (which is prior to Compiler-eem.483) and decompilation works
> there as well
>
>
> On Mon, Jan 9, 2023 at 7:53 PM Eliot Miranda <eliot.miranda at gmail.com>
> wrote:
>
>>
>> BTW, it's not to do with Compiler-eem.483; it's to do with the SistaV1
>> bytecode set and full blocks.  Compile with the old bytecode set and
>> embedded blocks and decompilation works.
>>
>> On Mon, Jan 9, 2023 at 10:45 AM Eliot Miranda <eliot.miranda at gmail.com>
>> wrote:
>>
>>> Hi Florin,
>>>
>>>     I've found the issue, which is an infinite loop in the Decompiler
>>> for your undecompilable version.  Strangely enough it has nothing to do
>>> with the code you modify. It has to do with the middle ifTrue: of the three
>>> at the end of the final block:
>>>
>>>                    mm1 eventHandler
>>>                         ifNotNil: [(morphs includesAllOf: mm1
>>> eventHandler allRecipients)
>>>                                 ifTrue: [mm1 eventHandler: nil]].
>>>
>>>
>>> *mm1 isMorphicModel                        ifTrue: [mm1 model
>>> isMorphicModel                                ifTrue: [mm1 model
>>> breakDependents]].*
>>>                     mm1 isTextMorph
>>>                         ifTrue: [mm1 setContainer: nil]]].
>>>
>>> I can fix it for this one method, but not without breaking decompilation
>>> of about 40 other methods.  So I need to understand it better.  Give me a
>>> few days.  I've called on a higher power (the original author is Dan
>>> himself). So hopefully we'll get this sorted very soon.
>>>
>>> On Sun, Jan 8, 2023 at 7:01 PM Florin Mateoc <florin.mateoc at gmail.com>
>>> wrote:
>>>
>>>>
>>>> Hi,
>>>>
>>>> Happy New Year everybody!
>>>>
>>>> I hope you will forgive my transgression, I know this is not about the
>>>> VM, it is about the bytecode compiler, but I am only subscribed to this
>>>> list, and the Squeak compiler is somewhere in between.
>>>>
>>>> I have recently stumbled upon a regression introduced by
>>>> Compiler-eem.483
>>>> One of my generated (transformed) methods is apparently valid Smalltalk
>>>> - it can still be compiled - but it cannot be decompiled anymore. I am not
>>>> sure if this is a compiler bug, or a latent decompiler bug exposed by the
>>>> changes in Compiler-eem.483
>>>>
>>>> My method is below, it is a transformed variant of
>>>> NativeImageSegment>>findRogueRootsPrep
>>>>
>>>> The bug is somehow caused by the literal #Marker. I have started at the
>>>> bytecodes and they look ok to me, but the decompiler enters an (apparently
>>>> unrelated) infinite loop. It is also not just about the literal itself or
>>>> the immediate surrounding code, the method needs to be big/complex enough
>>>> (over a certain number of literals?) to trigger the bug.
>>>>
>>>>
>>>> findRogueRootsPrep1
>>>> "Part of the tool to track down unwanted pointers into the segment.
>>>> Break all owner pointers in submorphs, scripts, and viewers in flaps."
>>>> | wld players morphs |
>>>> wld := arrayOfRoots detect: [:obj | obj isMorph and: [obj
>>>> isWorldMorph]] ifNone: [].
>>>> wld == nil ifTrue: [
>>>>   (wld := arrayOfRoots
>>>>     detect: [:obj1 | obj1 isMorph]
>>>>     ifNone: [#Marker]
>>>>   ) == #Marker ifTrue: [
>>>>     ^ self error: 'can''t find a root morph']].
>>>> morphs := IdentitySet new: 400.
>>>> wld allMorphsAndBookPagesInto: morphs.
>>>> players := wld presenter allExtantPlayers. "just the cached list"
>>>> players do: [:pp | | scriptEditors |
>>>>   scriptEditors := pp class tileScriptNames collect: [:nn | pp
>>>> scriptEditorFor: nn].
>>>>   scriptEditors do: [:se | morphs addAll: se allMorphs]].
>>>> wld submorphs do: [:mm | "non showing flaps"
>>>>   (mm isKindOf: FlapTab) ifTrue: [
>>>>     mm referent allMorphsAndBookPagesInto: morphs]].
>>>> morphs do: [:mm1 | "break the back pointers"
>>>>   mm1 isInMemory ifTrue: [
>>>>     (mm1 respondsTo: #target) ifTrue: [
>>>>       mm1 nearestOwnerThat: [:ow | | zzzTemp |
>>>>         ow == mm1 target ifTrue: [
>>>>           mm1 target: nil.
>>>>           zzzTemp := true
>>>>         ] ifFalse: [
>>>>           zzzTemp := false].
>>>>         zzzTemp]].
>>>>     (mm1 respondsTo: #arguments) ifTrue: [
>>>>       mm1 arguments do: [:arg |
>>>>         arg == nil ifFalse: [
>>>>           mm1 nearestOwnerThat: [:ow1 | | zzzTemp1 |
>>>>             ow1 == arg ifTrue: [
>>>>               mm1 arguments at: (mm1 arguments indexOf: arg) put: nil.
>>>>               zzzTemp1 := true
>>>>             ] ifFalse: [
>>>>               zzzTemp1 := false].
>>>>             zzzTemp1]]]].
>>>>     mm1 eventHandler == nil ifFalse: ["recipients point back up"
>>>>       (morphs includesAllOf: mm1 eventHandler allRecipients) ifTrue: [
>>>>         mm1 eventHandler: nil]].
>>>>     "temporary, until using Model for PartsBin"
>>>>     mm1 isMorphicModel ifTrue: [
>>>>       mm1 model isMorphicModel ifTrue: [
>>>>         mm1 model breakDependents]].
>>>>     mm1 isTextMorph ifTrue: [
>>>>       mm1 setContainer: nil]]].
>>>> (Smalltalk includesKey: #Owners) ifTrue: [
>>>>   Smalltalk at: #Owners put: nil].
>>>> "in case findOwnerMap: is commented out"
>>>> "self findOwnerMap: morphs."
>>>> morphs do: [:mm2 | "break the back pointers"
>>>>   mm2 isInMemory ifTrue: [
>>>>     mm2 privateOwner: nil]]
>>>>
>>>>
>>>> Florin
>>>>
>>>
>>>
>>> --
>>> _,,,^..^,,,_
>>> best, Eliot
>>>
>>
>>
>> --
>> _,,,^..^,,,_
>> best, Eliot
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20230110/47642d6a/attachment-0001.html>


More information about the Vm-dev mailing list