[squeak-dev] [Vm-dev] (Squeak) Compiler bug?

Florin Mateoc florin.mateoc at gmail.com
Thu Jan 12 17:07:15 UTC 2023


Thanks, moving to the correct list :)

On Thu, Jan 12, 2023 at 11:47 AM Eliot Miranda <eliot.miranda at gmail.com>
wrote:

>
> Hi Florin,  I’ll take a look asap but in return I must ask you to
> subscribe to squeak-dev and use vm-dev for its intended purpose :-)
>
> _,,,^..^,,,_ (phone)
>
> On Jan 11, 2023, at 4:38 PM, Florin Mateoc <florin.mateoc at gmail.com>
> wrote:
>
> 
> Hi Eliot,
>
> Thank you for fixing the decompiler.
>
> And now for an actual compiler bug :)
> It is not critical, but it's a bug nonetheless: the parser "swallows"
> comments for the last statement in blocks where the statement is not a
> return and it ends with a period.
> In these situations, the parser ends up calling addComment twice on the
> same parseNode, nilling out the comment that was put there in the first
> call.
>
> As an example:
>
> test
> true ifTrue: [self yourself. "a comment"]
>
> or, even simpler:
>
> test
> self yourself. "a comment"
>
> All the best,
> Florin
>
>
>
> On Tue, Jan 10, 2023 at 12:19 AM Florin Mateoc <florin.mateoc at gmail.com>
> wrote:
>
>> 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/squeak-dev/attachments/20230112/d8feee6d/attachment.html>


More information about the Squeak-dev mailing list