[squeak-dev] Event Theatre in Object Catalog sparks DNU in 6.0-trunk

David T. Lewis lewis at mail.msen.com
Sun Feb 18 19:12:34 UTC 2018


Here is my understanding of what is wrong, and what needs to be done to
make it right.

What is wrong:

1) PasteUpMorph>>displayWorld no longer recognizes the possibility of a
world in a world (such as a Worldlet). This happened through some minor
refactorings such that we no longer delegate to the outermostWordDisplayWorld,
but instead assume that a PasteUpMorph is always going to be the outer world.

2) In addition to the above, I broke Morph>>outermostWorldMorph logic for
the case of a morph that does not know its owner, such as a new Worldlet.
This was done when I changed direct references to global World to be (for morphs)
self world. Arguably the initialization code for "EventRecordingSpace open"
could be (should be?) reorganized so that this would not be a problem, but
it is probably easier to let Morph>>outermostWorldMorph default to
"Project current world" if it cannot otherwise figure out its owner and world.

I'm going to tinker around with this a bit before posting anything, but a
reasonable set of changes to resolve this seems to be:

1) Un-revert privateOuterDisplay world, and give it the same logic as the
current implementation of displayWorld:

  PasteUpMorph>>privateOuterDisplayWorld
	(self valueOfProperty: #shouldDisplayWorld ifAbsent: [true])
		ifTrue: [worldState displayWorld: self submorphs: submorphs].

2) Revert displayWorld back to its earlier implementation:

  PasteUpMorph>>displayWorld
	self outermostWorldMorph privateOuterDisplayWorld

3) Change outermostWorldMorph so that it defaults to the current project world
if it is not otherwise able to find an outer world (but being careful not
to break the MVC fallback, see #arNote):

  Morph>>outermostWorldMorph
	| outer |
	self world ifNotNil: [ :world |^world].
	Project current world ifNotNil: [ :world | world isWorldMorph ifTrue: [^world]].
	self flag: #arNote. "stuff below is really only for MVC"
	outer := self outermostMorphThat: [ :x | x isWorldMorph].
	outer ifNotNil: [^outer].
	self isWorldMorph ifTrue: [^self].
	^nil

Dave


On Sun, Feb 18, 2018 at 11:53:02AM -0500, David T. Lewis wrote:
> Ugh, I am blind, I see it now. Thanks Bob.
> 
> Dave
> 
> 
> On Sun, Feb 18, 2018 at 11:23:46AM -0500, David T. Lewis wrote:
> > I think I'm getting a bit lost on this, but here are my notes from things
> > I looked at this morning:
> > 
> > I found that opening the Sugar navigator bar ('Show Sugar navigator bar'
> > preference) makes the failure go away, but only because that preference
> > removes the global flaps.
> > 
> > The failure can be be easily reproduced with "EventRecordingSpace open"
> > with or without Sugar navigator bar open.
> > 
> > The underlying issue seems to be that Worldlet new (called from
> > EventRecordingSpace>>initialize) does not initialize the worldState instance
> > variable, which is required for later flap initialization.
> > 
> > Checking in an Etoys image, Worldlet new also answers an instance with
> > nil worldState, so the solution is not to change that initialization.
> > 
> > Unfortunately, evaluating EventRecordingSpace open in my Etoys image
> > crashes my VM, presumably because I am running a 64-bit VM and some plugin
> > for GSMCodec may not be updated for 64-bit. I'll need to either use SqueakJS,
> > or build a 32-bit interpreter VM, in order to step through this further
> > and see what is different in Squeak trunk versus Etoys development image.
> > 
> > Dave 
> > 
> > 
> > On Sun, Feb 18, 2018 at 06:58:14AM -0500, Bob Arning wrote:
> > > Except that #outermostWorldMorph for the Worldlet will return the World 
> > > where the <worldState> will be fine.
> > > 
> > > 
> > > On 2/17/18 10:54 PM, David T. Lewis wrote:
> > > >Thanks Bob,
> > > >
> > > >I see now the deprecated method, but I think something else is going wrong.
> > > >The original logic from privateOuterDisplayWorld is still present in the
> > > >most recent version of PasteUpMorph>>displayWorld. But worldState is nil
> > > >when this is called, and that seems to be the cause of the error.
> > > >
> > > >I can't follow up on it tonight, but I think I'll try to dig back through
> > > >some earlier versions of the trunk image and see if I can figure out where
> > > >it started failing.
> > > >
> > > >Dave
> > > >
> > > >
> > > >On Sat, Feb 17, 2018 at 09:36:25PM -0500, Bob Arning wrote:
> > > >>PasteUpMorph used to say:
> > > >>
> > > >>
> > > >>displayWorld
> > > >>
> > > >>?????? self outermostWorldMorph privateOuterDisplayWorld
> > > >>
> > > >>
> > > >>which would work if you remove the "self deprecated" from
> > > >>#privateOuterDisplayWorld
> > > >>
> > > >>
> > > >>On 2/17/18 5:05 PM, David T. Lewis wrote:
> > > >>>This is an interesting one.
> > > >>>
> > > >>>We have EventRecordingSpace class>>newStandalone that is trying to create
> > > >>>a new
> > > >>>instance "capable of standing by itself as a usable morph."
> > > >>>
> > > >>>This makes an instance with a contentArea that is a Worldlet. Presumabaly
> > > >>>that
> > > >>>Wordlet is supposed to be and "independent" thing too. But then we get to
> > > >>>Worldlet(PasteUpMorph)>>displayWorld, in which the Worldlet tries to use
> > > >>>its
> > > >>>worldState to display submorphs, but it has no worldState, so boom.
> > > >>>
> > > >>>It may be necessary to look at an older image to figure out where this is
> > > >>>going wrong.
> > > >>>
> > > >>>Dave
> > > >>>
> > > >>>p.s. Tim, thanks for posting this question :-)
> > > >>>
> > > >>>
> > > >>>On Sat, Feb 17, 2018 at 11:27:53AM -0800, Tm Jhnsn wrote:
> > > >>>>Hi all,
> > > >>>>
> > > >>>>I am really enjoying the latest versions of Squeak.
> > > >>>>
> > > >>>>In trying out 6.0-alpha with trunk updates, I found a DNU when doing
> > > >>>>normal Morphic tasks.  Sorry if this has already been reported.
> > > >>>>
> > > >>>>Should be repeatable:
> > > >>>>
> > > >>>>- open fresh image
> > > >>>>- make flaps appear (open a new Morphic project, or World menu -> flaps
> > > >>>>-> show shared tabs)
> > > >>>>- click Widgets
> > > >>>>- drag out an Object Catalog
> > > >>>>- click Multimedia
> > > >>>>
> > > >>>>Something is going on within the Event Theatre item's initialization.
> > > >>>>
> > > >>>>Seems to be that the "tutorial" Event Theatre Worldlet has a worldState
> > > >>>>instance variable which is nil, but it is being sent
> > > >>>>#displayWorld:submorphs: by PasteUpMorph>>#displayWorld.  Interestingly,
> > > >>>>Worldlet's class comments specifically suggest instances don't have 
> > > >>>>their
> > > >>>>own worldState.  :D
> > > >>>>
> > > >>>>Other buttons in the Object Catalog did not result in a DNU for me.
> > > >>>>
> > > >>>>...stack follows:
> > > >>>>
> > > >>>>UndefinedObject(Object)>>doesNotUnderstand: #displayWorld:submorphs:
> > > >>>>Worldlet(PasteUpMorph)>>displayWorld
> > > >>>>[] in Worldlet>>installFlaps
> > > >>>>OrderedCollection>>do:
> > > >>>>Worldlet>>installFlaps
> > > >>>>EventRecordingSpace>>addSuppliesFlap
> > > >>>>EventRecordingSpace>>initialize
> > > >>>>EventRecordingSpace(Morph)>>initializeToStandAlone
> > > >>>>EventRecordingSpace class(Morph class)>>newStandAlone
> > > >>>>PartsBin class>>thumbnailForQuad:color:
> > > >>>>[] in PartsBin>>listDirection:quadList:buttonClass:
> > > >>>>OrderedCollection>>do:
> > > >>>>PartsBin>>listDirection:quadList:buttonClass:
> > > >>>>PartsBin>>listDirection:quadList:
> > > >>>>ObjectsTool>>installQuads:fromButton:
> > > >>>>[] in ObjectsTool>>showCategory:fromButton:
> > > >>>>BlockClosure>>ensure:
> > > >>>>CursorWithMask(Cursor)>>showWhile:
> > > >>>>ObjectsTool>>showCategory:fromButton:
> > > >>>>SimpleButtonMorph>>doButtonAction
> > > >>>>SimpleButtonMorph>>mouseDown:
> > > >>>>SimpleButtonMorph(Morph)>>handleMouseDown:
> > > >>>>MouseButtonEvent>>sentTo:
> > > >>>>SimpleButtonMorph(Morph)>>handleEvent:
> > > >>>>MorphicEventDispatcher>>dispatchEvent:withHandler:withMorph:
> > > >>>>[] in MorphicEventDispatcher>>dispatchMouseDown:with:
> > > >>>>BlockClosure>>ensure:
> > > >>>>MorphicEventDispatcher>>dispatchMouseDown:with:
> > > >>>>MorphicEventDispatcher>>dispatchEvent:with:
> > > >>>>SimpleButtonMorph(Morph)>>processEvent:using:
> > > >>>>[] in MorphicEventDispatcher>>dispatchEvent:toSubmorphsOf:
> > > >>>>Array(SequenceableCollection)>>do:
> > > >>>>AlignmentMorph(Morph)>>submorphsDo:
> > > >>>>MorphicEventDispatcher>>dispatchEvent:toSubmorphsOf:
> > > >>>>MorphicEventDispatcher>>dispatchEvent:withHandler:withMorph:
> > > >>>>[] in MorphicEventDispatcher>>dispatchMouseDown:with:
> > > >>>>BlockClosure>>ensure:
> > > >>>>MorphicEventDispatcher>>dispatchMouseDown:with:
> > > >>>>MorphicEventDispatcher>>dispatchEvent:with:
> > > >>>>AlignmentMorph(Morph)>>processEvent:using:
> > > >>>>[] in MorphicEventDispatcher>>dispatchEvent:toSubmorphsOf:
> > > >>>>Array(SequenceableCollection)>>do:
> > > >>>>ObjectsTool(Morph)>>submorphsDo:
> > > >>>>MorphicEventDispatcher>>dispatchEvent:toSubmorphsOf:
> > > >>>>MorphicEventDispatcher>>dispatchEvent:withHandler:withMorph:
> > > >>>>[] in MorphicEventDispatcher>>dispatchMouseDown:with:
> > > >>>>BlockClosure>>ensure:
> > > >>>>MorphicEventDispatcher>>dispatchMouseDown:with:
> > > >>>>MorphicEventDispatcher>>dispatchEvent:with:
> > > >>>>ObjectsTool(Morph)>>processEvent:using:
> > > >>>>[] in MorphicEventDispatcher>>dispatchEvent:toSubmorphsOf:
> > > >>>>Array(SequenceableCollection)>>do:
> > > >>>>PasteUpMorph(Morph)>>submorphsDo:
> > > >>>>MorphicEventDispatcher>>dispatchEvent:toSubmorphsOf:
> > > >>>>MorphicEventDispatcher>>dispatchEvent:withHandler:withMorph:
> > > >>>>[] in MorphicEventDispatcher>>dispatchMouseDown:with:
> > > >>>>BlockClosure>>ensure:
> > > >>>>MorphicEventDispatcher>>dispatchMouseDown:with:
> > > >>>>MorphicEventDispatcher>>dispatchEvent:with:
> > > >>>>PasteUpMorph(Morph)>>processEvent:using:
> > > >>>>[] in PasteUpMorph>>processEvent:using:
> > > >>>>BlockClosure>>ensure:
> > > >>>>PasteUpMorph>>processEvent:using:
> > > >>>>PasteUpMorph(Morph)>>processEvent:
> > > >>>>[] in [] in [] in HandMorph>>sendEvent:focus:clear:
> > > >>>>BlockClosure>>ensure:
> > > >>>>MouseButtonEvent(MorphicEvent)>>becomeActiveDuring:
> > > >>>>[] in [] in HandMorph>>sendEvent:focus:clear:
> > > >>>>BlockClosure>>ensure:
> > > >>>>HandMorph>>becomeActiveDuring:
> > > >>>>[] in HandMorph>>sendEvent:focus:clear:
> > > >>>>BlockClosure>>ensure:
> > > >>>>PasteUpMorph>>becomeActiveDuring:
> > > >>>>HandMorph>>sendEvent:focus:clear:
> > > >>>>HandMorph>>sendMouseEvent:
> > > >>>>HandMorph>>handleEvent:
> > > >>>>HandMorph>>processEvents
> > > >>>>[] in WorldState>>doOneCycleNowFor:
> > > >>>>Array(SequenceableCollection)>>do:
> > > >>>>WorldState>>handsDo:
> > > >>>>WorldState>>doOneCycleNowFor:
> > > >>>>WorldState>>doOneCycleFor:
> > > >>>>PasteUpMorph>>doOneCycle
> > > >>>>[] in MorphicProject>>spawnNewProcess
> > > >>>>[] in BlockClosure>>newProcess
> > > >>>>
> > > >>>>
> > > >>>>Thanks,
> > > >>>>Tim
> > > >>>>
> > > >>>>
> > > >
> > > 
> > 
> > > 
> > 
> > 
> 


More information about the Squeak-dev mailing list