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

David T. Lewis lewis at mail.msen.com
Sun Feb 18 21:22:59 UTC 2018


To follow up on my summary below, issue #2 (Morph>>outermostWorldMorph)
goes away if EventRecordingSpace class>>open is reorganized a bit. So
this is not a problem after all, and no change to outermostWorldMorph
will be needed.

Dave

I think that the PasteUpMorph>>displayWorld change is all that will really be needed outside of Etoys. 

On Sun, Feb 18, 2018 at 02:12:34PM -0500, David T. Lewis wrote:
> 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