Pharo-dev
By thread
pharo-dev@lists.pharo.org
By month
Messages by month
- ----- 2026 -----
- August
- 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
- 3 participants
- 144616 messages
Re: [Pharo-project] Thread-safe collections
by Stéphane Ducasse
On Oct 23, 2009, at 3:31 PM, Schwab,Wilhelm K wrote:
> Stef,
>
> With no disrespect to Sig's opinions, I'm glad to hear that. I very
> quickly cobbled together a class called SharedLookupTable, and have
> no problems making it (suitably debugged) available.
>
> Now it's time for me to kick your ass a little, to coin a phrase :)
no problem
> Monticello is pretty good at what it does, but I sense the things it
> does not do interfering with good decision making. The class ended
> up in my Dolphin compatibility package, in part because it belongs
> there, though it really should be separate so I can easily release
> it and people would be able to get it w/o having to accept other
> ideas they might not want. But it went in the compatiblity package
> so I would not have to mess around with another package. Saving
> them is a pain; loading them into a new image is a pain.
why?
> Saving: the interface works well once understood, and the features
> it offers should never go away. However, either by script or by
> multiple selection, it would be nice to provide a comment to be
> applied to everything to be saved "now" vs. having to be prompted
> for it, then have the list scroll, then have to click away another
> window. Do that 30 times and it starts to get old.
this is strange because I thought that we fixed that pop up plague
when saving slices
Then you get all the comments you already typed in one of the button
of the poped up window. Did you see it?
> Loading: I spent a chunk of yesterday trying to build an RC1 image.
> Doing so revealed that my script-loader for script-loader does not
> validate package names. I had one build attempt come to a halt over
> case-sensitivity; I do not mind that. What I mind is that the
> particular case mix in question was more or less forced on me by a
> typo of mine. If MC were better about offering choices when they
> apply, I might not have typed it that way.
>
> I realize that Gofer is coming, and it might fix a lot of this.
yes
and also metacello which is coming along well
> The ideas above are probably not new, but I list them just in case.
>
> Bill
>
>
>
> -----Original Message-----
> From: pharo-project-bounces(a)lists.gforge.inria.fr [mailto:pharo-
> project-bounces(a)lists.gforge.inria.fr] On Behalf Of Stéphane Ducasse
> Sent: Friday, October 23, 2009 2:46 AM
> To: Pharo-project(a)lists.gforge.inria.fr
> Subject: Re: [Pharo-project] Thread-safe collections
>
> I would really like to see some packages getting implementing around
> the idea of a couple of robust and well tested thread safe
> collections.
>
> Stef
>
> On Oct 23, 2009, at 2:16 AM, Schwab,Wilhelm K wrote:
>
>> Sig,
>>
>> One can always construct examples in which protecting the entire
>> loop is the better option. That's not the scenario of interest.
>> Just as shared queues are useful, shared sets and dictionaries have
>> value for sporadic access scenarios. Doing it your way, everyone
>> writes their own incompletely protected (read buggy/dangerous) ad-
>> hoc
>> implementations of these common collections.
>>
>> I favor having solid implementations that are complete and as correct
>> as we can get them, leaving people to optimize as you suggest when it
>> makes sense to do so.
>>
>> Bill
>>
>>
>> -----Original Message-----
>> From: pharo-project-bounces(a)lists.gforge.inria.fr [mailto:pharo-
>> project-bounces(a)lists.gforge.inria.fr] On Behalf Of Igor Stasenko
>> Sent: Thursday, October 22, 2009 5:23 PM
>> To: Pharo-project(a)lists.gforge.inria.fr
>> Subject: Re: [Pharo-project] Thread-safe collections
>>
>> 2009/10/23 Schwab,Wilhelm K <bschwab(a)anest.ufl.edu>:
>>> Hello all,
>>>
>>> I just looked around for thread-safe collections, and found nothing
>>> that looks like a shared dictionary. The squeak-dev archives
>>> contain
>>> the obligatory newbie posts (wanting all collections to be thread
>>> safe) and the expected replies, some of which are overly dismissive
>>> of the idea. Something that protects things like
>>> #at:ifAbsentPut: and friends is _really_ useful. Am I missing an
>>> existing implementation?
>>>
>>
>> Imo, there's only one shared collection which is useful - shared
>> queue. :) If you need more kinds of thread-safe collections, it
>> probably indicating that the concurrent code (or model) which you
>> designed is in pretty bad shape.
>>
>> Just compare two following snippets:
>>
>> 1 to: 100 do: [:i | collection threadSafeAt: i put: something].
>>
>> and:
>>
>> semaphore critical: [ 1 to: 100 do: [:i | collection at: i put:
>> something] ].
>>
>> What you think, which one is better?
>>
>>
>>> Bill
>>>
>>>
>>> _______________________________________________
>>> 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.
>>
>> _______________________________________________
>> 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
>
>
> _______________________________________________
> 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] [ANN] Pharo rc1dev10491 - Win32 Installer
by Adrian Lienhard
Thanks, Torsten!
Adrian
On Oct 25, 2009, at 20:49 , Torsten Bergmann wrote:
> Forgot to mention:
>
> Windows Installer 1.0-10491-rc1dev09.10.5 is up
> on the download page.
>
> Bye
> Torsten
> --
> GRATIS für alle GMX-Mitglieder: Die maxdome Movie-FLAT!
> Jetzt freischalten unter http://portal.gmx.net/de/go/maxdome01
>
> _______________________________________________
> 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] question about results of MessageTally
by Adrian Lienhard
Have you tried with 0? I guess you get way too much in the tree
(especially when you trace a larger part of your application and not
only adding elements to a dictionary). It seems that 1% is a sensible
default as usually it does not make sense to look into these branches
more closely as you cannot optimize them much.
Adrian
On Oct 25, 2009, at 19:42 , Laval Jannik wrote:
> Hi Adrian,
>
> Now I understand the "problem".
> So we can use "report:cutoff:" which allows us to give a specific
> value for the threshold.
>
> I will create a new method, spyOn:cutoff:.
>
> I think the method "spyOn:" must have the threshold equals to 0.
> No ?
>
> Cheers,
> Jannik
>
>
> On Oct 24, 2009, at 12:08 , Adrian Lienhard wrote:
>
>> Hi Jannik,
>>
>> Interesting question!
>>
>> You left out an important part oft the tally: the part about GC
>> activity.
>>
>> For the large dictionary I get:
>>
>> **GCs**
>> full 9 totalling 1,696ms (1.0% uptime), avg 188.0ms
>> incr 3776 totalling 186,310ms (94.0% uptime), avg 49.0ms
>>
>> That is, 95% of time is spent in GC! A lot of incremental GC cycles
>> are triggered because for each at:put: a new association instance is
>> created. The larger the dictionary, the larger is the new memory
>> space
>> and hence the incremental GC takes longer to complete. In the above
>> tally the average was 49ms compared to
>>
>> incr 275 totalling 1,113ms (58.0% uptime), avg 4.0ms
>>
>> for the smaller dictionary. Therefore, the ratio between actual
>> method
>> execution time and GC time differs significantly between the two
>> runs.
>> As a result, a lot of branches of the tally are below a total of 1%
>> runtime in the second case. Message tally has a threshold that cuts
>> off branches with less than 1% runtime. Therefore you see less
>> details.
>>
>> Cheers,
>> Adrian
>>
>>
>> On Oct 24, 2009, at 07:21 , Laval Jannik wrote:
>>
>>> Hi,
>>>
>>> when I use MassageTally>>spyOn: on the creation of a Dictionary,
>>> results have not the same details according to the size of
>>> Dictionary.
>>>
>>> For example:
>>> ===
>>> |n|
>>> MessageTally spyOn:[
>>> n := Dictionary new.
>>> 1 to: 400000 do:[:each | n at: each put:each].
>>> ]
>>> ===
>>>
>>> returns this results:
>>>
>>> ====
>>> - 1745 tallies, 1751 msec.
>>>
>>> **Tree**
>>> --------------------------------
>>> Process: (40s) 1964: nil
>>> --------------------------------
>>> 45.8% {802ms} Dictionary(Set)>>atNewIndex:put:
>>> |43.6% {763ms} Dictionary(Set)>>fullCheck
>>> | |39.4% {690ms} Dictionary(Set)>>grow
>>> | | |27.2% {476ms} Dictionary>>noCheckAdd:
>>> | | | |25.2% {441ms} Dictionary(Set)>>findElementOrNil:
>>> | | | | |23.6% {413ms} Dictionary>>scanFor:
>>> | | | | |1.6% {28ms} primitives
>>> | | | |2.0% {35ms} primitives
>>> | | |9.2% {161ms} primitives
>>> | | |3.0% {53ms} Array(SequenceableCollection)>>do:
>>> | |2.4% {42ms} primitives
>>> | |1.8% {32ms} SmallInteger(Magnitude)>>max:
>>> |2.2% {39ms} primitives
>>> 22.4% {392ms} Association class>>key:value:
>>> |18.9% {331ms} Association class(LookupKey class)>>key:
>>> | |16.3% {285ms} Association(LookupKey)>>key:
>>> | |2.6% {46ms} primitives
>>> |1.9% {33ms} Association>>value:
>>> |1.6% {28ms} primitives
>>> 4.4% {77ms} Dictionary(Set)>>findElementOrNil:
>>> |2.3% {40ms} primitives
>>> |2.1% {37ms} Dictionary>>scanFor:
>>> 1.9% {33ms} primitives
>>> ====
>>>
>>> But, if I do:
>>> ===
>>> |n|
>>> MessageTally spyOn:[
>>> n := Dictionary new.
>>> 1 to: 4000000 do:[:each | n at: each put:each].
>>> ]
>>> ===
>>>
>>> results are:
>>> ====
>>> - 179772 tallies, 180312 msec.
>>>
>>> **Tree**
>>> --------------------------------
>>> Process: (40s) 1964: nil
>>> --------------------------------
>>> 3.1% {5590ms} Dictionary(Set)>>atNewIndex:put:
>>> |2.8% {5049ms} Dictionary(Set)>>fullCheck
>>> | 2.3% {4147ms} Dictionary(Set)>>grow
>>> | 1.3% {2344ms} Dictionary>>noCheckAdd:
>>> 1.0% {1803ms} Association class>>key:value:
>>> ====
>>>
>>> Where are the rest of the process ?
>>> Does anybody understand this behavior ? can you explain ?
>>>
>>>
>>> Cheers,
>>> Jannik
>>>
>>>
>>> _______________________________________________
>>> 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
>
> ---
> Jannik Laval
> PhD Student - Rmod Team - INRIA
> Certified Project Management Associate (IPMA)
> http://www.jannik-laval.eu
> http://rmod.lille.inria.fr
> ---
>
>
> _______________________________________________
> 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] [ANN] Pharo rc1dev10491 - Win32 Installer
by Torsten Bergmann
Forgot to mention:
Windows Installer 1.0-10491-rc1dev09.10.5 is up
on the download page.
Bye
Torsten
--
GRATIS für alle GMX-Mitglieder: Die maxdome Movie-FLAT!
Jetzt freischalten unter http://portal.gmx.net/de/go/maxdome01
Oct. 25, 2009
Re: [Pharo-project] Some bugs I ran into while working on hashing
by Stéphane Ducasse
nicolas if you produce a slice I will integrate them.
For now I'm focusing on emptying the pending stack of fixed items
Stef
On Oct 25, 2009, at 4:53 PM, Nicolas Cellier wrote:
> 2009/10/25 Nicolas Cellier <nicolas.cellier.aka.nice(a)gmail.com>:
>> 2009/10/25 Andres Valloud <avalloud(a)smalltalk.comcastbiz.net>:
>>>
>>> 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 :).
>>
>> If http://bugs.squeak.org were not down, I would even provide a link
>> with these enhancements
>>
>
> google says it should be http://www.google.fr/bugs.squeak.org/view.php?id=7099
> .
> Or go to the source
> http://blogten.blogspot.com/2008/06/drove-to-reno-today.html
> http://blogten.blogspot.com/2008/06/update-on-sqrtrounded.html
>
>
>>>
>>> Andres.
>>>
>>> _______________________________________________
>>> 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] hashing collections
by Ralph Boland
>
> 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.
>
You are right. These are serious problems with my idea and I retract
the proposal that the idea may be preferable to the problems we have
with putting the standard collections into Sets and Dictionaries.
It works well in my application because in each case the collections
have no duplicates and order doesn't matter. That is, in my application,
the hash collections are all effectively sets or dictionaries in compacted form.
I use a bit of code specific to my application to ensure they then are
compared efficiently.
Ralph
> 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] Improve pharo modularity: a first step
by Stéphane Ducasse
yes we did the same in VW.
Stef
On Oct 25, 2009, at 6:45 PM, Bernhard Pieber wrote:
> Hi Stéphane,
>
> Am 23.10.2009 um 12:50 schrieb Stéphane Ducasse:
>> Jannik
>> may be we should have
>>
>> PackageCore
>> PackageTest
>> PackageSetting
>> PackageExamples
> A convention we follow here is - for VA Smalltalk code, though:
> - Package (includes all code needed at runtime)
> - PackageDev (includes all code needed only at Development: tests,
> scripts, tools)
>
> This allows for nicely separating runtime packages from those only
> needed for development while keeping the numbers of packages smaller.
>
> Just my 2 cents.
>
> Cheers,
> Bernhard
> _______________________________________________
> 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] question about results of MessageTally
by Laval Jannik
Hi Adrian,
Now I understand the "problem".
So we can use "report:cutoff:" which allows us to give a specific
value for the threshold.
I will create a new method, spyOn:cutoff:.
I think the method "spyOn:" must have the threshold equals to 0.
No ?
Cheers,
Jannik
On Oct 24, 2009, at 12:08 , Adrian Lienhard wrote:
> Hi Jannik,
>
> Interesting question!
>
> You left out an important part oft the tally: the part about GC
> activity.
>
> For the large dictionary I get:
>
> **GCs**
> full 9 totalling 1,696ms (1.0% uptime), avg 188.0ms
> incr 3776 totalling 186,310ms (94.0% uptime), avg 49.0ms
>
> That is, 95% of time is spent in GC! A lot of incremental GC cycles
> are triggered because for each at:put: a new association instance is
> created. The larger the dictionary, the larger is the new memory space
> and hence the incremental GC takes longer to complete. In the above
> tally the average was 49ms compared to
>
> incr 275 totalling 1,113ms (58.0% uptime), avg 4.0ms
>
> for the smaller dictionary. Therefore, the ratio between actual method
> execution time and GC time differs significantly between the two runs.
> As a result, a lot of branches of the tally are below a total of 1%
> runtime in the second case. Message tally has a threshold that cuts
> off branches with less than 1% runtime. Therefore you see less
> details.
>
> Cheers,
> Adrian
>
>
> On Oct 24, 2009, at 07:21 , Laval Jannik wrote:
>
>> Hi,
>>
>> when I use MassageTally>>spyOn: on the creation of a Dictionary,
>> results have not the same details according to the size of
>> Dictionary.
>>
>> For example:
>> ===
>> |n|
>> MessageTally spyOn:[
>> n := Dictionary new.
>> 1 to: 400000 do:[:each | n at: each put:each].
>> ]
>> ===
>>
>> returns this results:
>>
>> ====
>> - 1745 tallies, 1751 msec.
>>
>> **Tree**
>> --------------------------------
>> Process: (40s) 1964: nil
>> --------------------------------
>> 45.8% {802ms} Dictionary(Set)>>atNewIndex:put:
>> |43.6% {763ms} Dictionary(Set)>>fullCheck
>> | |39.4% {690ms} Dictionary(Set)>>grow
>> | | |27.2% {476ms} Dictionary>>noCheckAdd:
>> | | | |25.2% {441ms} Dictionary(Set)>>findElementOrNil:
>> | | | | |23.6% {413ms} Dictionary>>scanFor:
>> | | | | |1.6% {28ms} primitives
>> | | | |2.0% {35ms} primitives
>> | | |9.2% {161ms} primitives
>> | | |3.0% {53ms} Array(SequenceableCollection)>>do:
>> | |2.4% {42ms} primitives
>> | |1.8% {32ms} SmallInteger(Magnitude)>>max:
>> |2.2% {39ms} primitives
>> 22.4% {392ms} Association class>>key:value:
>> |18.9% {331ms} Association class(LookupKey class)>>key:
>> | |16.3% {285ms} Association(LookupKey)>>key:
>> | |2.6% {46ms} primitives
>> |1.9% {33ms} Association>>value:
>> |1.6% {28ms} primitives
>> 4.4% {77ms} Dictionary(Set)>>findElementOrNil:
>> |2.3% {40ms} primitives
>> |2.1% {37ms} Dictionary>>scanFor:
>> 1.9% {33ms} primitives
>> ====
>>
>> But, if I do:
>> ===
>> |n|
>> MessageTally spyOn:[
>> n := Dictionary new.
>> 1 to: 4000000 do:[:each | n at: each put:each].
>> ]
>> ===
>>
>> results are:
>> ====
>> - 179772 tallies, 180312 msec.
>>
>> **Tree**
>> --------------------------------
>> Process: (40s) 1964: nil
>> --------------------------------
>> 3.1% {5590ms} Dictionary(Set)>>atNewIndex:put:
>> |2.8% {5049ms} Dictionary(Set)>>fullCheck
>> | 2.3% {4147ms} Dictionary(Set)>>grow
>> | 1.3% {2344ms} Dictionary>>noCheckAdd:
>> 1.0% {1803ms} Association class>>key:value:
>> ====
>>
>> Where are the rest of the process ?
>> Does anybody understand this behavior ? can you explain ?
>>
>>
>> Cheers,
>> Jannik
>>
>>
>> _______________________________________________
>> 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
---
Jannik Laval
PhD Student - Rmod Team - INRIA
Certified Project Management Associate (IPMA)
http://www.jannik-laval.eu
http://rmod.lille.inria.fr
---
Oct. 25, 2009
Re: [Pharo-project] Broken "Recover Lost Changes"
by John Toohey
Hey,
Actually what I did was to fileout the changes in the Change Sorter, edited
them, and filed them back in. At least I recovered my source, enough to save
it to MC. I then built a new image, and am back working again. I've sent you
an off list email with access to the image and changes file as they were
when my image crashed.
Thanks
On Sun, Oct 25, 2009 at 07:00, Adrian Lienhard <adi(a)netstyle.ch> wrote:
> 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
>
>
> _______________________________________________
> Pharo-project mailing list
> Pharo-project(a)lists.gforge.inria.fr
> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>
--
-JT
Oct. 25, 2009
Re: [Pharo-project] Improve pharo modularity: a first step
by Bernhard Pieber
Hi Stéphane,
Am 23.10.2009 um 12:50 schrieb Stéphane Ducasse:
> Jannik
> may be we should have
>
> PackageCore
> PackageTest
> PackageSetting
> PackageExamples
A convention we follow here is - for VA Smalltalk code, though:
- Package (includes all code needed at runtime)
- PackageDev (includes all code needed only at Development: tests,
scripts, tools)
This allows for nicely separating runtime packages from those only
needed for development while keeping the numbers of packages smaller.
Just my 2 cents.
Cheers,
Bernhard
Oct. 25, 2009