Pharo-dev
By thread
pharo-dev@lists.pharo.org
By month
Messages by month
- ----- 2026 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
October 2009
- 86 participants
- 1118 messages
Re: [Pharo-project] Traits composition question
by Igor Stasenko
2009/10/25 Adrian Lienhard <adi(a)netstyle.ch>:
> No, this is not possible. You can only exclude single methods but not
> whole traits.
>
Too bad, specifying dozens of methods for exclusion is not very funny :)
> Adrian
>
> On Oct 25, 2009, at 06:37 , Igor Stasenko wrote:
>
>> Suppose i having a trait grouping
>>
>> Trait named: #TraitGroup
>> uses: TraitA + TraitB + .... TraitN
>> category: 'foo'
>>
>> and suppose i want to use TraitGroup in one of my classes, but
>> excluding one of the traits in the list above.. i.e. something like:
>>
>> Object subclass: #Myclass
>> uses: TraitGroup - TraitA
>> ..
>>
>> but the above code don't seem to work..
>> Any clues, how i can do that?
>> Is such kind of composition possible at all?
>>
>> --
>> Best regards,
>> Igor Stasenko AKA sig.
>>
>> _______________________________________________
>> Pharo-project mailing list
>> Pharo-project(a)lists.gforge.inria.fr
>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>
>
> _______________________________________________
> Pharo-project mailing list
> Pharo-project(a)lists.gforge.inria.fr
> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>
--
Best regards,
Igor Stasenko AKA sig.
Oct. 25, 2009
Re: [Pharo-project] Feature request: All uses of Trait
by Igor Stasenko
2009/10/25 Adrian Lienhard <adi(a)netstyle.ch>:
> TClassAndTraitDescription users
>
err.. i didn't meant to get them programmatically.
I meant the tools support :)
> Cheers,
> Adrian
>
> On Oct 25, 2009, at 06:26 , Igor Stasenko wrote:
>
>> It would be cool to have a 'references-to' support for traits.
>> Or maybe its there already?
>>
>> How can i quickly look, what classes using the trait?
>>
>> --
>> Best regards,
>> Igor Stasenko AKA sig.
>>
>> _______________________________________________
>> Pharo-project mailing list
>> Pharo-project(a)lists.gforge.inria.fr
>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>
>
> _______________________________________________
> Pharo-project mailing list
> Pharo-project(a)lists.gforge.inria.fr
> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>
--
Best regards,
Igor Stasenko AKA sig.
Oct. 25, 2009
Re: [Pharo-project] Traits composition question
by Adrian Lienhard
No, this is not possible. You can only exclude single methods but not
whole traits.
Adrian
On Oct 25, 2009, at 06:37 , Igor Stasenko wrote:
> Suppose i having a trait grouping
>
> Trait named: #TraitGroup
> uses: TraitA + TraitB + .... TraitN
> category: 'foo'
>
> and suppose i want to use TraitGroup in one of my classes, but
> excluding one of the traits in the list above.. i.e. something like:
>
> Object subclass: #Myclass
> uses: TraitGroup - TraitA
> ..
>
> but the above code don't seem to work..
> Any clues, how i can do that?
> Is such kind of composition possible at all?
>
> --
> Best regards,
> Igor Stasenko AKA sig.
>
> _______________________________________________
> Pharo-project mailing list
> Pharo-project(a)lists.gforge.inria.fr
> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
Oct. 25, 2009
Re: [Pharo-project] Feature request: All uses of Trait
by Adrian Lienhard
TClassAndTraitDescription users
Cheers,
Adrian
On Oct 25, 2009, at 06:26 , Igor Stasenko wrote:
> It would be cool to have a 'references-to' support for traits.
> Or maybe its there already?
>
> How can i quickly look, what classes using the trait?
>
> --
> Best regards,
> Igor Stasenko AKA sig.
>
> _______________________________________________
> Pharo-project mailing list
> Pharo-project(a)lists.gforge.inria.fr
> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
Oct. 25, 2009
Re: [Pharo-project] Broken "Recover Lost Changes"
by Adrian Lienhard
Hi John,
Modifying the .changes file is usually not a good idea because methods
have pointers into this file to get to their sources. I thought you
had produces a .st or .cs file from your changes. Can you upload your
zip somewhere?
Cheers,
Adrian
On Oct 25, 2009, at 00:28 , John Toohey wrote:
> I loaded the changes file into Emacs, deleted everything except the
> changes
> since the last save point, and then I got errors on the Traits code.
> I then
> deleted those line, and managed to filein the code successfully. I
> have a
> copy of the image and changes file that was made just before I had the
> crash. I've zipped to to ca 16MB, so I can send those if they would
> be of
> help.
>
>
>
> On Sat, Oct 24, 2009 at 15:09, Adrian Lienhard <adi(a)netstyle.ch>
> wrote:
>
>> You can try to delete the part you posted below (including the
>> last !).
>>
>> In case you can/want to send me your changeset (or the image and
>> changes file) I can take a look.
>>
>> Just to make sure, you selected the top item in the list shown after
>> selecting Tools > "Recover lost changes..."?
>>
>> Cheers,
>> Adrian
>>
>>
>> On Oct 24, 2009, at 19:38 , John Toohey wrote:
>>
>>> Not sure, this is the line from the changes file on disk :-
>>>
>>> !Trait method!
>>> open
>>> self status: #Opened
>>> !
>>>
>>> On Sat, Oct 24, 2009 at 03:09, Stéphane Ducasse
>>> <stephane.ducasse(a)inria.fr>wrote:
>>>
>>>> I think that the closure code shake a lot of foundation and that it
>>>> will take some cycles to get a stable system.
>>>> Now self is indeed not a message so was a period missing in your
>>>> code?
>>>>
>>>> Setf
>>>>
>>>> On Oct 23, 2009, at 10:27 PM, John Toohey wrote:
>>>>
>>>>> I have a 4 day old image that just froze. After restarting, I
>>>>> tried
>>>>> to recover the code changes since I saved my image yesterday, but
>>>>> the list of changes in the tool are an unordered list going back
>>>>> to
>>>>> February of this year. Even old code of mine from that time was in
>>>>> the list. After about an hour I managed to manually select the
>>>>> changes I've made since yesterday, and file them out. When I try
>>>>> to
>>>>> file them back in, I get an error from the debugger, and cannot
>>>>> continue. Anyone know what I can do to recover my source, or point
>>>>> me in the right direction to recover from this.
>>>>>
>>>>> This is the stacktrace from the debugger :-
>>>>>
>>>>> From: jt(a)parspro.com
>>>>> To: Pharo-project(a)lists.gforge.inria.fr
>>>>> Subject: [BUG]UndefinedObject(Object)>>doesNotUnderstand: #self
>>>>>
>>>>> here insert explanation of what you were doing, suspect changes
>>>>> you've made and so forth.
>>>>>
>>>>> 23 October 2009 4:19:05 pm
>>>>>
>>>>> VM: Mac OS - intel - 1058 - Squeak3.8.1 of '28 Aug 2006' [latest
>>>>> update: #6747] Squeak VM 4.1.1b2
>>>>> Image: Pharo1.0beta [Latest update: #10477]
>>>>>
>>>>> SecurityManager state:
>>>>> Restricted: false
>>>>> FileAccess: true
>>>>> SocketAccess: true
>>>>> Working Dir /Users/jpt/Dev/repos/Dev-Images/PharoCore-1.0-10477-
>>>>> BETA
>>>>> Trusted Dir /foobar/tooBar/forSqueak/bogus
>>>>> Untrusted Dir /Users/jpt/Library/Preferences/Squeak/Internet/My
>>>>> Squeak
>>>>>
>>>>> UndefinedObject(Object)>>doesNotUnderstand: #self
>>>>> Receiver: nil
>>>>> Arguments and temporary variables:
>>>>> aMessage: self
>>>>> exception: MessageNotUnderstood: receiver of
>>>>> "self" is
>>>> nil
>>>>> resumeValue: nil
>>>>> Receiver's instance variables:
>>>>> nil
>>>>>
>>>>> UndefinedObject>>DoIt
>>>>> Receiver: nil
>>>>> Arguments and temporary variables:
>>>>>
>>>>> Receiver's instance variables:
>>>>> nil
>>>>>
>>>>> Compiler>>evaluate:in:to:notifying:ifFail:logged:
>>>>> Receiver: a Compiler
>>>>> Arguments and temporary variables:
>>>>> textOrStream: 'publish
>>>>> self status: #Opened
>>>>> '
>>>>> aContext: nil
>>>>> receiver: nil
>>>>> aRequestor: nil
>>>>> failBlock: [closure] in Compiler
>>>>> class>>evaluate:for:notifying:logged:
>>>>> logFlag: false
>>>>> methodNode: DoIt
>>>>> ^ publish self status: #Opened
>>>>> method: a CompiledMethod(982:
>>>> UndefinedObject>>DoIt)
>>>>> value: nil
>>>>> toLog: nil
>>>>> itsSelection: nil
>>>>> itsSelectionString: nil
>>>>> Receiver's instance variables:
>>>>> sourceStream: a ReadStream 'publish
>>>>> self status: #Opened
>>>>> '
>>>>> requestor: nil
>>>>> class: UndefinedObject
>>>>> category: nil
>>>>> context: nil
>>>>> parser: a Parser
>>>>>
>>>>> Compiler class>>evaluate:for:notifying:logged:
>>>>> Receiver: Compiler
>>>>> Arguments and temporary variables:
>>>>> textOrString: 'publish
>>>>> self status: #Opened
>>>>> '
>>>>> anObject: nil
>>>>> aController: nil
>>>>> logFlag: false
>>>>> Receiver's instance variables:
>>>>> superclass: Object
>>>>> methodDict: a MethodDictionary
>>>>> (#compile:in:classified:notifying:ifFail:->a Comp...etc...
>>>>> format: 142
>>>>> instanceVariables: #('sourceStream' 'requestor'
>>>> 'class'
>>>>> 'category' 'context' 'p...etc...
>>>>> organization: ('deprecated'
>>>> format:in:notifying:contentsSymbol:)
>>>>> ('error handli...etc...
>>>>> subclasses: nil
>>>>> name: #Compiler
>>>>> classPool: a Dictionary()
>>>>> sharedPools: nil
>>>>> environment: Smalltalk
>>>>> category: #'Compiler-Kernel'
>>>>> traitComposition: nil
>>>>> localSelectors: nil
>>>>>
>>>>> Compiler class>>evaluate:for:logged:
>>>>> Receiver: Compiler
>>>>> Arguments and temporary variables:
>>>>> textOrString: 'publish
>>>>> self status: #Opened
>>>>> '
>>>>> anObject: nil
>>>>> logFlag: false
>>>>> Receiver's instance variables:
>>>>> superclass: Object
>>>>> methodDict: a MethodDictionary
>>>>> (#compile:in:classified:notifying:ifFail:->a Comp...etc...
>>>>> format: 142
>>>>> instanceVariables: #('sourceStream' 'requestor'
>>>> 'class'
>>>>> 'category' 'context' 'p...etc...
>>>>> organization: ('deprecated'
>>>> format:in:notifying:contentsSymbol:)
>>>>> ('error handli...etc...
>>>>> subclasses: nil
>>>>> name: #Compiler
>>>>> classPool: a Dictionary()
>>>>> sharedPools: nil
>>>>> environment: Smalltalk
>>>>> category: #'Compiler-Kernel'
>>>>> traitComposition: nil
>>>>> localSelectors: nil
>>>>>
>>>>> Compiler class>>evaluate:
>>>>> Receiver: Compiler
>>>>> Arguments and temporary variables:
>>>>> textOrString: 'publish
>>>>> self status: #Opened
>>>>> '
>>>>> Receiver's instance variables:
>>>>> superclass: Object
>>>>> methodDict: a MethodDictionary
>>>>> (#compile:in:classified:notifying:ifFail:->a Comp...etc...
>>>>> format: 142
>>>>> instanceVariables: #('sourceStream' 'requestor'
>>>> 'class'
>>>>> 'category' 'context' 'p...etc...
>>>>> organization: ('deprecated'
>>>> format:in:notifying:contentsSymbol:)
>>>>> ('error handli...etc...
>>>>> subclasses: nil
>>>>> name: #Compiler
>>>>> classPool: a Dictionary()
>>>>> sharedPools: nil
>>>>> environment: Smalltalk
>>>>> category: #'Compiler-Kernel'
>>>>> traitComposition: nil
>>>>> localSelectors: nil
>>>>>
>>>>> [] in ChangeRecord>>fileIn
>>>>> Receiver: a ChangeRecord
>>>>> Arguments and temporary variables:
>>>>> <<error during printing>
>>>>> Receiver's instance variables:
>>>>> file: MultiByteFileStream:
>>>> '/Users/jpt/Dev/repos/Dev-Images/
>>>>> PharoCore-1.0-10477...etc...
>>>>> position: 29712
>>>>> type: #doIt
>>>>> class: nil
>>>>> category: nil
>>>>> meta: nil
>>>>> stamp: nil
>>>>>
>>>>> BlockClosure>>ensure:
>>>>> Receiver: [closure] in ChangeRecord>>fileIn
>>>>> Arguments and temporary variables:
>>>>> aBlock: [closure] in
>>>> CursorWithMask(Cursor)>>showWhile:
>>>>> returnValue: nil
>>>>> b: nil
>>>>> Receiver's instance variables:
>>>>> outerContext: ChangeRecord>>fileIn
>>>>> startpc: 107
>>>>> numArgs: 0
>>>>>
>>>>> CursorWithMask(Cursor)>>showWhile:
>>>>> Receiver: ((CursorWithMask
>>>>> extent: 16@16
>>>>> depth: 1
>>>>> fromArray: #(
>>>>> 2r0
>>>>> 2r0
>>>>> 2r0
>>>>> 2r10000000010...etc...
>>>>> Arguments and temporary variables:
>>>>> aBlock: [closure] in ChangeRecord>>fileIn
>>>>> oldcursor: ((CursorWithMask
>>>>> extent: 16@16
>>>>> depth: 1
>>>>> fromArray: #(
>>>>> 2r0
>>>>> 2r1...etc...
>>>>> Receiver's instance variables:
>>>>> bits: a Bitmap of length 16
>>>>> width: 16
>>>>> height: 16
>>>>> depth: 1
>>>>> offset: -1@-1
>>>>> maskForm: Form(16x16x1)
>>>>>
>>>>> ChangeRecord>>fileIn
>>>>> Receiver: a ChangeRecord
>>>>> Arguments and temporary variables:
>>>>> <<error during printing>
>>>>> Receiver's instance variables:
>>>>> file: MultiByteFileStream:
>>>> '/Users/jpt/Dev/repos/Dev-Images/
>>>>> PharoCore-1.0-10477...etc...
>>>>> position: 29712
>>>>> type: #doIt
>>>>> class: nil
>>>>> category: nil
>>>>> meta: nil
>>>>> stamp: nil
>>>>>
>>>>> [] in ChangeList>>fileInSelections
>>>>> Receiver: a ChangeList
>>>>> Arguments and temporary variables:
>>>>> any: true
>>>>> selected: a ChangeRecord
>>>>> item: #(true)
>>>>> Receiver's instance variables:
>>>>> dependents: a DependentsArray(a
>>>>> SystemWindow(252) a
>>>>> PluggableListMorphOfMany(33...etc...
>>>>> contents: ''
>>>>> currentCompiledMethod: nil
>>>>> contentsSymbol: #showDiffs
>>>>> changeList: an OrderedCollection(a ChangeRecord a
>>>> ChangeRecord a
>>>>> ChangeRecord a...etc...
>>>>> list: an OrderedCollection('do it: ''From
>>>>> Pharo1.0beta of
>>>>> 16...ber 2009 at 3:57...etc...
>>>>> listIndex: 0
>>>>> listSelections: #(true true true true true
>>>>> true
>>>> true true true
>>>>> true true true t...etc...
>>>>> file: MultiByteFileStream:
>>>> '/Users/jpt/Dev/repos/Dev-Images/
>>>>> PharoCore-1.0-10477...etc...
>>>>> lostMethodPointer: nil
>>>>> showsVersions: nil
>>>>>
>>>>> Array(SequenceableCollection)>>with:do:
>>>>> Receiver: #(true true true true true true true true true true
>>>>> true
>>>>> true true true true true true tru...etc...
>>>>> Arguments and temporary variables:
>>>>> otherCollection: an OrderedCollection(a
>>>>> ChangeRecord
>>>> a
>>>>> ChangeRecord a ChangeRec...etc...
>>>>> twoArgBlock: [closure] in
>>>>> ChangeList>>fileInSelections
>>>>> index: 171
>>>>> indexLimiT: 274
>>>>> Receiver's instance variables:
>>>>> #(true true true true true true true true true true true true true
>>>>> true true true true tru...etc...
>>>>>
>>>>> ChangeList>>fileInSelections
>>>>> Receiver: a ChangeList
>>>>> Arguments and temporary variables:
>>>>> any: #(true)
>>>>> Receiver's instance variables:
>>>>> dependents: a DependentsArray(a
>>>>> SystemWindow(252) a
>>>>> PluggableListMorphOfMany(33...etc...
>>>>> contents: ''
>>>>> currentCompiledMethod: nil
>>>>> contentsSymbol: #showDiffs
>>>>> changeList: an OrderedCollection(a ChangeRecord a
>>>> ChangeRecord a
>>>>> ChangeRecord a...etc...
>>>>> list: an OrderedCollection('do it: ''From
>>>>> Pharo1.0beta of
>>>>> 16...ber 2009 at 3:57...etc...
>>>>> listIndex: 0
>>>>> listSelections: #(true true true true true
>>>>> true
>>>> true true true
>>>>> true true true t...etc...
>>>>> file: MultiByteFileStream:
>>>> '/Users/jpt/Dev/repos/Dev-Images/
>>>>> PharoCore-1.0-10477...etc...
>>>>> lostMethodPointer: nil
>>>>> showsVersions: nil
>>>>>
>>>>> PluggableButtonMorph>>performAction
>>>>> Receiver: a PluggableButtonMorph(824)
>>>>> Arguments and temporary variables:
>>>>>
>>>>> Receiver's instance variables:
>>>>> bounds: 1408@359 corner: 1749@383
>>>>> owner: an AlignmentMorph(3699)
>>>>> submorphs: an Array(an AlignmentMorph(921))
>>>>> fullBounds: 1408@359 corner: 1749@383
>>>>> color: (Color r: 0.827 g: 0.827 b: 0.827)
>>>>> extension: a MorphExtension (1404) [balloonText]
>>>> [other:
>>>>> (layoutPolicy -> a T...etc...
>>>>> borderWidth: 0
>>>>> borderColor: Color transparent
>>>>> model: a ChangeList
>>>>> label: 'file in selections'
>>>>> getStateSelector: nil
>>>>> actionSelector: #fileInSelections
>>>>> getLabelSelector: nil
>>>>> getMenuSelector: nil
>>>>> shortcutCharacter: nil
>>>>> askBeforeChanging: true
>>>>> triggerOnMouseDown: false
>>>>> offColor: Color white
>>>>> onColor: Color white
>>>>> feedbackColor: nil
>>>>> showSelectionFeedback: false
>>>>> allButtons: nil
>>>>> arguments: #()
>>>>> argumentsProvider: nil
>>>>> argumentsSelector: nil
>>>>>
>>>>> [] in PluggableButtonMorph>>mouseUp:
>>>>> Receiver: a PluggableButtonMorph(824)
>>>>> Arguments and temporary variables:
>>>>> <<error during printing>
>>>>> Receiver's instance variables:
>>>>> bounds: 1408@359 corner: 1749@383
>>>>> owner: an AlignmentMorph(3699)
>>>>> submorphs: an Array(an AlignmentMorph(921))
>>>>> fullBounds: 1408@359 corner: 1749@383
>>>>> color: (Color r: 0.827 g: 0.827 b: 0.827)
>>>>> extension: a MorphExtension (1404) [balloonText]
>>>> [other:
>>>>> (layoutPolicy -> a T...etc...
>>>>> borderWidth: 0
>>>>> borderColor: Color transparent
>>>>> model: a ChangeList
>>>>> label: 'file in selections'
>>>>> getStateSelector: nil
>>>>> actionSelector: #fileInSelections
>>>>> getLabelSelector: nil
>>>>> getMenuSelector: nil
>>>>> shortcutCharacter: nil
>>>>> askBeforeChanging: true
>>>>> triggerOnMouseDown: false
>>>>> offColor: Color white
>>>>> onColor: Color white
>>>>> feedbackColor: nil
>>>>> showSelectionFeedback: false
>>>>> allButtons: nil
>>>>> arguments: #()
>>>>> argumentsProvider: nil
>>>>> argumentsSelector: nil
>>>>>
>>>>> Array(SequenceableCollection)>>do:
>>>>> Receiver: an Array(a PluggableButtonMorph(786) a
>>>>> PluggableButtonMorph(3485) a PluggableButtonMorph(5...etc...
>>>>> Arguments and temporary variables:
>>>>> aBlock: [closure] in
>>>>> PluggableButtonMorph>>mouseUp:
>>>>> index: 4
>>>>> indexLimiT: 4
>>>>> Receiver's instance variables:
>>>>> an Array(a PluggableButtonMorph(786) a
>>>>> PluggableButtonMorph(3485) a
>>>>> PluggableButtonMorph(5...etc...
>>>>>
>>>>> PluggableButtonMorph>>mouseUp:
>>>>> Receiver: a PluggableButtonMorph(824)
>>>>> Arguments and temporary variables:
>>>>> evt: [1518@375 mouseUp 3690378 nil]
>>>>> all: an Array(a PluggableButtonMorph(786) a
>>>> PluggableButtonMorph
>>>>> (3485) a Plugga...etc...
>>>>> Receiver's instance variables:
>>>>> bounds: 1408@359 corner: 1749@383
>>>>> owner: an AlignmentMorph(3699)
>>>>> submorphs: an Array(an AlignmentMorph(921))
>>>>> fullBounds: 1408@359 corner: 1749@383
>>>>> color: (Color r: 0.827 g: 0.827 b: 0.827)
>>>>> extension: a MorphExtension (1404) [balloonText]
>>>> [other:
>>>>> (layoutPolicy -> a T...etc...
>>>>> borderWidth: 0
>>>>> borderColor: Color transparent
>>>>> model: a ChangeList
>>>>> label: 'file in selections'
>>>>> getStateSelector: nil
>>>>> actionSelector: #fileInSelections
>>>>> getLabelSelector: nil
>>>>> getMenuSelector: nil
>>>>> shortcutCharacter: nil
>>>>> askBeforeChanging: true
>>>>> triggerOnMouseDown: false
>>>>> offColor: Color white
>>>>> onColor: Color white
>>>>> feedbackColor: nil
>>>>> showSelectionFeedback: false
>>>>> allButtons: nil
>>>>> arguments: #()
>>>>> argumentsProvider: nil
>>>>> argumentsSelector: nil
>>>>>
>>>>> PluggableButtonMorph(Morph)>>handleMouseUp:
>>>>> Receiver: a PluggableButtonMorph(824)
>>>>> Arguments and temporary variables:
>>>>> anEvent: [1518@375 mouseUp 3690378 nil]
>>>>> Receiver's instance variables:
>>>>> bounds: 1408@359 corner: 1749@383
>>>>> owner: an AlignmentMorph(3699)
>>>>> submorphs: an Array(an AlignmentMorph(921))
>>>>> fullBounds: 1408@359 corner: 1749@383
>>>>> color: (Color r: 0.827 g: 0.827 b: 0.827)
>>>>> extension: a MorphExtension (1404) [balloonText]
>>>> [other:
>>>>> (layoutPolicy -> a T...etc...
>>>>> borderWidth: 0
>>>>> borderColor: Color transparent
>>>>> model: a ChangeList
>>>>> label: 'file in selections'
>>>>> getStateSelector: nil
>>>>> actionSelector: #fileInSelections
>>>>> getLabelSelector: nil
>>>>> getMenuSelector: nil
>>>>> shortcutCharacter: nil
>>>>> askBeforeChanging: true
>>>>> triggerOnMouseDown: false
>>>>> offColor: Color white
>>>>> onColor: Color white
>>>>> feedbackColor: nil
>>>>> showSelectionFeedback: false
>>>>> allButtons: nil
>>>>> arguments: #()
>>>>> argumentsProvider: nil
>>>>> argumentsSelector: nil
>>>>>
>>>>> MouseButtonEvent>>sentTo:
>>>>> Receiver: [1518@375 mouseUp 3690378 nil]
>>>>> Arguments and temporary variables:
>>>>> anObject: a PluggableButtonMorph(824)
>>>>> Receiver's instance variables:
>>>>> timeStamp: 3690378
>>>>> source: a HandMorph(3216)
>>>>> windowIndex: nil
>>>>> type: #mouseUp
>>>>> buttons: 0
>>>>> position: 1518@375
>>>>> handler: nil
>>>>> wasHandled: true
>>>>> whichButton: 4
>>>>>
>>>>> PluggableButtonMorph(Morph)>>handleEvent:
>>>>> Receiver: a PluggableButtonMorph(824)
>>>>> Arguments and temporary variables:
>>>>> anEvent: [1518@375 mouseUp 3690378 nil]
>>>>> Receiver's instance variables:
>>>>> bounds: 1408@359 corner: 1749@383
>>>>> owner: an AlignmentMorph(3699)
>>>>> submorphs: an Array(an AlignmentMorph(921))
>>>>> fullBounds: 1408@359 corner: 1749@383
>>>>> color: (Color r: 0.827 g: 0.827 b: 0.827)
>>>>> extension: a MorphExtension (1404) [balloonText]
>>>> [other:
>>>>> (layoutPolicy -> a T...etc...
>>>>> borderWidth: 0
>>>>> borderColor: Color transparent
>>>>> model: a ChangeList
>>>>> label: 'file in selections'
>>>>> getStateSelector: nil
>>>>> actionSelector: #fileInSelections
>>>>> getLabelSelector: nil
>>>>> getMenuSelector: nil
>>>>> shortcutCharacter: nil
>>>>> askBeforeChanging: true
>>>>> triggerOnMouseDown: false
>>>>> offColor: Color white
>>>>> onColor: Color white
>>>>> feedbackColor: nil
>>>>> showSelectionFeedback: false
>>>>> allButtons: nil
>>>>> arguments: #()
>>>>> argumentsProvider: nil
>>>>> argumentsSelector: nil
>>>>>
>>>>> PluggableButtonMorph(Morph)>>handleFocusEvent:
>>>>> Receiver: a PluggableButtonMorph(824)
>>>>> Arguments and temporary variables:
>>>>> anEvent: [1518@375 mouseUp 3690378 nil]
>>>>> Receiver's instance variables:
>>>>> bounds: 1408@359 corner: 1749@383
>>>>> owner: an AlignmentMorph(3699)
>>>>> submorphs: an Array(an AlignmentMorph(921))
>>>>> fullBounds: 1408@359 corner: 1749@383
>>>>> color: (Color r: 0.827 g: 0.827 b: 0.827)
>>>>> extension: a MorphExtension (1404) [balloonText]
>>>> [other:
>>>>> (layoutPolicy -> a T...etc...
>>>>> borderWidth: 0
>>>>> borderColor: Color transparent
>>>>> model: a ChangeList
>>>>> label: 'file in selections'
>>>>> getStateSelector: nil
>>>>> actionSelector: #fileInSelections
>>>>> getLabelSelector: nil
>>>>> getMenuSelector: nil
>>>>> shortcutCharacter: nil
>>>>> askBeforeChanging: true
>>>>> triggerOnMouseDown: false
>>>>> offColor: Color white
>>>>> onColor: Color white
>>>>> feedbackColor: nil
>>>>> showSelectionFeedback: false
>>>>> allButtons: nil
>>>>> arguments: #()
>>>>> argumentsProvider: nil
>>>>> argumentsSelector: nil
>>>>>
>>>>> [] in HandMorph>>sendFocusEvent:to:clear:
>>>>> Receiver: a HandMorph(3216)
>>>>> Arguments and temporary variables:
>>>>> <<error during printing>
>>>>> Receiver's instance variables:
>>>>> bounds: 1661@782 corner: 1677@798
>>>>> owner: a PasteUpMorph(1622) [world]
>>>>> submorphs: #()
>>>>> fullBounds: 1661@782 corner: 1677@798
>>>>> color: Color blue
>>>>> extension: a MorphExtension (539) [eventHandler
>>>>> = an
>>>> EventHandler]
>>>>> mouseFocus: nil
>>>>> keyboardFocus: nil
>>>>> eventListeners: nil
>>>>> mouseListeners: nil
>>>>> keyboardListeners: nil
>>>>> mouseClickState: nil
>>>>> mouseOverHandler: a MouseOverHandler
>>>>> lastMouseEvent: [1661@782 mouseUp 3788444 nil]
>>>>> targetOffset: 99@6
>>>>> damageRecorder: a DamageRecorder
>>>>> cacheCanvas: nil
>>>>> cachedCanvasHasHoles: true
>>>>> temporaryCursor: nil
>>>>> temporaryCursorOffset: nil
>>>>> hardwareCursor: nil
>>>>> hasChanged: true
>>>>> savedPatch: nil
>>>>> userInitials: ''
>>>>> lastEventBuffer: #(1 3788444 1661 782 0 0 0 1)
>>>>> lastKeyScanCode: 126
>>>>> combinedChar: nil
>>>>>
>>>>> [] in PasteUpMorph>>becomeActiveDuring:
>>>>> Receiver: a PasteUpMorph(1622) [world]
>>>>> Arguments and temporary variables:
>>>>> <<error during printing>
>>>>> Receiver's instance variables:
>>>>> bounds: 0@0 corner: 1920@1178
>>>>> owner: nil
>>>>> submorphs: an Array(a TaskbarMorph(3095) a
>>>> SystemWindow(3356) a
>>>>> SystemWindow(25...etc...
>>>>> fullBounds: nil
>>>>> color: Color gray
>>>>> extension: a MorphExtension (2543) [eventHandler
>>>>> = an
>>>>> EventHandler] [other: (...etc...
>>>>> borderWidth: 0
>>>>> borderColor: (Color r: 0.5 g: 0.5 b: 0.5)
>>>>> presenter: a Presenter (1246)
>>>>> model: a MorphicModel(1926)
>>>>> cursor: 1
>>>>> padding: 3
>>>>> backgroundMorph: nil
>>>>> isPartsBin: nil
>>>>> autoLineLayout: false
>>>>> indicateCursor: nil
>>>>> resizeToFit: nil
>>>>> wantsMouseOverHalos: nil
>>>>> worldState: a WorldState
>>>>> griddingOn: nil
>>>>>
>>>>> BlockClosure>>on:do:
>>>>> Receiver: [closure] in PasteUpMorph>>becomeActiveDuring:
>>>>> Arguments and temporary variables:
>>>>> exception: Error
>>>>> handlerAction: [closure] in
>>>> PasteUpMorph>>becomeActiveDuring:
>>>>> handlerActive: false
>>>>> Receiver's instance variables:
>>>>> outerContext: PasteUpMorph>>becomeActiveDuring:
>>>>> startpc: 67
>>>>> numArgs: 0
>>>>>
>>>>> PasteUpMorph>>becomeActiveDuring:
>>>>> Receiver: a PasteUpMorph(1622) [world]
>>>>> Arguments and temporary variables:
>>>>> aBlock: [closure] in
>>>> HandMorph>>sendFocusEvent:to:clear:
>>>>> priorWorld: a PasteUpMorph(1622) [world]
>>>>> priorHand: a HandMorph(3216)
>>>>> priorEvent: [1518@375 mouseOver red nil nil]
>>>>> Receiver's instance variables:
>>>>> bounds: 0@0 corner: 1920@1178
>>>>> owner: nil
>>>>> submorphs: an Array(a TaskbarMorph(3095) a
>>>> SystemWindow(3356) a
>>>>> SystemWindow(25...etc...
>>>>> fullBounds: nil
>>>>> color: Color gray
>>>>> extension: a MorphExtension (2543) [eventHandler
>>>>> = an
>>>>> EventHandler] [other: (...etc...
>>>>> borderWidth: 0
>>>>> borderColor: (Color r: 0.5 g: 0.5 b: 0.5)
>>>>> presenter: a Presenter (1246)
>>>>> model: a MorphicModel(1926)
>>>>> cursor: 1
>>>>> padding: 3
>>>>> backgroundMorph: nil
>>>>> isPartsBin: nil
>>>>> autoLineLayout: false
>>>>> indicateCursor: nil
>>>>> resizeToFit: nil
>>>>> wantsMouseOverHalos: nil
>>>>> worldState: a WorldState
>>>>> griddingOn: nil
>>>>>
>>>>> HandMorph>>sendFocusEvent:to:clear:
>>>>> Receiver: a HandMorph(3216)
>>>>> Arguments and temporary variables:
>>>>> anEvent: [1518@375 mouseUp 3690378 nil]
>>>>> focusHolder: a PluggableButtonMorph(824)
>>>>> aBlock: [closure] in
>>>>> HandMorph>>sendMouseEvent:
>>>>> w: a PasteUpMorph(1622) [world]
>>>>> result: #(nil)
>>>>> Receiver's instance variables:
>>>>> bounds: 1661@782 corner: 1677@798
>>>>> owner: a PasteUpMorph(1622) [world]
>>>>> submorphs: #()
>>>>> fullBounds: 1661@782 corner: 1677@798
>>>>> color: Color blue
>>>>> extension: a MorphExtension (539) [eventHandler
>>>>> = an
>>>> EventHandler]
>>>>> mouseFocus: nil
>>>>> keyboardFocus: nil
>>>>> eventListeners: nil
>>>>> mouseListeners: nil
>>>>> keyboardListeners: nil
>>>>> mouseClickState: nil
>>>>> mouseOverHandler: a MouseOverHandler
>>>>> lastMouseEvent: [1661@782 mouseUp 3788444 nil]
>>>>> targetOffset: 99@6
>>>>> damageRecorder: a DamageRecorder
>>>>> cacheCanvas: nil
>>>>> cachedCanvasHasHoles: true
>>>>> temporaryCursor: nil
>>>>> temporaryCursorOffset: nil
>>>>> hardwareCursor: nil
>>>>> hasChanged: true
>>>>> savedPatch: nil
>>>>> userInitials: ''
>>>>> lastEventBuffer: #(1 3788444 1661 782 0 0 0 1)
>>>>> lastKeyScanCode: 126
>>>>> combinedChar: nil
>>>>>
>>>>> HandMorph>>sendEvent:focus:clear:
>>>>> Receiver: a HandMorph(3216)
>>>>> Arguments and temporary variables:
>>>>> anEvent: [1518@375 mouseUp 3690378 nil]
>>>>> focusHolder: a PluggableButtonMorph(824)
>>>>> aBlock: [closure] in
>>>>> HandMorph>>sendMouseEvent:
>>>>> result: nil
>>>>> Receiver's instance variables:
>>>>> bounds: 1661@782 corner: 1677@798
>>>>> owner: a PasteUpMorph(1622) [world]
>>>>> submorphs: #()
>>>>> fullBounds: 1661@782 corner: 1677@798
>>>>> color: Color blue
>>>>> extension: a MorphExtension (539) [eventHandler
>>>>> = an
>>>> EventHandler]
>>>>> mouseFocus: nil
>>>>> keyboardFocus: nil
>>>>> eventListeners: nil
>>>>> mouseListeners: nil
>>>>> keyboardListeners: nil
>>>>> mouseClickState: nil
>>>>> mouseOverHandler: a MouseOverHandler
>>>>> lastMouseEvent: [1661@782 mouseUp 3788444 nil]
>>>>> targetOffset: 99@6
>>>>> damageRecorder: a DamageRecorder
>>>>> cacheCanvas: nil
>>>>> cachedCanvasHasHoles: true
>>>>> temporaryCursor: nil
>>>>> temporaryCursorOffset: nil
>>>>> hardwareCursor: nil
>>>>> hasChanged: true
>>>>> savedPatch: nil
>>>>> userInitials: ''
>>>>> lastEventBuffer: #(1 3788444 1661 782 0 0 0 1)
>>>>> lastKeyScanCode: 126
>>>>> combinedChar: nil
>>>>>
>>>>> HandMorph>>sendMouseEvent:
>>>>> Receiver: a HandMorph(3216)
>>>>> Arguments and temporary variables:
>>>>> anEvent: [1518@375 mouseUp 3690378 nil]
>>>>> Receiver's instance variables:
>>>>> bounds: 1661@782 corner: 1677@798
>>>>> owner: a PasteUpMorph(1622) [world]
>>>>> submorphs: #()
>>>>> fullBounds: 1661@782 corner: 1677@798
>>>>> color: Color blue
>>>>> extension: a MorphExtension (539) [eventHandler
>>>>> = an
>>>> EventHandler]
>>>>> mouseFocus: nil
>>>>> keyboardFocus: nil
>>>>> eventListeners: nil
>>>>> mouseListeners: nil
>>>>> keyboardListeners: nil
>>>>> mouseClickState: nil
>>>>> mouseOverHandler: a MouseOverHandler
>>>>> lastMouseEvent: [1661@782 mouseUp 3788444 nil]
>>>>> targetOffset: 99@6
>>>>> damageRecorder: a DamageRecorder
>>>>> cacheCanvas: nil
>>>>> cachedCanvasHasHoles: true
>>>>> temporaryCursor: nil
>>>>> temporaryCursorOffset: nil
>>>>> hardwareCursor: nil
>>>>> hasChanged: true
>>>>> savedPatch: nil
>>>>> userInitials: ''
>>>>> lastEventBuffer: #(1 3788444 1661 782 0 0 0 1)
>>>>> lastKeyScanCode: 126
>>>>> combinedChar: nil
>>>>>
>>>>> HandMorph>>handleEvent:
>>>>> Receiver: a HandMorph(3216)
>>>>> Arguments and temporary variables:
>>>>> anEvent: [1518@375 mouseUp 3690378 nil]
>>>>> evt: [1518@375 mouseUp 3690378 nil]
>>>>> ofs: nil
>>>>> Receiver's instance variables:
>>>>> bounds: 1661@782 corner: 1677@798
>>>>> owner: a PasteUpMorph(1622) [world]
>>>>> submorphs: #()
>>>>> fullBounds: 1661@782 corner: 1677@798
>>>>> color: Color blue
>>>>> extension: a MorphExtension (539) [eventHandler
>>>>> = an
>>>> EventHandler]
>>>>> mouseFocus: nil
>>>>> keyboardFocus: nil
>>>>> eventListeners: nil
>>>>> mouseListeners: nil
>>>>> keyboardListeners: nil
>>>>> mouseClickState: nil
>>>>> mouseOverHandler: a MouseOverHandler
>>>>> lastMouseEvent: [1661@782 mouseUp 3788444 nil]
>>>>> targetOffset: 99@6
>>>>> damageRecorder: a DamageRecorder
>>>>> cacheCanvas: nil
>>>>> cachedCanvasHasHoles: true
>>>>> temporaryCursor: nil
>>>>> temporaryCursorOffset: nil
>>>>> hardwareCursor: nil
>>>>> hasChanged: true
>>>>> savedPatch: nil
>>>>> userInitials: ''
>>>>> lastEventBuffer: #(1 3788444 1661 782 0 0 0 1)
>>>>> lastKeyScanCode: 126
>>>>> combinedChar: nil
>>>>>
>>>>> HandMorph>>processEvents
>>>>> Receiver: a HandMorph(3216)
>>>>> Arguments and temporary variables:
>>>>> evt: [1518@375 mouseUp 3690378 nil]
>>>>> evtBuf: #(1 3690378 1518 375 0 0 0 1)
>>>>> type: 1
>>>>> hadAny: false
>>>>> Receiver's instance variables:
>>>>> bounds: 1661@782 corner: 1677@798
>>>>> owner: a PasteUpMorph(1622) [world]
>>>>> submorphs: #()
>>>>> fullBounds: 1661@782 corner: 1677@798
>>>>> color: Color blue
>>>>> extension: a MorphExtension (539) [eventHandler
>>>>> = an
>>>> EventHandler]
>>>>> mouseFocus: nil
>>>>> keyboardFocus: nil
>>>>> eventListeners: nil
>>>>> mouseListeners: nil
>>>>> keyboardListeners: nil
>>>>> mouseClickState: nil
>>>>> mouseOverHandler: a MouseOverHandler
>>>>> lastMouseEvent: [1661@782 mouseUp 3788444 nil]
>>>>> targetOffset: 99@6
>>>>> damageRecorder: a DamageRecorder
>>>>> cacheCanvas: nil
>>>>> cachedCanvasHasHoles: true
>>>>> temporaryCursor: nil
>>>>> temporaryCursorOffset: nil
>>>>> hardwareCursor: nil
>>>>> hasChanged: true
>>>>> savedPatch: nil
>>>>> userInitials: ''
>>>>> lastEventBuffer: #(1 3788444 1661 782 0 0 0 1)
>>>>> lastKeyScanCode: 126
>>>>> combinedChar: nil
>>>>>
>>>>> [] in WorldState>>doOneCycleNowFor:
>>>>> Receiver: a WorldState
>>>>> Arguments and temporary variables:
>>>>> <<error during printing>
>>>>> Receiver's instance variables:
>>>>> hands: an Array(a HandMorph(3216))
>>>>> viewBox: 0@0 corner: 1920@1178
>>>>> canvas: a FormCanvas on:
>>>> DisplayScreen(1920x1178x32)
>>>>> damageRecorder: a DamageRecorder
>>>>> stepList: a Heap(StepMessage(#stepAt: ->
>>>>> 3PButton
>>>>> (#togglePrettyDiffing 247))(3P...etc...
>>>>> lastStepTime: 3788426
>>>>> lastStepMessage: nil
>>>>> lastCycleTime: 3788446
>>>>> commandHistory: a CommandHistory
>>>>> alarms: a Heap()
>>>>> lastAlarmTime: 3788426
>>>>>
>>>>> Array(SequenceableCollection)>>do:
>>>>> Receiver: an Array(a HandMorph(3216))
>>>>> Arguments and temporary variables:
>>>>> aBlock: [closure] in
>>>>> WorldState>>doOneCycleNowFor:
>>>>> index: 1
>>>>> indexLimiT: 1
>>>>> Receiver's instance variables:
>>>>> an Array(a HandMorph(3216))
>>>>>
>>>>> WorldState>>handsDo:
>>>>> Receiver: a WorldState
>>>>> Arguments and temporary variables:
>>>>> aBlock: [closure] in
>>>>> WorldState>>doOneCycleNowFor:
>>>>> Receiver's instance variables:
>>>>> hands: an Array(a HandMorph(3216))
>>>>> viewBox: 0@0 corner: 1920@1178
>>>>> canvas: a FormCanvas on:
>>>> DisplayScreen(1920x1178x32)
>>>>> damageRecorder: a DamageRecorder
>>>>> stepList: a Heap(StepMessage(#stepAt: ->
>>>>> 3PButton
>>>>> (#togglePrettyDiffing 247))(3P...etc...
>>>>> lastStepTime: 3788426
>>>>> lastStepMessage: nil
>>>>> lastCycleTime: 3788446
>>>>> commandHistory: a CommandHistory
>>>>> alarms: a Heap()
>>>>> lastAlarmTime: 3788426
>>>>>
>>>>> WorldState>>doOneCycleNowFor:
>>>>> Receiver: a WorldState
>>>>> Arguments and temporary variables:
>>>>> aWorld: a PasteUpMorph(1622) [world]
>>>>> Receiver's instance variables:
>>>>> hands: an Array(a HandMorph(3216))
>>>>> viewBox: 0@0 corner: 1920@1178
>>>>> canvas: a FormCanvas on:
>>>> DisplayScreen(1920x1178x32)
>>>>> damageRecorder: a DamageRecorder
>>>>> stepList: a Heap(StepMessage(#stepAt: ->
>>>>> 3PButton
>>>>> (#togglePrettyDiffing 247))(3P...etc...
>>>>> lastStepTime: 3788426
>>>>> lastStepMessage: nil
>>>>> lastCycleTime: 3788446
>>>>> commandHistory: a CommandHistory
>>>>> alarms: a Heap()
>>>>> lastAlarmTime: 3788426
>>>>>
>>>>> WorldState>>doOneCycleFor:
>>>>> Receiver: a WorldState
>>>>> Arguments and temporary variables:
>>>>> aWorld: a PasteUpMorph(1622) [world]
>>>>> Receiver's instance variables:
>>>>> hands: an Array(a HandMorph(3216))
>>>>> viewBox: 0@0 corner: 1920@1178
>>>>> canvas: a FormCanvas on:
>>>> DisplayScreen(1920x1178x32)
>>>>> damageRecorder: a DamageRecorder
>>>>> stepList: a Heap(StepMessage(#stepAt: ->
>>>>> 3PButton
>>>>> (#togglePrettyDiffing 247))(3P...etc...
>>>>> lastStepTime: 3788426
>>>>> lastStepMessage: nil
>>>>> lastCycleTime: 3788446
>>>>> commandHistory: a CommandHistory
>>>>> alarms: a Heap()
>>>>> lastAlarmTime: 3788426
>>>>>
>>>>> PasteUpMorph>>doOneCycle
>>>>> Receiver: a PasteUpMorph(1622) [world]
>>>>> Arguments and temporary variables:
>>>>>
>>>>> Receiver's instance variables:
>>>>> bounds: 0@0 corner: 1920@1178
>>>>> owner: nil
>>>>> submorphs: an Array(a TaskbarMorph(3095) a
>>>> SystemWindow(3356) a
>>>>> SystemWindow(25...etc...
>>>>> fullBounds: nil
>>>>> color: Color gray
>>>>> extension: a MorphExtension (2543) [eventHandler
>>>>> = an
>>>>> EventHandler] [other: (...etc...
>>>>> borderWidth: 0
>>>>> borderColor: (Color r: 0.5 g: 0.5 b: 0.5)
>>>>> presenter: a Presenter (1246)
>>>>> model: a MorphicModel(1926)
>>>>> cursor: 1
>>>>> padding: 3
>>>>> backgroundMorph: nil
>>>>> isPartsBin: nil
>>>>> autoLineLayout: false
>>>>> indicateCursor: nil
>>>>> resizeToFit: nil
>>>>> wantsMouseOverHalos: nil
>>>>> worldState: a WorldState
>>>>> griddingOn: nil
>>>>>
>>>>> [] in Project class>>spawnNewProcess
>>>>> Receiver: Project
>>>>> Arguments and temporary variables:
>>>>>
>>>>> Receiver's instance variables:
>>>>> superclass: Model
>>>>> methodDict: a MethodDictionary(size 167)
>>>>> format: 172
>>>>> instanceVariables: #('world' 'changeSet'
>>>>> 'transcript'
>>>>> 'parentProject' 'previous...etc...
>>>>> organization: ('*Polymorph-Widgets'
>>>>> assureTaskbarPresenceMatchesPreference crea...etc...
>>>>> subclasses: nil
>>>>> name: #Project
>>>>> classPool: a Dictionary(#AllProjects->an
>>>> OrderedCollection(a
>>>>> Project(Juliet)) #...etc...
>>>>> sharedPools: nil
>>>>> environment: Smalltalk
>>>>> category: #'System-Support'
>>>>> traitComposition: {}
>>>>> localSelectors: nil
>>>>>
>>>>> [] in BlockClosure>>newProcess
>>>>> Receiver: [closure] in Project class>>spawnNewProcess
>>>>> Arguments and temporary variables:
>>>>>
>>>>> Receiver's instance variables:
>>>>> outerContext: Project class>>spawnNewProcess
>>>>> startpc: 53
>>>>> numArgs: 0
>>>>>
>>>>>
>>>>> --- The full stack ---
>>>>> UndefinedObject(Object)>>doesNotUnderstand: #self
>>>>> UndefinedObject>>DoIt
>>>>> Compiler>>evaluate:in:to:notifying:ifFail:logged:
>>>>> Compiler class>>evaluate:for:notifying:logged:
>>>>> Compiler class>>evaluate:for:logged:
>>>>> Compiler class>>evaluate:
>>>>> [] in ChangeRecord>>fileIn
>>>>> BlockClosure>>ensure:
>>>>> CursorWithMask(Cursor)>>showWhile:
>>>>> ChangeRecord>>fileIn
>>>>> [] in ChangeList>>fileInSelections
>>>>> Array(SequenceableCollection)>>with:do:
>>>>> ChangeList>>fileInSelections
>>>>> PluggableButtonMorph>>performAction
>>>>> [] in PluggableButtonMorph>>mouseUp:
>>>>> Array(SequenceableCollection)>>do:
>>>>> PluggableButtonMorph>>mouseUp:
>>>>> PluggableButtonMorph(Morph)>>handleMouseUp:
>>>>> MouseButtonEvent>>sentTo:
>>>>> PluggableButtonMorph(Morph)>>handleEvent:
>>>>> PluggableButtonMorph(Morph)>>handleFocusEvent:
>>>>> [] in HandMorph>>sendFocusEvent:to:clear:
>>>>> [] in PasteUpMorph>>becomeActiveDuring:
>>>>> BlockClosure>>on:do:
>>>>> PasteUpMorph>>becomeActiveDuring:
>>>>> HandMorph>>sendFocusEvent:to:clear:
>>>>> 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 Project class>>spawnNewProcess
>>>>> [] in BlockClosure>>newProcess
>>>>>
>>>>>
>>>>> --
>>>>> -JT
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Pharo-project mailing list
>>>>> Pharo-project(a)lists.gforge.inria.fr
>>>>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-
>>>>> project
>>>>
>>>>
>>>> _______________________________________________
>>>> Pharo-project mailing list
>>>> Pharo-project(a)lists.gforge.inria.fr
>>>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>>>>
>>>
>>>
>>>
>>> --
>>> -JT
>>> _______________________________________________
>>> Pharo-project mailing list
>>> Pharo-project(a)lists.gforge.inria.fr
>>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>>
>>
>> _______________________________________________
>> Pharo-project mailing list
>> Pharo-project(a)lists.gforge.inria.fr
>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>>
>
>
>
> --
> -JT
> _______________________________________________
> Pharo-project mailing list
> Pharo-project(a)lists.gforge.inria.fr
> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
Oct. 25, 2009
Re: [Pharo-project] hashing collections
by Andres Valloud
Watch out for cancellation effects... if the collections are
sequenceable and the hash values of their contents are not well
distributed, you may end up with performance issues because the hash
values cancel each other because the hash function commutes. Consider
for example the hash value of the following collections:
#(1 2 3)
#(1 2 3 4 4)
#(1 2 3 5 5)
#(1 4 2 3 4)
#(5 4 3 2 1 4 5)
#(6)
#(1 2 3 4 5 6 5 4 3 2 1)
I am not familiar with your application, though, so perhaps the data
does not cause these problems.
Andres.
Ralph Boland wrote:
> Food for thought:
>
> In my finite state machine generator I do a lot of
> hashing of sometimes large collections.
> For performance reasons I created hash value storing versions
> of the relevant collection classes. Getting the hash value
> of the hashed version of a collection was then very fast
> (accessing an instance value) and the hash values were good.
>
> For example, for Array I created HashArray The hash
> value of a HashArray was the XOR of the hash values of
> the elements of the HashArray. Note that this meant
> that each time you changed the entry in a HashArray
> you had to update the hash value.
> So for HashArray at: index put: object would look something
> like:
>
> hash := (hash xor: object hash) xor: (self at: index).
> super at: index put: object.
>
> If you like living on the edge you could instead leave out updating
> the hash value until you put the HashArray object where its hash
> value would be needed (like a Set or Dictionary (key)).
> This is of course error prone but then
> putting collections in Sets or Dictionaries (keys)
> is inherently error prone anyway because modifying the collection
> changes its hash value thus breaking every Set or Dictionary
> containing the collection.
>
> I would be temped to have all real collection classes (e.g. not Interval)
> not be storable in Sets or Dictionaries (key) at all and instead require
> hash versions of the collection be used but of course this would
> surely break a lot of things.
>
> Ralph Boland
>
>
>
Oct. 25, 2009
Re: [Pharo-project] HashTable vs Dictionary
by Andres Valloud
Quick tests show using #hash instead of #scaledIdentityHash makes the
system dictionary need 30% more time to retrieve all its keys. I didn't
try adding. The system dictionary size was about 3500.
Lukas Renggli wrote:
> Yeah, that could be a problem. Strangely SystemDictionary is a
> subclass of IdentityDictionary.
>
> It can be easily fixed, don't know if this has much of an impact on
> performance if the dictionary is smaller:
>
> SystemDictionary superclass: Dictionary.
> SystemDictionary allInstances do: [ :each | each rehash ]
>
> Lukas
>
> 2009/10/25 Stéphane Ducasse <stephane.ducasse(a)inria.fr>:
>
>> Ok I see. I would be curious to see if SystemDictionary does not
>> degrade once we load
>> Moose, Mondrian, Glamour....
>>
>>
>>>> So this means that by default we have bad performance. no?
>>>>
>>> No.
>>>
>>> In a fresh Pharo Web image less than 6% of the keys in Dictionaries
>>> and less than 10% of the values in Sets have a weak-hashes. Moreover
>>> the largest set with weak-hash values has 516 elements (on average
>>> only 1.8 elements), the largest dictionary with weak-hash keys has
>>> 1002 elements (on average only 4.3 elements). Using HashTable in such
>>> a situation would introduce a major speed penalty and waste a lot of
>>> memory.
>>>
>>> It would be cool if the Set and the Dictionary would choose their
>>> implementation strategy automatically depending on the use-case. In a
>>> standard Pharo image however that would just be the current
>>> implementation. There are simply no instances in the image where it
>>> would be worthwhile (large amount of data with bad hash) to use a
>>> HashMap.
>>>
>>> Lukas
>>>
>>> --
>>> Lukas Renggli
>>> http://www.lukas-renggli.ch
>>>
>>> _______________________________________________
>>> Pharo-project mailing list
>>> Pharo-project(a)lists.gforge.inria.fr
>>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>>>
>> _______________________________________________
>> Pharo-project mailing list
>> Pharo-project(a)lists.gforge.inria.fr
>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>>
>>
>
>
>
>
Oct. 25, 2009
Re: [Pharo-project] HashTable vs Dictionary
by Andres Valloud
Martin et al,
Here is a series of checkpointed changesets that mutate the latest RC
Pharo image. Load the changesets in strict alphabetical order. I made
a few small changes compared to Martin's changes, hopefully I didn't
miss anything.
Note that the changesets S1 through S3 modify SystemDictionary to be a
hash based collection. For the SystemDictionary sizes I have in my
image, this makes things slower. However, I'd expect that, as the
system dictionary grows, using #hash will become faster than using
#scaledIdentityHash. If you want to load these changes later, make sure
to load changeset A, then S1 through S3, and finally Z (I am hoping B's
hacks, which are undone by W, are not needed).
Enjoy!... I hope :). Let me know what you think.
Andres.
Martin McClure wrote:
> Stéphane Ducasse wrote:
>
>> Ok I see. I would be curious to see if SystemDictionary does not
>> degrade once we load
>> Moose, Mondrian, Glamour....
>>
>
> SystemDictionary is a subclass of IdentityDictionary, which does have
> some performance problems right around 2K elements, and more severe
> performance problems at sizes around 4K elements, but it's not nearly as
> bad as Set and Dictionary.
>
> But the hashed collection hash-spreading and prime table size code I
> sent yesterday gets rid of those bumps, so it's fast from very small
> sizes up through sizes > 10000, with very gradual degradation after that.
>
> Regards,
>
> -Martin
>
> _______________________________________________
> Pharo-project mailing list
> Pharo-project(a)lists.gforge.inria.fr
> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>
>
Oct. 25, 2009
[Pharo-project] Some bugs I ran into while working on hashing
by Andres Valloud
Hello, are these problems known? I am using the latest RC build.
* Create changeset X. Touch method Foo>>bar. Create changeset Y.
Touch method Foo>>bar again. Fileout changeset X. The fileout has the
code for changeset Y.
* Delete the first ! in a changeset with a preamble. Try to load it
from the file tool. You get a syntax error. However, the progress bar
does not go away. Is the file handle released?
* Integer>>isPrime should not be probabilistic. Suggestion: rename it
to Integer>>isMostLikelyPrime or something similar. Implement a
deterministic prime check for isPrime (even if it is slow --- users then
can decide whether they want a deterministic or probabilistic answer).
Here's a rough sketch of Integer>>isPrime:
isPrime
| guess guessSquared delta selfSqrtFloor |
self <= 1 ifTrue: [^self error: 'operation undefined'].
self even ifTrue: [^self = 2].
guess := 1 bitShift: self highBit + 1 // 2.
[
guessSquared := guess * guess.
delta := guessSquared - self // (guess bitShift: 1).
delta = 0
] whileFalse: [guess := guess - delta].
guessSquared = self ifFalse: [guess := guess - 1].
selfSqrtFloor := guess.
3 to: selfSqrtFloor by: 2 do: [:each | self \\ each = 0 ifTrue:
[^false]].
^true
Also, the above code can be used to implement sqrtFloor and sqrtRounded
in Integer. I am sure Nicolas Cellier remembers this :). Finally, I'm
not sure that isPrime should fail with "undefined operation" if the
receiver is <= 1. 1 is certainly not prime. Primes must be positive,
so zero and the negatives could just answer false. ???...
* Open an inspector on e.g.: Smalltalk. In the code pane, type:
self keys inject: Set new into: [:t :x | t add: x class; yourself]
Using the mouse, select the expression, and inspect the result using the
right button menu item. The result comes up. However, the inspector on
Smalltalk experiences a failure in one of its panes because lines is nil
in MultiNewParagraph(NewParagraph)>>fastFindFirstLineSuchThat:
Andres.
Oct. 25, 2009
Re: [Pharo-project] HashTable vs Dictionary
by Martin McClure
Stéphane Ducasse wrote:
> Ok I see. I would be curious to see if SystemDictionary does not
> degrade once we load
> Moose, Mondrian, Glamour....
SystemDictionary is a subclass of IdentityDictionary, which does have
some performance problems right around 2K elements, and more severe
performance problems at sizes around 4K elements, but it's not nearly as
bad as Set and Dictionary.
But the hashed collection hash-spreading and prime table size code I
sent yesterday gets rid of those bumps, so it's fast from very small
sizes up through sizes > 10000, with very gradual degradation after that.
Regards,
-Martin
Oct. 25, 2009