[squeak-dev] Emergency evaluator due to MNU in hasContentsInExplorer

Jakob Reschke forums.jakob at resfarm.de
Sun Feb 23 18:30:03 UTC 2020


Am Sa., 22. Feb. 2020 um 22:13 Uhr schrieb David T. Lewis <lewis at mail.msen.com>:
>...while doing the update.

Sorry, I did not mean that it happened during or because of the update
-- I merely intended to indicate that my image is up to date.

I just reproduced it in a fresh image, using the following:

Enable "open tools attached to mouse cursor" preference.

BadClass >>
hasContentsInExplorer
   ^ nil notEmpty

{BadClass new} <--- right click, explore

The ObjectExplorer has to be attached to the Hand to trigger the issue.
That's why you must "explore" via the menu, it does not work by
pressing Cmd-Shift-i.

My expectation is that the drawing error is caught, the explorer tree
turns red, and a debugger opens in the same project. This does happen
when the explorer is not attached to the hand.

It looks like the debugger is started in the new UI process, where it
reaches this:

[] in MorphicDebugger class>>openOn: processToDebug context: context
label: title contents: contentsStringOrNil fullView: full
   ...
   "Try drawing the debugger tool at least once to avoid freeze."
   debugger topView ifNotNil: [:window | window world displayWorld.
"Not safely!"].

In WorldState>>displayWorld:submorphs: it attempts to draw all the
hands. The one hand still has the broken ObjectExplorer SystemWindow
as a submorph. Thus, the explorer is drawn, the error is triggered
once again, and the second debugger notices a recursive invocation.

Below is the error report from the MVC debugger (you may want to go
straight ahead to the bottom because the detailed stack report does
not reach so far).

Kind regards,
Jakob



23 February 2020 7:17:54.275866 pm

VM: Win32 - Smalltalk
Image: Squeak5.3beta [latest update: #19402]

SecurityManager state:
Restricted: false
FileAccess: true
SocketAccess: true
Working Dir C:\Squeak\smalltalkCi
Trusted Dir C:\Squeak\smalltalkCi\Jakob
Untrusted Dir C:\Users\Jakob\Documents\My Squeak

MorphicProject>>suspendProcessForDebug
Receiver: a MorphicProject (hasContentsInExplorer) in a
PasteUpMorph(2434915) [world]
Arguments and temporary variables:
p: a Process in MorphicProject>>suspendProcessForDebug
Receiver's instance variables:
dependents: nil
world: a PasteUpMorph(2434915) [world]
uiManager: a MorphicUIManager
changeSet: a ChangeSet named hasContentsInExplorer
transcript: a TranscriptStream
parentProject: a MVCProject (Unnamed) in a ControlManager
previousProject: a MVCProject (Unnamed) in a ControlManager
displayDepth: 32
viewSize: 151 at 132
thumbnail: Form(1024x768x32)
nextProject: nil
projectParameters: an IdentityDictionary(#PrevailingProjectFlags->an
IdentityDictionary...etc...
version: nil
urlList: nil
lastDirectory: nil
lastSavedAtSeconds: nil
projectPreferenceFlagDictionary: an
IdentityDictionary(#enablePortraitMode->fal...etc...
resourceManager: a ResourceManager
uiProcess: nil

MVCProject(Project)>>enterForEmergencyRecovery
Receiver: a MVCProject (Unnamed) in a ControlManager
Arguments and temporary variables:
leavingProject: a MorphicProject (hasContentsInExplorer) in a
PasteUpMorph(2434...etc...
process: a Process in MorphicProject>>suspendProcessForDebug
titleForDebuggerWindow: 'FATAL PROJECT ERROR: Project was
''hasContentsInExplor...etc...
Receiver's instance variables:
dependents: nil
world: a ControlManager
uiManager: a MVCUIManager
changeSet: a ChangeSet named Unnamed
transcript: a TranscriptStream
parentProject: a MVCProject (Unnamed) in a ControlManager
previousProject: a MorphicProject (hasContentsInExplorer) in a
PasteUpMorph(243...etc...
displayDepth: 32
viewSize: 128 at 96
thumbnail: DisplayScreen(128x96x32)
nextProject: a MorphicProject (hasContentsInExplorer) in a
PasteUpMorph(2434915...etc...
projectParameters: an IdentityDictionary(#disabledGlobalFlapIDs->a
Set('Paintin...etc...
version: nil
urlList: nil
lastDirectory: nil
lastSavedAtSeconds: nil
projectPreferenceFlagDictionary: an
IdentityDictionary(#enablePortraitMode->fal...etc...
resourceManager: nil

Project class>>tryOtherProjectForRecovery:
Receiver: Project
Arguments and temporary variables:
errorMessage: 'MessageNotUnderstood: UndefinedObject>>notEmpty'
safeProject: a MVCProject (Unnamed) in a ControlManager
nextProject: a MVCProject (Unnamed) in a ControlManager
p: a MVCProject (Unnamed) in a ControlManager
Receiver's instance variables:
superclass: Model
methodDict: a MethodDictionary(size 256)
format: 65554
instanceVariables: #('world' 'uiManager' 'changeSet' 'transcript'
'parentProjec...etc...
organization: ('accessing' changeSet color displayDepth displayDepth:
findProjectView:...etc...
subclasses: {MVCProject . MorphicProject}
name: #Project
classPool: a Dictionary(#AllProjects->an OrderedCollection(a
MorphicProject (ha...etc...
sharedPools: nil
environment: Smalltalk
category: #'System-Support'

MorphicProject(Project)>>primitiveError:
Receiver: a MorphicProject (hasContentsInExplorer) in a
PasteUpMorph(2434915) [world]
Arguments and temporary variables:
errorMessage: 'MessageNotUnderstood: UndefinedObject>>notEmpty'
Receiver's instance variables:
dependents: nil
world: a PasteUpMorph(2434915) [world]
uiManager: a MorphicUIManager
changeSet: a ChangeSet named hasContentsInExplorer
transcript: a TranscriptStream
parentProject: a MVCProject (Unnamed) in a ControlManager
previousProject: a MVCProject (Unnamed) in a ControlManager
displayDepth: 32
viewSize: 151 at 132
thumbnail: Form(1024x768x32)
nextProject: nil
projectParameters: an IdentityDictionary(#PrevailingProjectFlags->an
IdentityDictionary...etc...
version: nil
urlList: nil
lastDirectory: nil
lastSavedAtSeconds: nil
projectPreferenceFlagDictionary: an
IdentityDictionary(#enablePortraitMode->fal...etc...
resourceManager: a ResourceManager
uiProcess: nil

MorphicProject(Project)>>recursiveError:
Receiver: a MorphicProject (hasContentsInExplorer) in a
PasteUpMorph(2434915) [world]
Arguments and temporary variables:
errorMessage: 'MessageNotUnderstood: UndefinedObject>>notEmpty'
Receiver's instance variables:
dependents: nil
world: a PasteUpMorph(2434915) [world]
uiManager: a MorphicUIManager
changeSet: a ChangeSet named hasContentsInExplorer
transcript: a TranscriptStream
parentProject: a MVCProject (Unnamed) in a ControlManager
previousProject: a MVCProject (Unnamed) in a ControlManager
displayDepth: 32
viewSize: 151 at 132
thumbnail: Form(1024x768x32)
nextProject: nil
projectParameters: an IdentityDictionary(#PrevailingProjectFlags->an
IdentityDictionary...etc...
version: nil
urlList: nil
lastDirectory: nil
lastSavedAtSeconds: nil
projectPreferenceFlagDictionary: an
IdentityDictionary(#enablePortraitMode->fal...etc...
resourceManager: a ResourceManager
uiProcess: nil

MorphicProject>>recursiveError:
Receiver: a MorphicProject (hasContentsInExplorer) in a
PasteUpMorph(2434915) [world]
Arguments and temporary variables:
msg: 'MessageNotUnderstood: UndefinedObject>>notEmpty'
Receiver's instance variables:
dependents: nil
world: a PasteUpMorph(2434915) [world]
uiManager: a MorphicUIManager
changeSet: a ChangeSet named hasContentsInExplorer
transcript: a TranscriptStream
parentProject: a MVCProject (Unnamed) in a ControlManager
previousProject: a MVCProject (Unnamed) in a ControlManager
displayDepth: 32
viewSize: 151 at 132
thumbnail: Form(1024x768x32)
nextProject: nil
projectParameters: an IdentityDictionary(#PrevailingProjectFlags->an
IdentityDictionary...etc...
version: nil
urlList: nil
lastDirectory: nil
lastSavedAtSeconds: nil
projectPreferenceFlagDictionary: an
IdentityDictionary(#enablePortraitMode->fal...etc...
resourceManager: a ResourceManager
uiProcess: nil

StandardToolSet class>>handleRecursiveError:
Receiver: StandardToolSet
Arguments and temporary variables:
description: 'MessageNotUnderstood: UndefinedObject>>notEmpty'
Receiver's instance variables:
superclass: Object
methodDict: a MethodDictionary()
format: 0
instanceVariables: nil
organization: ('as yet unclassified')

subclasses: {CommandLineToolSet . DebuggerTestsToolSet}
name: #StandardToolSet
classPool: nil
sharedPools: nil
environment: Smalltalk
category: #'Tools-Base'

ToolSet class>>handleRecursiveError:
Receiver: ToolSet
Arguments and temporary variables:
description: 'MessageNotUnderstood: UndefinedObject>>notEmpty'
ts: StandardToolSet
Receiver's instance variables:
superclass: AppRegistry
methodDict: a MethodDictionary()
format: 0
instanceVariables: nil
organization: ('as yet unclassified')

subclasses: nil
name: #ToolSet
classPool: nil
sharedPools: nil
environment: Smalltalk
category: #'System-Applications'
registeredClasses: an OrderedCollection(StandardToolSet CommandLineToolSet)
default: StandardToolSet

Debugger class>>openOn:context:label:contents:fullView:
Receiver: Debugger
Arguments and temporary variables:
process: a Process in MorphicProject>>suspendProcessForDebug
context: UndefinedObject(Object)>>doesNotUnderstand: #notEmpty
title: 'MessageNotUnderstood: UndefinedObject>>notEmpty'
contentsStringOrNil: nil
bool: false
ap: a Process in MorphicProject>>suspendProcessForDebug
Receiver's instance variables:
superclass: CodeHolder
methodDict: a MethodDictionary(size 147)
format: 65558
instanceVariables: #('interruptedProcess' 'contextStack'
'contextStackIndex' 'c...etc...
organization: ('accessing' contents contents:notifying:
contextStackTop contextVariablesInspector...etc...
subclasses: {TestCaseDebugger . MorphicDebugger . MVCDebugger}
name: #Debugger
classPool: a Dictionary(#ContextStackKeystrokes->a
Dictionary($T->#stepIntoBlock...etc...
sharedPools: nil
environment: Smalltalk
category: #'Tools-Debugger'

StandardToolSet class>>debugProcess:context:label:contents:fullView:
Receiver: StandardToolSet
Arguments and temporary variables:
aProcess: a Process in MorphicProject>>suspendProcessForDebug
aContext: UndefinedObject(Object)>>doesNotUnderstand: #notEmpty
aString: 'MessageNotUnderstood: UndefinedObject>>notEmpty'
contents: nil
aBool: false
Receiver's instance variables:
superclass: Object
methodDict: a MethodDictionary()
format: 0
instanceVariables: nil
organization: ('as yet unclassified')

subclasses: {CommandLineToolSet . DebuggerTestsToolSet}
name: #StandardToolSet
classPool: nil
sharedPools: nil
environment: Smalltalk
category: #'Tools-Base'

ToolSet class>>debugProcess:context:label:contents:fullView:
Receiver: ToolSet
Arguments and temporary variables:
aProcess: a Process in MorphicProject>>suspendProcessForDebug
aContext: UndefinedObject(Object)>>doesNotUnderstand: #notEmpty
aString: 'MessageNotUnderstood: UndefinedObject>>notEmpty'
contents: nil
aBool: false
ts: StandardToolSet
Receiver's instance variables:
superclass: AppRegistry
methodDict: a MethodDictionary()
format: 0
instanceVariables: nil
organization: ('as yet unclassified')

subclasses: nil
name: #ToolSet
classPool: nil
sharedPools: nil
environment: Smalltalk
category: #'System-Applications'
registeredClasses: an OrderedCollection(StandardToolSet CommandLineToolSet)
default: StandardToolSet

Process>>debug:title:full:contents:
Receiver: a Process in MorphicProject>>suspendProcessForDebug
Arguments and temporary variables:
context: UndefinedObject(Object)>>doesNotUnderstand: #notEmpty
title: 'MessageNotUnderstood: UndefinedObject>>notEmpty'
bool: false
contents: nil
topCtxt: Process>>debug:title:full:contents:
Receiver's instance variables:
nextLink: nil
suspendedContext: MorphicProject>>suspendProcessForDebug
priority: 40
myList: nil
threadId: nil
effectiveProcess: nil
name: nil
island: nil
env: a Dictionary(#errorRecursionFlag->false )

Process>>debug:title:full:
Receiver: a Process in MorphicProject>>suspendProcessForDebug
Arguments and temporary variables:
context: UndefinedObject(Object)>>doesNotUnderstand: #notEmpty
title: 'MessageNotUnderstood: UndefinedObject>>notEmpty'
bool: false
Receiver's instance variables:
nextLink: nil
suspendedContext: MorphicProject>>suspendProcessForDebug
priority: 40
myList: nil
threadId: nil
effectiveProcess: nil
name: nil
island: nil
env: a Dictionary(#errorRecursionFlag->false )

Process>>debug:title:
Receiver: a Process in MorphicProject>>suspendProcessForDebug
Arguments and temporary variables:
context: UndefinedObject(Object)>>doesNotUnderstand: #notEmpty
title: 'MessageNotUnderstood: UndefinedObject>>notEmpty'
Receiver's instance variables:
nextLink: nil
suspendedContext: MorphicProject>>suspendProcessForDebug
priority: 40
myList: nil
threadId: nil
effectiveProcess: nil
name: nil
island: nil
env: a Dictionary(#errorRecursionFlag->false )

StandardToolSet class>>handleError:
Receiver: StandardToolSet
Arguments and temporary variables:
anError: MessageNotUnderstood: UndefinedObject>>notEmpty
Receiver's instance variables:
superclass: Object
methodDict: a MethodDictionary()
format: 0
instanceVariables: nil
organization: ('as yet unclassified')

subclasses: {CommandLineToolSet . DebuggerTestsToolSet}
name: #StandardToolSet
classPool: nil
sharedPools: nil
environment: Smalltalk
category: #'Tools-Base'

ToolSet class>>handleError:
Receiver: ToolSet
Arguments and temporary variables:
anError: MessageNotUnderstood: UndefinedObject>>notEmpty
ctx: nil
ts: StandardToolSet
Receiver's instance variables:
superclass: AppRegistry
methodDict: a MethodDictionary()
format: 0
instanceVariables: nil
organization: ('as yet unclassified')

subclasses: nil
name: #ToolSet
classPool: nil
sharedPools: nil
environment: Smalltalk
category: #'System-Applications'
registeredClasses: an OrderedCollection(StandardToolSet CommandLineToolSet)
default: StandardToolSet

UnhandledError>>defaultAction
Receiver: UnhandledError:
Arguments and temporary variables:
ts: ToolSet
Receiver's instance variables:
messageText: nil
tag: nil
signalContext: UnhandledError(Exception)>>signal
handlerContext: nil
outerContext: nil
exception: MessageNotUnderstood: UndefinedObject>>notEmpty

UndefinedObject>>handleSignal:
Receiver: nil
Arguments and temporary variables:
exception: UnhandledError:
Receiver's instance variables:
nil

UnhandledError(Exception)>>signal
Receiver: UnhandledError:
Arguments and temporary variables:

Receiver's instance variables:
messageText: nil
tag: nil
signalContext: UnhandledError(Exception)>>signal
handlerContext: nil
outerContext: nil
exception: MessageNotUnderstood: UndefinedObject>>notEmpty


--- The full stack ---
MorphicProject>>suspendProcessForDebug
MVCProject(Project)>>enterForEmergencyRecovery
Project class>>tryOtherProjectForRecovery:
MorphicProject(Project)>>primitiveError:
MorphicProject(Project)>>recursiveError:
MorphicProject>>recursiveError:
StandardToolSet class>>handleRecursiveError:
ToolSet class>>handleRecursiveError:
Debugger class>>openOn:context:label:contents:fullView:
StandardToolSet class>>debugProcess:context:label:contents:fullView:
ToolSet class>>debugProcess:context:label:contents:fullView:
Process>>debug:title:full:contents:
Process>>debug:title:full:
Process>>debug:title:
StandardToolSet class>>handleError:
ToolSet class>>handleError:
UnhandledError>>defaultAction
UndefinedObject>>handleSignal:
UnhandledError(Exception)>>signal
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
UnhandledError class>>signalForException:
MessageNotUnderstood(Error)>>defaultAction
MessageNotUnderstood>>defaultAction
UndefinedObject>>handleSignal:
MessageNotUnderstood(Exception)>>signal
UndefinedObject(Object)>>doesNotUnderstand: #notEmpty
BadClass>>hasContentsInExplorer
ObjectExplorerWrapper>>hasContents
IndentingListItemMorph>>hasToggle
IndentingListItemMorph>>drawLinesToFirstChildOn:lineColor:
IndentingListItemMorph>>drawLinesOn:lineColor:indentThreshold:
[] in [] in PluggableTreeMorph(SimpleHierarchicalListMorph)>>drawLinesOn:
Array(SequenceableCollection)>>do:
TransformMorph(Morph)>>submorphsDo:
[] in PluggableTreeMorph(SimpleHierarchicalListMorph)>>drawLinesOn:
FormCanvas>>transformBy:clippingTo:during:smoothing:
PluggableTreeMorph(SimpleHierarchicalListMorph)>>drawLinesOn:
PluggableTreeMorph(SimpleHierarchicalListMorph)>>drawOn:
FormCanvas(Canvas)>>draw:
FormCanvas(Canvas)>>drawMorph:
PluggableTreeMorph(Morph)>>fullDrawOn:
FormCanvas(Canvas)>>fullDraw:
FormCanvas(Canvas)>>fullDrawMorph:
[] in [] in PluggableSystemWindow(Morph)>>drawSubmorphsOn:
Array(SequenceableCollection)>>reverseDo:
[] in PluggableSystemWindow(Morph)>>drawSubmorphsOn:
PluggableSystemWindow(Morph)>>drawSubmorphsOn:
PluggableSystemWindow(Morph)>>fullDrawOn:
FormCanvas(Canvas)>>fullDraw:
FormCanvas(Canvas)>>fullDrawMorph:
[] in [] in HandMorph(Morph)>>drawSubmorphsOn:
Array(SequenceableCollection)>>reverseDo:
[] in HandMorph(Morph)>>drawSubmorphsOn:
HandMorph(Morph)>>drawSubmorphsOn:
[] in HandMorph>>updateCacheCanvas:
FormCanvas>>translateBy:during:
HandMorph>>updateCacheCanvas:
HandMorph>>fullDrawOn:
FormCanvas(Canvas)>>fullDraw:
FormCanvas(Canvas)>>fullDrawMorph:
[] in WorldState>>displayWorld:submorphs:
OrderedCollection>>reverseDo:
-- and more not shown --



More information about the Squeak-dev mailing list