60528-64 OpalCompiler recompileAll ==> GLM trait conflict

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

60528-64 OpalCompiler recompileAll ==> GLM trait conflict

Ben Coman
In a fresh 60528-64 image download with PharoLauncher on Ubuntu 16.04...
1. Open Playground
2. Evaluate... OpalCompler recompileAll
3. Try opening Iceberg, Playground or Spotter.
==> Error: A class or trait does not properly resolve a conflict between multiple traits it uses.

System Browser, Test Runner and Monticello are okay.

60528 (32bit) is okay (what is different between 32bit and 64bit?)

60521-64 is broken
60520-64 is okay


cheers -ben

Reply | Threaded
Open this post in threaded view
|

Re: 60528-64 OpalCompiler recompileAll ==> GLM trait conflict

Stephane Ducasse-3
32 bits :)

On Wed, Dec 13, 2017 at 12:41 PM, Ben Coman <[hidden email]> wrote:

> In a fresh 60528-64 image download with PharoLauncher on Ubuntu 16.04...
> 1. Open Playground
> 2. Evaluate... OpalCompler recompileAll
> 3. Try opening Iceberg, Playground or Spotter.
> ==> Error: A class or trait does not properly resolve a conflict between
> multiple traits it uses.
>
> System Browser, Test Runner and Monticello are okay.
>
> 60528 (32bit) is okay (what is different between 32bit and 64bit?)
>
> 60521-64 is broken
> 60520-64 is okay
>
> https://pharo.manuscript.com/f/cases/20867/OpalCompiler-recompileAll-GLM-trait-conflict
>
> cheers -ben
>

Reply | Threaded
Open this post in threaded view
|

Re: 60528-64 OpalCompiler recompileAll ==> GLM trait conflict

Stephane Ducasse-3
Sorry I'm lame....

On Wed, Dec 13, 2017 at 12:49 PM, Stephane Ducasse
<[hidden email]> wrote:

> 32 bits :)
>
> On Wed, Dec 13, 2017 at 12:41 PM, Ben Coman <[hidden email]> wrote:
>> In a fresh 60528-64 image download with PharoLauncher on Ubuntu 16.04...
>> 1. Open Playground
>> 2. Evaluate... OpalCompler recompileAll
>> 3. Try opening Iceberg, Playground or Spotter.
>> ==> Error: A class or trait does not properly resolve a conflict between
>> multiple traits it uses.
>>
>> System Browser, Test Runner and Monticello are okay.
>>
>> 60528 (32bit) is okay (what is different between 32bit and 64bit?)
>>
>> 60521-64 is broken
>> 60520-64 is okay
>>
>> https://pharo.manuscript.com/f/cases/20867/OpalCompiler-recompileAll-GLM-trait-conflict
>>
>> cheers -ben
>>

Reply | Threaded
Open this post in threaded view
|

Re: 60528-64 OpalCompiler recompileAll ==> GLM trait conflict

Ben Coman
In reply to this post by Ben Coman


On 13 December 2017 at 19:41, Ben Coman <[hidden email]> wrote:
In a fresh 60528-64 image download with PharoLauncher on Ubuntu 16.04...
1. Open Playground
2. Evaluate... OpalCompler recompileAll
3. Try opening Iceberg, Playground or Spotter.
==> Error: A class or trait does not properly resolve a conflict between multiple traits it uses.

System Browser, Test Runner and Monticello are okay.

60528 (32bit) is okay (what is different between 32bit and 64bit?)

60521-64 is broken
60520-64 is okay


cheers -ben


I've got to the limit of where I can go with this one, so I'm seeking help. Copied from issue...

Having isolated the build where the issue was introduced,
normally I'd search the mail list for "60521" to find reports like these... 

and try applying the modifications to 60521 
manually to 60520 to see if I can break it.
But 60520 and 60521 reports are missing.

Comparing file dates (http://files.pharo.org/image/60/)....
2017.11.07  60520
2017.11.29  60521
2017.11.29  60522


Issue    Closed        Note
18760  2017.11.29  merged in 60522
20339  2017.11.29  resolved Fix To Include - Monkey was failing - removed the testRenameClassUsingClass
20250  2017.11.28  closed Fixed Upstream
20260  2017.11.28  reopened, originally merged 2017.08.22 
20586  2017.11.23  closed Wont Fix
20709  2017.11.18  merged in ????      (and there is no such Slice in Pharo6Inbox)
20119  2017.11.07  merged in 60520    (pull/492 ??)

applying Slice-20339 on top of 60520 doesn't break  "OpalCompiler recompileAll".
So I'm at a loss how to continue. 
Maybe it was just a momentary glitch :(
and builds > 60520 need to be thrown out and their integrations re-run
with either same or newer build numbers.

So we don't create additional rework, there should be no further integrations to Pharo6, 
so I've tentatively moved priority to "Show. Stopper" (not that that will necessarily have any great effect with development moved to Pharo 7). 

============================================

Putting a halt in CompiledMethod class >> conflictMarker
prior to running "OpalCompiler recompileAll"
stops in...
  GLMBrick(Behaviour)>>#updateMethodDictionarySelector: #innerBounds

where it calls...
  methodDescription effectiveMethod

which is...
  TraitDescription>>#effectiveMethod
    "Return the effective compiled method of this method description." 
    | method |
    method := self providedMethod.
    method isNil ifFalse: [^ method].
    method := self conflictMethod. "<<<<<<<<<"
    method isNil ifFalse: [^ method].
    ^ self requiredMethod.

with ivar...
  .locatedMethods={GLMBrickGeometryTrait>>#innerBounds . 
                  GLMBrickLayoutTrait>>#innerBounds}

and evaluting "self providedMethod"...
  TraitMethodDescription>>#providedLocatedMethod
    | locatedMethod aLocatedMethod refOrigin |
    locatedMethod := nil.
    self locatedMethods ifEmpty: [ ^ nil].
    self locatedMethods size > 1
      ifTrue: [ 
        aLocatedMethod := self locatedMethods anyOne.
        refOrigin := (aLocatedMethod methodClass >> aLocatedMethod selector) origin.
        (self locatedMethods allSatisfy: [:each | each origin == refOrigin])
          ifTrue: [^ aLocatedMethod].
      ].
      self locatedMethods do: [:each |
        each isProvided ifTrue: [
          locatedMethod isNil ifFalse: [^nil].
          locatedMethod := each]
        ].
    ^locatedMethod

shows...
 * all locatedMethods don't have the same origin 
  i.e. self locatedMethods collect: [:e|e origin]
    ==> {GLMBrickGeometryTrait, GLMBrickLayoutTrait}

 * all locatedMethods are provided
  i.e. self asOrderedCollection collect: [:e|e isProvided]
    ==> {true.true}  

Now System Browser shows these definitions...
1. (T)GLMBrickGeometeryTrait>>#innerBounds
        ^ self wrappedBounds innerBounds

2. (T)GLMBrickLayoutTrait>>#innerBounds
        ^ self explicitRequirement

3. GLMBrickedMorph subclass: #GLMBrick
    uses: GLMBrickPropertiesTrait 
        + GLMBrickLayoutTrait 
        + GLMBrickStructureTrait 
        + (GLMBrickGeometryTrait - {#privateBounds:})
    instanceVariableNames: 'brickBounds brickApi'
    classVariableNames: ''
    package: 'Glamour-Morphic-Brick-Widgets-Core'

which from my limited understanding of Traits seems to have been
correctly flagged as a conflict.
But image 60520-64 similarly has...

1. (T)GLMBrickGeometeryTrait>>#innerBounds
        ^ self wrappedBounds innerBounds

2. (T)GLMBrickLayoutTrait>>#innerBounds
      ^ self explicitRequirement

3. GLMBrickedMorph subclass: #GLMBrick
    uses: GLMBrickPropertiesTrait 
        + GLMBrickLayoutTrait 
        + GLMBrickStructureTrait 
        + (GLMBrickGeometryTrait - {#privateBounds:})
    instanceVariableNames: 'brickBounds brickApi'
    classVariableNames: ''
    package: 'Glamour-Morphic-Brick-Widgets-Core'

so is the question really why 60520 doesn't flag a conflict?


Also my meta question... why did I need to debug deep into the compiler 
to tune in on definitions [1.], [2.] & [3.] ?   i.e why have...
 
  TraitMethodDescription>>#conflictMethod
    | binary numberOfArguments |
    self isConflict ifFalse: [^nil].
    binary := self isBinarySelector.
    numberOfArguments := self numberOfArguments.
    ^self
      generateMethod: self selector
      withMarker: CompiledMethod conflictMarker
      forArgs: numberOfArguments
      binary: binary

and not...

    TraitMethodDescription>>#conflictMethod
      self isConflict ifFalse: [^nil].
      self raise: CompileTimeTraitErrorReportWithGUI

===================

P.S. Maybe not related, at various times stepping through "self providedMethod"
for ivar "locatedMethod" the pane inspector showed "error obtaining field value" 
(in the 60521 image)


Here's hoping some guru can pick it up from there.
cheers -ben
Reply | Threaded
Open this post in threaded view
|

Re: 60528-64 OpalCompiler recompileAll ==> GLM trait conflict

Ben Coman


On 15 December 2017 at 19:28, Ben Coman <[hidden email]> wrote:


On 13 December 2017 at 19:41, Ben Coman <[hidden email]> wrote:
In a fresh 60528-64 image download with PharoLauncher on Ubuntu 16.04...
1. Open Playground
2. Evaluate... OpalCompler recompileAll
3. Try opening Iceberg, Playground or Spotter.
==> Error: A class or trait does not properly resolve a conflict between multiple traits it uses.

System Browser, Test Runner and Monticello are okay.

60528 (32bit) is okay (what is different between 32bit and 64bit?)

60521-64 is broken
60520-64 is okay


cheers -ben


I've got to the limit of where I can go with this one, so I'm seeking help. Copied from issue...

Having isolated the build where the issue was introduced,
normally I'd search the mail list for "60521" to find reports like these... 

and try applying the modifications to 60521 
manually to 60520 to see if I can break it.
But 60520 and 60521 reports are missing.

Comparing file dates (http://files.pharo.org/image/60/)....
2017.11.07  60520
2017.11.29  60521
2017.11.29  60522


Issue    Closed        Note
18760  2017.11.29  merged in 60522
20339  2017.11.29  resolved Fix To Include - Monkey was failing - removed the testRenameClassUsingClass
20250  2017.11.28  closed Fixed Upstream
20260  2017.11.28  reopened, originally merged 2017.08.22 
20586  2017.11.23  closed Wont Fix
20709  2017.11.18  merged in ????      (and there is no such Slice in Pharo6Inbox)
20119  2017.11.07  merged in 60520    (pull/492 ??)

applying Slice-20339 on top of 60520 doesn't break  "OpalCompiler recompileAll".
So I'm at a loss how to continue. 
Maybe it was just a momentary glitch :(
and builds > 60520 need to be thrown out and their integrations re-run
with either same or newer build numbers.

So we don't create additional rework, there should be no further integrations to Pharo6, 
so I've tentatively moved priority to "Show. Stopper" (not that that will necessarily have any great effect with development moved to Pharo 7). 

============================================

Putting a halt in CompiledMethod class >> conflictMarker
prior to running "OpalCompiler recompileAll"
stops in...
  GLMBrick(Behaviour)>>#updateMethodDictionarySelector: #innerBounds

where it calls...
  methodDescription effectiveMethod

which is...
  TraitDescription>>#effectiveMethod
    "Return the effective compiled method of this method description." 
    | method |
    method := self providedMethod.
    method isNil ifFalse: [^ method].
    method := self conflictMethod. "<<<<<<<<<"
    method isNil ifFalse: [^ method].
    ^ self requiredMethod.

with ivar...
  .locatedMethods={GLMBrickGeometryTrait>>#innerBounds . 
                  GLMBrickLayoutTrait>>#innerBounds}

and evaluting "self providedMethod"...
  TraitMethodDescription>>#providedLocatedMethod
    | locatedMethod aLocatedMethod refOrigin |
    locatedMethod := nil.
    self locatedMethods ifEmpty: [ ^ nil].
    self locatedMethods size > 1
      ifTrue: [ 
        aLocatedMethod := self locatedMethods anyOne.
        refOrigin := (aLocatedMethod methodClass >> aLocatedMethod selector) origin.
        (self locatedMethods allSatisfy: [:each | each origin == refOrigin])
          ifTrue: [^ aLocatedMethod].
      ].
      self locatedMethods do: [:each |
        each isProvided ifTrue: [
          locatedMethod isNil ifFalse: [^nil].
          locatedMethod := each]
        ].
    ^locatedMethod

shows...
 * all locatedMethods don't have the same origin 
  i.e. self locatedMethods collect: [:e|e origin]
    ==> {GLMBrickGeometryTrait, GLMBrickLayoutTrait}

 * all locatedMethods are provided
  i.e. self asOrderedCollection collect: [:e|e isProvided]
    ==> {true.true}  

Now System Browser shows these definitions...
1. (T)GLMBrickGeometeryTrait>>#innerBounds
        ^ self wrappedBounds innerBounds

2. (T)GLMBrickLayoutTrait>>#innerBounds
        ^ self explicitRequirement

3. GLMBrickedMorph subclass: #GLMBrick
    uses: GLMBrickPropertiesTrait 
        + GLMBrickLayoutTrait 
        + GLMBrickStructureTrait 
        + (GLMBrickGeometryTrait - {#privateBounds:})
    instanceVariableNames: 'brickBounds brickApi'
    classVariableNames: ''
    package: 'Glamour-Morphic-Brick-Widgets-Core'

which from my limited understanding of Traits seems to have been
correctly flagged as a conflict.
But image 60520-64 similarly has...

1. (T)GLMBrickGeometeryTrait>>#innerBounds
        ^ self wrappedBounds innerBounds

2. (T)GLMBrickLayoutTrait>>#innerBounds
      ^ self explicitRequirement

3. GLMBrickedMorph subclass: #GLMBrick
    uses: GLMBrickPropertiesTrait 
        + GLMBrickLayoutTrait 
        + GLMBrickStructureTrait 
        + (GLMBrickGeometryTrait - {#privateBounds:})
    instanceVariableNames: 'brickBounds brickApi'
    classVariableNames: ''
    package: 'Glamour-Morphic-Brick-Widgets-Core'

so is the question really why 60520 doesn't flag a conflict?


Also my meta question... why did I need to debug deep into the compiler 
to tune in on definitions [1.], [2.] & [3.] ?   i.e why have...
 
  TraitMethodDescription>>#conflictMethod
    | binary numberOfArguments |
    self isConflict ifFalse: [^nil].
    binary := self isBinarySelector.
    numberOfArguments := self numberOfArguments.
    ^self
      generateMethod: self selector
      withMarker: CompiledMethod conflictMarker
      forArgs: numberOfArguments
      binary: binary

and not...

    TraitMethodDescription>>#conflictMethod
      self isConflict ifFalse: [^nil].
      self raise: CompileTimeTraitErrorReportWithGUI

===================

P.S. Maybe not related, at various times stepping through "self providedMethod"
for ivar "locatedMethod" the pane inspector showed "error obtaining field value" 
(in the 60521 image)


Here's hoping some guru can pick it up from there.
cheers -ben


So I noticed System Browser show GLMBrick is using the #innerBounds 
method from GLMBrickGeometryTrait.  So guessing part of solving this is probably to redefine (in a fresh image)...

  GLMBrickedMorph subclass: #GLMBrick
      uses: GLMBrickPropertiesTrait
                 + (GLMBrickLayoutTrait - {#innerBounds})
                 + GLMBrickStructureTrait 
                 + (GLMBrickGeometryTrait - {#privateBounds:})
      instanceVariableNames: 'brickBounds brickApi'
      classVariableNames: ''
      package: 'Glamour-Morphic-Brick-Widgets-Core'
 
but saving this produces error "Instance of GLMPrivacyAgreementBrick did not understand #onRemovedFrom:"
and the Quality Assistant Nautilius Plugin dies.

Trying to bypass this in another fresh image, opening System Browser then clicking on Settings in the QA area
 error when the Settings display.

cheers -ben