From lewis at mail.msen.com Wed Jul 1 02:22:51 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Wed Jul 1 02:22:54 2015 Subject: [squeak-dev] Re: Re: [ANN] The Squeak Website In-Reply-To: <1435675047151-4834937.post@n4.nabble.com> References: <8EB28068-6FBD-4E7B-8819-3B559B8A2EDA@gmx.de> <1EDA2D9E-E782-4828-BFE6-6D945B7882BC@gmail.com> <1435675047151-4834937.post@n4.nabble.com> Message-ID: <20150701022251.GA55832@shell.msen.com> On Tue, Jun 30, 2015 at 07:37:27AM -0700, Sean P. DeNigris wrote: > Louis LaBrunda wrote > > Hear, Hear, Edgar is a very worthwhile and often under appreciated member > > of the Squeak community!! > > Indeed! > +1000 Dave From commits at source.squeak.org Wed Jul 1 08:15:54 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 08:15:56 2015 Subject: [squeak-dev] The Trunk: ReleaseBuilder-mt.125.mcz Message-ID: Marcel Taeumel uploaded a new version of ReleaseBuilder to project The Trunk: http://source.squeak.org/trunk/ReleaseBuilder-mt.125.mcz ==================== Summary ==================== Name: ReleaseBuilder-mt.125 Author: mt Time: 1 July 2015, 10:15:47.361 am UUID: 3338b57a-ab20-ac44-b37b-d4e09f23e453 Ancestors: ReleaseBuilder-cmm.124 Restore setting the background in release builder's #setPreferences46 so that our build server produces trunk images with correct preferences again. #prepareNewBuild: is agnostic to the current release version. Note: We should find out why #prepareNewBuild: requires another try to set the background and where that background gets overridden. It is not good to put version-specific code into a version-agnostic method. =============== Diff against ReleaseBuilder-cmm.124 =============== Item was changed: ----- Method: ReleaseBuilder class>>setPreferences46 (in category 'preferences') ----- setPreferences46 "Preferences class defaultValueTableForCurrentRelease" + self setProjectBackground: Color darkGray. + "General User interaction" Preferences enable: #swapMouseButtons; disable: #mouseOverForKeyboardFocus. Morph indicateKeyboardFocus: true. "Text input." TextEditor autoEnclose: true ; autoIndent: true ; destructiveBackWord: false ; blinkingCursor: true ; dumbbellCursor: false. Preferences insertionPointColor: Color red. PluggableTextMorph simpleFrameAdornments: false. "Windows" Preferences installUniformWindowColors. SystemWindow reuseWindows: false. Model windowActiveOnFirstClick: false. "Not good for 800x600" Preferences disable: #showSplitterHandles; enable: #fastDragWindowForMorphic. CornerGripMorph drawCornerResizeHandles: false. ProportionalSplitterMorph smartHorizontalSplitters: false ; smartVerticalSplitters: false. "Scroll bars." Preferences enable: #scrollBarsNarrow; enable: #scrollBarsOnRight; disable: #alwaysHideHScrollbar; disable: #alwaysShowHScrollbar; disable: #alwaysShowVScrollbar. ScrollBar scrollBarsWithoutArrowButtons: true; scrollBarsWithoutMenuButton: true. ScrollPane useRetractableScrollBars: false. "Rounded corners." Morph preferredCornerRadius: 6. Preferences disable: #roundedWindowCorners. PluggableButtonMorph roundedButtonCorners: false. FillInTheBlankMorph roundedDialogCorners: false. MenuMorph roundedMenuCorners: false. ScrollBar roundedScrollBarLook: false. "Gradients." Preferences disable: #gradientScrollBars. SystemWindow gradientWindow: false. MenuMorph gradientMenu: false. PluggableButtonMorph gradientButton: false. "Shadows" Preferences enable: #menuAppearance3d. MenuMorph menuBorderWidth: 1; menuBorderColor: Color lightGray; menuLineColor: Color lightGray. Morph useSoftDropShadow: true.. "Lists and Trees" PluggableListMorph filterableLists: true; clearFilterAutomatically: false; highlightHoveredRow: true; menuRequestUpdatesSelection: true. PluggableTreeMorph filterByLabelsOnly: false; maximumSearchDepth: 1. LazyListMorph listSelectionTextColor: Color black; listSelectionColor: (Color r: 0.72 g: 0.72 b: 0.9). "Standard Tools" BalloonMorph setBalloonColorTo: (TranslucentColor r: 0.92 g: 0.92 b: 0.706 alpha: 0.75). Workspace shouldStyle: false. Browser listClassesHierarchically: true; showClassIcons: true; showMessageIcons: true; sortMessageCategoriesAlphabetically: true. Preferences enable: #annotationPanes; enable: #optionalButtons; enable: #diffsWithPrettyPrint; enable: #traceMessages; enable: #alternativeBrowseIt; enable: #menuWithIcons; enable: #visualExplorer. SystemNavigation thoroughSenders: true. "Halo" Preferences enable: #showBoundsInHalo ; disable: #alternateHandlesLook. "System" NetNameResolver enableIPv6: false. Scanner allowUnderscoreAsAssignment: true; prefAllowUnderscoreSelectors: true. "that's all, folks"! From commits at source.squeak.org Wed Jul 1 11:19:37 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 11:19:39 2015 Subject: [squeak-dev] The Inbox: System-ul.748.mcz Message-ID: Levente Uzonyi uploaded a new version of System to project The Inbox: http://source.squeak.org/inbox/System-ul.748.mcz ==================== Summary ==================== Name: System-ul.748 Author: ul Time: 1 July 2015, 1:17:39.216 pm UUID: 7e127e9c-33da-4199-b81f-324808eebfae Ancestors: System-eem.747 - Iterate over pragmas once per method instead of once per pragma in Preferences class>>prefEvent:. - There's no need to copy preferencesDictionary in Preferences class>>storePreferencesIn:, because it's a read-only data structure. - Ensure the durability of the changes of preferencesDictionary in Preferences class>>atomicUpdatePreferences: by checking for changes before overwriting it. =============== Diff against System-eem.747 =============== Item was changed: ----- Method: Preferences class>>atomicUpdatePreferences: (in category 'accessing') ----- + atomicUpdatePreferences: aBlock - atomicUpdatePreferences: aBlock "Evaluate aBlock with a copy of the preferences dictionary and + then assign (assignment is atomic) the copy to the dictionary." + + [ + | originalPreferences copyOfPreferences | + originalPreferences := preferencesDictionary. + copyOfPreferences := preferencesDictionary + ifNil: [ IdentityDictionary new ] + ifNotNil: [ :dictionary | dictionary copy ]. + aBlock value: copyOfPreferences. + originalPreferences == preferencesDictionary ifTrue: [ + preferencesDictionary := copyOfPreferences. + ^self ] ] repeat! - then assign (assignment is atomic) the copy to the dictionary." - | copyOfPreferences | - copyOfPreferences := preferencesDictionary - ifNil: [IdentityDictionary new] - ifNotNil: [:dict| dict copy]. - aBlock value: copyOfPreferences. - preferencesDictionary := copyOfPreferences! Item was changed: ----- Method: Preferences class>>prefEvent: (in category 'dynamic preferences') ----- prefEvent: anEvent "Check if this system event defines or removes a preference. TODO: Queue the event and handle in background process. There is zero reason to be so eager here." + + | aClass aSelector | - | aClass aSelector method | anEvent itemKind = SystemChangeNotifier classKind ifTrue: [^anEvent isRemoved ifTrue: [self removePreferencesFor: anEvent item]]. (anEvent itemKind = SystemChangeNotifier methodKind and: [(aClass := anEvent itemClass) isMeta]) ifFalse: "ignore instance methods" [^self]. aClass := aClass theNonMetaClass. aSelector := anEvent itemSelector. anEvent isRemoved ifTrue: [self atomicUpdatePreferences: [ :copyOfDictionaryOfPreferences | copyOfDictionaryOfPreferences removeKey: (aClass name,'>>', aSelector) asSymbol ifAbsent: []]] ifFalse: [(anEvent isAdded or: [anEvent isModified]) ifTrue: + [self respondToPreferencePragmasInMethod: anEvent item class: aClass]]! - [method := anEvent item. - method pragmas do: - [:pragma| - self respondToPreferencePragmasInMethod: method class: aClass]]]! Item was changed: ----- Method: Preferences class>>storePreferencesIn: (in category 'personalization') ----- + storePreferencesIn: aFileName + + | stream | - storePreferencesIn: aFileName - | stream prefsSnapshot | #(Prevailing PersonalPreferences) do: [:ea | Parameters removeKey: ea ifAbsent: []]. stream := ReferenceStream fileNamed: aFileName. stream nextPut: Parameters. + preferencesDictionary keysAndValuesDo: [:key :pref | preferencesDictionary at: key put: pref asPreference]. + stream nextPut: preferencesDictionary. - prefsSnapshot := preferencesDictionary copy. - prefsSnapshot keysAndValuesDo: [:key :pref | prefsSnapshot at: key put: pref asPreference]. - stream nextPut: prefsSnapshot. stream nextPut: (Smalltalk isMorphic ifTrue:[World fillStyle] ifFalse:[DesktopColor]). stream close! From leves at elte.hu Wed Jul 1 11:30:03 2015 From: leves at elte.hu (Levente Uzonyi) Date: Wed Jul 1 11:30:09 2015 Subject: [squeak-dev] The Trunk: System-cmm.725.mcz In-Reply-To: References: Message-ID: Hi Eliot, I reviewed the code and made a few changes, which you can find in the Inbox as System-ul.748. Feel free to pick the ones you like. The change of Preferences class >> #atomicUpdatePreferences: might seem unnecessary, because it's so unlikely to have multiple processes changing the preferences concurrently. Levente P.S.: Please note that I haven't tested the code. On Tue, 30 Jun 2015, Eliot Miranda wrote: > Hi All, but especially Chris, > ? ?I just committed?System-eem.745 to the inbox.? Please review. > > As I say in the commit comment, this is step 1.? If the code looks OK, the next step is a version which moves the preferences dictionary into a class inst var, so that ServicePreferences sits happily below Preferences.? But for that I'll need advice on how to write the > sequence of loads.? I *think* it's one configuration map and one package load.? The commit/configuration adds the class inst var and copies the DictionaryOfPreferences into it.? A subsequent commit replaces all methods that acess DictionaryOfPreferences and > ServiceDictionaryOfPreferences?with accesses to the class inst var > > > Rewrite Preferences to eliminate the AccessProtect. > Use a copy, update copy, assign scheme to update > the preferences dictionary atomically. > > Change Preferences access method compilation to > use Object>>#value to eliminate a block creation. > > Change Preference initialization to eliminate the > isKindOf: Symbol. > > This is step 1.? Given SystemPreferences it is clear > that the preferences dictionary should be stored in > a class inst var, so that SystemPreferences and > Preferences can share methods but access different > dictionaries.? The dictionaryOfProferences[:] accessors > are dubious as they break encapsulatiopn.? For example, > the reportPreferences: method, which is the only external > access, could insateaqd be moved into Preferences class. > > On Tue, Jun 30, 2015 at 10:46 AM, Eliot Miranda wrote: > Hi Levente, ?Hi Chris, > > On Tue, Apr 28, 2015 at 3:41 PM, Levente Uzonyi wrote: > There's no need to store preferences in a data structure at all. We already have "pragma" preferences (since 4.1), which store the preference values independently. Since the 4.1 release it's a "permanent" goal to rewrite all preferences to > "pragma" preferences. > We should just make it happen. > > > This seems like a lot of work, and is work that can be done over time.? But right now we're suffering lock ups due to the Mutex in Preferences.? For example, the Notifier/Debugger accesses the scrollBarsOnRight preference and I've often seen lock ups caused by > this.? So I propose that I fix the access to be as I described it.? There be no access lock except for adding/updating preferences.? So reading is done without synchronisation, and setting and/or adding is done by copying and assigning.? I also propose to compile > preferences without creating a block, so > > autoIndent > ^ self > valueOfFlag: #autoIndent > ifAbsent: true > > instead of > > autoIndent > ^ self > valueOfFlag: #autoIndent > ifAbsent: [true] > > which is well-supported by both the Interpreter and the Cog VMs, given Object>>value ^self.? This to save space and time. > > Levente > > P.S.: Reverting that method will solve the concurrency issue. > > On Tue, 28 Apr 2015, Eliot Miranda wrote: > > > > On Tue, Apr 28, 2015 at 12:47 PM, Chris Muller wrote: > ? ? ? Wait, the newer one has a non-local return in it, but > ? ? ? Mutex>>#critical: has an ensure: in it anyway, so maybe I don't see > ? ? ? the problem..? > > > If one hits ctrl-period when the system is in the critical section then the debugger can't open because it interrupts the critical section, preventing the ensure block from running, attempts to access e.g. > scroll bar preferences when it tries to open, and the system deadlocks.? So preferences either need to be *not* protected by a critical section, or the Debugger needs not to access preferences. > > IMO, we should try and write preferences so that they don't require a lock.? Writing them as a lock-free data structure would be a really good idea. First that critical section is slow and clunky.? Second, I > presume it is there only for the rare case of a write to preferences, not to protect reads. > > IMO, a simple implementation which copied and replaced the entire preferences dictionary on write would be sufficient.? Sure there's a danger that some client would get a stale value if it read concurrently > while there was a write, but then so what?? A preference is a preference, not a hard-and-fast value, and code should work accessing a preference no matter its value, so momentarily getting a stale value > shouldn't matter.? So the implementation could be as simple as > > addPreference: aName categories: categoryList default: aValue balloonHelp: helpString projectLocal: localBoolean changeInformee: informeeSymbol changeSelector: aChangeSelector type: aType > "Add or replace a preference as indicated.? Reuses the preexisting Preference object for this symbol, if there is one, so that UI artifacts that interact with it will remain valid." > > | aPreference aPrefSymbol | > aPrefSymbol := aName asSymbol. > aPreference := DictionaryOfPreferences > at: aPrefSymbol > ifAbsent: > [| newPreference | > newPreference := aPreference? > name:aPrefSymbol > defaultValue:aValue > helpString:helpString > localToProject:localBoolean > categoryList:categoryList > changeInformee:informeeSymbol > changeSelector:aChangeSelector > type: aType. > AccessLock critical: > [| newDict | > newDict := DictionaryOfPreferences copy. > newDict at: aPrefSymbol put: newPreference]. > self ?compileAccessMethodForPreference:aPreference. > newPreference] > > > ? ? ? On Tue, Apr 28, 2015 at 2:43 PM, Chris Muller wrote: > ? ? ? >> The above change restores the old behavior of locking up the image, so it > ? ? ? >> should be reverted. An additional comment explaininng why aBlock must not be > ? ? ? >> evaluated inside the argument of #accessDictionaryOfPreferencesIn: would be > ? ? ? >> helpful. > ? ? ? > > ? ? ? > Ahh, because aBlock might have a non-local return in it, leaving the > ? ? ? > Mutex unsignaled (and critical unenterable), is that right? > ? ? ? > > ? ? ? > Took me a minute to see that problem. > ? ? ? > > ? ? ? > Okay, I'll revert that method if no one else does by my next commit.. > ? ? ? > > ? ? ? >> It would be even better to finally get rid of DictionaryOfPreferences. > ? ? ? >> > ? ? ? >> > ? ? ? >> Levente > ? ? ? >> > > > > > -- > best,Eliot > > > > > > > > -- > best,Eliot > > > > > -- > best,Eliot > > From Das.Linux at gmx.de Wed Jul 1 12:25:30 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Wed Jul 1 12:25:37 2015 Subject: [squeak-dev] /4.2 went missing Message-ID: Dear all, apparently the 4.2 folder on our file server went missing. This could possibly have happened when box2 had gone haywire. Can anyone confirm? Also, I have a Squeak4.2-10966 zip laying around, so if no-one objects, I'll just put it there. Best regards -Tobias From karlramberg at gmail.com Wed Jul 1 12:36:31 2015 From: karlramberg at gmail.com (karl ramberg) Date: Wed Jul 1 12:36:36 2015 Subject: [squeak-dev] The Trunk: ReleaseBuilder-mt.125.mcz In-Reply-To: <5593a1c4.c132370a.9475.0218SMTPIN_ADDED_MISSING@mx.google.com> References: <5593a1c4.c132370a.9475.0218SMTPIN_ADDED_MISSING@mx.google.com> Message-ID: Hi, Could the color be set wrong in PasteUpMorph>>#initForProject: ? There project color is set to Preferences defaultWorldColor. Karl On Wed, Jul 1, 2015 at 10:15 AM, wrote: > Marcel Taeumel uploaded a new version of ReleaseBuilder to project The > Trunk: > http://source.squeak.org/trunk/ReleaseBuilder-mt.125.mcz > > ==================== Summary ==================== > > Name: ReleaseBuilder-mt.125 > Author: mt > Time: 1 July 2015, 10:15:47.361 am > UUID: 3338b57a-ab20-ac44-b37b-d4e09f23e453 > Ancestors: ReleaseBuilder-cmm.124 > > Restore setting the background in release builder's #setPreferences46 so > that our build server produces trunk images with correct preferences again. > #prepareNewBuild: is agnostic to the current release version. > > Note: We should find out why #prepareNewBuild: requires another try to set > the background and where that background gets overridden. It is not good to > put version-specific code into a version-agnostic method. > > =============== Diff against ReleaseBuilder-cmm.124 =============== > > Item was changed: > ----- Method: ReleaseBuilder class>>setPreferences46 (in category > 'preferences') ----- > setPreferences46 > "Preferences class defaultValueTableForCurrentRelease" > > + self setProjectBackground: Color darkGray. > + > "General User interaction" > Preferences > enable: #swapMouseButtons; > disable: #mouseOverForKeyboardFocus. > Morph indicateKeyboardFocus: true. > > "Text input." > TextEditor > autoEnclose: true ; > autoIndent: true ; > destructiveBackWord: false ; > blinkingCursor: true ; > dumbbellCursor: false. > Preferences > insertionPointColor: Color red. > PluggableTextMorph simpleFrameAdornments: false. > > "Windows" > Preferences installUniformWindowColors. > SystemWindow reuseWindows: false. > Model windowActiveOnFirstClick: false. "Not good for 800x600" > Preferences > disable: #showSplitterHandles; > enable: #fastDragWindowForMorphic. > CornerGripMorph drawCornerResizeHandles: false. > ProportionalSplitterMorph > smartHorizontalSplitters: false ; > smartVerticalSplitters: false. > > "Scroll bars." > Preferences > enable: #scrollBarsNarrow; > enable: #scrollBarsOnRight; > disable: #alwaysHideHScrollbar; > disable: #alwaysShowHScrollbar; > disable: #alwaysShowVScrollbar. > ScrollBar > scrollBarsWithoutArrowButtons: true; > scrollBarsWithoutMenuButton: true. > ScrollPane > useRetractableScrollBars: false. > > "Rounded corners." > Morph preferredCornerRadius: 6. > Preferences disable: #roundedWindowCorners. > PluggableButtonMorph roundedButtonCorners: false. > FillInTheBlankMorph roundedDialogCorners: false. > MenuMorph roundedMenuCorners: false. > ScrollBar roundedScrollBarLook: false. > > "Gradients." > Preferences disable: #gradientScrollBars. > SystemWindow gradientWindow: false. > MenuMorph gradientMenu: false. > PluggableButtonMorph gradientButton: false. > > "Shadows" > Preferences enable: #menuAppearance3d. > MenuMorph > menuBorderWidth: 1; > menuBorderColor: Color lightGray; > menuLineColor: Color lightGray. > Morph useSoftDropShadow: true.. > > "Lists and Trees" > PluggableListMorph > filterableLists: true; > clearFilterAutomatically: false; > highlightHoveredRow: true; > menuRequestUpdatesSelection: true. > PluggableTreeMorph > filterByLabelsOnly: false; > maximumSearchDepth: 1. > LazyListMorph > listSelectionTextColor: Color black; > listSelectionColor: (Color r: 0.72 g: 0.72 b: 0.9). > > "Standard Tools" > BalloonMorph setBalloonColorTo: > (TranslucentColor r: 0.92 g: 0.92 b: 0.706 alpha: 0.75). > Workspace shouldStyle: false. > Browser > listClassesHierarchically: true; > showClassIcons: true; > showMessageIcons: true; > sortMessageCategoriesAlphabetically: true. > Preferences enable: #annotationPanes; > enable: #optionalButtons; > enable: #diffsWithPrettyPrint; > enable: #traceMessages; > enable: #alternativeBrowseIt; > enable: #menuWithIcons; > enable: #visualExplorer. > SystemNavigation thoroughSenders: true. > > "Halo" > Preferences > enable: #showBoundsInHalo ; > disable: #alternateHandlesLook. > > "System" > NetNameResolver enableIPv6: false. > Scanner > allowUnderscoreAsAssignment: true; > prefAllowUnderscoreSelectors: true. > > "that's all, folks"! > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150701/4d1575ca/attachment-0001.htm From me at fniephaus.com Wed Jul 1 13:47:37 2015 From: me at fniephaus.com (Fabio Niephaus) Date: Wed Jul 1 13:47:47 2015 Subject: [squeak-dev] New Squeak Site Typo In-Reply-To: <5592B2A0.7050508@gmx.net> References: <5592B2A0.7050508@gmx.net> Message-ID: Hi Herbert, Thank you for reporting the typo. I have fixed it now. We will soon move the repository to Squeak's GitHub organization [1] and then you can open an issue there or even fix it with a pull request. Until then, you can find the repository at [2]. Kind regards, Fabio [1] https://github.com/squeak-smalltalk [2] https://github.com/HPI-SWA-Lab/squeak.org On Tue, Jun 30, 2015 at 5:15 PM Herbert K?nig wrote: > Hi, > > squeak.org\projects\ STEPS and Frank: > The last sentence lacks the e in the word one. > > Noticed this on my mobile where it looks great too. > > Is there a place other than the list to report these? Mantis? > > Cheers, > > Herbert > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150701/0b6fcab3/attachment.htm From asqueaker at gmail.com Wed Jul 1 14:59:04 2015 From: asqueaker at gmail.com (Chris Muller) Date: Wed Jul 1 14:59:09 2015 Subject: [squeak-dev] The Trunk: ReleaseBuilder-mt.125.mcz In-Reply-To: References: <5593a1c4.c132370a.9475.0218SMTPIN_ADDED_MISSING@mx.google.com> Message-ID: On Wed, Jul 1, 2015 at 7:36 AM, karl ramberg wrote: > Hi, > Could the color be set wrong in PasteUpMorph>>#initForProject: ? > > There project color is set to Preferences defaultWorldColor. That was my thought too. So I'll bet we're back to the background color not working at all. Plus, setPreferences46 is called indirectly from prepareNewBuild:, so it is not release-agnostic in the first place. But why is release-agnostic desirable anyway? We have a historical record of every version of every method, and also every release from which Preferences can be exported. I think we should get rid of setPreference46 entirely... From leves at elte.hu Wed Jul 1 15:46:08 2015 From: leves at elte.hu (Levente Uzonyi) Date: Wed Jul 1 15:46:13 2015 Subject: [squeak-dev] /4.2 went missing In-Reply-To: References: Message-ID: Hi Tobias, I've just restored all the files and directories, served by ftp.squeak.org, from the penultimate snapshot of box2. The list of directories includes the 4.1 and 4.2 directories you mentioned before. You can find the exact list in the admin log of box4. Levente On Wed, 1 Jul 2015, Tobias Pape wrote: > Dear all, > > apparently the 4.2 folder on our file server went missing. > This could possibly have happened when box2 had gone haywire. > > Can anyone confirm? > > Also, I have a Squeak4.2-10966 zip laying around, so if no-one > objects, I'll just put it there. > > Best regards > -Tobias > > > From Das.Linux at gmx.de Wed Jul 1 16:42:20 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Wed Jul 1 16:42:25 2015 Subject: [squeak-dev] /4.2 went missing In-Reply-To: References: Message-ID: Hi Levente On 01.07.2015, at 17:46, Levente Uzonyi wrote: > Hi Tobias, > > I've just restored all the files and directories, served by ftp.squeak.org, from the penultimate snapshot of box2. The list of directories includes the 4.1 and 4.2 directories you mentioned before. You can find the exact list in the admin log of box4. > Thanks! Glad you got our back, once again ;) Best regards -Tobias > Levente > > On Wed, 1 Jul 2015, Tobias Pape wrote: > >> Dear all, >> >> apparently the 4.2 folder on our file server went missing. >> This could possibly have happened when box2 had gone haywire. >> >> Can anyone confirm? >> >> Also, I have a Squeak4.2-10966 zip laying around, so if no-one >> objects, I'll just put it there. >> >> Best regards >> -Tobias From commits at source.squeak.org Wed Jul 1 19:12:42 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 19:12:44 2015 Subject: [squeak-dev] The Trunk: System-eem.745.mcz Message-ID: Chris Muller uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-eem.745.mcz ==================== Summary ==================== Name: System-eem.745 Author: eem Time: 30 June 2015, 1:54:22.14 pm UUID: 6af94be8-f437-435f-a94b-811c5de2938a Ancestors: System-cmm.744 Rewrite Preferences to eliminate the AccessProtect. Use a copy, update copy, assign scheme to update the preferences dictionary atomically. Change Preferences access method compilation to use Object>>#value to eliminate a block creation. Change Preference initialization to eliminate the isKindOf: Symbol. This is step 1. Given SystemPreferences it is clear that the preferences dictionary should be stored in a class inst var, so that SystemPreferences and Preferences can share methods but access different dictionaries. The dictionaryOfProferences[:] accessors are dubious as they break encapsulatiopn. For example, the reportPreferences: method, which is the only external access, could insateaqd be moved into Preferences class. =============== Diff against System-cmm.744 =============== Item was changed: ----- Method: Preference>>name:defaultValue:helpString:localToProject:categoryList:changeInformee:changeSelector:type: (in category 'initialization') ----- name: aName defaultValue: aValue helpString: aString localToProject: projectBoolean categoryList: aList changeInformee: informee changeSelector: aChangeSelector type: aType "Initialize the preference from the given values. There is an extra tolerence here for the symbols #true, #false, and #nil, which are interpreted, when appropriate, as meaning true, false, and nil" name := aName asSymbol. + value := defaultValue := aValue + caseOf: { + [#true] -> [true]. + [#false] -> [false] } + otherwise: + [aValue]. - defaultValue := aValue. - aValue = #true ifTrue: [defaultValue := true]. - aValue = #false ifTrue: [defaultValue := false]. - value := defaultValue. helpString := aString. localToProject := projectBoolean == true or: [projectBoolean = #true]. type := aType. + categoryList := aList + ifNil: [OrderedCollection with: #unclassified] + ifNotNil: [aList collect: [:elem | elem asSymbol]]. - categoryList := (aList ifNil: [OrderedCollection with: #unclassified]) collect: - [:elem | elem asSymbol]. + changeInformee := (informee == nil or: [informee == #nil]) ifFalse: + [(informee isSymbol) + ifTrue: [Smalltalk at: informee] + ifFalse: [informee]]. - changeInformee := (informee == nil or: [informee == #nil]) - ifTrue: [nil] - ifFalse: [(informee isKindOf: Symbol) - ifTrue: - [Smalltalk at: informee] - ifFalse: - [informee]]. changeSelector := aChangeSelector! Item was changed: Object subclass: #Preferences instanceVariableNames: '' + classVariableNames: 'DesktopColor DictionaryOfPreferences Parameters' - classVariableNames: 'AccessLock DesktopColor DictionaryOfPreferences Parameters' poolDictionaries: '' category: 'System-Preferences'! !Preferences commentStamp: '' prior: 0! A general mechanism to store preference choices. The default setup treats any symbol as a potential boolean flag; flags unknown to the preference dictionary are always returned as false. To open the control panel: Preferences openFactoredPanel To read how to use the panel (and how to make a preference be per-project): Preferences giveHelpWithPreferences All messages are on the class side. To query a a preference: Preferences logDebuggerStackToFile or some people prefer the more verbose Preferences valueOfFlag: #logDebuggerStackToFile You can make up a new preference any time. Do not define a new message in Preferences class. Accessor methods are compiled automatically when you add a preference as illustrated below: To add a preference (e.g. in the Postscript of a fileout): Preferences addPreference: #samplePreference categories: #(general browsing) default: true balloonHelp: 'This is an example of a preference added by a do-it' projectLocal: false changeInformee: nil changeSelector: nil. To change a preference programatically: Preferences disable: #logDebuggerStackToFile. Or to turn it on, Preferences enable: #logDebuggerStackToFile. ! Item was removed: - ----- Method: Preferences class>>accessDictionaryOfPreferencesIn: (in category 'accessing') ----- - accessDictionaryOfPreferencesIn: aBlock - - ^(AccessLock ifNil: [ AccessLock := Mutex new ]) - critical: [ aBlock value: DictionaryOfPreferences ]! Item was changed: ----- Method: Preferences class>>addPreference:categories:default:balloonHelp:projectLocal:changeInformee:changeSelector:type: (in category 'add preferences') ----- addPreference: aName categories: categoryList default: aValue balloonHelp: helpString projectLocal: localBoolean changeInformee: informeeSymbol changeSelector: aChangeSelector type: aType "Add or replace a preference as indicated. Reuses the preexisting Preference object for this symbol, if there is one, so that UI artifacts that interact with it will remain valid." + | newPreference aPreference | + (newPreference := Preference new) + name: aName asSymbol + defaultValue: aValue + helpString: helpString + localToProject: localBoolean + categoryList: categoryList + changeInformee: informeeSymbol + changeSelector: aChangeSelector - | aPreference aPrefSymbol | - aPrefSymbol := aName asSymbol. - aPreference := self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences - at:aPrefSymbol - ifAbsent: [ Preference new ] ]. - aPreference - name:aPrefSymbol - defaultValue:aValue - helpString:helpString - localToProject:localBoolean - categoryList:categoryList - changeInformee:informeeSymbol - changeSelector:aChangeSelector type: aType. + aPreference := DictionaryOfPreferences + at: newPreference name + ifAbsent: [newPreference]. + aPreference == newPreference + ifTrue: "Atomically add the new preference to the dictionary." + [self atomicUpdatePreferences: + [:preferenceDictionaryCopy| + preferenceDictionaryCopy at: newPreference name put: newPreference]] + ifFalse: "Use the copyFrom: primitive to atomically update the existing preference." + [aPreference copyFrom: newPreference]. + self compileAccessMethodForPreference: aPreference! - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences at: aPrefSymbol put: aPreference ]. - self compileAccessMethodForPreference:aPreference! Item was changed: ----- Method: Preferences class>>allPreferenceObjects (in category 'preference-object access') ----- allPreferenceObjects "Answer a list of all the Preference objects registered in the system" + ^DictionaryOfPreferences values! - ^self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences values ]! Item was added: + ----- Method: Preferences class>>atomicUpdatePreferences: (in category 'accessing') ----- + atomicUpdatePreferences: aBlock + "Evaluate aBlock with a copy of the preferences dictionary and + then assign (assignment is atomic) the copy to the dictionary." + | copyOfDictionaryOfPreferences | + copyOfDictionaryOfPreferences := DictionaryOfPreferences + ifNil: [IdentityDictionary new] + ifNotNil: [:dict| dict copy]. + aBlock value: copyOfDictionaryOfPreferences. + DictionaryOfPreferences := copyOfDictionaryOfPreferences! Item was changed: ----- Method: Preferences class>>compileAccessMethodForPreference: (in category 'initialization') ----- compileAccessMethodForPreference: aPreference "Compile an accessor method for the given preference" self class compileSilently: ( + '{1} ^self valueOfFlag: {2} ifAbsent: {3}' - '{1} ^self valueOfFlag: {2} ifAbsent: [ {3} ]' format: { aPreference name asString. aPreference name asSymbol printString. aPreference defaultValue storeString }) classified: '*autogenerated - standard queries'! Item was added: + ----- Method: Preferences class>>createPreference:categoryList:description:type: (in category 'private') ----- + createPreference: prefName categoryList: arrayOfStrings description: helpString type: typeSymbol + "Add a preference residing in aMethod" + | aPreference | + aPreference := PragmaPreference new. + aPreference + name: prefName + defaultValue: nil "always nil" + helpString: helpString + localToProject: false "governed by the method" + categoryList: arrayOfStrings + changeInformee: nil + changeSelector: nil + type: typeSymbol. + ^aPreference! Item was changed: ----- Method: Preferences class>>prefEvent: (in category 'dynamic preferences') ----- prefEvent: anEvent "Check if this system event defines or removes a preference. TODO: Queue the event and handle in background process. There is zero reason to be so eager here." + | aClass aSelector method | + anEvent itemKind = SystemChangeNotifier classKind ifTrue: + [^anEvent isRemoved ifTrue: + [self removePreferencesFor: anEvent item]]. + (anEvent itemKind = SystemChangeNotifier methodKind + and: [(aClass := anEvent itemClass) isMeta]) ifFalse: "ignore instance methods" + [^self]. + aClass := aClass theNonMetaClass. + aSelector := anEvent itemSelector. + anEvent isRemoved + ifTrue: + [self atomicUpdatePreferences: [ :copyOfDictionaryOfPreferences | + copyOfDictionaryOfPreferences removeKey: (aClass name,'>>', aSelector) asSymbol ifAbsent: []]] + ifFalse: + [(anEvent isAdded or: [anEvent isModified]) ifTrue: + [method := anEvent item. + method pragmas do: + [:pragma| + self respondToPreferencePragmasInMethod: method class: aClass]]]! - | aClass aSelector prefSymbol method | - (anEvent itemKind = SystemChangeNotifier classKind and: [anEvent isRemoved]) - ifTrue:[self removePreferencesFor: anEvent item]. - anEvent itemKind = SystemChangeNotifier methodKind ifTrue:[ - aClass := anEvent itemClass. - aClass isMeta ifFalse:[^self]. "ignore instance methods" - aClass := aClass theNonMetaClass. - aSelector := anEvent itemSelector. - (anEvent isRemoved or:[anEvent isModified]) ifTrue:[ - prefSymbol := (aClass name,'>>', aSelector) asSymbol. - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences removeKey: prefSymbol ifAbsent:[] ] ]. - (anEvent isAdded or:[anEvent isModified]) ifTrue:[ - method := anEvent item. - method pragmas do:[:pragma| | aPreference aPrefSymbol | - ((pragma keyword == #preference:category:description:type:) - or: [pragma keyword == #preference:categoryList:description:type:]) ifTrue:[ - aPrefSymbol := (aClass name,'>>', method selector) asSymbol. - aPreference := self - preference: pragma arguments first - category: pragma arguments second - description: pragma arguments third - type: pragma arguments fourth. - aPreference - provider: aClass - getter: method selector - setter: method selector asMutator. - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences at: aPrefSymbol put: aPreference ] ] ] ] ]. - ! Item was changed: ----- Method: Preferences class>>preference:category:description:type: (in category 'dynamic preferences') ----- + preference: prefName category: categoryName description: helpString type: typeSymbol + "Create a preference for a preference pragma in a method. + This method gets invoked from respondToPreferencePragmasInMethod:class:" + ^self createPreference: prefName + categoryList: (categoryName isArray "Alas pragma users are not always careful" + ifTrue: [categoryName] + ifFalse: [{categoryName} asArray]) + description: helpString + type: typeSymbol! - preference: prefName category: aStringOrArrayOfStrings description: helpString type: typeSymbol - "Add a preference residing in aMethod" - | aPreference | - aPreference := PragmaPreference new. - aPreference - name: prefName - defaultValue: nil "always nil" - helpString: helpString - localToProject: false "governed by the method" - categoryList: (aStringOrArrayOfStrings isArray ifTrue:[aStringOrArrayOfStrings] ifFalse:[{aStringOrArrayOfStrings}]) - changeInformee: nil - changeSelector: nil - type: typeSymbol. - ^aPreference! Item was added: + ----- Method: Preferences class>>preference:categoryList:description:type: (in category 'dynamic preferences') ----- + preference: prefName categoryList: categoryList description: helpString type: typeSymbol + "Create a preference for a preference pragma in a method. + This method gets invoked from respondToPreferencePragmasInMethod:class:" + ^self createPreference: prefName categoryList: categoryList asArray description: helpString type: typeSymbol! Item was changed: ----- Method: Preferences class>>preferenceAt:ifAbsent: (in category 'preference-object access') ----- preferenceAt: aSymbol ifAbsent: aBlock "Answer the Preference object at the given symbol, or the value of aBlock if not present" + ^DictionaryOfPreferences at: aSymbol ifAbsent: aBlock! - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences - at: aSymbol - ifPresent: [ :preference | ^preference ] ]. - ^aBlock value! Item was changed: ----- Method: Preferences class>>registerForEvents (in category 'dynamic preferences') ----- registerForEvents "Preferences registerForEvents" + SystemChangeNotifier uniqueInstance + noMoreNotificationsFor: self; + notify: self ofAllSystemChangesUsing: #prefEvent:. + Smalltalk allClassesDo: + [:aClass| + aClass class methodsDo: + [:method| + self respondToPreferencePragmasInMethod: method class: aClass]]! - SystemChangeNotifier uniqueInstance noMoreNotificationsFor: self. - SystemChangeNotifier uniqueInstance notify: self ofAllSystemChangesUsing: #prefEvent:. - Smalltalk allClassesDo:[:aClass| - aClass class methodsDo:[:method| - method pragmas do:[:pragma| | aPreference aPrefSymbol | - pragma keyword == #preference:category:description:type: ifTrue:[ - aPrefSymbol := (aClass name,'>>', method selector) asSymbol. - aPreference := self - preference: pragma arguments first - category: pragma arguments second - description: pragma arguments third - type: pragma arguments fourth. - aPreference - provider: aClass - getter: method selector - setter: method selector asMutator. - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences at: aPrefSymbol put: aPreference ] ] ] ] ]. - ! Item was changed: ----- Method: Preferences class>>removePreference: (in category 'initialization') ----- removePreference: aSymbol "Remove all memory of the given preference symbol in my various structures." | pref | + pref := self preferenceAt: aSymbol ifAbsent: [^self]. + pref localToProject ifTrue: + [Project allProjects do: + [:proj | + proj projectPreferenceFlagDictionary ifNotNil: + [:projectpreferences| + projectpreferences removeKey:aSymbol ifAbsent:[]]]]. + self atomicUpdatePreferences: [ :copyOfDictionaryOfPreferences | + copyOfDictionaryOfPreferences removeKey: aSymbol ifAbsent: nil ]. + self class removeSelector: aSymbol - pref := self preferenceAt:aSymbol ifAbsent:[^ self]. - pref localToProject - ifTrue: - [Project allInstancesDo: - [:proj | - proj projectPreferenceFlagDictionary ifNotNil: - [proj projectPreferenceFlagDictionary removeKey:aSymbol ifAbsent:[]]]]. - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences removeKey: aSymbol ifAbsent: [] ]. - self class removeSelector:aSymbol "Preferences removePreference: #tileToggleInBrowsers"! Item was changed: ----- Method: Preferences class>>removePreferencesFor: (in category 'dynamic preferences') ----- removePreferencesFor: aClass "Remove all the preferences registered for the given class" "Preferences removePreferencesFor: PreferenceExample" + self atomicUpdatePreferences: + [:copyOfDictionaryOfPreferences| | map | + map := copyOfDictionaryOfPreferences select: [ :pref | pref provider == aClass]. + map keysDo: + [ :prefName | + copyOfDictionaryOfPreferences removeKey: prefName]]! - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - | map | - map := dictionaryOfPreferences select: [ :pref | pref provider == aClass ]. - map keysDo: [ :prefName | dictionaryOfPreferences removeKey: prefName ] ]! Item was added: + ----- Method: Preferences class>>respondToPreferencePragmasInMethod:class: (in category 'dynamic preferences') ----- + respondToPreferencePragmasInMethod: method class: class + method pragmas do: + [:pragma| | preference | + ((pragma keyword beginsWith: #preference:) + and: [self respondsTo: pragma keyword]) ifTrue: + [preference := self + perform: pragma keyword + withArguments: pragma arguments. + preference + provider: class + getter: method selector + setter: method selector asMutator. + self atomicUpdatePreferences: + [ :copyOfDictionaryOfPreferences | + copyOfDictionaryOfPreferences + at: (class name, '>>', method selector) asSymbol + put: preference]]]! Item was changed: ----- Method: Preferences class>>savePersonalPreferences (in category 'personalization') ----- savePersonalPreferences "Save the current list of Preference settings as the user's personal choices" self + setParameter: #PersonalDictionaryOfPreferences + to: DictionaryOfPreferences deepCopy! - setParameter:#PersonalDictionaryOfPreferences - to: ( - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences deepCopy ])! Item was changed: ----- Method: Preferences class>>storePreferencesIn: (in category 'personalization') ----- storePreferencesIn: aFileName | stream prefsSnapshot | + #(Prevailing PersonalPreferences) do: + [:ea | + Parameters removeKey: ea ifAbsent: []]. - #(#Prevailing #PersonalPreferences ) do:[:ea | Parameters removeKey:ea ifAbsent:[]]. stream := ReferenceStream fileNamed: aFileName. + stream nextPut: Parameters. + prefsSnapshot := DictionaryOfPreferences copy. - stream nextPut:Parameters. - prefsSnapshot := self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences copy ]. prefsSnapshot keysAndValuesDo: [:key :pref | prefsSnapshot at: key put: pref asPreference]. + stream nextPut: prefsSnapshot. + stream nextPut: (Smalltalk isMorphic + ifTrue:[World fillStyle] + ifFalse:[DesktopColor]). - stream nextPut: prefsSnapshot. - Smalltalk isMorphic - ifTrue:[stream nextPut:World fillStyle] - ifFalse:[stream nextPut:DesktopColor]. stream close! From eliot.miranda at gmail.com Wed Jul 1 19:12:46 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed Jul 1 19:12:52 2015 Subject: [squeak-dev] The Trunk: System-cmm.725.mcz In-Reply-To: References: Message-ID: Hi Levente, yes I like the repeat in atomicUpdatePreferences:. That's safe. I don't care much for the method temp in refEvent: cuz I think the message keyword types anEvent item adequately. Not sure about storePreferencesIn: not taking a copy of preferencesDictionary. Surely it's safer to take the copy. So let me take the change to atomicUpdatePreferences: and get this show on the road :-). Thanks for your review! On Wed, Jul 1, 2015 at 4:30 AM, Levente Uzonyi wrote: > Hi Eliot, > > I reviewed the code and made a few changes, which you can find in the > Inbox as System-ul.748. Feel free to pick the ones you like. > The change of Preferences class >> #atomicUpdatePreferences: might seem > unnecessary, because it's so unlikely to have multiple processes changing > the preferences concurrently. > > Levente > > P.S.: Please note that I haven't tested the code. > > > On Tue, 30 Jun 2015, Eliot Miranda wrote: > > Hi All, but especially Chris, >> I just committed System-eem.745 to the inbox. Please review. >> >> As I say in the commit comment, this is step 1. If the code looks OK, >> the next step is a version which moves the preferences dictionary into a >> class inst var, so that ServicePreferences sits happily below Preferences. >> But for that I'll need advice on how to write the >> sequence of loads. I *think* it's one configuration map and one package >> load. The commit/configuration adds the class inst var and copies the >> DictionaryOfPreferences into it. A subsequent commit replaces all methods >> that acess DictionaryOfPreferences and >> ServiceDictionaryOfPreferences with accesses to the class inst var >> >> >> Rewrite Preferences to eliminate the AccessProtect. >> Use a copy, update copy, assign scheme to update >> the preferences dictionary atomically. >> >> Change Preferences access method compilation to >> use Object>>#value to eliminate a block creation. >> >> Change Preference initialization to eliminate the >> isKindOf: Symbol. >> >> This is step 1. Given SystemPreferences it is clear >> that the preferences dictionary should be stored in >> a class inst var, so that SystemPreferences and >> Preferences can share methods but access different >> dictionaries. The dictionaryOfProferences[:] accessors >> are dubious as they break encapsulatiopn. For example, >> the reportPreferences: method, which is the only external >> access, could insateaqd be moved into Preferences class. >> >> On Tue, Jun 30, 2015 at 10:46 AM, Eliot Miranda >> wrote: >> Hi Levente, Hi Chris, >> >> On Tue, Apr 28, 2015 at 3:41 PM, Levente Uzonyi >> wrote: >> There's no need to store preferences in a data structure at >> all. We already have "pragma" preferences (since 4.1), which store the >> preference values independently. Since the 4.1 release it's a "permanent" >> goal to rewrite all preferences to >> "pragma" preferences. >> We should just make it happen. >> >> >> This seems like a lot of work, and is work that can be done over time. >> But right now we're suffering lock ups due to the Mutex in Preferences. >> For example, the Notifier/Debugger accesses the scrollBarsOnRight >> preference and I've often seen lock ups caused by >> this. So I propose that I fix the access to be as I described it. There >> be no access lock except for adding/updating preferences. So reading is >> done without synchronisation, and setting and/or adding is done by copying >> and assigning. I also propose to compile >> preferences without creating a block, so >> >> autoIndent >> ^ self >> valueOfFlag: #autoIndent >> ifAbsent: true >> >> instead of >> >> autoIndent >> ^ self >> valueOfFlag: #autoIndent >> ifAbsent: [true] >> >> which is well-supported by both the Interpreter and the Cog VMs, given >> Object>>value ^self. This to save space and time. >> >> Levente >> >> P.S.: Reverting that method will solve the concurrency issue. >> >> On Tue, 28 Apr 2015, Eliot Miranda wrote: >> >> >> >> On Tue, Apr 28, 2015 at 12:47 PM, Chris Muller < >> asqueaker@gmail.com> wrote: >> Wait, the newer one has a non-local return in it, but >> Mutex>>#critical: has an ensure: in it anyway, so maybe >> I don't see >> the problem..? >> >> >> If one hits ctrl-period when the system is in the critical >> section then the debugger can't open because it interrupts the critical >> section, preventing the ensure block from running, attempts to access e.g. >> scroll bar preferences when it tries to open, and the system >> deadlocks. So preferences either need to be *not* protected by a critical >> section, or the Debugger needs not to access preferences. >> >> IMO, we should try and write preferences so that they don't >> require a lock. Writing them as a lock-free data structure would be a >> really good idea. First that critical section is slow and clunky. Second, I >> presume it is there only for the rare case of a write to >> preferences, not to protect reads. >> >> IMO, a simple implementation which copied and replaced the >> entire preferences dictionary on write would be sufficient. Sure there's a >> danger that some client would get a stale value if it read concurrently >> while there was a write, but then so what? A preference is a >> preference, not a hard-and-fast value, and code should work accessing a >> preference no matter its value, so momentarily getting a stale value >> shouldn't matter. So the implementation could be as simple as >> >> addPreference: aName categories: categoryList default: aValue >> balloonHelp: helpString projectLocal: localBoolean changeInformee: >> informeeSymbol changeSelector: aChangeSelector type: aType >> "Add or replace a preference as indicated. Reuses the >> preexisting Preference object for this symbol, if there is one, so that UI >> artifacts that interact with it will remain valid." >> >> | aPreference aPrefSymbol | >> aPrefSymbol := aName asSymbol. >> aPreference := DictionaryOfPreferences >> at: aPrefSymbol >> ifAbsent: >> [| newPreference | >> newPreference := aPreference >> name:aPrefSymbol >> defaultValue:aValue >> helpString:helpString >> localToProject:localBoolean >> categoryList:categoryList >> changeInformee:informeeSymbol >> changeSelector:aChangeSelector >> type: aType. >> AccessLock critical: >> [| newDict | >> newDict := DictionaryOfPreferences copy. >> newDict at: aPrefSymbol put: newPreference]. >> self compileAccessMethodForPreference:aPreference. >> newPreference] >> >> >> On Tue, Apr 28, 2015 at 2:43 PM, Chris Muller < >> asqueaker@gmail.com> wrote: >> >> The above change restores the old behavior of >> locking up the image, so it >> >> should be reverted. An additional comment >> explaininng why aBlock must not be >> >> evaluated inside the argument of >> #accessDictionaryOfPreferencesIn: would be >> >> helpful. >> > >> > Ahh, because aBlock might have a non-local return in >> it, leaving the >> > Mutex unsignaled (and critical unenterable), is that >> right? >> > >> > Took me a minute to see that problem. >> > >> > Okay, I'll revert that method if no one else does by >> my next commit.. >> > >> >> It would be even better to finally get rid of >> DictionaryOfPreferences. >> >> >> >> >> >> Levente >> >> >> >> >> >> >> -- >> best,Eliot >> >> >> >> >> >> >> >> -- >> best,Eliot >> >> >> >> >> -- >> best,Eliot >> >> > > > -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150701/6af1c99f/attachment.htm From commits at source.squeak.org Wed Jul 1 19:13:12 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 19:13:15 2015 Subject: [squeak-dev] The Trunk: System-eem.746.mcz Message-ID: Chris Muller uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-eem.746.mcz ==================== Summary ==================== Name: System-eem.746 Author: eem Time: 30 June 2015, 3:17:33.999 pm UUID: e08cd059-dc73-408a-b819-e40b840dda43 Ancestors: System-eem.745 First part of Preferences putsch to move preferences dictionary from class var to inst var. Also update class comment to describe preference pragmas. =============== Diff against System-eem.745 =============== Item was changed: Object subclass: #Preferences instanceVariableNames: '' classVariableNames: 'DesktopColor DictionaryOfPreferences Parameters' poolDictionaries: '' category: 'System-Preferences'! + Preferences class + instanceVariableNames: 'preferencesDictionary'! + !Preferences commentStamp: 'eem 6/30/2015 15:10' prior: 0! + A general mechanism to store preference choices. The default setup treats any symbol as a potential boolean flag; flags unknown to the preference dictionary are always answered as false. - !Preferences commentStamp: '' prior: 0! - A general mechanism to store preference choices. The default setup treats any symbol as a potential boolean flag; flags unknown to the preference dictionary are always returned as false. + To open the control panel: + PreferenceBrowser open - To open the control panel: Preferences openFactoredPanel To read how to use the panel (and how to make a preference be per-project): Preferences giveHelpWithPreferences + All messages are on the class side. There are two kinds of preference definition, preference pragmas (which are preferred) and preferences local to Preferences. - All messages are on the class side. + Preference Pragmas + Preferences can be local to a class or system of classes using preference pragmas. Look at senders of #preference:category:description:type: and #preference:categoryList:description:type: for examples: + (self systemNavigation browseAllSelect: + [:m| + #(preference:category:description:type: preference:categoryList:description:type:) anySatisfy: + [:s| (m pragmaAt: s) notNil]]) + With a preference pragma, the preference is typically kept in a class variable, local to the class whose method(s) contain(s) the pragma. Good style is to put the preference pragma in the accessor for the variable; see for example BitBlt class>>#subPixelRenderColorFonts. The pragma serves to declare the preference to Preferences. + + + Preference-local Preferences To query a a preference: Preferences logDebuggerStackToFile or some people prefer the more verbose Preferences valueOfFlag: #logDebuggerStackToFile + You can make up a new preference any time. Do not define a new message in Preferences class. Accessor methods are compiled automatically when you add a preference, either as as illustrated below, or by using - You can make up a new preference any time. Do not define a new message in Preferences class. Accessor methods are compiled automatically when you add a preference as illustrated below: + To add a non-pragma preference (e.g. in the Postscript of a fileout): + Preferences + addPreference: #samplePreference + categories: #(general browsing) + default: true + balloonHelp: 'This is an example of a preference added by a do-it' + projectLocal: false + changeInformee: nil + changeSelector: nil. - To add a preference (e.g. in the Postscript of a fileout): - Preferences addPreference: #samplePreference categories: #(general browsing) - default: true balloonHelp: 'This is an example of a preference added by a do-it' - projectLocal: false changeInformee: nil changeSelector: nil. To change a preference programatically: Preferences disable: #logDebuggerStackToFile. Or to turn it on, Preferences enable: #logDebuggerStackToFile. ! + Preferences class + instanceVariableNames: 'preferencesDictionary'! Item was changed: (PackageInfo named: 'System') postscript: '" Convert SoundService registeredClasses to classes if necessary " [ | currentSoundSystem | currentSoundSystem := SoundService defaultOrNil. (SoundService registeredClasses copy collect: [:ss | SoundService unregister: ss. ss isBehavior ifTrue: [ss] ifFalse: [ss class]] ) do: [:ssClass | SoundService register: ssClass]. SoundService default: (currentSoundSystem ifNotNil: [:css| css isBehavior ifTrue: [css] ifFalse: [css class]]). + ] value. + + "Convert preferences dictionary from class var to inst var if necessary." + (Preferences instVarNamed: ''preferencesDictionary'') ifNil: + [(Preferences classPool at: #DictionaryOfPreferences) ifNotNil: + [:dictionary| + Preferences + instVarNamed: ''preferencesDictionary'' + put: dictionary]]'! - ] value'! From commits at source.squeak.org Wed Jul 1 19:17:09 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 19:17:10 2015 Subject: [squeak-dev] The Trunk: System-eem.747.mcz Message-ID: Chris Muller uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-eem.747.mcz ==================== Summary ==================== Name: System-eem.747 Author: eem Time: 30 June 2015, 3:29:21.961 pm UUID: b4f12663-36dd-4e16-9c83-5e446ea6e037 Ancestors: System-eem.746 Second part of putsch. Move preferences dictionary from class var to inst var. Remove the setter, and makde the getter, currently used only by SystemReporter, answer a copy. =============== Diff against System-eem.746 =============== Item was changed: ----- Method: Preferences class>>addPreference:categories:default:balloonHelp:projectLocal:changeInformee:changeSelector:type: (in category 'add preferences') ----- addPreference: aName categories: categoryList default: aValue balloonHelp: helpString projectLocal: localBoolean changeInformee: informeeSymbol changeSelector: aChangeSelector type: aType "Add or replace a preference as indicated. Reuses the preexisting Preference object for this symbol, if there is one, so that UI artifacts that interact with it will remain valid." | newPreference aPreference | (newPreference := Preference new) name: aName asSymbol defaultValue: aValue helpString: helpString localToProject: localBoolean categoryList: categoryList changeInformee: informeeSymbol changeSelector: aChangeSelector type: aType. + aPreference := preferencesDictionary - aPreference := DictionaryOfPreferences at: newPreference name ifAbsent: [newPreference]. aPreference == newPreference ifTrue: "Atomically add the new preference to the dictionary." [self atomicUpdatePreferences: [:preferenceDictionaryCopy| preferenceDictionaryCopy at: newPreference name put: newPreference]] ifFalse: "Use the copyFrom: primitive to atomically update the existing preference." [aPreference copyFrom: newPreference]. self compileAccessMethodForPreference: aPreference! Item was changed: ----- Method: Preferences class>>allPreferenceObjects (in category 'preference-object access') ----- allPreferenceObjects "Answer a list of all the Preference objects registered in the system" + ^preferencesDictionary values! - ^DictionaryOfPreferences values! Item was changed: ----- Method: Preferences class>>atomicUpdatePreferences: (in category 'accessing') ----- atomicUpdatePreferences: aBlock "Evaluate aBlock with a copy of the preferences dictionary and then assign (assignment is atomic) the copy to the dictionary." + | copyOfPreferences | + copyOfPreferences := preferencesDictionary - | copyOfDictionaryOfPreferences | - copyOfDictionaryOfPreferences := DictionaryOfPreferences ifNil: [IdentityDictionary new] ifNotNil: [:dict| dict copy]. + aBlock value: copyOfPreferences. + preferencesDictionary := copyOfPreferences! - aBlock value: copyOfDictionaryOfPreferences. - DictionaryOfPreferences := copyOfDictionaryOfPreferences! Item was changed: ----- Method: Preferences class>>dictionaryOfPreferences (in category 'accessing') ----- dictionaryOfPreferences + "N.B. Does /not/ answer the dictionary itself. To burrow that deep use e.g. instVarNamed:" + ^preferencesDictionary copy! - "The use of this accessor doesn't ensure that the dictionary is not accessed concurrently. Use #accessDictionaryOfPreferencesIn: instead." - - ^DictionaryOfPreferences! Item was removed: - ----- Method: Preferences class>>dictionaryOfPreferences: (in category 'accessing') ----- - dictionaryOfPreferences: anObject - DictionaryOfPreferences := anObject! Item was changed: ----- Method: Preferences class>>initializeDictionaryOfPreferences (in category 'initialization') ----- initializeDictionaryOfPreferences + "Initialize the preferencesDictionary to be an empty IdentityDictionary" - "Initialize the DictionaryOfPreferences to be an empty IdentityDictionary" "Preferences initializeDictionaryOfPreferences" + preferencesDictionary := IdentityDictionary new! - self dictionaryOfPreferences:IdentityDictionary new! Item was changed: ----- Method: Preferences class>>inspectPreferences (in category 'preferences panel') ----- inspectPreferences "Open a window on the current preferences dictionary, allowing the user to inspect and change the current preference settings. This is fallen back upon if Morphic is not present. This is dangerous, the dictionary of preferences should not be accessed concurrently." "Preferences inspectPreferences" + preferencesDictionary inspectWithLabel: 'Preferences'! - self dictionaryOfPreferences inspectWithLabel:'Preferences'! Item was changed: ----- Method: Preferences class>>preferenceAt:ifAbsent: (in category 'preference-object access') ----- preferenceAt: aSymbol ifAbsent: aBlock "Answer the Preference object at the given symbol, or the value of aBlock if not present" + ^preferencesDictionary at: aSymbol ifAbsent: aBlock! - ^DictionaryOfPreferences at: aSymbol ifAbsent: aBlock! Item was changed: ----- Method: Preferences class>>savePersonalPreferences (in category 'personalization') ----- savePersonalPreferences "Save the current list of Preference settings as the user's personal choices" self setParameter: #PersonalDictionaryOfPreferences + to: preferencesDictionary deepCopy! - to: DictionaryOfPreferences deepCopy! Item was changed: ----- Method: Preferences class>>storePreferencesIn: (in category 'personalization') ----- storePreferencesIn: aFileName | stream prefsSnapshot | #(Prevailing PersonalPreferences) do: [:ea | Parameters removeKey: ea ifAbsent: []]. stream := ReferenceStream fileNamed: aFileName. stream nextPut: Parameters. + prefsSnapshot := preferencesDictionary copy. - prefsSnapshot := DictionaryOfPreferences copy. prefsSnapshot keysAndValuesDo: [:key :pref | prefsSnapshot at: key put: pref asPreference]. stream nextPut: prefsSnapshot. stream nextPut: (Smalltalk isMorphic ifTrue:[World fillStyle] ifFalse:[DesktopColor]). stream close! Item was changed: (PackageInfo named: 'System') postscript: '" Convert SoundService registeredClasses to classes if necessary " [ | currentSoundSystem | currentSoundSystem := SoundService defaultOrNil. (SoundService registeredClasses copy collect: [:ss | SoundService unregister: ss. ss isBehavior ifTrue: [ss] ifFalse: [ss class]] ) do: [:ssClass | SoundService register: ssClass]. SoundService default: (currentSoundSystem ifNotNil: [:css| css isBehavior ifTrue: [css] ifFalse: [css class]]). ] value. "Convert preferences dictionary from class var to inst var if necessary." (Preferences instVarNamed: ''preferencesDictionary'') ifNil: [(Preferences classPool at: #DictionaryOfPreferences) ifNotNil: [:dictionary| Preferences instVarNamed: ''preferencesDictionary'' + put: dictionary]]. + + (Smalltalk classNamed: #ServicePreferences) ifNotNil: + [:sp| + (sp instVarNamed: ''preferencesDictionary'') ifNil: + [(sp classPool at: #ServiceDictionaryOfPreferences) ifNotNil: + [:dictionary| + sp + instVarNamed: ''preferencesDictionary'' + put: dictionary]]]'! - put: dictionary]]'! From commits at source.squeak.org Wed Jul 1 19:17:27 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 19:17:28 2015 Subject: [squeak-dev] The Trunk: System-ul.748.mcz Message-ID: Chris Muller uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-ul.748.mcz ==================== Summary ==================== Name: System-ul.748 Author: ul Time: 1 July 2015, 1:17:39.216 pm UUID: 7e127e9c-33da-4199-b81f-324808eebfae Ancestors: System-eem.747 - Iterate over pragmas once per method instead of once per pragma in Preferences class>>prefEvent:. - There's no need to copy preferencesDictionary in Preferences class>>storePreferencesIn:, because it's a read-only data structure. - Ensure the durability of the changes of preferencesDictionary in Preferences class>>atomicUpdatePreferences: by checking for changes before overwriting it. =============== Diff against System-eem.747 =============== Item was changed: ----- Method: Preferences class>>atomicUpdatePreferences: (in category 'accessing') ----- + atomicUpdatePreferences: aBlock - atomicUpdatePreferences: aBlock "Evaluate aBlock with a copy of the preferences dictionary and + then assign (assignment is atomic) the copy to the dictionary." + + [ + | originalPreferences copyOfPreferences | + originalPreferences := preferencesDictionary. + copyOfPreferences := preferencesDictionary + ifNil: [ IdentityDictionary new ] + ifNotNil: [ :dictionary | dictionary copy ]. + aBlock value: copyOfPreferences. + originalPreferences == preferencesDictionary ifTrue: [ + preferencesDictionary := copyOfPreferences. + ^self ] ] repeat! - then assign (assignment is atomic) the copy to the dictionary." - | copyOfPreferences | - copyOfPreferences := preferencesDictionary - ifNil: [IdentityDictionary new] - ifNotNil: [:dict| dict copy]. - aBlock value: copyOfPreferences. - preferencesDictionary := copyOfPreferences! Item was changed: ----- Method: Preferences class>>prefEvent: (in category 'dynamic preferences') ----- prefEvent: anEvent "Check if this system event defines or removes a preference. TODO: Queue the event and handle in background process. There is zero reason to be so eager here." + + | aClass aSelector | - | aClass aSelector method | anEvent itemKind = SystemChangeNotifier classKind ifTrue: [^anEvent isRemoved ifTrue: [self removePreferencesFor: anEvent item]]. (anEvent itemKind = SystemChangeNotifier methodKind and: [(aClass := anEvent itemClass) isMeta]) ifFalse: "ignore instance methods" [^self]. aClass := aClass theNonMetaClass. aSelector := anEvent itemSelector. anEvent isRemoved ifTrue: [self atomicUpdatePreferences: [ :copyOfDictionaryOfPreferences | copyOfDictionaryOfPreferences removeKey: (aClass name,'>>', aSelector) asSymbol ifAbsent: []]] ifFalse: [(anEvent isAdded or: [anEvent isModified]) ifTrue: + [self respondToPreferencePragmasInMethod: anEvent item class: aClass]]! - [method := anEvent item. - method pragmas do: - [:pragma| - self respondToPreferencePragmasInMethod: method class: aClass]]]! Item was changed: ----- Method: Preferences class>>storePreferencesIn: (in category 'personalization') ----- + storePreferencesIn: aFileName + + | stream | - storePreferencesIn: aFileName - | stream prefsSnapshot | #(Prevailing PersonalPreferences) do: [:ea | Parameters removeKey: ea ifAbsent: []]. stream := ReferenceStream fileNamed: aFileName. stream nextPut: Parameters. + preferencesDictionary keysAndValuesDo: [:key :pref | preferencesDictionary at: key put: pref asPreference]. + stream nextPut: preferencesDictionary. - prefsSnapshot := preferencesDictionary copy. - prefsSnapshot keysAndValuesDo: [:key :pref | prefsSnapshot at: key put: pref asPreference]. - stream nextPut: prefsSnapshot. stream nextPut: (Smalltalk isMorphic ifTrue:[World fillStyle] ifFalse:[DesktopColor]). stream close! From commits at source.squeak.org Wed Jul 1 19:34:04 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 19:34:05 2015 Subject: [squeak-dev] Squeak 4.6: Tools-eem.626.mcz Message-ID: Chris Muller uploaded a new version of Tools to project Squeak 4.6: http://source.squeak.org/squeak46/Tools-eem.626.mcz ==================== Summary ==================== Name: Tools-eem.626 Author: eem Time: 30 June 2015, 3:05:48.319 pm UUID: 0bfae54b-3e68-4252-98d8-ddb1e56fc869 Ancestors: Tools-mt.625 Upgrade MessageSet class>>parse:toClassAndSelector: to allow one to construct text links in modern syntax, e.g. BitBlt class>>#subPixelRenderColorFonts =============== Diff against Tools-mt.625 =============== Item was changed: ----- Method: MessageSet class>>parse:toClassAndSelector: (in category 'utilities') ----- parse: methodRef toClassAndSelector: csBlock "Decode strings of the form [class] ." | tuple cl | self flag: #mref. "compatibility with pre-MethodReference lists" methodRef ifNil: [^ csBlock value: nil value: nil]. methodRef isString ifFalse: [^methodRef setClassAndSelectorIn: csBlock]. methodRef isEmpty ifTrue: [^csBlock value: nil value: nil]. + tuple := (methodRef asString includesSubString: '>>') + ifTrue: [(methodRef findTokens: '>>') fold: [:a :b| (a findTokens: ' '), {b first = $# ifTrue: [b allButFirst] ifFalse: [b]}]] + ifFalse: [methodRef asString findTokens: ' .']. - tuple := methodRef asString findTokens: ' .'. cl := Smalltalk at: tuple first asSymbol ifAbsent: [^ csBlock value: nil value: nil]. ^(tuple size = 2 or: [tuple size > 2 and: [(tuple at: 2) ~= 'class']]) ifTrue: [csBlock value: cl value: (tuple at: 2) asSymbol] ifFalse: [csBlock value: cl class value: (tuple at: 3) asSymbol]! From commits at source.squeak.org Wed Jul 1 19:34:13 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 19:34:16 2015 Subject: [squeak-dev] Squeak 4.6: Collections-topa.637.mcz Message-ID: Chris Muller uploaded a new version of Collections to project Squeak 4.6: http://source.squeak.org/squeak46/Collections-topa.637.mcz ==================== Summary ==================== Name: Collections-topa.637 Author: topa Time: 29 June 2015, 3:58:07.48 pm UUID: 32673ced-9c32-44cf-a95e-0cab2033fd30 Ancestors: Collections-eem.636 Always store Characters as if they had one instance variable with their value, regardless whether they are actually shaped that way. =============== Diff against Collections-eem.636 =============== Item was added: + ----- Method: Character>>storeDataOn: (in category 'object fileIn') ----- + storeDataOn: aDataStream + " Store characters in reference-like way, with value like instvar. + This is compatible with various Squeak Memory Systems" + + aDataStream + beginInstance: self class + size: 1. + aDataStream nextPut: self asInteger.! From commits at source.squeak.org Wed Jul 1 19:35:51 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 19:35:55 2015 Subject: [squeak-dev] Squeak 4.6: System-ul.748.mcz Message-ID: Chris Muller uploaded a new version of System to project Squeak 4.6: http://source.squeak.org/squeak46/System-ul.748.mcz ==================== Summary ==================== Name: System-ul.748 Author: ul Time: 1 July 2015, 1:17:39.216 pm UUID: 7e127e9c-33da-4199-b81f-324808eebfae Ancestors: System-eem.747 - Iterate over pragmas once per method instead of once per pragma in Preferences class>>prefEvent:. - There's no need to copy preferencesDictionary in Preferences class>>storePreferencesIn:, because it's a read-only data structure. - Ensure the durability of the changes of preferencesDictionary in Preferences class>>atomicUpdatePreferences: by checking for changes before overwriting it. =============== Diff against System-topa.743 =============== Item was changed: ----- Method: Preference>>name:defaultValue:helpString:localToProject:categoryList:changeInformee:changeSelector:type: (in category 'initialization') ----- name: aName defaultValue: aValue helpString: aString localToProject: projectBoolean categoryList: aList changeInformee: informee changeSelector: aChangeSelector type: aType "Initialize the preference from the given values. There is an extra tolerence here for the symbols #true, #false, and #nil, which are interpreted, when appropriate, as meaning true, false, and nil" name := aName asSymbol. + value := defaultValue := aValue + caseOf: { + [#true] -> [true]. + [#false] -> [false] } + otherwise: + [aValue]. - defaultValue := aValue. - aValue = #true ifTrue: [defaultValue := true]. - aValue = #false ifTrue: [defaultValue := false]. - value := defaultValue. helpString := aString. localToProject := projectBoolean == true or: [projectBoolean = #true]. type := aType. + categoryList := aList + ifNil: [OrderedCollection with: #unclassified] + ifNotNil: [aList collect: [:elem | elem asSymbol]]. - categoryList := (aList ifNil: [OrderedCollection with: #unclassified]) collect: - [:elem | elem asSymbol]. + changeInformee := (informee == nil or: [informee == #nil]) ifFalse: + [(informee isSymbol) + ifTrue: [Smalltalk at: informee] + ifFalse: [informee]]. - changeInformee := (informee == nil or: [informee == #nil]) - ifTrue: [nil] - ifFalse: [(informee isKindOf: Symbol) - ifTrue: - [Smalltalk at: informee] - ifFalse: - [informee]]. changeSelector := aChangeSelector! Item was changed: Object subclass: #Preferences instanceVariableNames: '' + classVariableNames: 'DesktopColor DictionaryOfPreferences Parameters' - classVariableNames: 'AccessLock DesktopColor DictionaryOfPreferences Parameters' poolDictionaries: '' category: 'System-Preferences'! + Preferences class + instanceVariableNames: 'preferencesDictionary'! + !Preferences commentStamp: 'eem 6/30/2015 15:10' prior: 0! + A general mechanism to store preference choices. The default setup treats any symbol as a potential boolean flag; flags unknown to the preference dictionary are always answered as false. - !Preferences commentStamp: '' prior: 0! - A general mechanism to store preference choices. The default setup treats any symbol as a potential boolean flag; flags unknown to the preference dictionary are always returned as false. + To open the control panel: + PreferenceBrowser open - To open the control panel: Preferences openFactoredPanel To read how to use the panel (and how to make a preference be per-project): Preferences giveHelpWithPreferences + All messages are on the class side. There are two kinds of preference definition, preference pragmas (which are preferred) and preferences local to Preferences. - All messages are on the class side. + Preference Pragmas + Preferences can be local to a class or system of classes using preference pragmas. Look at senders of #preference:category:description:type: and #preference:categoryList:description:type: for examples: + (self systemNavigation browseAllSelect: + [:m| + #(preference:category:description:type: preference:categoryList:description:type:) anySatisfy: + [:s| (m pragmaAt: s) notNil]]) + With a preference pragma, the preference is typically kept in a class variable, local to the class whose method(s) contain(s) the pragma. Good style is to put the preference pragma in the accessor for the variable; see for example BitBlt class>>#subPixelRenderColorFonts. The pragma serves to declare the preference to Preferences. + + + Preference-local Preferences To query a a preference: Preferences logDebuggerStackToFile or some people prefer the more verbose Preferences valueOfFlag: #logDebuggerStackToFile + You can make up a new preference any time. Do not define a new message in Preferences class. Accessor methods are compiled automatically when you add a preference, either as as illustrated below, or by using - You can make up a new preference any time. Do not define a new message in Preferences class. Accessor methods are compiled automatically when you add a preference as illustrated below: + To add a non-pragma preference (e.g. in the Postscript of a fileout): + Preferences + addPreference: #samplePreference + categories: #(general browsing) + default: true + balloonHelp: 'This is an example of a preference added by a do-it' + projectLocal: false + changeInformee: nil + changeSelector: nil. - To add a preference (e.g. in the Postscript of a fileout): - Preferences addPreference: #samplePreference categories: #(general browsing) - default: true balloonHelp: 'This is an example of a preference added by a do-it' - projectLocal: false changeInformee: nil changeSelector: nil. To change a preference programatically: Preferences disable: #logDebuggerStackToFile. Or to turn it on, Preferences enable: #logDebuggerStackToFile. ! + Preferences class + instanceVariableNames: 'preferencesDictionary'! Item was removed: - ----- Method: Preferences class>>accessDictionaryOfPreferencesIn: (in category 'accessing') ----- - accessDictionaryOfPreferencesIn: aBlock - - ^(AccessLock ifNil: [ AccessLock := Mutex new ]) - critical: [ aBlock value: DictionaryOfPreferences ]! Item was changed: ----- Method: Preferences class>>addPreference:categories:default:balloonHelp:projectLocal:changeInformee:changeSelector:type: (in category 'add preferences') ----- addPreference: aName categories: categoryList default: aValue balloonHelp: helpString projectLocal: localBoolean changeInformee: informeeSymbol changeSelector: aChangeSelector type: aType "Add or replace a preference as indicated. Reuses the preexisting Preference object for this symbol, if there is one, so that UI artifacts that interact with it will remain valid." + | newPreference aPreference | + (newPreference := Preference new) + name: aName asSymbol + defaultValue: aValue + helpString: helpString + localToProject: localBoolean + categoryList: categoryList + changeInformee: informeeSymbol + changeSelector: aChangeSelector - | aPreference aPrefSymbol | - aPrefSymbol := aName asSymbol. - aPreference := self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences - at:aPrefSymbol - ifAbsent: [ Preference new ] ]. - aPreference - name:aPrefSymbol - defaultValue:aValue - helpString:helpString - localToProject:localBoolean - categoryList:categoryList - changeInformee:informeeSymbol - changeSelector:aChangeSelector type: aType. + aPreference := preferencesDictionary + at: newPreference name + ifAbsent: [newPreference]. + aPreference == newPreference + ifTrue: "Atomically add the new preference to the dictionary." + [self atomicUpdatePreferences: + [:preferenceDictionaryCopy| + preferenceDictionaryCopy at: newPreference name put: newPreference]] + ifFalse: "Use the copyFrom: primitive to atomically update the existing preference." + [aPreference copyFrom: newPreference]. + self compileAccessMethodForPreference: aPreference! - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences at: aPrefSymbol put: aPreference ]. - self compileAccessMethodForPreference:aPreference! Item was changed: ----- Method: Preferences class>>allPreferenceObjects (in category 'preference-object access') ----- allPreferenceObjects "Answer a list of all the Preference objects registered in the system" + ^preferencesDictionary values! - ^self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences values ]! Item was added: + ----- Method: Preferences class>>atomicUpdatePreferences: (in category 'accessing') ----- + atomicUpdatePreferences: aBlock + "Evaluate aBlock with a copy of the preferences dictionary and + then assign (assignment is atomic) the copy to the dictionary." + + [ + | originalPreferences copyOfPreferences | + originalPreferences := preferencesDictionary. + copyOfPreferences := preferencesDictionary + ifNil: [ IdentityDictionary new ] + ifNotNil: [ :dictionary | dictionary copy ]. + aBlock value: copyOfPreferences. + originalPreferences == preferencesDictionary ifTrue: [ + preferencesDictionary := copyOfPreferences. + ^self ] ] repeat! Item was changed: ----- Method: Preferences class>>compileAccessMethodForPreference: (in category 'initialization') ----- compileAccessMethodForPreference: aPreference "Compile an accessor method for the given preference" self class compileSilently: ( + '{1} ^self valueOfFlag: {2} ifAbsent: {3}' - '{1} ^self valueOfFlag: {2} ifAbsent: [ {3} ]' format: { aPreference name asString. aPreference name asSymbol printString. aPreference defaultValue storeString }) classified: '*autogenerated - standard queries'! Item was added: + ----- Method: Preferences class>>createPreference:categoryList:description:type: (in category 'private') ----- + createPreference: prefName categoryList: arrayOfStrings description: helpString type: typeSymbol + "Add a preference residing in aMethod" + | aPreference | + aPreference := PragmaPreference new. + aPreference + name: prefName + defaultValue: nil "always nil" + helpString: helpString + localToProject: false "governed by the method" + categoryList: arrayOfStrings + changeInformee: nil + changeSelector: nil + type: typeSymbol. + ^aPreference! Item was changed: ----- Method: Preferences class>>dictionaryOfPreferences (in category 'accessing') ----- dictionaryOfPreferences + "N.B. Does /not/ answer the dictionary itself. To burrow that deep use e.g. instVarNamed:" + ^preferencesDictionary copy! - "The use of this accessor doesn't ensure that the dictionary is not accessed concurrently. Use #accessDictionaryOfPreferencesIn: instead." - - ^DictionaryOfPreferences! Item was removed: - ----- Method: Preferences class>>dictionaryOfPreferences: (in category 'accessing') ----- - dictionaryOfPreferences: anObject - DictionaryOfPreferences := anObject! Item was changed: ----- Method: Preferences class>>initializeDictionaryOfPreferences (in category 'initialization') ----- initializeDictionaryOfPreferences + "Initialize the preferencesDictionary to be an empty IdentityDictionary" - "Initialize the DictionaryOfPreferences to be an empty IdentityDictionary" "Preferences initializeDictionaryOfPreferences" + preferencesDictionary := IdentityDictionary new! - self dictionaryOfPreferences:IdentityDictionary new! Item was changed: ----- Method: Preferences class>>inspectPreferences (in category 'preferences panel') ----- inspectPreferences "Open a window on the current preferences dictionary, allowing the user to inspect and change the current preference settings. This is fallen back upon if Morphic is not present. This is dangerous, the dictionary of preferences should not be accessed concurrently." "Preferences inspectPreferences" + preferencesDictionary inspectWithLabel: 'Preferences'! - self dictionaryOfPreferences inspectWithLabel:'Preferences'! Item was changed: ----- Method: Preferences class>>prefEvent: (in category 'dynamic preferences') ----- prefEvent: anEvent "Check if this system event defines or removes a preference. TODO: Queue the event and handle in background process. There is zero reason to be so eager here." + + | aClass aSelector | + anEvent itemKind = SystemChangeNotifier classKind ifTrue: + [^anEvent isRemoved ifTrue: + [self removePreferencesFor: anEvent item]]. + (anEvent itemKind = SystemChangeNotifier methodKind + and: [(aClass := anEvent itemClass) isMeta]) ifFalse: "ignore instance methods" + [^self]. + aClass := aClass theNonMetaClass. + aSelector := anEvent itemSelector. + anEvent isRemoved + ifTrue: + [self atomicUpdatePreferences: [ :copyOfDictionaryOfPreferences | + copyOfDictionaryOfPreferences removeKey: (aClass name,'>>', aSelector) asSymbol ifAbsent: []]] + ifFalse: + [(anEvent isAdded or: [anEvent isModified]) ifTrue: + [self respondToPreferencePragmasInMethod: anEvent item class: aClass]]! - | aClass aSelector prefSymbol method | - (anEvent itemKind = SystemChangeNotifier classKind and: [anEvent isRemoved]) - ifTrue:[self removePreferencesFor: anEvent item]. - anEvent itemKind = SystemChangeNotifier methodKind ifTrue:[ - aClass := anEvent itemClass. - aClass isMeta ifFalse:[^self]. "ignore instance methods" - aClass := aClass theNonMetaClass. - aSelector := anEvent itemSelector. - (anEvent isRemoved or:[anEvent isModified]) ifTrue:[ - prefSymbol := (aClass name,'>>', aSelector) asSymbol. - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences removeKey: prefSymbol ifAbsent:[] ] ]. - (anEvent isAdded or:[anEvent isModified]) ifTrue:[ - method := anEvent item. - method pragmas do:[:pragma| | aPreference aPrefSymbol | - ((pragma keyword == #preference:category:description:type:) - or: [pragma keyword == #preference:categoryList:description:type:]) ifTrue:[ - aPrefSymbol := (aClass name,'>>', method selector) asSymbol. - aPreference := self - preference: pragma arguments first - category: pragma arguments second - description: pragma arguments third - type: pragma arguments fourth. - aPreference - provider: aClass - getter: method selector - setter: method selector asMutator. - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences at: aPrefSymbol put: aPreference ] ] ] ] ]. - ! Item was changed: ----- Method: Preferences class>>preference:category:description:type: (in category 'dynamic preferences') ----- + preference: prefName category: categoryName description: helpString type: typeSymbol + "Create a preference for a preference pragma in a method. + This method gets invoked from respondToPreferencePragmasInMethod:class:" + ^self createPreference: prefName + categoryList: (categoryName isArray "Alas pragma users are not always careful" + ifTrue: [categoryName] + ifFalse: [{categoryName} asArray]) + description: helpString + type: typeSymbol! - preference: prefName category: aStringOrArrayOfStrings description: helpString type: typeSymbol - "Add a preference residing in aMethod" - | aPreference | - aPreference := PragmaPreference new. - aPreference - name: prefName - defaultValue: nil "always nil" - helpString: helpString - localToProject: false "governed by the method" - categoryList: (aStringOrArrayOfStrings isArray ifTrue:[aStringOrArrayOfStrings] ifFalse:[{aStringOrArrayOfStrings}]) - changeInformee: nil - changeSelector: nil - type: typeSymbol. - ^aPreference! Item was added: + ----- Method: Preferences class>>preference:categoryList:description:type: (in category 'dynamic preferences') ----- + preference: prefName categoryList: categoryList description: helpString type: typeSymbol + "Create a preference for a preference pragma in a method. + This method gets invoked from respondToPreferencePragmasInMethod:class:" + ^self createPreference: prefName categoryList: categoryList asArray description: helpString type: typeSymbol! Item was changed: ----- Method: Preferences class>>preferenceAt:ifAbsent: (in category 'preference-object access') ----- preferenceAt: aSymbol ifAbsent: aBlock "Answer the Preference object at the given symbol, or the value of aBlock if not present" + ^preferencesDictionary at: aSymbol ifAbsent: aBlock! - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences - at: aSymbol - ifPresent: [ :preference | ^preference ] ]. - ^aBlock value! Item was changed: ----- Method: Preferences class>>registerForEvents (in category 'dynamic preferences') ----- registerForEvents "Preferences registerForEvents" + SystemChangeNotifier uniqueInstance + noMoreNotificationsFor: self; + notify: self ofAllSystemChangesUsing: #prefEvent:. + Smalltalk allClassesDo: + [:aClass| + aClass class methodsDo: + [:method| + self respondToPreferencePragmasInMethod: method class: aClass]]! - SystemChangeNotifier uniqueInstance noMoreNotificationsFor: self. - SystemChangeNotifier uniqueInstance notify: self ofAllSystemChangesUsing: #prefEvent:. - Smalltalk allClassesDo:[:aClass| - aClass class methodsDo:[:method| - method pragmas do:[:pragma| | aPreference aPrefSymbol | - pragma keyword == #preference:category:description:type: ifTrue:[ - aPrefSymbol := (aClass name,'>>', method selector) asSymbol. - aPreference := self - preference: pragma arguments first - category: pragma arguments second - description: pragma arguments third - type: pragma arguments fourth. - aPreference - provider: aClass - getter: method selector - setter: method selector asMutator. - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences at: aPrefSymbol put: aPreference ] ] ] ] ]. - ! Item was changed: ----- Method: Preferences class>>removePreference: (in category 'initialization') ----- removePreference: aSymbol "Remove all memory of the given preference symbol in my various structures." | pref | + pref := self preferenceAt: aSymbol ifAbsent: [^self]. + pref localToProject ifTrue: + [Project allProjects do: + [:proj | + proj projectPreferenceFlagDictionary ifNotNil: + [:projectpreferences| + projectpreferences removeKey:aSymbol ifAbsent:[]]]]. + self atomicUpdatePreferences: [ :copyOfDictionaryOfPreferences | + copyOfDictionaryOfPreferences removeKey: aSymbol ifAbsent: nil ]. + self class removeSelector: aSymbol - pref := self preferenceAt:aSymbol ifAbsent:[^ self]. - pref localToProject - ifTrue: - [Project allInstancesDo: - [:proj | - proj projectPreferenceFlagDictionary ifNotNil: - [proj projectPreferenceFlagDictionary removeKey:aSymbol ifAbsent:[]]]]. - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences removeKey: aSymbol ifAbsent: [] ]. - self class removeSelector:aSymbol "Preferences removePreference: #tileToggleInBrowsers"! Item was changed: ----- Method: Preferences class>>removePreferencesFor: (in category 'dynamic preferences') ----- removePreferencesFor: aClass "Remove all the preferences registered for the given class" "Preferences removePreferencesFor: PreferenceExample" + self atomicUpdatePreferences: + [:copyOfDictionaryOfPreferences| | map | + map := copyOfDictionaryOfPreferences select: [ :pref | pref provider == aClass]. + map keysDo: + [ :prefName | + copyOfDictionaryOfPreferences removeKey: prefName]]! - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - | map | - map := dictionaryOfPreferences select: [ :pref | pref provider == aClass ]. - map keysDo: [ :prefName | dictionaryOfPreferences removeKey: prefName ] ]! Item was added: + ----- Method: Preferences class>>respondToPreferencePragmasInMethod:class: (in category 'dynamic preferences') ----- + respondToPreferencePragmasInMethod: method class: class + method pragmas do: + [:pragma| | preference | + ((pragma keyword beginsWith: #preference:) + and: [self respondsTo: pragma keyword]) ifTrue: + [preference := self + perform: pragma keyword + withArguments: pragma arguments. + preference + provider: class + getter: method selector + setter: method selector asMutator. + self atomicUpdatePreferences: + [ :copyOfDictionaryOfPreferences | + copyOfDictionaryOfPreferences + at: (class name, '>>', method selector) asSymbol + put: preference]]]! Item was changed: ----- Method: Preferences class>>savePersonalPreferences (in category 'personalization') ----- savePersonalPreferences "Save the current list of Preference settings as the user's personal choices" self + setParameter: #PersonalDictionaryOfPreferences + to: preferencesDictionary deepCopy! - setParameter:#PersonalDictionaryOfPreferences - to: ( - self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences deepCopy ])! Item was changed: ----- Method: Preferences class>>storePreferencesIn: (in category 'personalization') ----- + storePreferencesIn: aFileName + + | stream | + #(Prevailing PersonalPreferences) do: + [:ea | + Parameters removeKey: ea ifAbsent: []]. - storePreferencesIn: aFileName - | stream prefsSnapshot | - #(#Prevailing #PersonalPreferences ) do:[:ea | Parameters removeKey:ea ifAbsent:[]]. stream := ReferenceStream fileNamed: aFileName. + stream nextPut: Parameters. + preferencesDictionary keysAndValuesDo: [:key :pref | preferencesDictionary at: key put: pref asPreference]. + stream nextPut: preferencesDictionary. + stream nextPut: (Smalltalk isMorphic + ifTrue:[World fillStyle] + ifFalse:[DesktopColor]). - stream nextPut:Parameters. - prefsSnapshot := self accessDictionaryOfPreferencesIn: [ :dictionaryOfPreferences | - dictionaryOfPreferences copy ]. - prefsSnapshot keysAndValuesDo: [:key :pref | prefsSnapshot at: key put: pref asPreference]. - stream nextPut: prefsSnapshot. - Smalltalk isMorphic - ifTrue:[stream nextPut:World fillStyle] - ifFalse:[stream nextPut:DesktopColor]. stream close! Item was changed: ----- Method: SmalltalkImage>>license (in category 'license') ----- license "This method contains the text of the license agreement for Squeak." ^ + 'Copyright (c) The individual, corporate, and institutional contributors who have collectively contributed elements to this software ("The Squeak Community"), 1996-2015 All rights reserved. - 'Copyright (c) The individual, corporate, and institutional contributors who have collectively contributed elements to this software ("The Squeak Community"), 1996-2014 All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Portions of Squeak are covered by the following license Copyright (c) Xerox Corp. 1981, 1982 All rights reserved. Copyright (c) Apple Computer, Inc. 1985-1996 All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. '! Item was changed: (PackageInfo named: 'System') postscript: '" Convert SoundService registeredClasses to classes if necessary " [ | currentSoundSystem | currentSoundSystem := SoundService defaultOrNil. (SoundService registeredClasses copy collect: [:ss | SoundService unregister: ss. ss isBehavior ifTrue: [ss] ifFalse: [ss class]] ) do: [:ssClass | SoundService register: ssClass]. SoundService default: (currentSoundSystem ifNotNil: [:css| css isBehavior ifTrue: [css] ifFalse: [css class]]). + ] value. + + "Convert preferences dictionary from class var to inst var if necessary." + (Preferences instVarNamed: ''preferencesDictionary'') ifNil: + [(Preferences classPool at: #DictionaryOfPreferences) ifNotNil: + [:dictionary| + Preferences + instVarNamed: ''preferencesDictionary'' + put: dictionary]]. + + (Smalltalk classNamed: #ServicePreferences) ifNotNil: + [:sp| + (sp instVarNamed: ''preferencesDictionary'') ifNil: + [(sp classPool at: #ServiceDictionaryOfPreferences) ifNotNil: + [:dictionary| + sp + instVarNamed: ''preferencesDictionary'' + put: dictionary]]]'! - ] value'! From commits at source.squeak.org Wed Jul 1 19:36:20 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 19:36:21 2015 Subject: [squeak-dev] Squeak 4.6: ReleaseBuilder-mt.125.mcz Message-ID: Chris Muller uploaded a new version of ReleaseBuilder to project Squeak 4.6: http://source.squeak.org/squeak46/ReleaseBuilder-mt.125.mcz ==================== Summary ==================== Name: ReleaseBuilder-mt.125 Author: mt Time: 1 July 2015, 10:15:47.361 am UUID: 3338b57a-ab20-ac44-b37b-d4e09f23e453 Ancestors: ReleaseBuilder-cmm.124 Restore setting the background in release builder's #setPreferences46 so that our build server produces trunk images with correct preferences again. #prepareNewBuild: is agnostic to the current release version. Note: We should find out why #prepareNewBuild: requires another try to set the background and where that background gets overridden. It is not good to put version-specific code into a version-agnostic method. =============== Diff against ReleaseBuilder-cmm.123 =============== Item was removed: - SystemOrganization addCategory: #ReleaseBuilder! Item was removed: - Object subclass: #ReleaseBuilder - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'ReleaseBuilder'! - - !ReleaseBuilder commentStamp: 'fbs 5/2/2013 22:36' prior: 0! - I'm the script that prepares a trunk image for release. Which version of Squeak I release is stored in ReleaseBuilder class >> squeakVersion.! Item was removed: - ----- Method: ReleaseBuilder class>>buildRepository (in category 'private') ----- - buildRepository - ^ MCRepository trunk! Item was removed: - ----- Method: ReleaseBuilder class>>checkForDirtyPackages (in category 'scripts') ----- - checkForDirtyPackages - MCWorkingCopy checkModified: true. - (MCWorkingCopy allManagers anySatisfy: - [ : wc | (wc ancestors size = 1) not or: [ wc modified ] ]) ifTrue: [ Warning signal: 'There are dirty and/or unmerged packages.' ]! Item was removed: - ----- Method: ReleaseBuilder class>>configureDesktop (in category 'private') ----- - configureDesktop - self deleteAllWindows. - MorphicProject initialize. - Project current resourceManager reset. "Zap eventual resources" - "Replace docking bar instance in case its code has changed." - Project current removeMainDockingBar. - TheWorldMainDockingBar updateInstances! Item was removed: - ----- Method: ReleaseBuilder class>>deleteAllWindows (in category 'private') ----- - deleteAllWindows - (SystemWindow - windowsIn: ActiveWorld - satisfying: - [ : window | true ]) do: - [ : window | [ window makeClosable; delete ] - on: ProvideAnswerNotification - do: [ : noti | noti resume: true ] ]! Item was removed: - ----- Method: ReleaseBuilder class>>loadWellKnownPackages (in category 'private') ----- - loadWellKnownPackages - "Load into the release image those packages that have been stripped from Trunk, but still deemed necessary for a release artifact." - Installer new merge: #squeakRelease! Item was removed: - ----- Method: ReleaseBuilder class>>prepareNewBuild (in category 'scripts') ----- - prepareNewBuild - self prepareNewBuild: self buildRepository.! Item was removed: - ----- Method: ReleaseBuilder class>>prepareNewBuild: (in category 'scripts') ----- - prepareNewBuild: anMCRepository - "ReleaseBuilderTrunk prepareNewBuild" - "Prepare everything that should be done for a new image build" - MCMcmUpdater updateMissingPackages: true. - MCMcmUpdater enableUpdatesForAllPackages. - TTCFont registerAll. - RealEstateAgent standardSize: 600 @ 400. - SystemVersion newVersion: self versionString. - SMLoaderPlus setDefaultFilters: (OrderedCollection with: #filterSafelyAvailable). - " Preferences outOfTheBox." "<-- uncomment after #defaultValueTableForCurrentRelease is fixed up." - self - setDisplayExtent: 800 @ 600 ; - switchToNewRepository: anMCRepository ; - setPreferences ; "<-- remove this after defaultValueTableForCurrentRelease is fixed up." - checkForDirtyPackages ; - configureDesktop. - Smalltalk cleanUp: true. - "Let's be explicit about clearing passwords for the publicly-consumed build." - "clearPasswords is not very thorough, it should be improved." - MCHttpRepository clearCredentials. - Utilities setAuthorInitials: String empty. - Environment allInstancesDo: [ : env | env purgeUndeclared ]. - Undeclared removeUnreferencedKeys. - Smalltalk garbageCollect. - [ self loadWellKnownPackages "<-- 4.5 is not ready for unloaded / reloaded packages" ]. - Compiler recompileAll! Item was removed: - ----- Method: ReleaseBuilder class>>prepareNewRelease (in category 'scripts') ----- - prepareNewRelease - "This method is run at time of release to transfer the top trunk versions into my releaseRepository, and produce a release image." - self - transferCurrentPackagesAsUser: Utilities authorInitials - password: (UIManager default requestPassword: 'Enter password for ' , self projectUrl). - self prepareNewBuild: self releaseRepository! Item was removed: - ----- Method: ReleaseBuilder class>>prepareNextVersionAlpha (in category 'scripts') ----- - prepareNextVersionAlpha - "Prepare the first alpha image for next release." - SystemVersion - newVersion: ((UIManager default request: 'Please specify the name of the\new version of Squeak.' withCRs initialAnswer: SystemVersion current version) - ifEmpty: [^ self inform: 'Aborted.']). - MCFileBasedRepository flushAllCaches. - MCHttpRepository clearCredentials. - Utilities setAuthorInitials: String empty. - self switchToNewRepository: self buildRepository. - Smalltalk condenseSources! Item was removed: - ----- Method: ReleaseBuilder class>>projectBackground45 (in category 'resources') ----- - projectBackground45 - - ^ Form fromBinaryStream: 'iVBORw0KGgoAAAANSUhEUgAAAGYAAABXCAYAAAD2+TBqAAAvWUlEQVR4Xl3d19ocRZKA4b7/ - k72BPRqz45YBZkAIhDzyXkLe/0hIyOIlJEFtvdn9NbVzUE+XzYwMnxGR2audB+emR998OT1/ - eWP66uH56fzFvdPFL/dP9786Oz1+cnl69uL69ODrC9PV61+M32s3jozj7Pk905Vrh6cjx/41 - 3b57cjp24qNxfHnl4HTy9CfTmXOfjXd8d+7C59OtOyemC5f2jXtPnl0d7965d2p6/ebhuK+N - l9/dGv0fP/nxdP3m0enS5QOj/2+eXhnf+cZ72nTuOZjv3j893n/6/Np0+uyn04lTu6a3vz6e - btw6Nt758ef7072dM+N6mp5P3/1wZ8D09eNLY5za/uXt1+Mc/N5x/fPrr6Zvv789DrB6H4xg - gAP9Xr4y4+XhpenZ85vTo8dXxvH8xa3p60eXpxs3T0wvv70znb+wfzp1+rNx/9btU9O168em - na8uTO9+fTpdvXZ8evrs1vTrby+m23fOTtdvnJzevH06rQz68tVDAyAEevXLgzEowAPUYCDC - gP06IAAhDRjQAP7hp3vjW4h076dXO+PXtcM3COvdm7ePD2Q49IuIkInQEIg4+oN07foFI4J/ - cfTD8T6EnzqzexAR0hDKN9rWpl/t+S5G8hwB3def7w998f7oz+G+dhHNe34PH/lgnGsPbPD1 - 8NHFwWj6PnFy94zcowPZFy8dnI6f+GTcu37j+HT33tnp4KEPpiNHP5rOnts7I/70eNczBL1w - 8cBM1MvT/Z2L052756Zz5w+MA4FWkIsgqK9jiHvx7c3RucH4JTkOQBnc/oP/OxCxM0ube5/v - +9tW6gzEABHVwCEFYg0OYd68ezQ4DuFIjv78OhAQIRw48/sf7w64tI2wYP1tejo42fvu6d/h - G+/rw7UxQCb4SWTn/Wofco3Z2Pz6Vpv6NDYwuo5BtesaPJ5hxFevv55e//JoKymPv7k6JIUU - 3bt/btz76sHFQSTX3zy5Ns4ffv3l9MOPO9PNWyfHt965c/fMkKj7O+enFWAgCiCQBCgcaOAG - CyjXAPOewUA27j1w6L2h9gDrGQ4yaN8cPPzPcc9z77tGKARyrj0ExP0kVP9Hj/97DFrfuNU7 - 7377ZisJpJg0aA9iIArnG4PvcT3m6D1wRSDnxqNNY/CNdl1ry3lE1iYVi3jgdy9V71v3++bF - y9vTk6fXhyRQZ5ANye5D+Okze8a9X948HhKCID/+9NVWxfnWd1Tb9z/cH4T88vLhaaVDg4Aw - qgdidWiQCIUAOAqXegY4nAnwCOI8AkOKdwGeunMvhOgLByMItZhK8qtPRPMLmdSW9xGJhILF - e6k+7aSeIJAkJwG+1Z8+PAe3AzOkumpnz96/bm0aiU+VOpI47xqfdzCQX31e+vLQdOXqkUEA - v9TZseO7hiQgwr797w0JgPxz5/eNe5BPoqg80oaoh7/417j/86uHg2ArnQLEAAwEgAaXqkAE - SAUYQDN8dLdrxh9HQS7k+Ta16L24MJVloFRA9kP7SRlVhsN96xqBIdm5A4zgdQ/htYEhEM89 - /ZJasCAiVex975GoDHhEqn33MA+4tAcGDgC44cQ7SZ9z8PoGYUgF9YXznSMCVcWe+HUfotmZ - iPfFkX+Pc8QhHYjLBrFTvnd/pQPIgSQIMfhEF2JxfLrYu4DCVQZN7eBsBPKO57gbVxqAd1wj - Yh6S9iEZM7iG4O7pC/IMGCIREmLZJTBqE8LAmienT7DmPaXiwEtF+oXQCBuBMCBGADemQ6gM - f9+7N03PRh+pRn3pWxvsHZvANnz3/b0hDQjx9t2TgVzP2CBqy7Pu8dgQ0TVJSb0hEmnT3grA - AIMMiAgBiILziC1AcBIipGcNMIPoGkK4mJADeO9DoOfuaTfDm53SfoQMKQ5c7/AOO+YZafQM - MiGJpOYkcD4wC0bRvl/IdA/sCGKM2kwFudY+pvLrPc/AhpFSc6Sw77WNONqhKjHGyVOfDvUF - +VQT1YXzSQUXmTTxwrzD9vDGSAWb4pqj4JpKo+5I2SBM6sBgdARAg25+srQvCAdAv75LLRho - Rpi9yZbgWEjPWFMXuNdAEQ8hEZikOJqTaGfMEWYE4VxtuNYOIkCK8wgJDrAmnZANeZgu+6ZN - DNL8rDHlbGgDLAgNtlzk1LbrHCPX8DQckZkI3353d9p/4J8D+aSBywzhDirKNQkhTRBPUqg6 - v5wbfWI4mgF8xrzSGQAyktmC9LxBxNWQBxhS4D4E4KBUzt79fx+cPYzizH3NGSBAewaE4BlX - 5/sO/GMMFsE/+fRP4x3tI1J6Pe8QnK4NArw5Ekk7+HLvfeM9/bI3kI443nUPIc1hfN8k0z3n - YE9t6RNTQZq2wap9v+Bn5HlbpIUEZPSn6eXWbpAYEuIgDe7lxemT5oAPMMIXLbHSgc4BD1BA - NbhsCATgUoNAOFzUNc5M1xtwkzCI0hEExY2Q7j5mgACSRcW57/AOhDdxRDT3SaM+89QQURvN - T/LM3POt++AAd3OpvDb3PNNmDKSvvDTIdu0cfDw2RCN1Dn0gGqIPJ2ImBgRzh83kzVVIAylC - JAd1Rl15F3GoOFKEOMZnDOFZ+9pdxRE8EhySl4IoXvAM8ZoHFBHAuQ7A7mzCOhp1jbDZnr4x - UIOJ6w3W+/olZc4Zds/i3AgAHjA4MvQITAVQScGkP3Ak0UUl3ANj3h04qNFgwxze8evbVGBT - CN/mAKXuaZHhyc7GnFcFyYhCPVFhPDH3HNSYZ0+f3RjzG+quOQu8ciJIJNwZP5ysiA6AAGLQ - BuIFSMBpGWWAp48BnHoKUYiIOyGzSEFc2aBIpf5SmzgTF2fsM876x0nNa0ICoqbj9QNBhYx8 - q32I85z0M/7ew1xNCYxVH+BoVu9bttG34MIgfl2zk95rAr6MNhg7tcUFZvx/+vnBVmIg35wE - AUiPe94jKVQc6eGB6fvsec7Xvhn+2SO7d3JcD4kBQCqiiVaz/aFHN2JmsIAzcA36RYzEEQES - S+cRN98fgryL01OVBlygFLJiCm04RxQwQIjvC5bGQNoFm3ZJV0FOY6EKEYR05kW5/9nnf/l/ - sTBjKAphXNpzUJFgKUaHyYobgkG7EMzG7N33v9Onn/11OACIcPTYx9Oez/8+JMrBFUYQaoxE - IVzOyrUb5pDwZjwXZmY5s57HQBLASE2eQXaCQS1+hkMyisTNd83sSY17TUghHOdRNdqjOryH - GBEn2+N58anUkL69bx5R7M59fVNB2tV3XhS4vI/zU1H6zGPTR6EbR+pW21vuX/Sx9OIKR/Us - b3TgbrYfJIUKY9hJCOmhvpyb37A9ucPmNe4hlv708eJbbdJAp2eh2D+ItGp2v5wJ8wpwLEQz - flSGI48p17TwB2TjpiaaGfBlhMAAER/nea4vA9YPAiIMVzibkEqkSnB9ahP3atN5HBfxU8vF - 41JBvEXvI3bf6pd0ZMNIlz6MmZQgrPe99+v0ZMBY3BBMGHgN+8th0BHDOeSToml6sSWAZ+41 - 30FA0gU+hLl6/fAsoQfmPm/POCHJe6YVpBVugYDEGCEgl7hCsAYysoUkICbVkdsdQRAwdYj7 - nCN+4Rnvl18pzFO+JvUDceDST6Ej50UU3EOovKtUTnG17E6SsPQUSxU0Z4oRSWHpBwQ0tuZT - BUqNyThdL3NAxlb4yrNUYzFGk/XwVf7JuAs1xVwYa1WcqnA3QAFX6MJ1EzEd5335JpEnJTou - 94KAfnUKCdkP1wUcM8DazkZRK+DwTuov9RND6DO1E7yeNe8xWAci9C1Gg5QiHODIPUbI5lik - jORAkva9i6BLt1tfpTIwa2pOP80Hs48OcGgHrM6L45UTyg7qrzFpY1WDzcghmWooxI9IgIPI - DHkRWggI6UVjC20UkfXMOWQXTXYOyNzjvCWE0AYkIaj+cXWBTW012cSJ5Wkg3T2z6OyUc4zl - uqBsMTDSlqueOobomNTYC+9E7IK68AFf2TLvglt/4CuSgSgFR7VvLNSfdzkx2qcS4UBbvtG3 - Z65XkJdXgpJN1gAP+QaXmkAYwLlXnAvHpU6aFWckAevXwCDBt3GGftkyRCNdANUmLkIY7UE+ - j6wJpsFRY/UdM3i3w7dlKyHHWPxqHxH0bazNi9IWzcvAAv5m4eCr7ybQxps3u4wjlp9yv4mq - PuCoEFfpdu2lthyuMyu+WwVsXofz8vsonlezdIUBXxaxuY3fIrjNSXRMPQBG54Vi0rG41DdJ - WSrS/f8MSHofrKmqJpTBWOq6eVLByCaFRR7AUS4o1apvB5XlfgQpgoAQmGM5+0eAvLOICKYm - w01K83oLDJcpTYoar/czDca9ys3UGNHENWUlHQYBoSWJTAgLzRRGB2xOAwDLEEYwHaZ2AKYd - 14ibKil/kl2hwspGNp8Amz48J4FJKXXgHilCNAMtDgaJeV5FxisOyaaVp6m/VBeVggmp2TxW - jFk6Qbuew4FzM3iqCCzOvQd2Y9KXMWlL28sohbaK9zm0sUqUSvuiKu6o8ALCigZDRiEKCNIR - MYUEDefbe7cij8InkA44wCa2f/jTf41JlYP/buZ75hw7NU/EznwyS9t7s/2gEj4a1w7n3vMO - F7NCEsiOifTF7mAiDBWsSW6RdO9ypd1DDAzjnZJuhV6aUpSqyLMqIJsnWPoidZVNLe7me3Cl - ZmmVXbv/OO7lAPlWu1vjny5OHLMFgKoipGQRoJ17D8dk5ByFxrVn0AZWcg3x3PdtDgYffucB - cT43CHT77omZqGzU9THpcl+Ywn0z4sdPvhwTspffsQfXtpPUose4z3iK50Fyqe+mAJBchBoM - nmEYxPF9EQvMBdkQZ44FwRWZxISl17PFudkRKfxqL0nxbXA1v4qRs32rQvsAK7RODKk1jacm - MugVahgEafK8erS4yjkA/Jba1SlEIE7zJO1B8vWbRwbyf3n7cIQkEOPdb4/HZIuEODcrJk1v - 3n09iHPk2IfjW3CWmwd3M3ZwVZMWgfKGmmeAl4NS1Dt161vtaQuMog9V0DjHwFXz+JZHBcnF - 8TBd7rtn+gUL+IqqUG/eyaMDI3wXeF1llPOEqtlqnlGQ0MCKwhbjQpi4q3RwvrzGC5sUujG4 - JpkFIh98fX5WnR+Pg2oSwPvi6AezhL0/I3z3IAaVRnUhINVGpYkvUWmlJJLo4lnNfSC5yZ7+ - SXWSDpkkPBVHuo276IYDMlMxpRbgqwKP3PFwoO8YUVtwUCqFu6wdcBGETIb3w2NJs6HK8rUr - oijf7h6xXQb1NOY3L4S6SocmDaVtdd5ELa5rotV8ouK6ZuIVFDZnylPM+8uVNZhCJqlTz9hB - 72fgc3W1yxaWaU09I2r9F21o3gVG3+z+7M/bejXfFScsolDoCT7AllPimyay2vNObncBVyEv - 91N9TXpXBfF8qEMckrtJBDOMvec8ianKpVl/yHQNMZDQ3KMCDAegCp0XSQjRTbR8XykUqUUs - Ym8w1YlVGtukN3tWGnqZzi58X5EFBgIbQ5u3tkx3hGRjBBPJ870+XOvDN2CKafQBh753Hy4L - loq3lbdaFoPkKMERwhif9lcmRYlzaeEOzwCe57PMMlYcgZsckFOYvioZnSIcBGVM3WtGj1tK - +xYWacKoLV7VMvdiMH4ZYwdpFsLHYc5zLgyw2F/FiY1B37moEI3IFf95VgTckaHWptBJFajF - w5rXaR88xg4GjoL+vOu8uZTxNgfLPiMklVqfZWpXEFdopTlN5bAoWllps+lKkZocVXUJMR2J - McAAjPAGhavo2Yo5tF1evgJzfRsEg1jyDsBlKzPkxeUMrtKl5jDGoZ9SFpXflidKJRmPtnsW - TMvIgLHmZVUKZWxFxqsYSlKrzatGGyxwUo0CRi/SAjef7vmf7eS1sXs2vDKAV5GJy5roFFUG - YPW+y5xIbrKBNonLhlT3W4wJp1fk7RxCcq8z1FU5Gpg2cZ9r/TaoJA4zFMYvZBPCIFD7TXhz - i1NL2Qv9L/MsfrWH85u9Y8i80qYQvimY6j1c3yoC7WIwDK8vKi1nooJHvwi8jHQnuanAVZk7 - DwHE2OXduPYB5ET9osS4C9DlaIoOFCavhqxQeLGoZr4QV66/6vxC9S3dWKpQfcY4lfS6V4wP - LGDGjb2DkMWyckryOhGvVHiwJyFLlet7k0DwxEDFyiJcklLlp3HmKGWrKiosFJQtS/1le3yv - WmglkaMoQD5aJYdqdOU11UF5Jq+tUM07Ej5VpjukSRUZuFeJZ0khSxAkhNRSuadoQamovLfc - uKRSIQzIcJ5z4WgegRMxRRlShM376nlqr8laKweWaezCRanHsVRkzseXfQS7Mbtn3FW/yDqW - DIMD5UhSw36byBZnq6IzaUVEhG+ul5qv6KU4Xhnj8lWrgZw5NQp5UqCAUOEBsDdvvxmdQ7h3 - KvWswkPFx29C9/MvAkG6ch3XUq4yet5FODlvTKDyXTmoe6NCceYW6jIHpLkOKSnehrMhFLIr - QEco0QTSXBSBBHof1+NW6qVoRjaPROYul7PHJFVKIo66YuNwDm54kI2sFEkJLMZd14892wZQ - 2bXsJJj0jwEQzjNIx1hJonFSd5XqIloxtJXOcAtgdKqQQJlnlYQKCtwHmGp1BHGuwgMREVSB - QbW4Ds9xlu8RwveVhiJa7/mmpRdUQ/EmIp7v34R1mctpYHFllThlAAu98Iiqma7itARfAUnM - ZkwKKkhL+XtjQDCEMW5jwKAOBHR/MPAm3a3f5i15aMEZc2A2Ul46goOT05D6LWqyIpKOuAVh - AAFgnbeopgU5nlN3iEm8K98hHaTH8yTm873/GAQxGGrMgN03IFUkJKyZOyQhUC5unlIeYp5j - dioDzFgWSvcNBHiXAa3UtbKmIskFbkkMdYsADhKMQTGa8RkXHOz65M8Dfs+reiHxCApGhC9t - DfYchBZrFT9kd8pgYkKEMiVpFYUD0RBzhUsgLO6HWEimbgBH3ypawzUIUXlni3KogKTO4AzA - e4iEaIiA4J5V5V7drr6r4WIPnBdRwE0GTV3Rud4xiMqW3v/wv7eVl+YYGV5zhdRVKsw31GXz - FoRmo8YsfYYffCQb4505+/n4jaFIDtUFVnB7r5VhnpU+Zq/KlJpoFmbBIMu4GearxLZEmecm - oDlFY+Yf9yKKuic1uDgCITJyuAOwDCGEuwdAyK1O17sI5t6hwx+O5QU4z2Egvsd9VIbDPdIT - B1cLBvnVqhUeoZJajFqoHXdVqV9Kt/LdjK92Kt1NSpYrGzwzHozUYqJ1tcuLQSxMlIQgGOZD - EOMAO81QxnLptusHnBWyfPzJH8a4mmiWws74OzAOorBRYBteGaRCnI5xBa7HMQBzD3K9o7LQ - ewhAonAbwrgPWN8AtgJqjgWiejcPD0ER1rsHDr6/rX3Onc29NAgGtEwpwHFiqqx6gdbMVMzn - HGdCGCnM62tNCw5nA4ouGAuGxJgkBNMYP8bMbmJcOBhFevN918Y+GGxTfF9srTTEsmYtKY8B - wYOQyxXXRVswlWcr4sjroI4gLpUGqa4BiziAAFCAAzRisBUkjRvsHUTBURwEnFYxNSYgobnL - +srlheBqA6gbUrFccYbz0uF5bKV8izhU6tRKguZkBm/AELgusLs53OvBuRsXmSSAyXjhAsyY - zj3MBhfOU9OIhskQvsxvSzuqT0MQsGAW4ygq7b3GY+wttuo9v6uWCkAwaYFw5Z756xDtGSBw - P1HPr0e8VlIhBOBzjz3n4fglMQ3a+5ChD0e6tgK8uLm4XVlGiK6osAEu5w6VKxUQrWagYouW - gFQa1RI+RCAVYCYR4GVXjdH43DNmlZSpa2N0H744HMX1CvuzES2X12eGHxOBuYBlcbXSCUk2 - yV9BJsQ78rIy1s67B8k4HiflXuIkog1YXMQGRdCWUyMG4rZcwQos7/h29LlJMTTzrkqlOrLm - MpXOFuku1FMcrRhfxSWFTNLZuLpoA0Tk2RmHMZIasJL8JtuuMSqbaWGSd1N9DuqsYsbmIPVf - HLF9AYqo96xCfNdFlQtdYbxVi2lwcrbBRBOXkIJff3s2uAp388IglipDHMClztoJokp27dWm - QeLIPJvmCWN2PRMiiWFDMogAx3kkiMdS5SY1AMEVuBtMxrysanVfLVmvisWzgoXlbzCUcWK+ - xty6liIhGM4vxspuwpHzwivVu+mrFd2lKkonYJ7SC5jLt8ZSsLVxGOOqnR10DMGQz8bgetxC - Uog24ADuHECeQ67vHNrAUVSeoza9a/DNoqm1llaPSMA8IMivBgvCEQDSWkC0TEu3gizOqvCh - +J6BZ1ArN0Jw19ot+FoexjiyJ83TwEhdkRzXDtLTO+Y+bKdvEbtS4RKK5YMqpCxaXX0AKWNX - wEFaqlKiDknyWB8D2a0JLC5GIiDNPQhEIICkwqgmhCJpLaUGOGlBDIZRG9pujxWE8T6iO9c+ - VQCgJmNV4xTZxknFx4rWlnpt+bdQR/cKjWRrmtuU9tZ2FZ3NOXiGYCfxfmkEDJQKtsiVc9Nq - 4zZMgCeMWdKwiHgFF8tClsYY4ZZLVcqk5rh0PWJlkNmMvQBkUkJiIJJoI1AA8qwA73tc5Dni - GUg2Rlva9bx+vKP9iIUYLQ+kClo7yVC2qU7rWXCfCSTO9w5urWg8T6wlGFXlI1JVLZ61iZB+ - x6rkmVEwW1X5EI4Zk+iWUjQ9oFWce0bblFiDcPBRwWVyXVe/ZnzVQsQg2ZkiA4gVQ61wCMDa - dAZi29kB4nTe/CRC8VicA7DgHmlq5ZTBttuDb1MVRaPdw5XOly5wyIWwZQF4tQTFy/L1WxpS - XVlpgzKc2RQDrgqzEE85d8h25LSwicZnCkE6MCFNYCwkiLvv3dRcsbllqe4ynbDMbLqfl4gQ - NIAxVTpV3mtMMBn3lqYxarg6dQZQnlU7PADQPe81Actt9NxgtOfcdwxkNkmb2uZ2mpD6BtEN - KqBw93K3imbthfQrtsjTKvFU4XfrYSJGM+1SBBBVDVrr/5urGCMGay1lO124P1TWfJ49dY5B - B842dc9CSHldrXBYepyV7FZ11K5PlQdngypkGTN/1A9ZEA+hOAchWgmFuxGrqAA1hut10pqW - uDqqQw5OMQ/Bve3lUuq4yV7zChxUBJY3UyWo99rnpdQudQYR4AQziSXBxkDSczKaHEIiJBsv - ArTLEcJ4RgOQbM4Pddvs3kFajBWxfOudVF/LyKk89xEVLostahfu4BhMMT4m1kbM2PITzDiM - vxA/RGssO1KU2YdFlzWG+3FKCz5JTquiKtouVV3lCf2Lg1pU2hpOnFHOu+wl++Ge78p9U02t - cNNHXlslpgwzAw5BkJiqAXsq0zVJiLHaBAHCqHLvOvdbILZ4mDFS8cNR2aRHpEL05zoHQfsI - 2oSdDQaLe3CaJLoP58UM22etAnjjGkHMfPURUJw7wn0GYlAIVeyM3UHxQjAClzrM4yEx3D2c - naRUi1bAMO+rUtDKntrRqZUGeTW9X5mTe6m1gpbZtrKQyzQGDsdE1Gszea4899215yTKWMo5 - CWCm2rRb4DLHwDPn2iERvoEf98vh+HYsFV+YBu+GV8/BCIYmpiXRKgYZ7rKPil+RiDarIW51 - BEAcgJMQDAeNmf2mBqsocbmRanuLnlZJEmeYNLaXWJ6KttqZiQS13IMUeaeFTevNd56v19PM - nJvXCEHF5cBrLJgJl0MSrYDDMZuxmdEvQ1EhOMkqEgAfqXNSpR1EIx2IXvQ8wpTxxRSu2zsG - 04MH8UtlV1edZmm6sCrHXYg/I59v7/4y/+8ckGzP2AtyU37UKuEKu0sctRqs1HA5Bwfvq7oy - 122x1SKmKiQjsvMmknlnYAUb5LVdSHMQzFPopOArBJaJhDQIYg98W66pKIXnRd8xZOnx6hr0 - 1bukAfIjbPtj+iat5NukFFxDejaLgqnolnOMeQz9DLiSXRnIElp0pM5Q32CJPOdAiAaBCj62 - qKhcSOvvqbgW6bQMzrsV8CUp6ddWhbVusrRwC2hbENQeliE4FVwCrvR1Qcj2FaM+cgaoNIf3 - GOnqEIzV2LRHIkiIbytEyZjrt33HIBlRi8QnddorxIMBEKQdM7xrvEUvWmY41mCipk4BqoM8 - FQAUsm+3h/I2DufuVeFe6Wnxn4KEVE8BxGq4chnTq6WAK/TOeWh5YDVdVdLw+7XpPsRRIcYA - zgomWsINAdRKISbcivGEVfLCeF0FJhly43ZIjTPUxQS1kRfnW4REEIQuylFaPXxiCJLkNzh9 - hxGGpM3MZUxUdtGAESsbOZHNHKMPU1eJaZuleUfHOQs4qSpHhMltbvl021PFFSZaxZJwB4lo - EubwXfuUUYE8tzblyS1vKV6+P66sqqVKHbawBB/CuK78qsxsM/dKsop8sAHLLXpDcIHXbAv7 - pM/mdhGreFs7/aVai4ZwovTLefDMuKsxo84Kwo58TN4GoHFGgbt2PtWYwVFh3jUonsxwL2ek - te4DwlF/GeYu3FAGrzhRDkETwiofW2uZlLR6TTt5Y6VnxzLCTTIPjGCGLMg2LsRpt1ZSA7EY - 0Xmzes9xL6SlxooAlOxrDoJwCMN4N3HWH0ZNs7iHKO2wlA1LtWkrczE00WZaUDSj81Uh+wx7 - olpOu2CljjTql+9f/RWkaZwhR/3synJ11bJQuw2l2x+spXSkrixjqYCWUPznEozKlnyXuvKr - aKKdjTARz8u4wJnqobY4A+7jXCorA59NyPkpDWLM3i2gyy5rZyTKNlEN53BZMQpC6t85PJZA - 5DS5X8VQtdftrpinumrn02bzeTAGSywNKu5JtIsUj1TrYnWuw3k1yJXWlpWskK81McviiAr2 - eGYt10PgylzbQaIIrfeb+YMboiCVJECAcRhDEfIiFrg41ed93F4RBuSVl3EUimlbq1SasXeu - n1Il+q5uQt8movohsRjBvaLxNNCos1hkN5croleV5iztR+WhOiAdAMYBbfQM+MQeMXAvg2Vu - Eve3rcmy3qvCN+8XjW0OkzrTTtt04aZiTS27RvjlntCQhgsRA1zp9VznotzNzUohG6cxOcq1 - IEbjShKbnxQngxdqTJ/tQZaNzpP1W4C3suGqkDCHPkiqZ20B1r4KxdNWeVwhHMXbWbvIsk5J - Fi+FDfJOKgDSSESeFsq3n1nloG3X2FylUthWmvWtcxyDgxDLuy3UrSypSsrSBAbXbq0Q9tme - vw3EsIHghAzMV0mW+wjDeHNecLM2jL8abgxq/KTMt6XflyW0cAZfnI32Va6qJm2C0HCXJIOv - +ogIjdlawl56fSwnp7ZwhYbKZy8NlOsmX+ldgDTpSpW19wwELtf9I1ohl/LwrfKC3DyvqjGr - AaueGcEAmuvdBgxtu2WQ7REGESGtjCwYqS9EcY2hqJFsirEWP8sBaq9+424iDUdtEa+NagWa - NDb7zxFo1z+S4zyJ1Ka+ttv7bv47oOXrmI8tXWU/ymLmGrtGYWKde8yb8cxgATmq+DfbMxbM - hCwqbRl+yf1tf5jmOUlAHllBy1Z+le2rzjh71M5L498sNmqiIkIIN0fZ/elftpWfSRXYlzXU - FVxArAMujDsJooowZoRb1uDpD4FLO7suyu27zACCIGR/tuC9iD4YflMgWOC2FXErSM91RFGi - S282mDZqBlx6FZfxLAyycAwfXGih1G6ViYjQ9vDtqVygs8Wxhb4LWLaHprRxmco23mlDVe9D - ZEFCkgJR4AMnpoIgE9D+RmRpgHmb/eEB97dCRd9WV1egMy9VH21YXVrd4f2MemYBDp0XX9R2 - FaypR++07J3dxNAt619VBdhqqahHhbTitp2XKilqK8YWqlYoEaILq7RNYQUIJKP5TXVglotf - uXZobL7wyad/3P7LBvsy1jbOYaACrZDRgBypj5JVy40jKh+qCAOTtGC31W3Dc9wUMZZOLqCZ - 9IkElEaH/KLEpA2CI8hSNYKzsNBy5u+bIgxNfCu/JV3DGZjHo/9VyK7SI4AbXDZEUHHpui43 - 02kLwbZhzJa0m9FyE5z+D8a362Xlp8f6/bv3T42dL4pCb6vyLQ7aqKuKJNa2cP82b9KfCLUn - THt16qOlf01sI952S/xN5UuByQKd7Y8MqRDowPEkaxkPK3dV8o1EcSx8W1ShiHxho6LUhbZS - a65LCYxNfogPTq7ADuJbNAuZ4ldtcVW2sZl74eqhWjZ/NdJqY9/j0DbTWW7f3h/58MTshoFA - r375akgTBBb+NhActkw/ANwf4ZAkE0nqoP+DKQPYxg8IQCW2s1HbhLRsm0ou40kCIIgtzYhT - idShezlBpHb5TsRdTiZ5fBU1BnPwt4KgrX4r+cozpk5X5Tfa079KR2qs5dA8B1lECG+HiOq3 - KjLwbttNlRJu/5UWGRVKWS5BuHz14LTvwN/ntu109/mWaKlOwFIxkFcaYs1pv3NZi5eaJ2GA - igXB2xL4loAbmzGNKPbGa0sFVR3j131IgvAykMW+qB7PW0GHeUhLeyuXs9JucTTPTTpTmZ61 - PzM4TE8Kf61IQpO1ljkXj1ouL09KKpRotXEeVVs8dVTC2oKjVjrnvbleb+uxf2z0Y0Of9fa2 - a7XYOpZC8AaLC1Mdz1/c2VaqtB9OW72PUM3MbBisDGGqrEKNCiRSNy1pbMlJhRlDVc42AOez - GxwC0oXDEa2lj6QHAVqFlnpsfpXnt5b2M9saafcqSc6ZGH+6UCSYt1Rxdpu9Fe9K7zcHiTip - C+f9HRW12Ba/hVfaM7mVwi05X/+T0rGxac/Pr3eGE9BfULWJA8QbRN5OZUY//vTw95VqG08w - SU7ywQee5TUGQvjWRCJKQcwWbTVzh3ieGMZw3T7+VfojomekBYy8O8TkUFSAD+mFsBBFOwji - /by/8mCYr7TEqtAJVdP+xVVEts+M30L4Le1ux9dCCEsVYQ1+WzhCFJXSNsEtm674DTFs2MPG - rPcgO7jdPGdUxGz0bnOpCOWf8DKa1Ze1Urk5UNun5J63DrKN7sY/EG6K3KmXYmjNOZIkiPc8 - m9OEEizsT4mzvMeylr51ZEswUUsp3W8xcY5DcyVtrXJrKwKgh4tftUyOYWc0Kzdqk5727sfh - jvYBW2507dy31Vy1HRSboF0qzPZX9iNz3sZsLbnAodzHwuotm7h2/fcUcZuntltr0YP2HGhd - Z0V+qd5Rmb8plCiI2X+FQVJrZlJniLMsECw1whkgJaLOGfmxPfzGdjXXKeGW9CNyRR+VNuUM - rEhB23rkXrZMobUm7TBUuCCbk9tr8C2dbuMD7zQPalVu22w1l1iHW+6PjeO4zK/fPNiujSSp - Iyu6+euPjHPhkctXjm7XdVYJSV213WLeGQajtpIe99onxoSugCXV0wKu5T79VZ2WRCyO2NKU - lgR2RIQm6FXrFDsrYq1dNpPEtqs5wvuOp7nqXy+WG4Eud05d/rFBf7Cz3NsLQhT08djahbyd - M9pZKUcgSdRHKtQEkzfGK+MEFClA7BFV3swvqhTFnWsjenWb6GrJA+lta8X+GKhN5lyDuVhe - u9HygPrXpNIcVFm12PVd4LEJbnMZ33jWIqcyns30ScPyr7AKaeVYUG+lKIrtaXfV5mXVcbUV - bg5B4l+gsj94o5qqqo8D24u/HH7bWLE5ZSO50dWIkazmMH5JznJpuHMz7yruxcAcAPenngUR - 2yEJvFz0lgDqt9XLZVjzIqvmSQohvRl6gdqWlI/Q08ZrqlSqfA6ENgHG7dRU1TUV02dvqvKs - LjxPrTQ+qalmYNWm0FSQc9zd3l+Q099cOcrpk4pWUbXUroljy7tVWDbPKUqQO95Sg/UW9Z/N - avPOsC929WvRaH/aA2gc19YhBrIOg9zcIql8TfudYQywV+SwLQ7c2M2KOsaEeW6jxFh/mpA9 - w/FJDgK1WLiqTN+EyAiR1PiuySVitVCrpZIRkxdYyVOF7FIXq3amoIPbM7ly1vYQK9pbXVfG - tGhoxdNVSraBW4tE2y4X0qo3a08Y2yvaTtFE01aK1OLyf51L/xp0+n2dL18vQRzhmU2hR2W0 - xe0K6/T/Au0c2xRAQLS2K5dtMll5EdXCsBcv0/9yxQJpy42OEKVPiiRnO5IY0lN6ocIQxM79 - d38VR7elR3s5GmwlSQboHBe290nS0jIKbXCVqZE8sXYCb1/JkkDZobVxtkv5pa1X1oRUG+Yg - DGThj6V6uXFzvTkRQ1l51PJ/B4oBtu9yf8rWWFr11UKq1GKlW80zMswt6irk0mSxIsnsX65x - C5uqmy7Hn9vfxkfL8t6WHI55TFsKQhKxJ96tGl7+S8Uy89ifvbWdVos82+EoV7pVvP3/ZVuu - t8GCw86xzWWctyKg2T+OIv5Fa0OKWBk1N1K1m0RTaxmNhR1sR4r+4rG43nID6/a2qRaNWqko - pY1/imNV5NdeB21uBNmlmJd/VtpEtUlkgdHSE74ndam31Cf1tirwhyhtmd7/o4yto35e75M5 - KLuZYTdZKyffyqhpsxMTqcARLcGDiP4jM7VXgmxtw9abhvZPExFmuNWzOkAMiCHmGctmymuV - e3psDwxmbZYthSSOQ6qihbstLR8bA83SUkZTuyGNXTAvKdzSqjPRgFLrrSyrwmgk2Gb8VBze - XqBlJyMM1eg78HFmqiCl6sqMrgzKxtLr/Y7Pr5ehbZJhAPr51aMB7Mtv10mndoz9bZ4DVNXR - bkzrouwLm2XmB8Z9wOi8DeXYE32REvatVb84x95mEDn+pXuzPpE0cHlbQFu983oeZF7EHol4 - r/8Qp2Scds5fODi8t4uXuKCHxn/nOwqEps//syx4WfsADxBZwV5bmFQXVmlvtlZ4yZbF/jUJ - fOZnIhqcnGGbN8UZJB58Ozw4Ns5GF3Obru/P8KwM7N7OyWF8GeJKRg3k7btnM3FuDCTv+uQv - oxij5RUMtc2q0/3yI8eO754N6J65jb3b/6VvodDvC2APD7Vlj2UBTAMnxu0BRkLZleXG28vt - GcEpb2Oncgi4fvPw9PCxrRYvjHFUZvrosWXgJpAPZ/WgIF4VpfIkpao7wwNqblGhRLN/59QX - uNpsIttQerl9d9qZo1psBMEkd+7ZY1Na3Xzs2LgPbu0a37Pntwduf1ULpzSZhjFHm/u4MDsG - q9dv5OsvD2QJKLarhbD642+uDyMrLhWH9d8tQvVPn1/dclX/zVVtloEX5Bt/F7X5d6K3vz4a - O5GTUoFLnN0qZl5RRdXmI+0vs/xvl9barNc+qjt7fzp7YdcgyuMnF7f2DUdijCtXjw0mMZ4v - Lx+Zme6jbU0XSSbpubfmSmNHpc1+BWCHfOctayxx5xlmyp1vJ0E49A99l6/uHwQBF6aRCESc - lkZiZPCQktPzuB0k5/q1L6ZDB9+bVvsP/m2WlF1DtYzw+SbsbEB3761FjnrCMbi5bdjpdAhr - 6VsBPwimJ5sd08X97zGVBECzfSLOExsRgc1S7lEStdldon+9aLVvReUVB64rFo/NCJkdgftH - BxL8R0Bbf2Aq8K/d6itDgqi15aqG8jlt7VV1TPGsZQ1Y+f5lRSrNUl1y8TpaZL2bup2j9sxw - k/RTA18IM/YeGJlK/0I+ExKheWjSGSatM2FuXD/iL31PDe5lbKtsBCRq0s247cjRXVuj2DbA - 663f1wXSVBfA+fpVj1SKU2o3NQZANoYudt7/T0aEdeT4xtbLKRRTzgKDZBPWm+tcm67fsvbz - 4Ghvu57mEbVzZtgUREKgsp5tvdhqgjK1xQy7bidy1+120VodbYx/JtxUphrDOgpibzQphjvj - oI2oNmM2Heh/cspwsik/zlrm1c87sxqbx/rkyvTu7ZzBpOvXRmrzbxibUAEdaHD04KvXj7e5 - hXUM7NI4xrZUY73M86GXdUZttWVVq8NEj588W3tPVKY/SyhwySaIFLRGpiXbVZjg0o93/WlM - yBCKWqGCMIGQy4lTSnE/GGqNBLbj3toGfDYk3ziosrEoaUZuG3f37+nVB/CmOBYh3TstC6lu - oI1QW85ePR7GXG+tf2jAwbacPb97SAs7iJExTvutweUo4p+llQq7f2+2o/fnnM3DOYH28uZ6 - gpmLaR4AIesarQvDI5OQYiwhyWKl9W4Te4eLy3iv1yM+GMAR79a7r8uU9g9AvV/RhYAlQlWH - bNDNxh2tCG7eUuAw+8U7pJKogjEHGQM+vnUqivctt4iEhHIm6/9T2z2cF/Dwlhw8Okwao3Iy - wG+cVK9z4/DMOZU1ahM2RYBjddpYp7+O+e08OD2kmA1EpJu3jwxC6Xv97x/r9Dpi3Ll9YhyI - c9v+NzNj/R/B5L9fXci2wQAAAABJRU5ErkJggg==' base64Decoded asByteArray readStream! Item was removed: - ----- Method: ReleaseBuilder class>>projectBackground46 (in category 'resources') ----- (excessive size, no diff calculated) Item was removed: - ----- Method: ReleaseBuilder class>>projectBackground46Computed (in category 'resources') ----- - projectBackground46Computed - - | randomPoint col | - col := Color fromString: '#76A5BF'. - randomPoint := World right atRandom @ World bottom atRandom. - ^ ((GradientFillStyle colors: { - col. - col twiceDarker. - col twiceDarker twiceDarker}) - radial: true ; - origin: randomPoint; - direction: randomPoint; - normal: nil ; - yourself) - ! Item was removed: - ----- Method: ReleaseBuilder class>>projectUrl (in category 'private') ----- - projectUrl - ^ (self repositoryUrl , '/', (self versionString copyWithout: $.)) asLowercase! Item was removed: - ----- Method: ReleaseBuilder class>>releaseRepository (in category 'private') ----- - releaseRepository - ^ MCRepository location: self projectUrl! Item was removed: - ----- Method: ReleaseBuilder class>>repositoryUrl (in category 'private') ----- - repositoryUrl - ^ 'http://source.squeak.org'! Item was removed: - ----- Method: ReleaseBuilder class>>setDisplayExtent: (in category 'private') ----- - setDisplayExtent: extent - "Uncomment next line when the primitives become available in the Squeak VM." - " DisplayScreen hostWindowSize: extent." - Display extent = extent ifFalse: [ Warning signal: 'Display extent not set to ', extent ]! Item was removed: - ----- Method: ReleaseBuilder class>>setPreferences (in category 'private') ----- - setPreferences - - self setPreferences46. ! Item was removed: - ----- Method: ReleaseBuilder class>>setPreferences45 (in category 'preferences') ----- - setPreferences45 - - self setProjectBackground: self projectBackground45. - - Workspace shouldStyle: false. - SystemWindow reuseWindows: true. - TextEditor - autoEnclose: true ; - autoIndent: false ; - destructiveBackWord: false ; - blinkingCursor: false ; - dumbbellCursor: false. - BalloonMorph setBalloonColorTo: - (TranslucentColor - r: 0.92 - g: 0.92 - b: 0.706 - alpha: 0.75). - Preferences - installBrightWindowColors ; - insertionPointColor: Color red ; - enable: #scrollBarsWithoutMenuButton ; - enable: #gradientScrollBars ; - enable: #swapMouseButtons ; - enable: #annotationPanes ; - disable: #showSplitterHandles ; - enable: #showBoundsInHalo ; - disable: #alternateHandlesLook ; - disable: #roundedMenuCorners ; - disable: #roundedWindowCorners ; - enable: #traceMessages ; - enable: #diffsWithPrettyPrint ; - disable: #alwaysShowVScrollbar ; - enable: #alternativeBrowseIt. - ProportionalSplitterMorph - smartHorizontalSplitters: false ; - smartVerticalSplitters: false. - PluggableButtonMorph roundedButtonCorners: false. - FillInTheBlankMorph roundedDialogCorners: false. - Workspace shouldStyle: false. - NetNameResolver enableIPv6: false. - Browser listClassesHierarchically: true. - SystemNavigation thoroughSenders: true! Item was removed: - ----- Method: ReleaseBuilder class>>setPreferences46 (in category 'preferences') ----- - setPreferences46 - "Preferences class defaultValueTableForCurrentRelease" - - self setProjectBackground: Color darkGray. - - "General User interaction" - Preferences - enable: #swapMouseButtons; - disable: #mouseOverForKeyboardFocus. - Morph indicateKeyboardFocus: true. - - "Text input." - TextEditor - autoEnclose: false ; - autoIndent: true ; - destructiveBackWord: false ; - blinkingCursor: true ; - dumbbellCursor: false. - Preferences - insertionPointColor: Color red. - PluggableTextMorph simpleFrameAdornments: false. - - "Windows" - Preferences installUniformWindowColors. - SystemWindow reuseWindows: false. - Model windowActiveOnFirstClick: false. "Not good for 800x600" - Preferences - disable: #showSplitterHandles; - enable: #fastDragWindowForMorphic. - CornerGripMorph drawCornerResizeHandles: false. - ProportionalSplitterMorph - smartHorizontalSplitters: false ; - smartVerticalSplitters: false. - - "Scroll bars." - Preferences - enable: #scrollBarsNarrow; - enable: #scrollBarsOnRight; - disable: #alwaysHideHScrollbar; - disable: #alwaysShowHScrollbar; - disable: #alwaysShowVScrollbar. - ScrollBar - scrollBarsWithoutArrowButtons: true; - scrollBarsWithoutMenuButton: true. - ScrollPane - useRetractableScrollBars: false. - - "Rounded corners." - Morph preferredCornerRadius: 6. - Preferences disable: #roundedWindowCorners. - PluggableButtonMorph roundedButtonCorners: false. - FillInTheBlankMorph roundedDialogCorners: false. - MenuMorph roundedMenuCorners: false. - ScrollBar roundedScrollBarLook: false. - - "Gradients." - Preferences disable: #gradientScrollBars. - SystemWindow gradientWindow: false. - MenuMorph gradientMenu: false. - PluggableButtonMorph gradientButton: false. - - "Shadows" - Preferences enable: #menuAppearance3d. - MenuMorph - menuBorderWidth: 1; - menuBorderColor: Color lightGray; - menuLineColor: Color lightGray. - Morph useSoftDropShadow: true.. - - "Lists and Trees" - PluggableListMorph - filterableLists: true; - clearFilterAutomatically: false; - highlightHoveredRow: true; - menuRequestUpdatesSelection: true. - PluggableTreeMorph - filterByLabelsOnly: false; - maximumSearchDepth: 1. - LazyListMorph - listSelectionTextColor: Color black; - listSelectionColor: (Color r: 0.72 g: 0.72 b: 0.9). - - "Standard Tools" - BalloonMorph setBalloonColorTo: - (TranslucentColor r: 0.92 g: 0.92 b: 0.706 alpha: 0.75). - Workspace shouldStyle: false. - Browser - listClassesHierarchically: true; - showClassIcons: true; - showMessageIcons: true; - sortMessageCategoriesAlphabetically: true. - Preferences enable: #annotationPanes; - enable: #optionalButtons; - enable: #diffsWithPrettyPrint; - enable: #traceMessages; - enable: #alternativeBrowseIt; - enable: #menuWithIcons; - enable: #visualExplorer. - SystemNavigation thoroughSenders: true. - - "Halo" - Preferences - enable: #showBoundsInHalo ; - disable: #alternateHandlesLook. - - "System" - NetNameResolver enableIPv6: false. - Scanner - allowUnderscoreAsAssignment: true; - prefAllowUnderscoreSelectors: true. - - "that's all, folks"! Item was removed: - ----- Method: ReleaseBuilder class>>setPreferences46LowDetails (in category 'preferences') ----- - setPreferences46LowDetails - "Higher performance." - - self setPreferences46. - - self setProjectBackground: (Color gray: 0.6). - - Preferences disable: #roundedWindowCorners. - PluggableButtonMorph roundedButtonCorners: false. - FillInTheBlankMorph roundedDialogCorners: false. - MenuMorph roundedMenuCorners: false. - ScrollBar roundedScrollBarLook: false. - - Preferences disable: #gradientScrollBars. - SystemWindow gradientWindow: false. - MenuMorph gradientMenu: false. - PluggableButtonMorph gradientButton: false. - - Preferences disable: #menuAppearance3d. - - Morph indicateKeyboardFocus: false. - - PluggableListMorph highlightHoveredRow: false. - Browser - listClassesHierarchically: false; - showClassIcons: false; - showMessageIcons: false; - sortMessageCategoriesAlphabetically: false. - Preferences - disable: #menuWithIcons; - disable: #visualExplorer. - - "Non-3D menu." - MenuMorph - menuBorderWidth: 1; - menuBorderColor: Color lightGray; - menuLineColor: Color lightGray.! Item was removed: - ----- Method: ReleaseBuilder class>>setPreferences46Retro (in category 'preferences') ----- - setPreferences46Retro - "Higher performance." - - self setPreferences46. - - self setProjectBackground: self projectBackground46Computed. - - "Rounded stuff." - Morph preferredCornerRadius: 8. - Preferences enable: #roundedWindowCorners. - PluggableButtonMorph roundedButtonCorners: true. - FillInTheBlankMorph roundedDialogCorners: true. - MenuMorph roundedMenuCorners: true. - "ScrollBar roundedScrollBarLook: true." - - "Gradients." - Preferences enable: #gradientScrollBars. - SystemWindow gradientWindow: true. - MenuMorph gradientMenu: true. - PluggableButtonMorph gradientButton: true. - - "Scroll bars." - Preferences - disable: #scrollBarsNarrow; - enable: #alwaysShowVScrollbar; - enable: #alwaysHideHScrollbar. - ScrollBar - scrollBarsWithoutArrowButtons: false; - scrollBarsWithoutMenuButton: false.! Item was removed: - ----- Method: ReleaseBuilder class>>setProjectBackground: (in category 'private') ----- - setProjectBackground: aFormOrColorOrFillStyle - - MorphicProject defaultFill: (aFormOrColorOrFillStyle isForm - ifTrue: [InfiniteForm with: aFormOrColorOrFillStyle] - ifFalse: [aFormOrColorOrFillStyle isColor - ifTrue: [SolidFillStyle color: aFormOrColorOrFillStyle] - ifFalse: [aFormOrColorOrFillStyle]]). - ActiveWorld fillStyle: MorphicProject defaultFill.! Item was removed: - ----- Method: ReleaseBuilder class>>switchToNewRepository: (in category 'private') ----- - switchToNewRepository: anMCRepository - MCMcmUpdater defaultUpdateURL: anMCRepository description. - MCRepositoryGroup reset. - MCRepositoryGroup default addRepository: anMCRepository. - MCWorkingCopy allManagers do: - [ : each | each repositoryGroup: - (MCRepositoryGroup new - addRepository: anMCRepository ; - yourself) ]! Item was removed: - ----- Method: ReleaseBuilder class>>transferCurrentPackagesAsUser:password: (in category 'scripts') ----- - transferCurrentPackagesAsUser: username password: password - "Copy the packages currently loaded in the image from the trunk repository to my releaseRepository." - | releaseRep | - releaseRep := self releaseRepository - user: username; - password: password; - yourself. - MCWorkingCopy allManagers do: - [ : eachWorkingCopy | eachWorkingCopy ancestors do: - [ : eachVersionInfo | (releaseRep includesVersionNamed: eachVersionInfo versionName) ifFalse: - [ (MCRepository trunk versionWithInfo: eachVersionInfo) - ifNil: [ Warning signal: eachVersionInfo name , ' not found in trunk.' ] - ifNotNilDo: [ : ver | releaseRep storeVersion: ver ] ] ] ]! Item was removed: - ----- Method: ReleaseBuilder class>>versionString (in category 'private') ----- - versionString - ^ 'Squeak4.6'! From commits at source.squeak.org Wed Jul 1 19:57:48 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 19:57:50 2015 Subject: [squeak-dev] The Trunk: Services-Base-eem.56.mcz Message-ID: Eliot Miranda uploaded a new version of Services-Base to project The Trunk: http://source.squeak.org/trunk/Services-Base-eem.56.mcz ==================== Summary ==================== Name: Services-Base-eem.56 Author: eem Time: 30 June 2015, 3:34:50.838 pm UUID: 2e8b9c56-6312-4a69-b65c-164ab583f617 Ancestors: Services-Base-mt.55 ServicePreferences as per System-eem.747. Move preferences dictionary from class var to inst var. =============== Diff against Services-Base-mt.55 =============== Item was added: + (PackageInfo named: 'Services-Base') preamble: '(Smalltalk classNamed: #ServicePreferences) ifNotNil: + [:sp| + (sp instVarNamed: ''preferencesDictionary'') ifNil: + [(sp classPool at: #ServiceDictionaryOfPreferences) ifNotNil: + [:dictionary| + sp + instVarNamed: ''preferencesDictionary'' + put: dictionary]]]'! Item was changed: Preferences subclass: #ServicePreferences instanceVariableNames: '' + classVariableNames: '' - classVariableNames: 'ServiceDictionaryOfPreferences' poolDictionaries: '' category: 'Services-Base-GUI'! !ServicePreferences commentStamp: 'rr 7/10/2006 15:36' prior: 0! I store the preferences related to the servicse framework. The preferences are editable via the Services Browser, based on Hernan Tylim's Preference Browser. The main preference categories for services are: -- keyboard shortcuts -- : several text preferences, one per keyboard shortcuts. To edit them, enter a service identifier (equal to the method name under which it is defined in its ServiceProvider), and accept with alt-s or enter -- menu contents -- : All the service categories in the image have a text preference under here. To edit it, enter the services identifiers you wish to put in this category, separating them with a single space character. The order is important: it defines the order of the items in menus. -- settings -- : general boolean preferences. Then there is a preference category for each provider in the image. Under each, you will find: A boolean preference for each service in the image. If it is false, the service will not appear in menus. The text preference for each service category defined by the service provider. This is the same as the one appearing in the menu contents preference category.! Item was removed: - ----- Method: ServicePreferences class>>dictionaryOfPreferences (in category 'accessing') ----- - dictionaryOfPreferences - ServiceDictionaryOfPreferences - ifNil: [ServiceDictionaryOfPreferences := IdentityDictionary new]. - ^ ServiceDictionaryOfPreferences ! Item was removed: - ----- Method: ServicePreferences class>>dictionaryOfPreferences: (in category 'accessing') ----- - dictionaryOfPreferences: aDictionary - ServiceDictionaryOfPreferences := aDictionary! Item was changed: ----- Method: ServicePreferences class>>wipe (in category 'accessing') ----- wipe + preferencesDictionary := nil! - self dictionaryOfPreferences: nil! From commits at source.squeak.org Wed Jul 1 20:03:39 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 20:03:42 2015 Subject: [squeak-dev] The Trunk: System-eem.749.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-eem.749.mcz ==================== Summary ==================== Name: System-eem.749 Author: eem Time: 1 July 2015, 1:02:40.277 pm UUID: e067c0b6-9b7b-49ca-ae4d-e5b2e9c0bc8e Ancestors: System-ul.748 Revert storePreferencesIn: to work with a copy, which accords with the old code. Go for brevity in prefEvent:. =============== Diff against System-ul.748 =============== Item was changed: ----- Method: Preferences class>>prefEvent: (in category 'dynamic preferences') ----- prefEvent: anEvent "Check if this system event defines or removes a preference. TODO: Queue the event and handle in background process. There is zero reason to be so eager here." + | aClass aSelector method | - - | aClass aSelector | anEvent itemKind = SystemChangeNotifier classKind ifTrue: [^anEvent isRemoved ifTrue: [self removePreferencesFor: anEvent item]]. (anEvent itemKind = SystemChangeNotifier methodKind and: [(aClass := anEvent itemClass) isMeta]) ifFalse: "ignore instance methods" [^self]. aClass := aClass theNonMetaClass. aSelector := anEvent itemSelector. anEvent isRemoved ifTrue: [self atomicUpdatePreferences: [ :copyOfDictionaryOfPreferences | copyOfDictionaryOfPreferences removeKey: (aClass name,'>>', aSelector) asSymbol ifAbsent: []]] ifFalse: [(anEvent isAdded or: [anEvent isModified]) ifTrue: + [method := anEvent item. + method pragmas do: + [:pragma| + self respondToPreferencePragmasInMethod: method class: aClass]]]! - [self respondToPreferencePragmasInMethod: anEvent item class: aClass]]! Item was changed: ----- Method: Preferences class>>storePreferencesIn: (in category 'personalization') ----- + storePreferencesIn: aFileName + | stream prefsSnapshot | - storePreferencesIn: aFileName - - | stream | #(Prevailing PersonalPreferences) do: [:ea | Parameters removeKey: ea ifAbsent: []]. stream := ReferenceStream fileNamed: aFileName. stream nextPut: Parameters. + prefsSnapshot := preferencesDictionary copy. + prefsSnapshot keysAndValuesDo: [:key :pref | prefsSnapshot at: key put: pref asPreference]. + stream nextPut: prefsSnapshot. - preferencesDictionary keysAndValuesDo: [:key :pref | preferencesDictionary at: key put: pref asPreference]. - stream nextPut: preferencesDictionary. stream nextPut: (Smalltalk isMorphic ifTrue:[World fillStyle] ifFalse:[DesktopColor]). stream close! From ma.chris.m at gmail.com Wed Jul 1 20:04:48 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Wed Jul 1 20:04:50 2015 Subject: [squeak-dev] The Trunk: System-cmm.725.mcz In-Reply-To: References: Message-ID: I reviewed too, and already committed you and Levente's changes. > yes I like the repeat in atomicUpdatePreferences:. That's safe. I don't > care much for the method temp in refEvent: cuz I think the message keyword > types anEvent item adequately. Not sure about storePreferencesIn: not > taking a copy of preferencesDictionary. Surely it's safer to take the copy. I had similar doubts initially, until I read Levente's comment: He reminds us that the dictionary is NEVER updated. Only read and replaced whole. A copy there is even misleading to the reader. > So let me take the change to atomicUpdatePreferences: and get this show on > the road :-). Thanks for your review! Already done. Thanks Eliot and Levente! From tim at rowledge.org Wed Jul 1 20:10:31 2015 From: tim at rowledge.org (tim Rowledge) Date: Wed Jul 1 20:10:34 2015 Subject: [squeak-dev] The Trunk: Services-Base-eem.56.mcz In-Reply-To: <201507011957.t61Jvqqp003862@mail64c0.megamailservers.com> References: <201507011957.t61Jvqqp003862@mail64c0.megamailservers.com> Message-ID: On 01-07-2015, at 7:57 PM, commits@source.squeak.org wrote: > Eliot Miranda uploaded a new version of Services-Base to project The Trunk: > http://source.squeak.org/trunk/Services-Base-eem.56.mcz > > ==================== Summary ==================== > > Name: Services-Base-eem.56 > Author: eem > Time: 30 June 2015, 3:34:50.838 pm > UUID: 2e8b9c56-6312-4a69-b65c-164ab583f617 > Ancestors: Services-Base-mt.55 > > ServicePreferences as per System-eem.747. Move preferences dictionary from class var to inst var. > > =============== Diff against Services-Base-mt.55 =============== > > Item was added: > + (PackageInfo named: 'Services-Base') preamble: '(Smalltalk classNamed: #ServicePreferences) ifNotNil: > + [:sp| > + (sp instVarNamed: ''preferencesDictionary'') ifNil: > + [(sp classPool at: #ServiceDictionaryOfPreferences) ifNotNil: > + [:dictionary| > + sp > + instVarNamed: ''preferencesDictionary'' > + put: dictionary]]]?! The preamble breaks in a spur (15046) image; there is no such instvar. Unsurprisingly this is the same from both ?update Squeak? and manually loading the mcz. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Make it right before you make it faster. From commits at source.squeak.org Wed Jul 1 20:26:20 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 20:26:23 2015 Subject: [squeak-dev] The Trunk: Network-cmm.161.mcz Message-ID: Chris Muller uploaded a new version of Network to project The Trunk: http://source.squeak.org/trunk/Network-cmm.161.mcz ==================== Summary ==================== Name: Network-cmm.161 Author: cmm Time: 1 July 2015, 3:26:03.655 pm UUID: af917aa1-ce76-460b-ba1a-7fb49700f44a Ancestors: Network-ul.160 Remove the methods overridden by WebClient, since that has now been folded into base Squeak. =============== Diff against Network-ul.160 =============== Item was removed: - ----- Method: HTTPSocket class>>httpGet:args:user:passwd: (in category 'get the page') ----- - httpGet: url args: args user: user passwd: passwd - "Upload the contents of the stream to a file on the server. - - WARNING: This method will send a basic auth header proactively. - This is necessary to avoid breaking MC and SqueakSource since SS does not - return a 401 when accessing a private (global no access) repository." - - | authorization result | - authorization := (user , ':' , passwd) base64Encoded. - result := self - httpGet: url args: args accept: '*/*' - request: 'Authorization: Basic ' , authorization , String crlf. - ^result - ! Item was removed: - ----- Method: HTTPSocket class>>httpGetDocument:args:accept:request: (in category 'get the page') ----- - httpGetDocument: url args: args accept: mimeType request: requestString - "Return the exact contents of a web object. Asks for the given MIME type. If mimeType is nil, use 'text/html'. An extra requestString may be submitted and must end with crlf. The parsed header is saved. Use a proxy server if one has been registered. tk 7/23/97 17:12" - - "Note: To fetch raw data, you can use the MIME type 'application/octet-stream'." - - | urlString | - "Normalize the url" - urlString := (Url absoluteFromText: url) asString. - - args ifNotNil: [ - urlString := urlString, (self argString: args) - ]. - - ^(self httpRequestHandler) - httpRequest: 'GET' url: urlString headers:( - (mimeType ifNil:[''] ifNotNil:['Accept: ', mimeType, String crlf]), - 'Accept: text/html', String crlf, - HTTPProxyCredentials, - HTTPBlabEmail, - requestString - ) content: nil response: nil.! Item was removed: - ----- Method: HTTPSocket class>>httpPost:args:user:passwd: (in category 'get the page') ----- - httpPost: url args: args user: user passwd: passwd - - "WARNING: This method will send a basic auth header proactively. - This is necessary to avoid breaking MC and SqueakSource since SS does not - return a 401 when accessing a private (global no access) repository." - - | authorization | - authorization := (user , ':' , passwd) base64Encoded. - ^self - httpPostDocument: url args: args accept: '*/*' - request: 'Authorization: Basic ' , authorization , String crlf - ! Item was removed: - ----- Method: HTTPSocket class>>httpPost:content:type:accept:request: (in category 'get the page') ----- - httpPost: url content: postData type: contentType accept: mimeType request: requestString - "like httpGET, except it does a POST instead of a GET. POST allows data to be uploaded" - - | urlString | - "Normalize the url" - urlString := (Url absoluteFromText: url) asString. - - ^(self httpRequestHandler) - httpRequest: 'POST' url: urlString headers:( - 'Accept: ', mimeType, String crlf, - 'Accept: text/html', String crlf, - 'Content-Type: ', contentType, String crlf, - 'Content-Length: ', (postData ifNil:['']) size, String crlf, - HTTPProxyCredentials, - HTTPBlabEmail, - requestString "extra user request. Authorization" - ) content: (postData ifNil:['']) response: nil! Item was removed: - ----- Method: HTTPSocket class>>httpPostDocument:args:accept:request: (in category 'get the page') ----- - httpPostDocument: url args: args accept: mimeType request: requestString - "like httpGET, except it does a POST instead of a GET. POST allows data to be uploaded" - - | argString | - args ifNotNil: [ - argString := self argString: args. - argString first = $? ifTrue: [argString := argString allButFirst]. - ]. - - ^self httpPost: url - content: argString - type: 'application/x-www-form-urlencoded' - accept: mimeType - request: requestString! Item was removed: - ----- Method: HTTPSocket class>>httpPostMultipart:args:accept:request: (in category 'get the page') ----- - httpPostMultipart: url args: argsDict accept: mimeType request: requestString - " do multipart/form-data encoding rather than x-www-urlencoded " - - | mimeBorder argsStream | - mimeBorder := '----squeak-georgia-tech-', Time millisecondClockValue printString, '-csl-cool-stuff-----'. - "encode the arguments dictionary" - argsStream := WriteStream on: String new. - argsDict associationsDo: [:assoc | - assoc value do: [ :value | | fieldValue | - "print the boundary" - argsStream nextPutAll: '--', mimeBorder, String crlf. - " check if it's a non-text field " - argsStream nextPutAll: 'Content-disposition: multipart/form-data; name="', assoc key, '"'. - (value isKindOf: MIMEDocument) - ifFalse: [fieldValue := value] - ifTrue: [argsStream nextPutAll: ' filename="', value url pathForFile, '"', String crlf, 'Content-Type: ', value contentType. - fieldValue := (value content - ifNil: [(FileStream fileNamed: value url pathForFile) contentsOfEntireFile] - ifNotNil: [value content]) asString]. - " Transcript show: 'field=', key, '; value=', fieldValue; cr. " - argsStream nextPutAll: String crlf, String crlf, fieldValue, String crlf. - ]]. - argsStream nextPutAll: '--', mimeBorder, '--'. - - ^self httpPost: url - content: argsStream contents - type: 'multipart/form-data; boundary=', mimeBorder - accept: mimeType - request: requestString - ! Item was removed: - ----- Method: HTTPSocket class>>httpPostToSuperSwiki:args:accept:request: (in category 'get the page') ----- - httpPostToSuperSwiki: url args: argsDict accept: mimeType request: requestString - - | mimeBorder argString | - mimeBorder := '---------SuperSwiki',Time millisecondClockValue printString,'-----'. - argString := String streamContents: [ :strm | - strm nextPutAll: mimeBorder, String crlf. - argsDict associationsDo: [:assoc | - assoc value do: [ :value | - strm - nextPutAll: 'Content-disposition: form-data; name="', assoc key, '"'; - nextPutAll: String crlf; - nextPutAll: String crlf; - nextPutAll: value; - nextPutAll: String crlf; - nextPutAll: String crlf; - nextPutAll: mimeBorder; - nextPutAll: String crlf. - ] - ]. - ]. - - ^self httpPost: url - content: argString - type: 'multipart/form-data; boundary=', mimeBorder - accept: mimeType - request: requestString - ! Item was removed: - ----- Method: HTTPSocket class>>httpPut:to:user:passwd: (in category 'get the page') ----- - httpPut: contents to: url user: user passwd: passwd - "Upload the contents of the stream to a file on the server - - WARNING: This method will send a basic auth header proactively. - This is necessary to avoid breaking MC and SqueakSource since SS does not - return a 401 when accessing a private (global no access) repository." - - | urlString resp header | - - "Normalize the url" - urlString := (Url absoluteFromText: url) asString. - - resp := (self httpRequestHandler) - httpRequest: 'PUT' url: urlString headers:( - 'Authorization: Basic ', (user, ':', passwd) base64Encoded, String crlf, - 'Accept: */*', String crlf, - 'Content-Type: application/octet-stream', String crlf, - 'Content-Length: ', (contents ifNil:['']) size, String crlf, - HTTPProxyCredentials, - HTTPBlabEmail - ) content: contents response:[:rr| header := rr]. - ^resp isString ifTrue:[header, resp] ifFalse:[header, resp content]! From commits at source.squeak.org Wed Jul 1 20:34:46 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 20:34:47 2015 Subject: [squeak-dev] The Trunk: Help-Squeak-Project-cmm.25.mcz Message-ID: Chris Muller uploaded a new version of Help-Squeak-Project to project The Trunk: http://source.squeak.org/trunk/Help-Squeak-Project-cmm.25.mcz ==================== Summary ==================== Name: Help-Squeak-Project-cmm.25 Author: cmm Time: 1 July 2015, 3:34:35.436 pm UUID: 84a2402f-811d-4a8c-9459-f6af9d8d9b21 Ancestors: Help-Squeak-Project-kfr.24 - Update internal release notes in the Help Browser. (no need to use a release-specific method). - Release Notes has duplication with the one in TheWorldMainDockingBar which will be addressed later. =============== Diff against Help-Squeak-Project-kfr.24 =============== Item was changed: ----- Method: SqueakProjectHelp class>>pages (in category 'accessing') ----- pages + ^#(releaseNotes extendingTheSystem squeakResourcesOnline squeakUserInterface workingWithSqueak)! - ^#(releaseNotes4point5 extendingTheSystem squeakResourcesOnline squeakUserInterface workingWithSqueak)! Item was added: + ----- Method: SqueakProjectHelp class>>releaseNotes (in category 'pages') ----- + releaseNotes + "This method was automatically generated. Edit it using:" + "a HelpBrowser edit: #releaseNotes" + ^HelpTopic + title: 'Release Notes' + contents: TheWorldMainDockingBar releaseNotes "<--- ugh, we will fix this later, for now may we not have TWO copies of the 8K release notes string in memory?"! Item was removed: - ----- Method: SqueakProjectHelp class>>releaseNotes4point5 (in category 'pages') ----- - releaseNotes4point5 - ^HelpTopic - title: 'Squeak 4.5 Theodor' - icon: (HelpIcons iconNamed: #squeakIcon) - contents: - 'Squeak 4.5 ---- Theodor - =================== - - ______________________________________________ - Language enhancements: - - Environments - Environments allows multiple classes with the same name to exist in the same image, with code referencing through its class'' "environment". - - Collections - New and improved sorting utilities for Arrays and OrderedCollections. - New FloatCollection inherits the convenient add:/remove: API of OrderedCollection, but using an internal FloatArray for better efficiency. - An all-new LRUCache implementation. - Promise is now a fully chainable object with decent error handling. - Compiler - - Numerics - Faster and better Random. - log/ln fixed for integers. - - Dates and Times - New methods provide access to primitive 240 and 241, which can provide microsecond resolution timestamps on Cog VMs. - New convenience methods allow creating DateAndTimes relative to now (e.g., "5 minutes ago"). - Parsing improvements. - - Text, Graphics, Sound - Form>pixelValueAt: now makes use of the new primitivePixelValueAt:, avoiding the overhead of a full BitBlt. - Elimination of the dual hierarchy of NewParagraph & MultiNewParagraph etc and TextStopConditions and lots of Scanner improvements. - PaintBoxMorph re-engineering. - ADPCMCodec performance improvement. - - ______________________________________________ - IDE, Monticello and Trunk process improvements: - - Several MVC fixes allow debugging in MVC once again. - Smart-Splitters causes the bars between browser panes to automatically optimize their position. - Fixed color-selection from anywhere on the screen working again. - Improved command-line interface via Smalltalk run: [ :arg1 :arg2 | ... ]. - squeakDebug.log report length is now settable. - MCReorganizationPreloader now resolves moves between arbitrary packages, independent of their order in the configuration. - mcz/snapshot/source.st now encoded in UTF8 instead of latin-1. - New pre-selection highlight feature for lists. - System space analysis now available in Help | About. - Message-traces can be pared more easily. - - ______________________________________________ - Configuration - Lots of improvements in the CI build/test slave. - Installer now documents externally-loadable packages as simple literal structures that can be merged via Installer>>#merge:. - MC ancestry history strings can now be stubbed for a smaller image and sustainable MC history. - - ______________________________________________ - History and Accounting Tools - A great new historical website by Bob Arning. - MC history and origin is now available for methods and class-definitions from browser menus. - A new amazing ObjectHistory makes it possible to efficiently track the born-on date of any object to a resolution of one minute. - Added "search history" to Package history browser. - - ______________________________________________ - Fixes and cleanups - Packages organized toward eliminating circular dependencies, and with proper concern for existing and future UI frameworks. - Updated uses of SmalltalkImage current to, simply, "Smalltalk." - Moving away from use of Utilities. - More preferences made pragma-based. - Compiler factorings and cleanups. - Diminished excessive usage of ReadWriteStream. - ProtoObject API balanced and minimal. - Moved classifying and logging behavior out of Compiler (a responsibility of Behavior). - - ______________________________________________ - Application Upgrade Notes - Default Float printing is now true to its internal representation. Apps must now use appropriate methods to format Floats rather than roundTo:. - ($a to: $b) now returns ''ab'' rather than #($a $b). - Remove OneCharacterSymbols optimization. - LRUCache instance migrations, if any. See post-scripts in Collections-ul.546, 547 - Rectangles with 0 area (e.g., lines) can now intersect. - - - - This release is dedicated - to the memory of our friend - Andreas Raab (1968 -- 2013) - !! - ]style[(10 1 4 1 7 1 19 1 1 47 22 2 13 142 11 329 8 57 15 237 21 358 48 720 13 321 28 372 18 522 25 382 1 5 7 4 9 56 1)ba2FBitstreamVeraSerif#32.0,a2FBitstreamVeraSerif#32.0,a2--FBitstreamVeraSerif#32.0,a2FBitstreamVeraSerif#32.0,ia2FBitstreamVeraSerif#32.0,FBitstreamVeraSerif#24.0a2,FBitstreamVeraSerif#24.0----a2,FBitstreamVeraSerif#24.0a2,,FBitstreamVeraSerif#16.0,FBitstreamVeraSerif#24.0,,bFBitstreamVeraSerif#16.0,FBitstreamVeraSerif#16.0,bFBitstreamVeraSerif#16.0,FBitstreamVeraSerif#16.0,bFBitstreamVeraSerif#16.0,FBitstreamVeraSerif#16.0,bFBitstreamVeraSerif#16.0,FBitstreamVeraSerif#16.0,bFBitstreamVeraSerif#16.0,FBitstreamVeraSerif#16.0,FBitstreamVeraSerif#24.0,FBitstreamVeraSerif#16.0,FBitstreamVeraSerif#24.0,FBitstreamVeraSerif#16.0,FBitstreamVeraSerif#24.0,FBitstreamVeraSerif#16.0,FBitstreamVeraSerif#24.0,FBitstreamVeraSerif#16.0,FBitstreamVeraSerif#24.0,FBitstreamVeraSerif#16.0,,FBitstreamVeraSerif#16.0ia2,FBitstreamVeraSerif#16.0iba2,FBitstreamVeraSerif#16.0ia2,FBitstreamVeraSerif#16.0iba2,FBitstreamVeraSerif#16.0ia2,!!' readStream nextChunkText! From leves at elte.hu Wed Jul 1 20:41:45 2015 From: leves at elte.hu (Levente Uzonyi) Date: Wed Jul 1 20:41:55 2015 Subject: [squeak-dev] The Trunk: System-cmm.725.mcz In-Reply-To: References: Message-ID: Hi Eliot, My change of #prefEvent: is not about the temporary variable. It's about removing the loop which got duplicated. The original method looked like ... method := anEvent item. method pragmas do:[:pragma| | aPreference aPrefSymbol | ((pragma keyword == #preference:category:description:type:) or: [pragma keyword == #preference:categoryList:description:type:]) ifTrue:[ aPrefSymbol := (aClass name,'>>', method selector) asSymbol. ... Your version with #respondToPreferencePragmasInMethod:class: inlined would look like ... method := anEvent item. * method pragmas do: [:pragma| * method pragmas do: [:pragma| | preference | ((pragma keyword beginsWith: #preference:) and: [self respondsTo: pragma keyword]) ifTrue: [preference := self perform: pragma keyword withArguments: pragma arguments. ... One of the "method pragmas do:" loops (marked with *) is superfluous. Since #respondToPreferencePragmasInMethod:class: contains the loop, and is also sent by other methods, I decided to remove the loop from #prefEvent:. The #copy in #storePreferencesIn: was added in Squeak 4.1, or 4.2, because the dictionary could have been read and written concurrently. But this is not the case anymore. Levente On Wed, 1 Jul 2015, Eliot Miranda wrote: > Hi Levente, > ? ?yes I like the repeat in atomicUpdatePreferences:.? That's safe.? I don't care much for the method temp in refEvent: cuz I think the message keyword types anEvent item adequately.? Not sure about storePreferencesIn: not taking a copy of?preferencesDictionary.? > Surely it's safer to take the copy.? So let me take the change to?atomicUpdatePreferences: and get this show on the road :-).? Thanks for your review! > > On Wed, Jul 1, 2015 at 4:30 AM, Levente Uzonyi wrote: > Hi Eliot, > > I reviewed the code and made a few changes, which you can find in the Inbox as System-ul.748. Feel free to pick the ones you like. > The change of Preferences class >> #atomicUpdatePreferences: might seem unnecessary, because it's so unlikely to have multiple processes changing the preferences concurrently. > > Levente > > P.S.: Please note that I haven't tested the code. > > On Tue, 30 Jun 2015, Eliot Miranda wrote: > > Hi All, but especially Chris, > ? ?I just committed?System-eem.745 to the inbox.? Please review. > > As I say in the commit comment, this is step 1.? If the code looks OK, the next step is a version which moves the preferences dictionary into a class inst var, so that ServicePreferences sits happily below Preferences.? But for that I'll need > advice on how to write the > sequence of loads.? I *think* it's one configuration map and one package load.? The commit/configuration adds the class inst var and copies the DictionaryOfPreferences into it.? A subsequent commit replaces all methods that acess > DictionaryOfPreferences and > ServiceDictionaryOfPreferences?with accesses to the class inst var > > > Rewrite Preferences to eliminate the AccessProtect. > Use a copy, update copy, assign scheme to update > the preferences dictionary atomically. > > Change Preferences access method compilation to > use Object>>#value to eliminate a block creation. > > Change Preference initialization to eliminate the > isKindOf: Symbol. > > This is step 1.? Given SystemPreferences it is clear > that the preferences dictionary should be stored in > a class inst var, so that SystemPreferences and > Preferences can share methods but access different > dictionaries.? The dictionaryOfProferences[:] accessors > are dubious as they break encapsulatiopn.? For example, > the reportPreferences: method, which is the only external > access, could insateaqd be moved into Preferences class. > > On Tue, Jun 30, 2015 at 10:46 AM, Eliot Miranda wrote: > ? ? ? Hi Levente, ?Hi Chris, > > ? ? ? On Tue, Apr 28, 2015 at 3:41 PM, Levente Uzonyi wrote: > ? ? ? ? ? ? There's no need to store preferences in a data structure at all. We already have "pragma" preferences (since 4.1), which store the preference values independently. Since the 4.1 release it's a "permanent" goal to rewrite all > preferences to > ? ? ? ? ? ? "pragma" preferences. > ? ? ? ? ? ? We should just make it happen. > > > This seems like a lot of work, and is work that can be done over time.? But right now we're suffering lock ups due to the Mutex in Preferences.? For example, the Notifier/Debugger accesses the scrollBarsOnRight preference and I've often seen > lock ups caused by > this.? So I propose that I fix the access to be as I described it.? There be no access lock except for adding/updating preferences.? So reading is done without synchronisation, and setting and/or adding is done by copying and assigning.? I also > propose to compile > preferences without creating a block, so > > autoIndent > ^ self > valueOfFlag: #autoIndent > ifAbsent: true > > instead of > > autoIndent > ^ self > valueOfFlag: #autoIndent > ifAbsent: [true] > > which is well-supported by both the Interpreter and the Cog VMs, given Object>>value ^self.? This to save space and time. > > ? ? ? Levente > > ? ? ? P.S.: Reverting that method will solve the concurrency issue. > > ? ? ? On Tue, 28 Apr 2015, Eliot Miranda wrote: > > > > ? ? ? ? ? ? On Tue, Apr 28, 2015 at 12:47 PM, Chris Muller wrote: > ? ? ? ? ? ? ? ? ? Wait, the newer one has a non-local return in it, but > ? ? ? ? ? ? ? ? ? Mutex>>#critical: has an ensure: in it anyway, so maybe I don't see > ? ? ? ? ? ? ? ? ? the problem..? > > > ? ? ? ? ? ? If one hits ctrl-period when the system is in the critical section then the debugger can't open because it interrupts the critical section, preventing the ensure block from running, attempts to access e.g. > ? ? ? ? ? ? scroll bar preferences when it tries to open, and the system deadlocks.? So preferences either need to be *not* protected by a critical section, or the Debugger needs not to access preferences. > > ? ? ? ? ? ? IMO, we should try and write preferences so that they don't require a lock.? Writing them as a lock-free data structure would be a really good idea. First that critical section is slow and clunky.? Second, I > ? ? ? ? ? ? presume it is there only for the rare case of a write to preferences, not to protect reads. > > ? ? ? ? ? ? IMO, a simple implementation which copied and replaced the entire preferences dictionary on write would be sufficient.? Sure there's a danger that some client would get a stale value if it read concurrently > ? ? ? ? ? ? while there was a write, but then so what?? A preference is a preference, not a hard-and-fast value, and code should work accessing a preference no matter its value, so momentarily getting a stale value > ? ? ? ? ? ? shouldn't matter.? So the implementation could be as simple as > > ? ? ? ? ? ? addPreference: aName categories: categoryList default: aValue balloonHelp: helpString projectLocal: localBoolean changeInformee: informeeSymbol changeSelector: aChangeSelector type: aType > ? ? ? ? ? ? "Add or replace a preference as indicated.? Reuses the preexisting Preference object for this symbol, if there is one, so that UI artifacts that interact with it will remain valid." > > ? ? ? ? ? ? | aPreference aPrefSymbol | > ? ? ? ? ? ? aPrefSymbol := aName asSymbol. > ? ? ? ? ? ? aPreference := DictionaryOfPreferences > ? ? ? ? ? ? at: aPrefSymbol > ? ? ? ? ? ? ifAbsent: > ? ? ? ? ? ? [| newPreference | > ? ? ? ? ? ? newPreference := aPreference? > ? ? ? ? ? ? name:aPrefSymbol > ? ? ? ? ? ? defaultValue:aValue > ? ? ? ? ? ? helpString:helpString > ? ? ? ? ? ? localToProject:localBoolean > ? ? ? ? ? ? categoryList:categoryList > ? ? ? ? ? ? changeInformee:informeeSymbol > ? ? ? ? ? ? changeSelector:aChangeSelector > ? ? ? ? ? ? type: aType. > ? ? ? ? ? ? AccessLock critical: > ? ? ? ? ? ? [| newDict | > ? ? ? ? ? ? newDict := DictionaryOfPreferences copy. > ? ? ? ? ? ? newDict at: aPrefSymbol put: newPreference]. > ? ? ? ? ? ? self ?compileAccessMethodForPreference:aPreference. > ? ? ? ? ? ? newPreference] > > > ? ? ? ? ? ? ? ? ? On Tue, Apr 28, 2015 at 2:43 PM, Chris Muller wrote: > ? ? ? ? ? ? ? ? ? >> The above change restores the old behavior of locking up the image, so it > ? ? ? ? ? ? ? ? ? >> should be reverted. An additional comment explaininng why aBlock must not be > ? ? ? ? ? ? ? ? ? >> evaluated inside the argument of #accessDictionaryOfPreferencesIn: would be > ? ? ? ? ? ? ? ? ? >> helpful. > ? ? ? ? ? ? ? ? ? > > ? ? ? ? ? ? ? ? ? > Ahh, because aBlock might have a non-local return in it, leaving the > ? ? ? ? ? ? ? ? ? > Mutex unsignaled (and critical unenterable), is that right? > ? ? ? ? ? ? ? ? ? > > ? ? ? ? ? ? ? ? ? > Took me a minute to see that problem. > ? ? ? ? ? ? ? ? ? > > ? ? ? ? ? ? ? ? ? > Okay, I'll revert that method if no one else does by my next commit.. > ? ? ? ? ? ? ? ? ? > > ? ? ? ? ? ? ? ? ? >> It would be even better to finally get rid of DictionaryOfPreferences. > ? ? ? ? ? ? ? ? ? >> > ? ? ? ? ? ? ? ? ? >> > ? ? ? ? ? ? ? ? ? >> Levente > ? ? ? ? ? ? ? ? ? >> > > > > > ? ? ? ? ? ? -- > ? ? ? ? ? ? best,Eliot > > > > > > > > -- > best,Eliot > > > > > -- > best,Eliot > > > > > > > > -- > best,Eliot > > From leves at elte.hu Wed Jul 1 20:48:53 2015 From: leves at elte.hu (Levente Uzonyi) Date: Wed Jul 1 20:48:57 2015 Subject: [squeak-dev] The Trunk: Tools-eem.626.mcz In-Reply-To: References: Message-ID: Hi Eliot, I think an #asString send is missing from the line ifTrue: [(methodRef findTokens: '>>') fold: [:a :b| (a findTokens: ' '), {b first = $# ifTrue: [b allButFirst] ifFalse: [b]}]] It should be ifTrue: [(methodRef asString findTokens: '>>') fold: [:a :b| (a findTokens: ' '), {b first = $# ifTrue: [b allButFirst] ifFalse: [b]}]] It would be even better to store "methodRef asString" in a temporary variable. But taking a closer look at the code the #asString sends are unnecessary, because we already know that methodRef #isString is true. And there's no point in converting Symbols to Strings for #includesSubString: or #findTokens:. Levente On Tue, 30 Jun 2015, commits@source.squeak.org wrote: > Eliot Miranda uploaded a new version of Tools to project The Trunk: > http://source.squeak.org/trunk/Tools-eem.626.mcz > > ==================== Summary ==================== > > Name: Tools-eem.626 > Author: eem > Time: 30 June 2015, 3:05:48.319 pm > UUID: 0bfae54b-3e68-4252-98d8-ddb1e56fc869 > Ancestors: Tools-mt.625 > > Upgrade MessageSet class>>parse:toClassAndSelector: > to allow one to construct text links in modern syntax, e.g. > BitBlt class>>#subPixelRenderColorFonts > > =============== Diff against Tools-mt.625 =============== > > Item was changed: > ----- Method: MessageSet class>>parse:toClassAndSelector: (in category 'utilities') ----- > parse: methodRef toClassAndSelector: csBlock > "Decode strings of the form [class] ." > > | tuple cl | > > > self flag: #mref. "compatibility with pre-MethodReference lists" > > methodRef ifNil: [^ csBlock value: nil value: nil]. > methodRef isString ifFalse: > [^methodRef setClassAndSelectorIn: csBlock]. > methodRef isEmpty ifTrue: > [^csBlock value: nil value: nil]. > + tuple := (methodRef asString includesSubString: '>>') > + ifTrue: [(methodRef findTokens: '>>') fold: [:a :b| (a findTokens: ' '), {b first = $# ifTrue: [b allButFirst] ifFalse: [b]}]] > + ifFalse: [methodRef asString findTokens: ' .']. > - tuple := methodRef asString findTokens: ' .'. > cl := Smalltalk at: tuple first asSymbol ifAbsent: [^ csBlock value: nil value: nil]. > ^(tuple size = 2 or: [tuple size > 2 and: [(tuple at: 2) ~= 'class']]) > ifTrue: [csBlock value: cl value: (tuple at: 2) asSymbol] > ifFalse: [csBlock value: cl class value: (tuple at: 3) asSymbol]! > > > From leves at elte.hu Wed Jul 1 21:08:06 2015 From: leves at elte.hu (Levente Uzonyi) Date: Wed Jul 1 21:08:09 2015 Subject: [squeak-dev] The Trunk: Services-Base-eem.56.mcz In-Reply-To: References: <201507011957.t61Jvqqp003862@mail64c0.megamailservers.com> Message-ID: Hi Tim, Services-Base-eem.56 depends on System-eem.746 (or later). This dependency is ensured by the last few non-spur update maps. But those maps, along with the last few versions of the System package, haven't been "ported" to spur yet. So the spur update process doesn't work at the moment. It'll be fixed when Eliot runs his script to create the missing non-spur version. Levente On Wed, 1 Jul 2015, tim Rowledge wrote: > > On 01-07-2015, at 7:57 PM, commits@source.squeak.org wrote: > >> Eliot Miranda uploaded a new version of Services-Base to project The Trunk: >> http://source.squeak.org/trunk/Services-Base-eem.56.mcz >> >> ==================== Summary ==================== >> >> Name: Services-Base-eem.56 >> Author: eem >> Time: 30 June 2015, 3:34:50.838 pm >> UUID: 2e8b9c56-6312-4a69-b65c-164ab583f617 >> Ancestors: Services-Base-mt.55 >> >> ServicePreferences as per System-eem.747. Move preferences dictionary from class var to inst var. >> >> =============== Diff against Services-Base-mt.55 =============== >> >> Item was added: >> + (PackageInfo named: 'Services-Base') preamble: '(Smalltalk classNamed: #ServicePreferences) ifNotNil: >> + [:sp| >> + (sp instVarNamed: ''preferencesDictionary'') ifNil: >> + [(sp classPool at: #ServiceDictionaryOfPreferences) ifNotNil: >> + [:dictionary| >> + sp >> + instVarNamed: ''preferencesDictionary'' >> + put: dictionary]]]?! > > The preamble breaks in a spur (15046) image; there is no such instvar. Unsurprisingly this is the same from both ?update Squeak? and manually loading the mcz. > > tim > -- > tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim > Make it right before you make it faster. > > > > From leves at elte.hu Wed Jul 1 21:10:28 2015 From: leves at elte.hu (Levente Uzonyi) Date: Wed Jul 1 21:10:32 2015 Subject: [squeak-dev] The Trunk: Network-cmm.161.mcz In-Reply-To: References: Message-ID: Hi Chris, This change is a bit against modularity, because the HTTP protocol will no longer work once you unload the WebClient package. Levente On Wed, 1 Jul 2015, commits@source.squeak.org wrote: > Chris Muller uploaded a new version of Network to project The Trunk: > http://source.squeak.org/trunk/Network-cmm.161.mcz > > ==================== Summary ==================== > > Name: Network-cmm.161 > Author: cmm > Time: 1 July 2015, 3:26:03.655 pm > UUID: af917aa1-ce76-460b-ba1a-7fb49700f44a > Ancestors: Network-ul.160 > > Remove the methods overridden by WebClient, since that has now been folded into base Squeak. > > =============== Diff against Network-ul.160 =============== > > Item was removed: > - ----- Method: HTTPSocket class>>httpGet:args:user:passwd: (in category 'get the page') ----- > - httpGet: url args: args user: user passwd: passwd > - "Upload the contents of the stream to a file on the server. > - > - WARNING: This method will send a basic auth header proactively. > - This is necessary to avoid breaking MC and SqueakSource since SS does not > - return a 401 when accessing a private (global no access) repository." > - > - | authorization result | > - authorization := (user , ':' , passwd) base64Encoded. > - result := self > - httpGet: url args: args accept: '*/*' > - request: 'Authorization: Basic ' , authorization , String crlf. > - ^result > - ! > > Item was removed: > - ----- Method: HTTPSocket class>>httpGetDocument:args:accept:request: (in category 'get the page') ----- > - httpGetDocument: url args: args accept: mimeType request: requestString > - "Return the exact contents of a web object. Asks for the given MIME type. If mimeType is nil, use 'text/html'. An extra requestString may be submitted and must end with crlf. The parsed header is saved. Use a proxy server if one has been registered. tk 7/23/97 17:12" > - > - "Note: To fetch raw data, you can use the MIME type 'application/octet-stream'." > - > - | urlString | > - "Normalize the url" > - urlString := (Url absoluteFromText: url) asString. > - > - args ifNotNil: [ > - urlString := urlString, (self argString: args) > - ]. > - > - ^(self httpRequestHandler) > - httpRequest: 'GET' url: urlString headers:( > - (mimeType ifNil:[''] ifNotNil:['Accept: ', mimeType, String crlf]), > - 'Accept: text/html', String crlf, > - HTTPProxyCredentials, > - HTTPBlabEmail, > - requestString > - ) content: nil response: nil.! > > Item was removed: > - ----- Method: HTTPSocket class>>httpPost:args:user:passwd: (in category 'get the page') ----- > - httpPost: url args: args user: user passwd: passwd > - > - "WARNING: This method will send a basic auth header proactively. > - This is necessary to avoid breaking MC and SqueakSource since SS does not > - return a 401 when accessing a private (global no access) repository." > - > - | authorization | > - authorization := (user , ':' , passwd) base64Encoded. > - ^self > - httpPostDocument: url args: args accept: '*/*' > - request: 'Authorization: Basic ' , authorization , String crlf > - ! > > Item was removed: > - ----- Method: HTTPSocket class>>httpPost:content:type:accept:request: (in category 'get the page') ----- > - httpPost: url content: postData type: contentType accept: mimeType request: requestString > - "like httpGET, except it does a POST instead of a GET. POST allows data to be uploaded" > - > - | urlString | > - "Normalize the url" > - urlString := (Url absoluteFromText: url) asString. > - > - ^(self httpRequestHandler) > - httpRequest: 'POST' url: urlString headers:( > - 'Accept: ', mimeType, String crlf, > - 'Accept: text/html', String crlf, > - 'Content-Type: ', contentType, String crlf, > - 'Content-Length: ', (postData ifNil:['']) size, String crlf, > - HTTPProxyCredentials, > - HTTPBlabEmail, > - requestString "extra user request. Authorization" > - ) content: (postData ifNil:['']) response: nil! > > Item was removed: > - ----- Method: HTTPSocket class>>httpPostDocument:args:accept:request: (in category 'get the page') ----- > - httpPostDocument: url args: args accept: mimeType request: requestString > - "like httpGET, except it does a POST instead of a GET. POST allows data to be uploaded" > - > - | argString | > - args ifNotNil: [ > - argString := self argString: args. > - argString first = $? ifTrue: [argString := argString allButFirst]. > - ]. > - > - ^self httpPost: url > - content: argString > - type: 'application/x-www-form-urlencoded' > - accept: mimeType > - request: requestString! > > Item was removed: > - ----- Method: HTTPSocket class>>httpPostMultipart:args:accept:request: (in category 'get the page') ----- > - httpPostMultipart: url args: argsDict accept: mimeType request: requestString > - " do multipart/form-data encoding rather than x-www-urlencoded " > - > - | mimeBorder argsStream | > - mimeBorder := '----squeak-georgia-tech-', Time millisecondClockValue printString, '-csl-cool-stuff-----'. > - "encode the arguments dictionary" > - argsStream := WriteStream on: String new. > - argsDict associationsDo: [:assoc | > - assoc value do: [ :value | | fieldValue | > - "print the boundary" > - argsStream nextPutAll: '--', mimeBorder, String crlf. > - " check if it's a non-text field " > - argsStream nextPutAll: 'Content-disposition: multipart/form-data; name="', assoc key, '"'. > - (value isKindOf: MIMEDocument) > - ifFalse: [fieldValue := value] > - ifTrue: [argsStream nextPutAll: ' filename="', value url pathForFile, '"', String crlf, 'Content-Type: ', value contentType. > - fieldValue := (value content > - ifNil: [(FileStream fileNamed: value url pathForFile) contentsOfEntireFile] > - ifNotNil: [value content]) asString]. > - " Transcript show: 'field=', key, '; value=', fieldValue; cr. " > - argsStream nextPutAll: String crlf, String crlf, fieldValue, String crlf. > - ]]. > - argsStream nextPutAll: '--', mimeBorder, '--'. > - > - ^self httpPost: url > - content: argsStream contents > - type: 'multipart/form-data; boundary=', mimeBorder > - accept: mimeType > - request: requestString > - ! > > Item was removed: > - ----- Method: HTTPSocket class>>httpPostToSuperSwiki:args:accept:request: (in category 'get the page') ----- > - httpPostToSuperSwiki: url args: argsDict accept: mimeType request: requestString > - > - | mimeBorder argString | > - mimeBorder := '---------SuperSwiki',Time millisecondClockValue printString,'-----'. > - argString := String streamContents: [ :strm | > - strm nextPutAll: mimeBorder, String crlf. > - argsDict associationsDo: [:assoc | > - assoc value do: [ :value | > - strm > - nextPutAll: 'Content-disposition: form-data; name="', assoc key, '"'; > - nextPutAll: String crlf; > - nextPutAll: String crlf; > - nextPutAll: value; > - nextPutAll: String crlf; > - nextPutAll: String crlf; > - nextPutAll: mimeBorder; > - nextPutAll: String crlf. > - ] > - ]. > - ]. > - > - ^self httpPost: url > - content: argString > - type: 'multipart/form-data; boundary=', mimeBorder > - accept: mimeType > - request: requestString > - ! > > Item was removed: > - ----- Method: HTTPSocket class>>httpPut:to:user:passwd: (in category 'get the page') ----- > - httpPut: contents to: url user: user passwd: passwd > - "Upload the contents of the stream to a file on the server > - > - WARNING: This method will send a basic auth header proactively. > - This is necessary to avoid breaking MC and SqueakSource since SS does not > - return a 401 when accessing a private (global no access) repository." > - > - | urlString resp header | > - > - "Normalize the url" > - urlString := (Url absoluteFromText: url) asString. > - > - resp := (self httpRequestHandler) > - httpRequest: 'PUT' url: urlString headers:( > - 'Authorization: Basic ', (user, ':', passwd) base64Encoded, String crlf, > - 'Accept: */*', String crlf, > - 'Content-Type: application/octet-stream', String crlf, > - 'Content-Length: ', (contents ifNil:['']) size, String crlf, > - HTTPProxyCredentials, > - HTTPBlabEmail > - ) content: contents response:[:rr| header := rr]. > - ^resp isString ifTrue:[header, resp] ifFalse:[header, resp content]! > > > From commits at source.squeak.org Wed Jul 1 21:18:25 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 21:18:26 2015 Subject: [squeak-dev] The Trunk: WebClient-HTTP-cmm.3.mcz Message-ID: Chris Muller uploaded a new version of WebClient-HTTP to project The Trunk: http://source.squeak.org/trunk/WebClient-HTTP-cmm.3.mcz ==================== Summary ==================== Name: WebClient-HTTP-cmm.3 Author: cmm Time: 1 July 2015, 4:18:01.916 pm UUID: 6f6573bd-7d5b-425f-9fcb-632b4a59b792 Ancestors: WebClient-HTTP-topa.2 Recategorize methods so they are no longer overrides. WebClient is now part of Squeak. =============== Diff against WebClient-HTTP-topa.2 =============== Item was changed: + ----- Method: HTTPSocket class>>httpGet:args:user:passwd: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpGet:args:user:passwd: (in category '*WebClient-HTTP-override') ----- httpGet: url args: args user: user passwd: passwd "Upload the contents of the stream to a file on the server. WARNING: This method will send a basic auth header proactively. This is necessary to avoid breaking MC and SqueakSource since SS does not return a 401 when accessing a private (global no access) repository." | urlString xhdrs client resp progress | "Normalize the url" urlString := (Url absoluteFromText: url) asString. "Some raw extra headers which historically have been added" xhdrs := HTTPProxyCredentials, HTTPBlabEmail. "may be empty" client := WebClient new. client username: user; password: passwd. ^[resp := client httpGet: urlString do:[:req| "HACK: Proactively send a basic auth header. See comment above." req headerAt: 'Authorization' put: 'Basic ', (user, ':', passwd) base64Encoded. "Accept anything" req addHeader: 'Accept' value: '*/*'. "Add the additional headers" (WebUtils readHeadersFrom: xhdrs readStream) do:[:assoc| req addHeader: assoc key value: assoc value]]. progress := [:total :amount| (HTTPProgress new) total: total; amount: amount; signal: 'Downloading...' ]. "Simulate old HTTPSocket return behavior" (resp code between: 200 and: 299) ifTrue:[^(RWBinaryOrTextStream with: (resp contentWithProgress: progress)) reset] ifFalse:[resp asString, resp content]. ] ensure:[client destroy]. ! Item was changed: + ----- Method: HTTPSocket class>>httpGetDocument:args:accept:request: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpGetDocument:args:accept:request: (in category '*WebClient-HTTP-override') ----- httpGetDocument: url args: args accept: mimeType request: requestString "Return the exact contents of a web object. Asks for the given MIME type. If mimeType is nil, use 'text/html'. An extra requestString may be submitted and must end with crlf. The parsed header is saved. Use a proxy server if one has been registered. tk 7/23/97 17:12" "Note: To fetch raw data, you can use the MIME type 'application/octet-stream'." | client xhdrs resp urlString progress | "Normalize the url" urlString := (Url absoluteFromText: url) asString. args ifNotNil: [ urlString := urlString, (self argString: args) ]. "Some raw extra headers which historically have been added" xhdrs := HTTPProxyCredentials, HTTPBlabEmail, "may be empty" requestString. "extra user request. Authorization" client := WebClient new. ^[resp := client httpGet: urlString do:[:req| "Add ACCEPT header" mimeType ifNotNil:[req headerAt: 'Accept' put: mimeType]. "Always accept plain text" req addHeader: 'Accept' value: 'text/html'. "Add the additional headers" (WebUtils readHeadersFrom: xhdrs readStream) do:[:assoc| req addHeader: assoc key value: assoc value]]. progress := [:total :amount| (HTTPProgress new) total: total; amount: amount; signal: 'Downloading...' ]. "Simulate old HTTPSocket return behavior" (resp code between: 200 and: 299) ifTrue:[MIMEDocument contentType: resp contentType content: (resp contentWithProgress: progress) url: url] ifFalse:[resp asString, resp content]. ] ensure:[client destroy]. ! Item was changed: + ----- Method: HTTPSocket class>>httpPost:args:user:passwd: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpPost:args:user:passwd: (in category '*WebClient-HTTP-override') ----- httpPost: url args: args user: user passwd: passwd "WARNING: This method will send a basic auth header proactively. This is necessary to avoid breaking MC and SqueakSource since SS does not return a 401 when accessing a private (global no access) repository." | argString xhdrs client resp urlString | "Normalize the url" urlString := (Url absoluteFromText: url) asString. args ifNotNil: [ argString := self argString: args. argString first = $? ifTrue: [argString := argString allButFirst]. ]. "Some raw extra headers which historically have been added" xhdrs := HTTPProxyCredentials, HTTPBlabEmail. "may be empty" client := WebClient new. client username: (user ifEmpty:[nil]); password: (passwd ifEmpty:[nil]). ^[resp := client httpPost: urlString content: (argString ifNil:['']) type: 'application/x-www-form-urlencoded' do:[:req| "HACK: Proactively send a basic auth header. See comment above." req headerAt: 'Authorization' put: 'Basic ', (user, ':', passwd) base64Encoded. "Accept anything" req addHeader: 'Accept' value: '*/*'. "Add the additional headers" (WebUtils readHeadersFrom: xhdrs readStream) do:[:assoc| req addHeader: assoc key value: assoc value]]. "Simulate old HTTPSocket return behavior" (resp code between: 200 and: 299) ifTrue:[MIMEDocument contentType: resp contentType content: resp content url: url] ifFalse:[resp asString, resp content]. ] ensure:[client destroy]. ! Item was changed: + ----- Method: HTTPSocket class>>httpPost:content:type:accept:request: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpPost:content:type:accept:request: (in category '*WebClient-HTTP-override') ----- httpPost: url content: postData type: contentType accept: mimeType request: requestString "like httpGET, except it does a POST instead of a GET. POST allows data to be uploaded" | urlString xhdrs client resp | "Normalize the url" urlString := (Url absoluteFromText: url) asString. "Some raw extra headers which historically have been added" xhdrs := HTTPProxyCredentials, HTTPBlabEmail, "may be empty" requestString. "extra user request. Authorization" client := WebClient new. ^[resp := client httpPost: urlString content: (postData ifNil:['']) type: contentType do:[:req| "Add ACCEPT header" mimeType ifNotNil:[req headerAt: 'Accept' put: mimeType]. "Always accept plain text" req addHeader: 'Accept' value: 'text/html'. "Add the additional headers" (WebUtils readHeadersFrom: xhdrs readStream) do:[:assoc| req addHeader: assoc key value: assoc value]]. "Simulate old HTTPSocket return behavior" (resp code between: 200 and: 299) ifTrue:[MIMEDocument contentType: resp contentType content: resp content url: url] ifFalse:[resp asString, resp content]. ] ensure:[client destroy]. ! Item was changed: + ----- Method: HTTPSocket class>>httpPostDocument:args:accept:request: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpPostDocument:args:accept:request: (in category '*WebClient-HTTP-override') ----- httpPostDocument: url args: args accept: mimeType request: requestString "like httpGET, except it does a POST instead of a GET. POST allows data to be uploaded" | argString | args ifNotNil: [ argString := self argString: args. argString first = $? ifTrue: [argString := argString allButFirst]. ]. ^self httpPost: url content: argString type: 'application/x-www-form-urlencoded' accept: mimeType request: requestString! Item was changed: + ----- Method: HTTPSocket class>>httpPostMultipart:args:accept:request: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpPostMultipart:args:accept:request: (in category '*WebClient-HTTP-override') ----- httpPostMultipart: url args: argsDict accept: mimeType request: requestString " do multipart/form-data encoding rather than x-www-urlencoded " | mimeBorder argsStream | mimeBorder := '----squeak-georgia-tech-', Time millisecondClockValue printString, '-csl-cool-stuff-----'. "encode the arguments dictionary" argsStream := WriteStream on: String new. argsDict associationsDo: [:assoc | assoc value do: [ :value | | fieldValue | "print the boundary" argsStream nextPutAll: '--', mimeBorder; crlf. " check if it's a non-text field " argsStream nextPutAll: 'Content-disposition: multipart/form-data; name="', assoc key, '"'. (value isKindOf: MIMEDocument) ifFalse: [fieldValue := value] ifTrue: [ argsStream nextPutAll: ' filename="'; nextPutAll: value url pathForFile; nextPut: $"; crlf; nextPutAll: 'Content-Type: '; nextPutAll: value contentType. fieldValue := (value content ifNil: [(FileStream fileNamed: value url pathForFile) contentsOfEntireFile] ifNotNil: [value content]) asString]. " Transcript show: 'field=', key, '; value=', fieldValue; cr. " argsStream crlf; crlf; nextPutAll: fieldValue; crlf ]]. argsStream nextPutAll: '--', mimeBorder, '--'. ^self httpPost: url content: argsStream contents type: 'multipart/form-data; boundary=', mimeBorder accept: mimeType request: requestString ! Item was changed: + ----- Method: HTTPSocket class>>httpPostToSuperSwiki:args:accept:request: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpPostToSuperSwiki:args:accept:request: (in category '*WebClient-HTTP-override') ----- httpPostToSuperSwiki: url args: argsDict accept: mimeType request: requestString | mimeBorder argString | mimeBorder := '---------SuperSwiki',Time millisecondClockValue printString,'-----'. argString := String streamContents: [ :strm | strm nextPutAll: mimeBorder; crlf. argsDict associationsDo: [:assoc | assoc value do: [ :value | strm nextPutAll: 'Content-disposition: form-data; name="', assoc key, '"'; crlf; crlf; nextPutAll: value; crlf; crlf; nextPutAll: mimeBorder; crlf. ] ]. ]. ^self httpPost: url content: argString type: 'multipart/form-data; boundary=', mimeBorder accept: mimeType request: requestString ! Item was changed: + ----- Method: HTTPSocket class>>httpPut:to:user:passwd: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpPut:to:user:passwd: (in category '*WebClient-HTTP-override') ----- httpPut: contents to: url user: user passwd: passwd "Upload the contents of the stream to a file on the server WARNING: This method will send a basic auth header proactively. This is necessary to avoid breaking MC and SqueakSource since SS does not return a 401 when accessing a private (global no access) repository." | urlString xhdrs client resp | "Normalize the url" urlString := (Url absoluteFromText: url) asString. "Some raw extra headers which historically have been added" xhdrs := HTTPProxyCredentials, HTTPBlabEmail. "may be empty" client := WebClient new. client username: (user ifEmpty:[nil]); password: (passwd ifEmpty:[nil]). ^[resp := client httpPut: urlString content: contents type: nil do:[:req| "HACK: Proactively send a basic auth header. See comment above." req headerAt: 'Authorization' put: 'Basic ', (user, ':', passwd) base64Encoded. "Accept anything" req addHeader: 'Accept' value: '*/*'. "Add the additional headers" (WebUtils readHeadersFrom: xhdrs readStream) do:[:assoc| req addHeader: assoc key value: assoc value]]. "Simulate old HTTPSocket return behavior" resp asString, resp content ] ensure:[client destroy]. ! From commits at source.squeak.org Wed Jul 1 21:38:59 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 21:39:02 2015 Subject: [squeak-dev] Squeak 4.6: Help-Squeak-Project-cmm.25.mcz Message-ID: Chris Muller uploaded a new version of Help-Squeak-Project to project Squeak 4.6: http://source.squeak.org/squeak46/Help-Squeak-Project-cmm.25.mcz ==================== Summary ==================== Name: Help-Squeak-Project-cmm.25 Author: cmm Time: 1 July 2015, 3:34:35.436 pm UUID: 84a2402f-811d-4a8c-9459-f6af9d8d9b21 Ancestors: Help-Squeak-Project-kfr.24 - Update internal release notes in the Help Browser. (no need to use a release-specific method). - Release Notes has duplication with the one in TheWorldMainDockingBar which will be addressed later. =============== Diff against Help-Squeak-Project-kfr.24 =============== Item was removed: - SystemOrganization addCategory: #'Help-Squeak-Project'! Item was removed: - ----- Method: HelpIcons class>>squeakIcon (in category '*help-squeak-project') ----- - squeakIcon - ^(Form - extent: 12@12 - depth: 32 - fromArray: #( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 75398782 26843545 0 0 1159996452 1378823983 338044454 0 0 0 0 455682345 1295266868 1126376227 0 0 1040582150 0 1328097577 0 0 0 23488102 1277502757 0 1076834095 0 0 1075781407 0 287647013 472854319 0 0 471472666 204089898 0 1092756002 0 0 1041963803 36909875 0 1880232466 454761243 287515427 1342572038 0 104939841 974460181 0 0 270080281 354690084 86846765 3674539269 1394219546 1611599631 3557427722 86123042 388244516 204287277 0 26843545 605558808 1025055001 1008014613 1159141143 522264865 739710743 1159141143 571083274 570820102 188891714 0 942550574 1411391520 1143021857 1312241463 1428563494 3205040393 3708159494 1663576104 1511067921 1579887403 1629758500 958472481 656679972 439563059 1294608938 839913488 739644950 172246084 221459251 840900383 1075978786 1209933342 724512559 707077413 0 0 0 0 0 0 0 0 0 0 38488907 0 0 0 0 0 0 0 0 0 0 0 0 0) - offset: 0@0)! Item was removed: - CustomHelp subclass: #SqueakHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakHelp class>>bookName (in category 'accessing') ----- - bookName - ^'Squeak'! Item was removed: - ----- Method: SqueakHelp class>>icon (in category 'accessing') ----- - icon - (self name = #SqueakHelp) ifTrue: [^HelpIcons iconNamed: #squeakIcon]. - ^nil! Item was removed: - ----- Method: SqueakHelp class>>introduction (in category 'as yet unclassified') ----- - introduction - "This method was automatically generated. Edit it using:" - "a HelpBrowser edit: #introduction" - ^HelpTopic - title: 'Welcome' - contents: - 'WELCOME - - Squeak is a modern, open source, full-featured implementation of the powerful Smalltalk programming language and environment. - - Squeak is highly-portable - even its virtual machine is written entirely in Smalltalk making it easy to debug, analyze, and change. - - Squeak is the vehicle for a wide range of projects from multimedia applications, educational platforms to commercial web application development.!! - ]style[(7 2 6 72 9 41 6 70 9 49 6 139)bc000000000a0FBitstreamVeraSerif#20.0,c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000!!' readStream nextChunkText! Item was removed: - ----- Method: SqueakHelp class>>pages (in category 'accessing') ----- - pages - ^#(introduction SqueakProjectHelp SqueakToolsHelp SqueakTutorials)! Item was removed: - SqueakProjectHelp subclass: #SqueakLicenseHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakLicenseHelp class>>bookName (in category 'accessing') ----- - bookName - ^'License'! Item was removed: - ----- Method: SqueakLicenseHelp class>>licenseChange (in category 'pages') ----- - licenseChange - ^HelpTopic - title: 'License has changed with 4.0' - contents: 'On 23 September 1996, Apple Computer Inc. released Squeak V1.1 under the "Squeak License" (SqL). - - On May 8, 2006 Apple agreed to relicense original Squeak V1.1 under the Apple Public Source License. - - On October 12, 2006 Apple granted permission to relicense under Apache license 2.0. - - In 2006, VPRI began to collect "Distribution Agreements" for all contributors to Squeak since V1.1 up to V3.8, asking them to relicense their contributions, which were originally licensed under SqL, to the MIT license. This was a great effort on behalf of many and VPRI has 100s of signed documents agreeing to this. - - Do you want to contribute source to Squeak?All new contributions since 4.0 must be under the MIT license. When you make your code available, please state explicitly in some form such as the description on a web site or email announcement that your contribution is under the MIT license. (It doesn''t have to be exclusive; you can release it under difference licenses at the same time.) - - Have you contributed source to Squeak? If you believe you have, but have not sent in an agreement to allow your submission(s) to be licensed under the MIT license then please see http://netjam.org/squeak/contributors. There you can find a list of known contributors and a PDF of the agreement with instructions. The snail mail address is found in the agreement PDF file. - - Also there are a few people for which we are lacking full contact information. If you think you can help please also visit the link above and see if you can identify any of the unknown developer initials or any of the developers for whom we do not have a current email address.' ! Item was removed: - ----- Method: SqueakLicenseHelp class>>officialLicense (in category 'pages') ----- - officialLicense - ^HelpTopic - title: 'Official License - 4.0' - contents: 'Copyright (c) The individual, corporate, and institutional contributors who have collectively contributed elements to this software ("The Squeak Community"), 1996-2011 All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - Portions of Squeak are covered by the following license - - - Copyright (c) Xerox Corp. 1981, 1982 All rights reserved. - Copyright (c) Apple Computer, Inc. 1985-1996 All rights reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.'! Item was removed: - ----- Method: SqueakLicenseHelp class>>pages (in category 'accessing') ----- - pages - ^#(licenseChange officialLicense)! Item was removed: - SqueakHelp subclass: #SqueakProjectHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakProjectHelp class>>bookName (in category 'accessing') ----- - bookName - ^'The Project'! Item was removed: - ----- Method: SqueakProjectHelp class>>extendingTheSystem (in category 'pages') ----- - extendingTheSystem - ^HelpTopic - title: 'Extending The System' - icon: (HelpIcons iconNamed: #squeakIcon) - contents: - 'SqueakMap is an integrated catalog of external applications for Squeak. It is accessible from the "Apps" menu. This catalog does not host the projects, it merely documents the load scripts required to correctly bring them into the image. - - Many SqueakMap packages use Installer, which defines several packages in its package-definitions protocol. Any of these can be loaded with an expression like the following: - - Installer new merge: #openGL - - Change #openGL to the selector name of the package you want to load. The latest version of that package and all of its prerequisites will be merged into the image. Merging a package is no different from loading it unless the package is already loaded, in which case it is upgraded to the latest version in a way that preserves any local changes you may already have made. - - --------------- - This remainder of this workspace documents load-scripts for packages that are not documented in either SqueakMap or Installer. - - OCompletion - "Provides source code completion as you type" - (Installer ss project: ''OCompletion'') install: ''Ocompletion''. - (Smalltalk at: #ECToolSet) register. - (Smalltalk at: #ToolSet) default: (Smalltalk at: #ECToolSet). - - Omnibrowser - "Including Refactoring engine" - (Installer ss project: ''MetacelloRepository'') install: ''ConfigurationOfOmniBrowser''. - ((Smalltalk at: #ConfigurationOfOmniBrowser) project perform: #lastVersion) load: #( Dev ). - - Pier CMS - "Pier CMS: http://www.piercms.com" - (Installer ss project: ''MetacelloRepository'') install: ''ConfigurationOfPier2''. - (Smalltalk at: #ConfigurationOfPier2) load. - - (Installer lukas project: ''pier2'') install: ''Pier-Blog''. - (Installer lukas project: ''pier2'') install: ''Pier-Book''. - (Installer lukas project: ''pier2addons'') install: ''Pier-Setup''. - (Smalltalk at: #PRDistribution) new register. - - Open Cobalt - "http://opencobalt.org (Best to run this from an image in an open cobalt directory)" - Installer ss project: ''TweakCore''; install: ''update''. - [Installer ss project: ''TweakExtras''; install: ''update''] - on: (Smalltalk at: #CUnsynchronizedModification) do: [:ex | ex resume]. - Installer cobalt project: ''Tweak''; - answer: ''Would you like to conserve memory at all costs?'' with: true; - answer: ''Password for interactive VNC connections?'' with: ''cobalt''; - answer: ''Would you like to add the RFBServer to the World open menu?'' with: true; - install: ''update'' - !! - ]style[(9 309 19 252 6 126 8 237 11 209 11 210 8 386 11 547)dSMLoaderPlus open;;,,d| newBrowser | - newBrowser := Browser new selectSystemCategory: ''Installer-Core''; selectClass: Installer; metaClassIndicated: false; selectMessageCategoryNamed: ''package-definitions''; selectMessageNamed: #openGL. - Browser openBrowserView: (newBrowser openMessageCatEditString: nil) label: ''External Package Definitions'';;,,i,,u,,bu,,bu,,bu,,bu,!!' readStream nextChunkText! Item was removed: - ----- Method: SqueakProjectHelp class>>pages (in category 'accessing') ----- - pages - ^#(releaseNotes4point5 extendingTheSystem squeakResourcesOnline squeakUserInterface workingWithSqueak)! Item was removed: - ----- Method: SqueakProjectHelp class>>releaseNotes4point5 (in category 'pages') ----- - releaseNotes4point5 - ^HelpTopic - title: 'Squeak 4.5 Theodor' - icon: (HelpIcons iconNamed: #squeakIcon) - contents: - 'Squeak 4.5 ---- Theodor - =================== - - ______________________________________________ - Language enhancements: - - Environments - Environments allows multiple classes with the same name to exist in the same image, with code referencing through its class'' "environment". - - Collections - New and improved sorting utilities for Arrays and OrderedCollections. - New FloatCollection inherits the convenient add:/remove: API of OrderedCollection, but using an internal FloatArray for better efficiency. - An all-new LRUCache implementation. - Promise is now a fully chainable object with decent error handling. - Compiler - - Numerics - Faster and better Random. - log/ln fixed for integers. - - Dates and Times - New methods provide access to primitive 240 and 241, which can provide microsecond resolution timestamps on Cog VMs. - New convenience methods allow creating DateAndTimes relative to now (e.g., "5 minutes ago"). - Parsing improvements. - - Text, Graphics, Sound - Form>pixelValueAt: now makes use of the new primitivePixelValueAt:, avoiding the overhead of a full BitBlt. - Elimination of the dual hierarchy of NewParagraph & MultiNewParagraph etc and TextStopConditions and lots of Scanner improvements. - PaintBoxMorph re-engineering. - ADPCMCodec performance improvement. - - ______________________________________________ - IDE, Monticello and Trunk process improvements: - - Several MVC fixes allow debugging in MVC once again. - Smart-Splitters causes the bars between browser panes to automatically optimize their position. - Fixed color-selection from anywhere on the screen working again. - Improved command-line interface via Smalltalk run: [ :arg1 :arg2 | ... ]. - squeakDebug.log report length is now settable. - MCReorganizationPreloader now resolves moves between arbitrary packages, independent of their order in the configuration. - mcz/snapshot/source.st now encoded in UTF8 instead of latin-1. - New pre-selection highlight feature for lists. - System space analysis now available in Help | About. - Message-traces can be pared more easily. - - ______________________________________________ - Configuration - Lots of improvements in the CI build/test slave. - Installer now documents externally-loadable packages as simple literal structures that can be merged via Installer>>#merge:. - MC ancestry history strings can now be stubbed for a smaller image and sustainable MC history. - - ______________________________________________ - History and Accounting Tools - A great new historical website by Bob Arning. - MC history and origin is now available for methods and class-definitions from browser menus. - A new amazing ObjectHistory makes it possible to efficiently track the born-on date of any object to a resolution of one minute. - Added "search history" to Package history browser. - - ______________________________________________ - Fixes and cleanups - Packages organized toward eliminating circular dependencies, and with proper concern for existing and future UI frameworks. - Updated uses of SmalltalkImage current to, simply, "Smalltalk." - Moving away from use of Utilities. - More preferences made pragma-based. - Compiler factorings and cleanups. - Diminished excessive usage of ReadWriteStream. - ProtoObject API balanced and minimal. - Moved classifying and logging behavior out of Compiler (a responsibility of Behavior). - - ______________________________________________ - Application Upgrade Notes - Default Float printing is now true to its internal representation. Apps must now use appropriate methods to format Floats rather than roundTo:. - ($a to: $b) now returns ''ab'' rather than #($a $b). - Remove OneCharacterSymbols optimization. - LRUCache instance migrations, if any. See post-scripts in Collections-ul.546, 547 - Rectangles with 0 area (e.g., lines) can now intersect. - - - - This release is dedicated - to the memory of our friend - Andreas Raab (1968 -- 2013) - !! - ]style[(10 1 4 1 7 1 19 1 1 47 22 2 13 142 11 329 8 57 15 237 21 358 48 720 13 321 28 372 18 522 25 382 1 5 7 4 9 56 1)ba2FBitstreamVeraSerif#32.0,a2FBitstreamVeraSerif#32.0,a2--FBitstreamVeraSerif#32.0,a2FBitstreamVeraSerif#32.0,ia2FBitstreamVeraSerif#32.0,FBitstreamVeraSerif#24.0a2,FBitstreamVeraSerif#24.0----a2,FBitstreamVeraSerif#24.0a2,,FBitstreamVeraSerif#16.0,FBitstreamVeraSerif#24.0,,bFBitstreamVeraSerif#16.0,FBitstreamVeraSerif#16.0,bFBitstreamVeraSerif#16.0,FBitstreamVeraSerif#16.0,bFBitstreamVeraSerif#16.0,FBitstreamVeraSerif#16.0,bFBitstreamVeraSerif#16.0,FBitstreamVeraSerif#16.0,bFBitstreamVeraSerif#16.0,FBitstreamVeraSerif#16.0,FBitstreamVeraSerif#24.0,FBitstreamVeraSerif#16.0,FBitstreamVeraSerif#24.0,FBitstreamVeraSerif#16.0,FBitstreamVeraSerif#24.0,FBitstreamVeraSerif#16.0,FBitstreamVeraSerif#24.0,FBitstreamVeraSerif#16.0,FBitstreamVeraSerif#24.0,FBitstreamVeraSerif#16.0,,FBitstreamVeraSerif#16.0ia2,FBitstreamVeraSerif#16.0iba2,FBitstreamVeraSerif#16.0ia2,FBitstreamVeraSerif#16.0iba2,FBitstreamVeraSerif#16.0ia2,!!' readStream nextChunkText! Item was removed: - ----- Method: SqueakProjectHelp class>>squeakResourcesOnline (in category 'pages') ----- - squeakResourcesOnline - ^HelpTopic - title: 'Squeak Resources Online' - icon: (HelpIcons iconNamed: #squeakIcon) - contents: - 'Squeak web sites - Main Squeak site http://www.squeak.org - Weekly Squeak http://news.squeak.org - Oversight Board http://board.squeak.org - Downloads for many versions http://ftp.squeak.org - Development of the virtual machine http://squeakvm.org - Google+ Page - https://plus.google.com/u/0/b/115950529692424242526/ - - Squeak-dev - The main Squeak mailing list - http://lists.squeakfoundation.org/mailman/listinfo/squeak-dev - http://dir.gmane.org/gmane.comp.lang.smalltalk.squeak.general - http://n4.nabble.com/Squeak-Dev-f45488.html - - Squeak-Beginners - The place to ask even the most basic questions - http://lists.squeakfoundation.org/mailman/listinfo/beginners - http://dir.gmane.org/gmane.comp.lang.smalltalk.squeak.beginners - http://n4.nabble.com/Squeak-Beginners-f107673.html - - Squeak By Example - http://www.squeakbyexample.org/ - - Squeak, Open Personal Computing and Multimedia - http://coweb.cc.gatech.edu/squeakbook/ - http://stephane.ducasse.free.fr/FreeBooks/CollectiveNBlueBook/ - - Squeak, Open Personal Computing for Multimedia - http://www.cc.gatech.edu/~mark.guzdial/drafts/ - http://stephane.ducasse.free.fr/FreeBooks/GuzdialBookDrafts/ - - More Books about Squeak and Smalltalk - http://stephane.ducasse.free.fr/FreeBooks.html - !! - ]style[(16 316 41 173 65 181 17 35 46 106 46 112 37 49)bu,,bu,,bu,,bu,,bu,,bu,,bu,!!' readStream nextChunkText - ! Item was removed: - ----- Method: SqueakProjectHelp class>>squeakUserInterface (in category 'pages') ----- - squeakUserInterface - ^HelpTopic - title: 'Squeak User Interface' - icon: (HelpIcons iconNamed: #squeakIcon) - contents: - 'The Squeak UI has some unusual elements that you may not have seen before. Here is a brief introduction to those elements: - - Projects - A project is an entire Squeak desktop full of windows. Projects are can be used to change quickly from one task to another. An inactive project is represented by a project window that shows a thumbnail of that project''s windows. Project windows are actually more like doors than windows, since you can enter the project just by clicking on its project window. You can create a new project by choosing ''open...project'' from the screen menu. To exit a project (and return to its parent project), choose ''previous project'' from the screen menu. Each project maintains its set of windows, plus its own set of Smalltalk changes and its own screen color depth. - - Morphic Halos - In a morphic project, cmd-click (alt-click) on a window or other graphical object will bring up a constellation of colored circles called "halo handles" around that object. Additional clicks will cycle through the halos for other graphical objects in the nesting structure. If you hold down the Shift key while cmd-clicking, the nested morphs will be traversed from innermost outward. Clicking without the cmd (alt) key will dismiss the halo. While the halo is up, letting the cursor linger over one of the halo handles for a few seconds will cause a balloon to pop up with the name of that handle. Three useful handles are the top-left "X" handle (delete), the bottom-right yellow handle (resize), and the brown handle (slide the object within its containing object). Halos allow complex graphical objects to be explored--or even disassembled (using the black halo handle). Usually no harm results from taking apart an object; you can just discard the pieces and create a new one. - - Flaps - To enable Flaps, click on the desktop to show the world menu, choose the "Flaps..." menu and "show shared tags". Tabs labeled "Squeak", "Tools", "Supplies", etc., will appear along the edges of the Squeak desktop. Click on any tab to open the corresponding flap. Drag a tab to resize the flap and to relocate the tab. Bring up the halo on any tab and click on its menu handle to be presented with many options relating to the flap. Use the "Flaps..." menu, reached via the desktop menu, to control which flaps are visible and for other flap-related options and assistance. - - Parts Bins - You can obtain new objects in many ways. The "Objects Catalog" (choose "objects'' from the world menu or open the objects flap) and several of the standard flaps (e.g. "Tools" and "Supplies") serve as "Parts Bins" the for new objects. Drag any icon you see in a Parts Bin and a fresh copy of the kind of object it represents will appear "in your hand"; click to deposit the new object anywhere you wish. You can also add your own objects to any of the flaps -- just drag your object over the tab, wait for the flap to pop open, then drop the object at the desired position in the flap. - !! - ]style[(123 9 663 13 991 5 579 10 589),bu,,bu,,bu,,bu,!!' readStream nextChunkText! Item was removed: - ----- Method: SqueakProjectHelp class>>workingWithSqueak (in category 'pages') ----- - workingWithSqueak - ^HelpTopic - title: 'Working with Squeak' - icon: (HelpIcons iconNamed: #squeakIcon) - contents: - 'Starting and Quitting - Like most Smalltalk''s, the machine-executable portion is a relatively small program known as the "virtual machine" (VM). The VM''s job is to provide services from the physical machine to real Smalltalk objects. Services like input and output. The Smalltalk system, including all data and code, is a system of objects, built from the ground up, and interpreted by this virtual computer. This affords Smalltalk system platform portability. - - Smalltalk cannot run without the VM. The VM can''t do anything useful except process Smalltalk systems. - - To start the system, drag the ".image" data file to the VM executable "squeak". There are myriad command-line options for starting the system via the command-line (see squeak --help). By default, the system will open on the screen in a single OS window. - - To quit a Squeak session, choose ''quit'' from the menu bar. If you save, the image file will be overwritten and resume from that place the next time it''s launched. - - The Image File - Squeak is an environment built in its own objects from the ground up, including one or more end-user applications. All of the objects in the system -- Classes, Dictionaries, Windows, Customers and other objects that make up the Squeak environment are stored in a binary ".image" file. This is the "object-data file" loaded by the VM when Squeak is launched. - - When an image is started, every object resumes exactly from where it was last saved. - - The Sources File - Smalltalk is traditionally includes the source code in the running system. However, keeping multiple copies of the same source code in all images files is wasteful. Therefore, the source code itself is kept in a read-only .sources file and accessed by all images. The image files merely have pointers into this file, which is read on-the-fly to present original source code. - - The code of the base system is stored in the file "SqueakV41.sources". This file does not change except between releases of Squeak. Normally this file should be placed in the folder containing the VM executable. - - The Changes File - The purpose of Squeak is to develop new programs and systems. Code changes to the running system are effective immediately. But since multiple images can be running, they cannot all update the .sources file safely. Therefore, each image file is accompanied by a ".changes" file which contains source code changes for that and only that Smalltalk system.. - - The changes file is important for project work. It keeps a sequential log of development activity for the purpose of recovering work performed since the last image-save. Any of several events could lead to the need to recover work, including a power-outage or making an erroneous change to code required to keep the system running. - - The changes file does not consume memory space, so Squeak is able to keep a complete history of all program changes. This makes it easy to examine or even reinstate older versions of methods (see ''versions'' option in browser selector pane). This encourages experimentation, since you can easily revert to the original versions of any set of methods. - - In extreme cases where sources and/or changes files are not available, the system can still run, and will automatically decompile the bytecode methods in image memory, if necessary, into readable and editable versions of the original source code (only comments and temporary variable names are lost). - - Transferring Code-Snippets Between Images - In addition to the ''save'' command that saves the entire state of the system, the code of individual methods, categories or classes may be ''filed out'' and then filed-in to another image. - - Packages - The code of an entire project is encapsulated by a Package. This allows users to share their code with other users. Code of packages are delineated by the categories of their classes, and methods. The Monticello browser is then used to wrap that code into a Package object which can be saved to a Monticello repository at http://ss3.gemtalksystems.com/ss. - - Some projects end up using the resources provided by several packages, resulting in a hierarchy of packages that make up a system. Installer can be used to install such systems.!! - ]style[(21 970 14 448 16 396 11 188 16 321 4 1025 41 188 8 52 10 55 2 420)bu,,bu,,bu,,u,,bu,,u,,bu,,bu,,i,,i,!!' readStream nextChunkText! Item was removed: - SqueakToolsHelp subclass: #SqueakToolsDebuggerHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakToolsDebuggerHelp class>>bookName (in category 'accessing') ----- - bookName - ^'Debugger'! Item was removed: - ----- Method: SqueakToolsDebuggerHelp class>>openingTheDebugger (in category 'pages') ----- - openingTheDebugger - ^HelpTopic - title: 'Open a Debugger.' - contents: 'A debugger window is opened in response to an unhandled exception condition. Evaluating the expression ''self halt'' in a workspace or as an expression in a method will cause a debugger window to be opened. The debugger provides direct interactive access to the interrupted process. - - The debugger permits its interrupted process to be inspected and modified. Source code and variables may be modified interactively, and the process can be stepped through its execution in various ways.'! Item was removed: - ----- Method: SqueakToolsDebuggerHelp class>>pages (in category 'accessing') ----- - pages - ^# (whatIsADebugger openingTheDebugger usingTheDebugger)! Item was removed: - ----- Method: SqueakToolsDebuggerHelp class>>showForm: (in category 'pages') ----- - showForm: aSymbol - | form contents | - form := ScriptingSystem formAtKey: aSymbol. - contents := (String with: Character cr) asText, - (Text string: ' ' - attribute: (TextFontReference toFont: - (FormSetFont new - fromFormArray: (Array with: form) - asciiStart: Character space asInteger - ascent: form height))), - (String with: Character cr) asText. - ^contents! Item was removed: - ----- Method: SqueakToolsDebuggerHelp class>>usingTheDebugger (in category 'pages') ----- - usingTheDebugger - ^HelpTopic - title: 'Debugging Loops.' - contents: 'There are a few ways to get out of a loop. The best way is to just let the loop run. - - To do that select the space on your code (while in the Debugger) you want to jump to, right click and select: ''run to here.'' - - ' asText, - (self showForm: #Debugger1), - ' - - That will take you to the place you clicked on in your code. - - There is another trick, loops usually have an index. This is Smalltalk after all. In the case above we just selected this code and selected ''Debug it'' - - 1 to: 100 do: [:i | Transcript show: i asString]. - Transcript show: ''done'' - - While in the outer content evaluating the loop, select i change the value to 100 hit accept and ''bobs your uncle'' the loop is done. - - Ok so a bit of a hack but this can be used it to skip over some processing, and since you are debugging and know what you are doing it should be fine. - - ' asText, - (self showForm: #Debugger2), - ' - Proceed is just continue and stop debugging. - - Restart will stop debugging at the selected method and restart that method from the beginning. - - Into goes into the execution of the next method and shows you what it does. - - Over executes the next message and moves over it to the next message. - - Through steps you through a block of code, so if you are about to execute a block, this steps you through that block - - Full Stack increases the number of levels you see in the upper panel. That normally shows you a subset of the execution stack. Full stack will show you the rest of the stack that called this method. - - Where is useful if you click around a method during debugging. It will highlight the code at its execution point. You can also just select the stack method again to do the same thing. - - Tally is supposed to tally selected code, but may not be reliable within the debugger. If you want to tally something do it outside a debugger.' asText! Item was removed: - ----- Method: SqueakToolsDebuggerHelp class>>whatIsADebugger (in category 'pages') ----- - whatIsADebugger - ^HelpTopic - title: 'What is a Debugger.' - contents: 'A debugger represents the machine state at the time of an interrupted process. It also represent a query path into the state of the process. - - The debugger is typically viewed through a window that views the stack of suspended contexts, the code for, and execution point in, the currently selected message, and inspectors on both the receiver of the currently selected message, and the variables in the current context.'! Item was removed: - SqueakHelp subclass: #SqueakToolsHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakToolsHelp class>>basicDevelopmentTools (in category 'pages') ----- - basicDevelopmentTools - ^HelpTopic - title: 'Basic Development Tools' - contents: 'Smalltalk environments have some of the best user interfaces for programmers ever devised. Those who have programmed in Lisp under Emacs have some idea, but Smalltalk is even better. - - You should learn these basic tools thoroughly: - - Workspace - - Transcript - - Browser - - Inspector - - File List - - Change Sorter - - Debugger - - Method Finder - '! Item was removed: - ----- Method: SqueakToolsHelp class>>bookName (in category 'accessing') ----- - bookName - ^'Tools'! Item was removed: - ----- Method: SqueakToolsHelp class>>pages (in category 'accessing') ----- - pages - ^#(basicDevelopmentTools)! Item was removed: - SqueakToolsHelp subclass: #SqueakToolsTranscriptHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakToolsTranscriptHelp class>>bookName (in category 'accessing') ----- - bookName - ^'Transcript'! Item was removed: - ----- Method: SqueakToolsTranscriptHelp class>>pages (in category 'accessing') ----- - pages - ^# (transcript)! Item was removed: - ----- Method: SqueakToolsTranscriptHelp class>>transcript (in category 'pages') ----- - transcript - ^HelpTopic - title: 'The Transcript window' - contents: 'The Transcript window is often used for logging or printing results from text only code. - To open the Transcript use TheWorldMenu and choose ''open...''. Then choose ''Transcript''. - You can also type - - Transcript open - - in a Workspace and doIt. - '! Item was removed: - SqueakToolsHelp subclass: #SqueakToolsWorkspaceHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakToolsWorkspaceHelp class>>bookName (in category 'accessing') ----- - bookName - ^'Workspace'! Item was removed: - ----- Method: SqueakToolsWorkspaceHelp class>>openWorkspace (in category 'pages') ----- - openWorkspace - ^HelpTopic - title: 'Open a Workspace' - contents: 'You can open a Workspace window in any of the following ways: - - - Keyboard Shortcut: while pointing at an empty part of the Squeak window, press alt-k (in Windows) or cmd-k (on a Mac) - - World Menu: select "Workspace" - - Tools Flap: click on the Tools Flap. When it comes out, drag the Workspace icon out. - - Doit: select inside the following quote and doit: "Workspace open"'! Item was removed: - ----- Method: SqueakToolsWorkspaceHelp class>>pages (in category 'accessing') ----- - pages - ^#(workspace openWorkspace saveWorkspace)! Item was removed: - ----- Method: SqueakToolsWorkspaceHelp class>>saveWorkspace (in category 'pages') ----- - saveWorkspace - ^HelpTopic - title: 'Saving Workspace to a File' - contents: 'You can save the text content of a Workspace to a file by choosing the workspace menu (from within the workspace), then ''more...'', then ''save contents to file...''.'! Item was removed: - ----- Method: SqueakToolsWorkspaceHelp class>>workspace (in category 'pages') ----- - workspace - ^HelpTopic - title: 'What is a Workspace' - contents: 'A Workspace is a window used as a scratchpad area where fragments of Smalltalk code can be entered, stored, edited, and evaluated.'! Item was removed: - SqueakHelp subclass: #SqueakTutorials - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakTutorials class>>bookName (in category 'accessing') ----- - bookName - ^'Tutorials'! Item was removed: - ----- Method: SqueakTutorials class>>introduction (in category 'pages') ----- - introduction - "This method was automatically generated. Edit it using:" - "SqueakTutorials edit: #introduction" - ^HelpTopic - title: 'Introduction' - contents: - 'Here you will some short tutorials on how to use Squeak for daily tasks. Feel free to add your own.!!' readStream nextChunkText! Item was removed: - ----- Method: SqueakTutorials class>>pages (in category 'accessing') ----- - pages - ^#(introduction)! Item was removed: - SqueakTutorials subclass: #SqueakTutorialsCommandKey - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakTutorialsCommandKey class>>bookName (in category 'as yet unclassified') ----- - bookName - ^'Command Key Mappings'! Item was removed: - ----- Method: SqueakTutorialsCommandKey class>>commandKeyMappings (in category 'as yet unclassified') ----- - commandKeyMappings - "This method was automatically generated. Edit it using:" - "SqueakTutorialsCommandKey edit: #commandKeyMappings" - ^HelpTopic - title: 'Command Key Mappings' - contents: - 'Lower-case command keys - (use with Cmd key on Mac and Alt key on other platforms) - a Select all - b Browse it (selection is a class name or cursor is over a class-list or message-list) - c Copy selection - d Do it (selection is a valid expression) - e Exchange selection with prior selection - f Find - g Find again - h Set selection as search string for find again - i Inspect it (selection is a valid expression, or selection is over an inspect-ilst) - j Again once (do the last text-related operation again) - k Set font - l Cancel - m Implementors of it (selection is a message selector or cursor is over a class-list or message-list) - n Senders of it (selection is a message selector or cursor is over a class-list or message-list) - o Spawn current method - p Print it (selection is a valid expression) - q Query symbol (toggle all possible completion for a given prefix) - r Recognizer - s Save (i.e. accept) - t Finds a Transcript (when cursor is over the desktop) - u Toggle alignment - v Paste - w Delete preceding word (over text); Close-window (over morphic desktop) - x Cut selection - y Swap characters - z Undo - - Note: for Do it, Senders of it, etc., a null selection will be expanded to a word or to the current line in an attempt to do what you want. Also note that Senders/Implementors of it will find the outermost keyword selector in a large selection, as when you have selected a bracketed expression or an entire line. Finally note that the same cmd-m and cmd-n (and cmd-v for versions) work in the message pane of most browsers. - - Upper-case command keys - (use with Shift-Cmd, or Ctrl on Mac - or Shift-Alt on other platforms; sometimes Ctrl works too) - A Advance argument - B Browse it in this same browser (in System browsers only) - C Compare the selected text to the clipboard contents - D Duplicate - E Method strings containing it - F Insert ''ifFalse:'' - G fileIn from it (a file name) - H cursor TopHome: - I Inspect via Object Explorer - J Again many (apply the previous text command repeatedly until the end of the text) - K Set style - L Outdent (move selection one tab-stop left) - M Select current type-in - N References to it (selection is a class name, or cursor is over a class-list or message-list) - O Open single-message browser (in message lists) - P Make project link - R Indent (move selection one tab-stap right) - S Search - T Insert ''ifTrue:'' - U Convert linefeeds to carriage returns in selection - V Paste author''s initials - W Selectors containing it (in text); show-world-menu (when issued with cursor over desktop) - X Force selection to lowercase - Y Force selection to uppercase - Z Capitalize all words in selection - - Other special keys - Backspace Backward delete character - Del Forward delete character - Shift-Bksp Backward delete word - Shift-Del Forward delete word - Esc Pop up the Desktop Menu - \ Send top window to back - - Cursor keys - left, right, - up, down Move cursor left, right, up or down - Ctrl-left Move cursor left one word - Ctrl-right Move cursor right one word - Home Move cursor to begin of line or begin of text - End Move cursor to end of line or end of text - PgUp, Ctrl-up Move cursor up one page - PgDown, Ctrl-Dn Move cursor down one page - - Note all these keys can be used together with Shift to define or enlarge the selection. You cannot however shrink that selection again, as in some other systems. - - Other Cmd-key combinations (not available on all platforms) - Return Insert return followed by as many tabs as the previous line - (with a further adjustment for additional brackets in that line) - Space Select the current word as with double clicking - - Enclose the selection in a kind of bracket. Each is a toggle. - (not available on all platforms) - Ctrl-( Enclose within ( and ), or remove enclosing ( and ) - Ctrl-[ Enclose within [ and ], or remove enclosing [ and ] - Crtl-{ Enclose within { and }, or remove enclosing { and } - Ctrl-< Enclose within < and >, or remove enclosing < and > - Ctrl-'' Enclose within '' and '', or remove enclosing '' and '' - Ctrl-" Enclose within " and ", or remove enclosing " and " - Note also that you can double-click just inside any of the above delimiters, - or at the beginning or end of a line, to select the text enclosed. - - Text Emphasis - (not available on all platforms) - Cmd-1 type the first method argument - Cmd-2 type the second method argument - Cmd-3 type the third method argument - Cmd-4 type the fourth method argument - Cmd-5 for future use - Cmd-6 color, action-on-click, link to class comment, link to method, url - Brings up a menu. To remove these properties, select - more than the active part and then use command-0. - Cmd-7 bold - Cmd-8 italic - Cmd-9 narrow (same as negative kern) - Cmd-0 plain text (resets all emphasis) - Cmd-- underlined (toggles it) - Cmd-= struck out (toggles it) - - Shift-Cmd-- (aka :=) negative kern (letters 1 pixel closer) - Shift-Cmd-+ positive kern (letters 1 pixel larger spread) - - Docking Bar - Ctrl- opens the n-th (where n is between 0 and 7) menu if such exists, otherwise it moves the keyboard focus to the Search Bar. Currently this means: - Ctrl-0 Activates Search Bar - Ctrl-1 Squeak menu - Ctrl-2 Projects menu - Ctrl-3 Tools menu - Ctrl-4 Apps menu - Ctrl-5 Extras menu - Ctrl-6 Windows menu - Ctrl-7 Help menu - !!' readStream nextChunkText! Item was removed: - ----- Method: SqueakTutorialsCommandKey class>>pages (in category 'as yet unclassified') ----- - pages - ^# (commandKeyMappings)! Item was removed: - SqueakTutorials subclass: #SqueakTutorialsOnImage - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakTutorialsOnImage class>>bookName (in category 'as yet unclassified') ----- - bookName - ^'The Squeak Image'! Item was removed: - ----- Method: SqueakTutorialsOnImage class>>pages (in category 'as yet unclassified') ----- - pages - ^# (theImage)! Item was removed: - ----- Method: SqueakTutorialsOnImage class>>theImage (in category 'as yet unclassified') ----- - theImage - ^HelpTopic - title: 'Working with the Squeak Image' - contents: 'Working with the ecosystem of objects in a Smalltalk image. - - The basic tool for this is called an Inspector. Whenever you have an expression, like "3 + 4", you press cmd-i to "inspect it", which opens an inspector on the result. This works in any text area. Try for example inspecting "self" in a class browser, and you will inspect the underlying class object (which the browser shows a high-level view of). - - In the Inspector you see the objects referenced by this object (via instance variables or indexed fields) in the left panel. Select any of them and choose "inspect" from the context menu (or press cmd-i again). This way you can inspect all the objects in the system. - - A more modern tool than the Inspector (which was around 40 years ago already) is the Object Explorer. It presents you a tree view of an object and its "children", which again are the instance variables and indexed fields of the object. Open it with cmd-shift-i (or "explore" in the context menu). - - You can also do the reverse. If you choose "objects pointing to this value" you get an inspector showing all the objects that directly point to this object. Similarly there is a "reverse explorer", which you can open by selecting "explore pointers". - - There are two roots to all the objects in the system: - - Smalltalk specialObjectsArray - - which basically holds everything the Virtual Machine needs to know about, and in turn almost every object in the whole image, and - - thisContext - - which is the current execution context, holding onto temporary objects. When a garbage collection is performed, any object not reachable form either of these two roots is removed from memory. - - An "interesting" global object to explore is - - Project current - - which holds your current workspace, in particular - - Project current world - - , the root of all morphs in the world. And of course - - Smalltalk - - itself is the dictionary that holds all global objects, including all classes (unless they are defined in a non-global environment). - - There is also a low-level way to enumerate all objects in memory. "self someObject" will return the very first object in memory (which happens to be the nil object), and "anObject nextObject" will return the next one: - - | object count | - count := 0. - object := self someObject. - [0 == object] - whileFalse: [count := count + 1. - object := object nextObject]. - count - - Interestingly, this also finds objects that are due to be garbage-collected. For example, if you accidentally closed a text window, there is a good chance its contents will still be in memory, and can be retrieved using an expression like - - ByteString allInstances last: 10 - - This makes use of the someInstance/nextInstance methods, which are similar to someObject/nextObject, but restricted to instances of one class only. - '! Item was removed: - SqueakTutorials subclass: #SqueakTutorialsOnXML - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakTutorialsOnXML class>>bookName (in category 'accessing') ----- - bookName - ^'XML'! Item was removed: - ----- Method: SqueakTutorialsOnXML class>>dataRetrieval (in category 'pages') ----- - dataRetrieval - ^HelpTopic - title: 'Retrieving XML data' - contents: - 'Retrieving data from XML documents is simple and easy in Squeak Smalltalk. This tutorial demonstrates the fundamentals with a straightforward approach where code can be tested right away either here or in a Workspace window. The beauty of Squeak Smalltalk resides in the possibility to evaluate, inspect, print and debug code anywhere and this window is no different. - - This tutorial demonstrates how to... - - * retrieve an XML document from the World Wide Web - * instantiate an XML document class - * inspect and understand the content of an XML document - * retrieve and display values from specific XML tags - - Retrieve an XML document from the World Wide Web - - There are many manners to retrieve data from the World Wide Web in Squeak Smalltalk. HTTPClient is among them and allows to download files in all simplicity. Select the following code snippet and inspect it (press alt-i). An Inspect window will open with the document loaded in memory. The result is a MIMEDocument object. - - HTTPClient httpGetDocument: ''http://source.squeak.org/trunk/feed.rss''. - - TIP: Select HTTPClient and browse it (press alt-b) to open a System Browser window on its class. HTTPClient does not have instance methods but it has class methods. Click on class to see class methods. - - Instantiate an XML Document - - An instance of MIMEDocument will not allow to retrieve XML data in a comprehensive manner because it does not understand the nature of XML. For this reason, it is necessary to parse the content of MIMEDocument using XMLDOMParser. XMLDOMParser>>parseDocumentFrom: requires a stream as a parameter and ReadStream will be used for this purpose. The following code snippet instantiates an XMLDocument using the content of the downloaded file. - - | doc | - doc := HTTPClient httpGetDocument: ''http://source.squeak.org/trunk/feed.rss''. - XMLDOMParser parseDocumentFrom: (ReadStream on: (doc content)). - - Inspect and understand the content of an XML document - - XML is a flexible document format and it is necessary to understand how each given XML file is structured in order to properly search, retrieve and manipulate data. Inspecting values is critical in a dynamic programming language and environment, such as Squeak Smalltalk. Select the previous code snippet and inspect it (press alt-i). - - Unfortunately, the Inspect window does not reveal a lot about the XML structure of the downloaded file. Select the previous code snippet once again and explore it (press alt and the capital letter i). An Explorer window will open with a tree outline on the instance of XMLDocument. - - The Inspect and Explorer windows tell a lot about an XMLDocument. The sections are instance variables and their values are displayed aside. In the Explorer window, unfold elementsAndContents. Unfold other sections as deemed necessary to understand the XML format and the data available. - - The gibberish coding is about to become clear. Open a Browser window from the world menu and right click in the first pane, select find class (press alt-f) and type XMLDocument to search for its class, or select the class name and browse it (press alt-b). However, it is suggested to read more about XMLParser and XMLParserTest first. - - Retrieve and display values from specific XML tags - - The downloaded XML file contains a list of items which are denoted by the tag name "item". The Explorer window revealed the content of interest is located at the array index 1 of the elementsAndContents, which can be accessed through XMLDocument>>root. - - TIP: Some XML documents have additional components contained within its file, such as XMLPI (XML Processing Instructions). For this reason, the root may lead to this rather than the data which will be indexed at 2 or more. It is necessary to use XMLNodeWithElements>>elements, e.g. (xml elements at: 2), in order to access subsequent data. - - The following code snippet will display items in a Transcript window. Open a Transcript window using the world menu before selecting and executing the code. Select the code snippet and execute it (press alt-d). - - | doc xml | - doc := HTTPClient httpGetDocument: ''http://source.squeak.org/trunk/feed.rss''. - xml := XMLDOMParser parseDocumentFrom: (ReadStream on: (doc content)). - xml root tagsNamed: #item do: [:e | - Transcript show: (e asString); cr. - ]. - - An XML item looks like this: - - - HelpSystem-Core-tbn.46.mcz - http://source.squeak.org/trunk.html - throw out pharo specific stuff since we are now integrated in squeak (and pharo too where squeak specific stuff was removed) - Sun, 02 May 2010 20:23:49 +0000 - Torsten Bergmann <Torsten.Bergmann@astares.de> - The Trunk - - - - The following code snippet uses information learned, retrieves each comment and displays them in a Transcript window. Notice an author can have a nil value and is handled accordingly. - - | doc xml | - doc := HTTPClient httpGetDocument: ''http://source.squeak.org/trunk/feed.rss''. - xml := XMLDOMParser parseDocumentFrom: (ReadStream on: (doc content)). - xml root tagsNamed: #item do: [:e | - Transcript - show: ''Date: '', ((e firstTagNamed: #pubDate) contentString); cr; - show: ''Title: '', ((e firstTagNamed: #title) contentString); cr; - show: ''Author: '', - (((e firstTagNamed: #author) notNil) - ifTrue: [(e firstTagNamed: #author) contentString] - ifFalse: ['''']); cr; - show: ''Description: '', ((e firstTagNamed: #description) contentString); cr; cr. - ]. - - An item will now look like: - - Date: Sun, 02 May 2010 20:23:49 +0000 - Title: HelpSystem-Core-tbn.46.mcz - Author: Torsten Bergmann - Description: throw out pharo specific stuff since we are now integrated in squeak (and pharo too where squeak specific stuff was removed) - '! Item was removed: - ----- Method: SqueakTutorialsOnXML class>>pages (in category 'accessing') ----- - pages - ^# (dataRetrieval)! Item was removed: - ----- Method: Utilities class>>openCommandKeyHelp (in category '*Help-Squeak-Project-support windows') ----- - openCommandKeyHelp - "Open a window giving command key help." - "Utilities openCommandKeyHelp" - - HelpBrowser openOn: SqueakTutorialsCommandKey! Item was removed: - (PackageInfo named: 'Help-Squeak-Project') postscript: '| aForm aSecondForm | (excessive size, no diff calculated) From commits at source.squeak.org Wed Jul 1 21:39:00 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 21:39:05 2015 Subject: [squeak-dev] Squeak 4.6: System-eem.749.mcz Message-ID: Chris Muller uploaded a new version of System to project Squeak 4.6: http://source.squeak.org/squeak46/System-eem.749.mcz ==================== Summary ==================== Name: System-eem.749 Author: eem Time: 1 July 2015, 1:02:40.277 pm UUID: e067c0b6-9b7b-49ca-ae4d-e5b2e9c0bc8e Ancestors: System-ul.748 Revert storePreferencesIn: to work with a copy, which accords with the old code. Go for brevity in prefEvent:. =============== Diff against System-ul.748 =============== Item was changed: ----- Method: Preferences class>>prefEvent: (in category 'dynamic preferences') ----- prefEvent: anEvent "Check if this system event defines or removes a preference. TODO: Queue the event and handle in background process. There is zero reason to be so eager here." + | aClass aSelector method | - - | aClass aSelector | anEvent itemKind = SystemChangeNotifier classKind ifTrue: [^anEvent isRemoved ifTrue: [self removePreferencesFor: anEvent item]]. (anEvent itemKind = SystemChangeNotifier methodKind and: [(aClass := anEvent itemClass) isMeta]) ifFalse: "ignore instance methods" [^self]. aClass := aClass theNonMetaClass. aSelector := anEvent itemSelector. anEvent isRemoved ifTrue: [self atomicUpdatePreferences: [ :copyOfDictionaryOfPreferences | copyOfDictionaryOfPreferences removeKey: (aClass name,'>>', aSelector) asSymbol ifAbsent: []]] ifFalse: [(anEvent isAdded or: [anEvent isModified]) ifTrue: + [method := anEvent item. + method pragmas do: + [:pragma| + self respondToPreferencePragmasInMethod: method class: aClass]]]! - [self respondToPreferencePragmasInMethod: anEvent item class: aClass]]! Item was changed: ----- Method: Preferences class>>storePreferencesIn: (in category 'personalization') ----- + storePreferencesIn: aFileName + | stream prefsSnapshot | - storePreferencesIn: aFileName - - | stream | #(Prevailing PersonalPreferences) do: [:ea | Parameters removeKey: ea ifAbsent: []]. stream := ReferenceStream fileNamed: aFileName. stream nextPut: Parameters. + prefsSnapshot := preferencesDictionary copy. + prefsSnapshot keysAndValuesDo: [:key :pref | prefsSnapshot at: key put: pref asPreference]. + stream nextPut: prefsSnapshot. - preferencesDictionary keysAndValuesDo: [:key :pref | preferencesDictionary at: key put: pref asPreference]. - stream nextPut: preferencesDictionary. stream nextPut: (Smalltalk isMorphic ifTrue:[World fillStyle] ifFalse:[DesktopColor]). stream close! From commits at source.squeak.org Wed Jul 1 21:39:09 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 21:39:12 2015 Subject: [squeak-dev] Squeak 4.6: WebClient-HTTP-cmm.3.mcz Message-ID: Chris Muller uploaded a new version of WebClient-HTTP to project Squeak 4.6: http://source.squeak.org/squeak46/WebClient-HTTP-cmm.3.mcz ==================== Summary ==================== Name: WebClient-HTTP-cmm.3 Author: cmm Time: 1 July 2015, 4:18:01.916 pm UUID: 6f6573bd-7d5b-425f-9fcb-632b4a59b792 Ancestors: WebClient-HTTP-topa.2 Recategorize methods so they are no longer overrides. WebClient is now part of Squeak. =============== Diff against WebClient-HTTP-topa.2 =============== Item was changed: + ----- Method: HTTPSocket class>>httpGet:args:user:passwd: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpGet:args:user:passwd: (in category '*WebClient-HTTP-override') ----- httpGet: url args: args user: user passwd: passwd "Upload the contents of the stream to a file on the server. WARNING: This method will send a basic auth header proactively. This is necessary to avoid breaking MC and SqueakSource since SS does not return a 401 when accessing a private (global no access) repository." | urlString xhdrs client resp progress | "Normalize the url" urlString := (Url absoluteFromText: url) asString. "Some raw extra headers which historically have been added" xhdrs := HTTPProxyCredentials, HTTPBlabEmail. "may be empty" client := WebClient new. client username: user; password: passwd. ^[resp := client httpGet: urlString do:[:req| "HACK: Proactively send a basic auth header. See comment above." req headerAt: 'Authorization' put: 'Basic ', (user, ':', passwd) base64Encoded. "Accept anything" req addHeader: 'Accept' value: '*/*'. "Add the additional headers" (WebUtils readHeadersFrom: xhdrs readStream) do:[:assoc| req addHeader: assoc key value: assoc value]]. progress := [:total :amount| (HTTPProgress new) total: total; amount: amount; signal: 'Downloading...' ]. "Simulate old HTTPSocket return behavior" (resp code between: 200 and: 299) ifTrue:[^(RWBinaryOrTextStream with: (resp contentWithProgress: progress)) reset] ifFalse:[resp asString, resp content]. ] ensure:[client destroy]. ! Item was changed: + ----- Method: HTTPSocket class>>httpGetDocument:args:accept:request: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpGetDocument:args:accept:request: (in category '*WebClient-HTTP-override') ----- httpGetDocument: url args: args accept: mimeType request: requestString "Return the exact contents of a web object. Asks for the given MIME type. If mimeType is nil, use 'text/html'. An extra requestString may be submitted and must end with crlf. The parsed header is saved. Use a proxy server if one has been registered. tk 7/23/97 17:12" "Note: To fetch raw data, you can use the MIME type 'application/octet-stream'." | client xhdrs resp urlString progress | "Normalize the url" urlString := (Url absoluteFromText: url) asString. args ifNotNil: [ urlString := urlString, (self argString: args) ]. "Some raw extra headers which historically have been added" xhdrs := HTTPProxyCredentials, HTTPBlabEmail, "may be empty" requestString. "extra user request. Authorization" client := WebClient new. ^[resp := client httpGet: urlString do:[:req| "Add ACCEPT header" mimeType ifNotNil:[req headerAt: 'Accept' put: mimeType]. "Always accept plain text" req addHeader: 'Accept' value: 'text/html'. "Add the additional headers" (WebUtils readHeadersFrom: xhdrs readStream) do:[:assoc| req addHeader: assoc key value: assoc value]]. progress := [:total :amount| (HTTPProgress new) total: total; amount: amount; signal: 'Downloading...' ]. "Simulate old HTTPSocket return behavior" (resp code between: 200 and: 299) ifTrue:[MIMEDocument contentType: resp contentType content: (resp contentWithProgress: progress) url: url] ifFalse:[resp asString, resp content]. ] ensure:[client destroy]. ! Item was changed: + ----- Method: HTTPSocket class>>httpPost:args:user:passwd: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpPost:args:user:passwd: (in category '*WebClient-HTTP-override') ----- httpPost: url args: args user: user passwd: passwd "WARNING: This method will send a basic auth header proactively. This is necessary to avoid breaking MC and SqueakSource since SS does not return a 401 when accessing a private (global no access) repository." | argString xhdrs client resp urlString | "Normalize the url" urlString := (Url absoluteFromText: url) asString. args ifNotNil: [ argString := self argString: args. argString first = $? ifTrue: [argString := argString allButFirst]. ]. "Some raw extra headers which historically have been added" xhdrs := HTTPProxyCredentials, HTTPBlabEmail. "may be empty" client := WebClient new. client username: (user ifEmpty:[nil]); password: (passwd ifEmpty:[nil]). ^[resp := client httpPost: urlString content: (argString ifNil:['']) type: 'application/x-www-form-urlencoded' do:[:req| "HACK: Proactively send a basic auth header. See comment above." req headerAt: 'Authorization' put: 'Basic ', (user, ':', passwd) base64Encoded. "Accept anything" req addHeader: 'Accept' value: '*/*'. "Add the additional headers" (WebUtils readHeadersFrom: xhdrs readStream) do:[:assoc| req addHeader: assoc key value: assoc value]]. "Simulate old HTTPSocket return behavior" (resp code between: 200 and: 299) ifTrue:[MIMEDocument contentType: resp contentType content: resp content url: url] ifFalse:[resp asString, resp content]. ] ensure:[client destroy]. ! Item was changed: + ----- Method: HTTPSocket class>>httpPost:content:type:accept:request: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpPost:content:type:accept:request: (in category '*WebClient-HTTP-override') ----- httpPost: url content: postData type: contentType accept: mimeType request: requestString "like httpGET, except it does a POST instead of a GET. POST allows data to be uploaded" | urlString xhdrs client resp | "Normalize the url" urlString := (Url absoluteFromText: url) asString. "Some raw extra headers which historically have been added" xhdrs := HTTPProxyCredentials, HTTPBlabEmail, "may be empty" requestString. "extra user request. Authorization" client := WebClient new. ^[resp := client httpPost: urlString content: (postData ifNil:['']) type: contentType do:[:req| "Add ACCEPT header" mimeType ifNotNil:[req headerAt: 'Accept' put: mimeType]. "Always accept plain text" req addHeader: 'Accept' value: 'text/html'. "Add the additional headers" (WebUtils readHeadersFrom: xhdrs readStream) do:[:assoc| req addHeader: assoc key value: assoc value]]. "Simulate old HTTPSocket return behavior" (resp code between: 200 and: 299) ifTrue:[MIMEDocument contentType: resp contentType content: resp content url: url] ifFalse:[resp asString, resp content]. ] ensure:[client destroy]. ! Item was changed: + ----- Method: HTTPSocket class>>httpPostDocument:args:accept:request: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpPostDocument:args:accept:request: (in category '*WebClient-HTTP-override') ----- httpPostDocument: url args: args accept: mimeType request: requestString "like httpGET, except it does a POST instead of a GET. POST allows data to be uploaded" | argString | args ifNotNil: [ argString := self argString: args. argString first = $? ifTrue: [argString := argString allButFirst]. ]. ^self httpPost: url content: argString type: 'application/x-www-form-urlencoded' accept: mimeType request: requestString! Item was changed: + ----- Method: HTTPSocket class>>httpPostMultipart:args:accept:request: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpPostMultipart:args:accept:request: (in category '*WebClient-HTTP-override') ----- httpPostMultipart: url args: argsDict accept: mimeType request: requestString " do multipart/form-data encoding rather than x-www-urlencoded " | mimeBorder argsStream | mimeBorder := '----squeak-georgia-tech-', Time millisecondClockValue printString, '-csl-cool-stuff-----'. "encode the arguments dictionary" argsStream := WriteStream on: String new. argsDict associationsDo: [:assoc | assoc value do: [ :value | | fieldValue | "print the boundary" argsStream nextPutAll: '--', mimeBorder; crlf. " check if it's a non-text field " argsStream nextPutAll: 'Content-disposition: multipart/form-data; name="', assoc key, '"'. (value isKindOf: MIMEDocument) ifFalse: [fieldValue := value] ifTrue: [ argsStream nextPutAll: ' filename="'; nextPutAll: value url pathForFile; nextPut: $"; crlf; nextPutAll: 'Content-Type: '; nextPutAll: value contentType. fieldValue := (value content ifNil: [(FileStream fileNamed: value url pathForFile) contentsOfEntireFile] ifNotNil: [value content]) asString]. " Transcript show: 'field=', key, '; value=', fieldValue; cr. " argsStream crlf; crlf; nextPutAll: fieldValue; crlf ]]. argsStream nextPutAll: '--', mimeBorder, '--'. ^self httpPost: url content: argsStream contents type: 'multipart/form-data; boundary=', mimeBorder accept: mimeType request: requestString ! Item was changed: + ----- Method: HTTPSocket class>>httpPostToSuperSwiki:args:accept:request: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpPostToSuperSwiki:args:accept:request: (in category '*WebClient-HTTP-override') ----- httpPostToSuperSwiki: url args: argsDict accept: mimeType request: requestString | mimeBorder argString | mimeBorder := '---------SuperSwiki',Time millisecondClockValue printString,'-----'. argString := String streamContents: [ :strm | strm nextPutAll: mimeBorder; crlf. argsDict associationsDo: [:assoc | assoc value do: [ :value | strm nextPutAll: 'Content-disposition: form-data; name="', assoc key, '"'; crlf; crlf; nextPutAll: value; crlf; crlf; nextPutAll: mimeBorder; crlf. ] ]. ]. ^self httpPost: url content: argString type: 'multipart/form-data; boundary=', mimeBorder accept: mimeType request: requestString ! Item was changed: + ----- Method: HTTPSocket class>>httpPut:to:user:passwd: (in category '*webclient-http') ----- - ----- Method: HTTPSocket class>>httpPut:to:user:passwd: (in category '*WebClient-HTTP-override') ----- httpPut: contents to: url user: user passwd: passwd "Upload the contents of the stream to a file on the server WARNING: This method will send a basic auth header proactively. This is necessary to avoid breaking MC and SqueakSource since SS does not return a 401 when accessing a private (global no access) repository." | urlString xhdrs client resp | "Normalize the url" urlString := (Url absoluteFromText: url) asString. "Some raw extra headers which historically have been added" xhdrs := HTTPProxyCredentials, HTTPBlabEmail. "may be empty" client := WebClient new. client username: (user ifEmpty:[nil]); password: (passwd ifEmpty:[nil]). ^[resp := client httpPut: urlString content: contents type: nil do:[:req| "HACK: Proactively send a basic auth header. See comment above." req headerAt: 'Authorization' put: 'Basic ', (user, ':', passwd) base64Encoded. "Accept anything" req addHeader: 'Accept' value: '*/*'. "Add the additional headers" (WebUtils readHeadersFrom: xhdrs readStream) do:[:assoc| req addHeader: assoc key value: assoc value]]. "Simulate old HTTPSocket return behavior" resp asString, resp content ] ensure:[client destroy]. ! From commits at source.squeak.org Wed Jul 1 21:39:17 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 21:39:19 2015 Subject: [squeak-dev] Squeak 4.6: Services-Base-eem.56.mcz Message-ID: Chris Muller uploaded a new version of Services-Base to project Squeak 4.6: http://source.squeak.org/squeak46/Services-Base-eem.56.mcz ==================== Summary ==================== Name: Services-Base-eem.56 Author: eem Time: 30 June 2015, 3:34:50.838 pm UUID: 2e8b9c56-6312-4a69-b65c-164ab583f617 Ancestors: Services-Base-mt.55 ServicePreferences as per System-eem.747. Move preferences dictionary from class var to inst var. =============== Diff against Services-Base-mt.55 =============== Item was added: + (PackageInfo named: 'Services-Base') preamble: '(Smalltalk classNamed: #ServicePreferences) ifNotNil: + [:sp| + (sp instVarNamed: ''preferencesDictionary'') ifNil: + [(sp classPool at: #ServiceDictionaryOfPreferences) ifNotNil: + [:dictionary| + sp + instVarNamed: ''preferencesDictionary'' + put: dictionary]]]'! Item was changed: Preferences subclass: #ServicePreferences instanceVariableNames: '' + classVariableNames: '' - classVariableNames: 'ServiceDictionaryOfPreferences' poolDictionaries: '' category: 'Services-Base-GUI'! !ServicePreferences commentStamp: 'rr 7/10/2006 15:36' prior: 0! I store the preferences related to the servicse framework. The preferences are editable via the Services Browser, based on Hernan Tylim's Preference Browser. The main preference categories for services are: -- keyboard shortcuts -- : several text preferences, one per keyboard shortcuts. To edit them, enter a service identifier (equal to the method name under which it is defined in its ServiceProvider), and accept with alt-s or enter -- menu contents -- : All the service categories in the image have a text preference under here. To edit it, enter the services identifiers you wish to put in this category, separating them with a single space character. The order is important: it defines the order of the items in menus. -- settings -- : general boolean preferences. Then there is a preference category for each provider in the image. Under each, you will find: A boolean preference for each service in the image. If it is false, the service will not appear in menus. The text preference for each service category defined by the service provider. This is the same as the one appearing in the menu contents preference category.! Item was removed: - ----- Method: ServicePreferences class>>dictionaryOfPreferences (in category 'accessing') ----- - dictionaryOfPreferences - ServiceDictionaryOfPreferences - ifNil: [ServiceDictionaryOfPreferences := IdentityDictionary new]. - ^ ServiceDictionaryOfPreferences ! Item was removed: - ----- Method: ServicePreferences class>>dictionaryOfPreferences: (in category 'accessing') ----- - dictionaryOfPreferences: aDictionary - ServiceDictionaryOfPreferences := aDictionary! Item was changed: ----- Method: ServicePreferences class>>wipe (in category 'accessing') ----- wipe + preferencesDictionary := nil! - self dictionaryOfPreferences: nil! From commits at source.squeak.org Wed Jul 1 21:55:02 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 21:55:03 2015 Subject: [squeak-dev] Daily Commit Log Message-ID: <20150701215502.28709.qmail@box4.squeakfoundation.org> Changes to Trunk (http://source.squeak.org/trunk.html) in the last 24 hours: http://lists.squeakfoundation.org/pipermail/packages/2015-June/008761.html Name: Tools-eem.626 Ancestors: Tools-mt.625 Upgrade MessageSet class>>parse:toClassAndSelector: to allow one to construct text links in modern syntax, e.g. BitBlt class>>#subPixelRenderColorFonts ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008762.html Name: ReleaseBuilder-mt.125 Ancestors: ReleaseBuilder-cmm.124 Restore setting the background in release builder's #setPreferences46 so that our build server produces trunk images with correct preferences again. #prepareNewBuild: is agnostic to the current release version. Note: We should find out why #prepareNewBuild: requires another try to set the background and where that background gets overridden. It is not good to put version-specific code into a version-agnostic method. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008763.html Name: System-eem.745 Ancestors: System-cmm.744 Rewrite Preferences to eliminate the AccessProtect. Use a copy, update copy, assign scheme to update the preferences dictionary atomically. Change Preferences access method compilation to use Object>>#value to eliminate a block creation. Change Preference initialization to eliminate the isKindOf: Symbol. This is step 1. Given SystemPreferences it is clear that the preferences dictionary should be stored in a class inst var, so that SystemPreferences and Preferences can share methods but access different dictionaries. The dictionaryOfProferences[:] accessors are dubious as they break encapsulatiopn. For example, the reportPreferences: method, which is the only external access, could insateaqd be moved into Preferences class. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008764.html Name: System-eem.746 Ancestors: System-eem.745 First part of Preferences putsch to move preferences dictionary from class var to inst var. Also update class comment to describe preference pragmas. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008765.html Name: System-eem.747 Ancestors: System-eem.746 Second part of putsch. Move preferences dictionary from class var to inst var. Remove the setter, and makde the getter, currently used only by SystemReporter, answer a copy. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008766.html Name: System-ul.748 Ancestors: System-eem.747 - Iterate over pragmas once per method instead of once per pragma in Preferences class>>prefEvent:. - There's no need to copy preferencesDictionary in Preferences class>>storePreferencesIn:, because it's a read-only data structure. - Ensure the durability of the changes of preferencesDictionary in Preferences class>>atomicUpdatePreferences: by checking for changes before overwriting it. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008767.html Name: Services-Base-eem.56 Ancestors: Services-Base-mt.55 ServicePreferences as per System-eem.747. Move preferences dictionary from class var to inst var. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008768.html Name: System-eem.749 Ancestors: System-ul.748 Revert storePreferencesIn: to work with a copy, which accords with the old code. Go for brevity in prefEvent:. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008769.html Name: Network-cmm.161 Ancestors: Network-ul.160 Remove the methods overridden by WebClient, since that has now been folded into base Squeak. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008770.html Name: Help-Squeak-Project-cmm.25 Ancestors: Help-Squeak-Project-kfr.24 - Update internal release notes in the Help Browser. (no need to use a release-specific method). - Release Notes has duplication with the one in TheWorldMainDockingBar which will be addressed later. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008771.html Name: WebClient-HTTP-cmm.3 Ancestors: WebClient-HTTP-topa.2 Recategorize methods so they are no longer overrides. WebClient is now part of Squeak. ============================================= From asqueaker at gmail.com Wed Jul 1 21:55:06 2015 From: asqueaker at gmail.com (Chris Muller) Date: Wed Jul 1 21:55:10 2015 Subject: [squeak-dev] The Trunk: Network-cmm.161.mcz In-Reply-To: References: Message-ID: Do MC overrides actually somehow "reload" the code that was overridden when you unload the overriding code? If so, that is kind of amazing. My purpose of doing this is to avoid having dirty packages in the release. I can no longer even use the old HTTPSocket code in my apps. Is it still usable? WebClient works a lot better. Is there a solution that addresses all concerns? On Wed, Jul 1, 2015 at 4:10 PM, Levente Uzonyi wrote: > Hi Chris, > > This change is a bit against modularity, because the HTTP protocol will no > longer work once you unload the WebClient package. > > Levente > > > On Wed, 1 Jul 2015, commits@source.squeak.org wrote: > >> Chris Muller uploaded a new version of Network to project The Trunk: >> http://source.squeak.org/trunk/Network-cmm.161.mcz >> >> ==================== Summary ==================== >> >> Name: Network-cmm.161 >> Author: cmm >> Time: 1 July 2015, 3:26:03.655 pm >> UUID: af917aa1-ce76-460b-ba1a-7fb49700f44a >> Ancestors: Network-ul.160 >> >> Remove the methods overridden by WebClient, since that has now been folded >> into base Squeak. >> >> =============== Diff against Network-ul.160 =============== >> >> Item was removed: >> - ----- Method: HTTPSocket class>>httpGet:args:user:passwd: (in category >> 'get the page') ----- >> - httpGet: url args: args user: user passwd: passwd >> - "Upload the contents of the stream to a file on the server. >> - >> - WARNING: This method will send a basic auth header proactively. >> - This is necessary to avoid breaking MC and SqueakSource since SS >> does not >> - return a 401 when accessing a private (global no access) >> repository." >> - >> - | authorization result | >> - authorization := (user , ':' , passwd) base64Encoded. >> - result := self >> - httpGet: url args: args accept: '*/*' >> - request: 'Authorization: Basic ' , authorization , String >> crlf. >> - ^result >> - ! >> >> Item was removed: >> - ----- Method: HTTPSocket class>>httpGetDocument:args:accept:request: (in >> category 'get the page') ----- >> - httpGetDocument: url args: args accept: mimeType request: requestString >> - "Return the exact contents of a web object. Asks for the given >> MIME type. If mimeType is nil, use 'text/html'. An extra requestString may >> be submitted and must end with crlf. The parsed header is saved. Use a >> proxy server if one has been registered. tk 7/23/97 17:12" >> - >> - "Note: To fetch raw data, you can use the MIME type >> 'application/octet-stream'." >> - >> - | urlString | >> - "Normalize the url" >> - urlString := (Url absoluteFromText: url) asString. >> - >> - args ifNotNil: [ >> - urlString := urlString, (self argString: args) >> - ]. >> - >> - ^(self httpRequestHandler) >> - httpRequest: 'GET' url: urlString headers:( >> - (mimeType ifNil:[''] ifNotNil:['Accept: ', >> mimeType, String crlf]), >> - 'Accept: text/html', String crlf, >> - HTTPProxyCredentials, >> - HTTPBlabEmail, >> - requestString >> - ) content: nil response: nil.! >> >> Item was removed: >> - ----- Method: HTTPSocket class>>httpPost:args:user:passwd: (in category >> 'get the page') ----- >> - httpPost: url args: args user: user passwd: passwd >> - >> - "WARNING: This method will send a basic auth header proactively. >> - This is necessary to avoid breaking MC and SqueakSource since SS >> does not >> - return a 401 when accessing a private (global no access) >> repository." >> - >> - | authorization | >> - authorization := (user , ':' , passwd) base64Encoded. >> - ^self >> - httpPostDocument: url args: args accept: '*/*' >> - request: 'Authorization: Basic ' , authorization , String >> crlf >> - ! >> >> Item was removed: >> - ----- Method: HTTPSocket class>>httpPost:content:type:accept:request: >> (in category 'get the page') ----- >> - httpPost: url content: postData type: contentType accept: mimeType >> request: requestString >> - "like httpGET, except it does a POST instead of a GET. POST >> allows data to be uploaded" >> - >> - | urlString | >> - "Normalize the url" >> - urlString := (Url absoluteFromText: url) asString. >> - >> - ^(self httpRequestHandler) >> - httpRequest: 'POST' url: urlString headers:( >> - 'Accept: ', mimeType, String crlf, >> - 'Accept: text/html', String crlf, >> - 'Content-Type: ', contentType, String crlf, >> - 'Content-Length: ', (postData ifNil:['']) size, >> String crlf, >> - HTTPProxyCredentials, >> - HTTPBlabEmail, >> - requestString "extra user request. Authorization" >> - ) content: (postData ifNil:['']) response: nil! >> >> Item was removed: >> - ----- Method: HTTPSocket class>>httpPostDocument:args:accept:request: >> (in category 'get the page') ----- >> - httpPostDocument: url args: args accept: mimeType request: >> requestString >> - "like httpGET, except it does a POST instead of a GET. POST >> allows data to be uploaded" >> - >> - | argString | >> - args ifNotNil: [ >> - argString := self argString: args. >> - argString first = $? ifTrue: [argString := argString >> allButFirst]. >> - ]. >> - >> - ^self httpPost: url >> - content: argString >> - type: 'application/x-www-form-urlencoded' >> - accept: mimeType >> - request: requestString! >> >> Item was removed: >> - ----- Method: HTTPSocket class>>httpPostMultipart:args:accept:request: >> (in category 'get the page') ----- >> - httpPostMultipart: url args: argsDict accept: mimeType request: >> requestString >> - " do multipart/form-data encoding rather than x-www-urlencoded " >> - >> - | mimeBorder argsStream | >> - mimeBorder := '----squeak-georgia-tech-', Time >> millisecondClockValue printString, '-csl-cool-stuff-----'. >> - "encode the arguments dictionary" >> - argsStream := WriteStream on: String new. >> - argsDict associationsDo: [:assoc | >> - assoc value do: [ :value | | fieldValue | >> - "print the boundary" >> - argsStream nextPutAll: '--', mimeBorder, String crlf. >> - " check if it's a non-text field " >> - argsStream nextPutAll: 'Content-disposition: >> multipart/form-data; name="', assoc key, '"'. >> - (value isKindOf: MIMEDocument) >> - ifFalse: [fieldValue := value] >> - ifTrue: [argsStream nextPutAll: ' filename="', >> value url pathForFile, '"', String crlf, 'Content-Type: ', value >> contentType. >> - fieldValue := (value content >> - ifNil: [(FileStream fileNamed: >> value url pathForFile) contentsOfEntireFile] >> - ifNotNil: [value content]) >> asString]. >> - " Transcript show: 'field=', key, '; value=', fieldValue; cr. " >> - argsStream nextPutAll: String crlf, String crlf, >> fieldValue, String crlf. >> - ]]. >> - argsStream nextPutAll: '--', mimeBorder, '--'. >> - >> - ^self httpPost: url >> - content: argsStream contents >> - type: 'multipart/form-data; boundary=', >> mimeBorder >> - accept: mimeType >> - request: requestString >> - ! >> >> Item was removed: >> - ----- Method: HTTPSocket >> class>>httpPostToSuperSwiki:args:accept:request: (in category 'get the >> page') ----- >> - httpPostToSuperSwiki: url args: argsDict accept: mimeType request: >> requestString >> - >> - | mimeBorder argString | >> - mimeBorder := '---------SuperSwiki',Time millisecondClockValue >> printString,'-----'. >> - argString := String streamContents: [ :strm | >> - strm nextPutAll: mimeBorder, String crlf. >> - argsDict associationsDo: [:assoc | >> - assoc value do: [ :value | >> - strm >> - nextPutAll: 'Content-disposition: >> form-data; name="', assoc key, '"'; >> - nextPutAll: String crlf; >> - nextPutAll: String crlf; >> - nextPutAll: value; >> - nextPutAll: String crlf; >> - nextPutAll: String crlf; >> - nextPutAll: mimeBorder; >> - nextPutAll: String crlf. >> - ] >> - ]. >> - ]. >> - >> - ^self httpPost: url >> - content: argString >> - type: 'multipart/form-data; boundary=', >> mimeBorder >> - accept: mimeType >> - request: requestString >> - ! >> >> Item was removed: >> - ----- Method: HTTPSocket class>>httpPut:to:user:passwd: (in category >> 'get the page') ----- >> - httpPut: contents to: url user: user passwd: passwd >> - "Upload the contents of the stream to a file on the server >> - >> - WARNING: This method will send a basic auth header proactively. >> - This is necessary to avoid breaking MC and SqueakSource since SS >> does not >> - return a 401 when accessing a private (global no access) >> repository." >> - >> - | urlString resp header | >> - >> - "Normalize the url" >> - urlString := (Url absoluteFromText: url) asString. >> - >> - resp := (self httpRequestHandler) >> - httpRequest: 'PUT' url: urlString headers:( >> - 'Authorization: Basic ', (user, ':', passwd) >> base64Encoded, String crlf, >> - 'Accept: */*', String crlf, >> - 'Content-Type: application/octet-stream', String >> crlf, >> - 'Content-Length: ', (contents ifNil:['']) size, >> String crlf, >> - HTTPProxyCredentials, >> - HTTPBlabEmail >> - ) content: contents response:[:rr| header := rr]. >> - ^resp isString ifTrue:[header, resp] ifFalse:[header, resp >> content]! >> >> >> > From commits at source.squeak.org Wed Jul 1 22:15:32 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 22:15:34 2015 Subject: [squeak-dev] The Trunk: Morphic-eem.990.mcz Message-ID: Eliot Miranda uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-eem.990.mcz ==================== Summary ==================== Name: Morphic-eem.990 Author: eem Time: 1 July 2015, 3:14:20.524 pm UUID: 0fb6f2b8-b89e-48e4-bf73-ab547b7b0d49 Ancestors: Morphic-cmm.989 Update the CurvierMorph's drawCurvier preference to the recommended style., eliminating the only send of addPreference:category:default:balloonHelp: in trunk outside of Preferences. =============== Diff against Morphic-cmm.989 =============== Item was removed: - ----- Method: CurvierMorph class>>Curvier (in category 'class initialization') ----- - Curvier - - ^ self drawCurvier.! Item was changed: ----- Method: CurvierMorph class>>drawCurvier (in category 'class initialization') ----- drawCurvier + + ^DrawCurvier ifNil: [true]! - ^ DrawCurvier.! Item was changed: ----- Method: CurvierMorph class>>initialize (in category 'class initialization') ----- initialize "CurvierMorph initialize" - Preferences - preferenceAt: #Curvier - ifAbsent: [Preferences - addPreference: #Curvier - category: #morphic - default: true - balloonHelp: 'if true, closed CurvierMorphs will be smoother and more symmetrical all about. If false they will mimic the old curve shapes with the one sharp bend.']. self registerInFlapsRegistry! From commits at source.squeak.org Wed Jul 1 22:26:39 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 22:26:39 2015 Subject: [squeak-dev] The Trunk: Kernel-eem.930.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.930.mcz ==================== Summary ==================== Name: Kernel-eem.930 Author: eem Time: 1 July 2015, 3:25:55.097 pm UUID: f2ef6b5c-be8c-4bce-ab1b-dff14bb8ab0e Ancestors: Kernel-eem.929 Fix the bug with the Debugger's through such that the Debugger would appear to freeze when encountering an MNU. The example is Debug It on: Object flushDependents do: [ : e | ] followed by Over, Through. But in fact one can see the same issue doing Debug It and then Through on nil zork What was happening is that Through was stepping through the uncaught and looping MNUs (of do: or zork in the above examples) since the Debugger did not catch unhandled errors during Through, and sicne doesNotUnderstand:'s default if uncaught is to resend. The fix is merely to catch unhandled errors when doing Through to the same effect as runUntilErrorOrReturnFrom: caching errors for Over. Also speed up Through. The changes made in Kernel-eem.857 through Kernel-eem.896 to provide process-faithful debugging slowed down Process>>step a lot. These changes restore the performance by using evaluate:onBehalfOf: once for each Through, rather than once for each step within Through. =============== Diff against Kernel-eem.929 =============== Item was added: + ----- Method: Exception>>canSearchForSignalerContext (in category 'debug support') ----- + canSearchForSignalerContext + "This method is /only/ to support the debugger's catching of exceptions in stepIntoBlock." + ^signalContext isContext! Item was changed: + ----- Method: Exception>>signalerContext (in category 'handling') ----- - ----- Method: Exception>>signalerContext (in category 'printing') ----- signalerContext "Find the first sender of signal(:)" ^ signalContext findContextSuchThat: [:ctxt | (ctxt receiver == self or: [ctxt receiver == self class]) not]! Item was changed: ----- Method: Process>>stepToHome: (in category 'changing suspended state') ----- stepToHome: aContext + "Resume self until the home of top context is aContext. Top context may be a block context. + Catch any UnhandledErrors that are created while stepping, answering the relevant signalerContext + if so. Note that this will cause weird effects if using through to step through UnhandledError + code, but as the doctor ordered, don't do that; use over or into instead." - "Resume self until the home of top context is aContext. Top context may be a block context." + ^Processor activeProcess + evaluate: + [| home anError | + home := aContext home. + [suspendedContext := suspendedContext step. + home == suspendedContext home or: [home isDead]] whileFalse: + [(suspendedContext selector == #signalForException: + and: [suspendedContext receiver == UnhandledError + and: [anError := suspendedContext tempAt: 1. + ((suspendedContext objectClass: anError) includesBehavior: Exception) + and: [anError canSearchForSignalerContext]]]) ifTrue: + [anError signalerContext ifNotNil: + [:unhandledErrorSignalerContext| + [unhandledErrorSignalerContext == suspendedContext] whileFalse: + [self completeStep: suspendedContext]. + ^unhandledErrorSignalerContext]]]. + suspendedContext] + onBehalfOf: self! - | home ctxt | - home := aContext home. - [ ctxt := self step. - home == ctxt home. - ] whileFalse: [ - home isDead ifTrue: [^ self suspendedContext]. - ]. - ^ self suspendedContext! From commits at source.squeak.org Wed Jul 1 23:21:03 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 23:21:07 2015 Subject: [squeak-dev] The Trunk: System-eem.750.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-eem.750.mcz ==================== Summary ==================== Name: System-eem.750 Author: eem Time: 1 July 2015, 4:20:21.905 pm UUID: dde31c47-a8ec-451a-a343-5820a048c91c Ancestors: System-eem.749 Provide a defaultAction for Warning that gives the user the option of debugging, ignoring or terminating when a Warning is raised in normal execution, or allows the Debugger to handle it if a Warning is raised during debugging. =============== Diff against System-eem.749 =============== Item was changed: ----- Method: Warning>>defaultAction (in category '*System-exceptionDescription') ----- defaultAction + "Inform the user of a Warning, giving them the choice of ignoring the warning (proceeding), debugging, + or terminating the compuation. If in the context of a debugger, instead allow the debugger to display + the wasrning in context." + | inDebugger | + inDebugger := [UnhandledError signal] + on: UnhandledError + do: [:uhe| uhe isNested]. + inDebugger ifTrue: + [^UnhandledError signalForException: self]. + (UIManager default + chooseFrom: #(proceed debug close) + values: #(proceed debug close) + title: 'Warning: ', self messageText) + caseOf: { + [#proceed] -> [self resume]. + [#debug] -> [UnhandledError signalForException: self]. + [#close] -> [| condemned | + condemned := Processor activeProcess. + Project current spawnNewProcessIfThisIsUI: condemned. + condemned terminate] }! - "The user should be notified of the occurrence of an exceptional occurrence and given an option of continuing or aborting the computation. The description of the occurrence should include any text specified as the argument of the #signal: message." - ToolSet - debugContext: thisContext - label: 'Warning' - contents: self messageText, '\\Select Proceed to continue, or close this window to cancel the operation.' withCRs. - self resume. - ! From commits at source.squeak.org Wed Jul 1 23:23:02 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 23:23:04 2015 Subject: [squeak-dev] The Trunk: Kernel-eem.931.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.931.mcz ==================== Summary ==================== Name: Kernel-eem.931 Author: eem Time: 1 July 2015, 4:22:19.817 pm UUID: edffee09-d6f1-4ae8-b10b-59fe640b5dfe Ancestors: Kernel-eem.930 When an error occurs during complete:, which is used by the Debugger, raise a Notification to allow the Debugger to learn of the error's description. =============== Diff against Kernel-eem.930 =============== Item was changed: ----- Method: Process>>complete: (in category 'changing suspended state') ----- complete: aContext "Run self until aContext is popped or an unhandled error is raised. Return self's new top context, unless an unhandled error was raised then return the signaler context (rather than open a debugger)." | ctxt pair error | ctxt := suspendedContext. suspendedContext := nil. "disable this process while running its stack in active process below" pair := Processor activeProcess evaluate: [ctxt runUntilErrorOrReturnFrom: aContext] onBehalfOf: self. suspendedContext := pair first. error := pair second. + error ifNotNil: + ["Give a debugger a chance to update its title to reflect the new exception" + Notification new + tag: {aContext. error}; + signal. + ^error signalerContext]. - error ifNotNil: [^ error signalerContext]. ^ suspendedContext! From commits at source.squeak.org Wed Jul 1 23:24:56 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 23:24:59 2015 Subject: [squeak-dev] The Trunk: Tools-eem.627.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.627.mcz ==================== Summary ==================== Name: Tools-eem.627 Author: eem Time: 1 July 2015, 4:24:25.556 pm UUID: ef07ef13-aa42-4e9c-baf8-3b6ccbfa1f92 Ancestors: Tools-eem.626 Use Kernel-eem.931 to have the debugger update its label to the description of an exception raised while debugging. =============== Diff against Tools-eem.626 =============== Item was changed: ----- Method: Debugger>>doStep (in category 'context stack menu') ----- doStep "Send the selected message in the accessed method, and regain control after the invoked method returns." | currentContext newContext | self okToChange ifFalse: [^ self]. self checkContextSelection. currentContext := self selectedContext. + newContext := [interruptedProcess completeStep: currentContext] + on: Notification + do: [:ex| + (ex tag isArray + and: [ex tag size = 2 + and: [(ex tag first == currentContext or: [ex tag first hasSender: currentContext])]]) + ifTrue: + [self labelString: ex tag second description. + ex resume] + ifFalse: + [ex pass]]. + newContext == currentContext ifTrue: + [newContext := interruptedProcess stepToSendOrReturn]. - newContext := interruptedProcess completeStep: currentContext. - newContext == currentContext ifTrue: [ - newContext := interruptedProcess stepToSendOrReturn]. self contextStackIndex > 1 ifTrue: [self resetContext: newContext] + ifFalse: + [newContext == currentContext - ifFalse: [newContext == currentContext ifTrue: [self changed: #contentsSelection. self updateInspectors] ifFalse: [self resetContext: newContext]]. ! From commits at source.squeak.org Wed Jul 1 23:39:23 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 23:39:26 2015 Subject: [squeak-dev] The Trunk: Kernel-eem.932.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.932.mcz ==================== Summary ==================== Name: Kernel-eem.932 Author: eem Time: 1 July 2015, 4:38:42.065 pm UUID: 12b4ce38-269d-4f6f-9b12-eae61d403a03 Ancestors: Kernel-eem.931 Provide the same Debugger label support as complete: for the step into block support. =============== Diff against Kernel-eem.931 =============== Item was changed: ----- Method: Process>>stepToHome: (in category 'changing suspended state') ----- stepToHome: aContext "Resume self until the home of top context is aContext. Top context may be a block context. Catch any UnhandledErrors that are created while stepping, answering the relevant signalerContext if so. Note that this will cause weird effects if using through to step through UnhandledError code, but as the doctor ordered, don't do that; use over or into instead." ^Processor activeProcess evaluate: [| home anError | home := aContext home. [suspendedContext := suspendedContext step. home == suspendedContext home or: [home isDead]] whileFalse: [(suspendedContext selector == #signalForException: and: [suspendedContext receiver == UnhandledError and: [anError := suspendedContext tempAt: 1. ((suspendedContext objectClass: anError) includesBehavior: Exception) and: [anError canSearchForSignalerContext]]]) ifTrue: [anError signalerContext ifNotNil: [:unhandledErrorSignalerContext| [unhandledErrorSignalerContext == suspendedContext] whileFalse: [self completeStep: suspendedContext]. + "Give a debugger a chance to update its title to reflect the new exception" + Notification new + tag: {unhandledErrorSignalerContext. anError}; + signal. ^unhandledErrorSignalerContext]]]. suspendedContext] onBehalfOf: self! From commits at source.squeak.org Wed Jul 1 23:40:49 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 23:40:51 2015 Subject: [squeak-dev] The Trunk: Tools-eem.628.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.628.mcz ==================== Summary ==================== Name: Tools-eem.628 Author: eem Time: 1 July 2015, 4:40:15.806 pm UUID: 9f27ada3-52e9-4acb-83fe-2c117840e385 Ancestors: Tools-eem.627 Debugger: Extract the exception notification handler into its own method and use it for Through support also. =============== Diff against Tools-eem.627 =============== Item was changed: ----- Method: Debugger>>doStep (in category 'context stack menu') ----- doStep "Send the selected message in the accessed method, and regain control after the invoked method returns." | currentContext newContext | self okToChange ifFalse: [^ self]. self checkContextSelection. currentContext := self selectedContext. + newContext := self handleLabelUpdatesIn: [interruptedProcess completeStep: currentContext] + whenExecuting: currentContext. - newContext := [interruptedProcess completeStep: currentContext] - on: Notification - do: [:ex| - (ex tag isArray - and: [ex tag size = 2 - and: [(ex tag first == currentContext or: [ex tag first hasSender: currentContext])]]) - ifTrue: - [self labelString: ex tag second description. - ex resume] - ifFalse: - [ex pass]]. newContext == currentContext ifTrue: [newContext := interruptedProcess stepToSendOrReturn]. self contextStackIndex > 1 ifTrue: [self resetContext: newContext] ifFalse: [newContext == currentContext ifTrue: [self changed: #contentsSelection. self updateInspectors] ifFalse: [self resetContext: newContext]]. ! Item was added: + ----- Method: Debugger>>handleLabelUpdatesIn:whenExecuting: (in category 'context stack menu') ----- + handleLabelUpdatesIn: aBlock whenExecuting: aContext + "Send the selected message in the accessed method, and regain control + after the invoked method returns." + + ^aBlock + on: Notification + do: [:ex| + (ex tag isArray + and: [ex tag size = 2 + and: [(ex tag first == aContext or: [ex tag first hasSender: aContext])]]) + ifTrue: + [self labelString: ex tag second description. + ex resume] + ifFalse: + [ex pass]]! Item was changed: ----- Method: Debugger>>stepIntoBlock (in category 'context stack menu') ----- stepIntoBlock "Send messages until you return to the present method context. Used to step into a block in the method." + self handleLabelUpdatesIn: + [interruptedProcess stepToHome: self selectedContext] + whenExecuting: self selectedContext. + self resetContext: interruptedProcess stepToSendOrReturn! - interruptedProcess stepToHome: self selectedContext. - self resetContext: interruptedProcess stepToSendOrReturn.! From commits at source.squeak.org Wed Jul 1 23:56:02 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 23:56:04 2015 Subject: [squeak-dev] The Trunk: Collections.spur-topa.637.mcz Message-ID: Eliot Miranda uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections.spur-topa.637.mcz ==================== Summary ==================== Name: Collections.spur-topa.637 Author: eem Time: 1 July 2015, 4:53:36.191 pm UUID: 289efa0a-c485-4568-9da8-fecf175cfbbe Ancestors: Collections-topa.637, Collections.spur-eem.636 Collections-topa.637 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Always store Characters as if they had one instance variable with their value, regardless whether they are actually shaped that way. =============== Diff against Collections-topa.637 =============== Item was changed: ----- Method: Array>>elementsExchangeIdentityWith: (in category 'converting') ----- elementsExchangeIdentityWith: otherArray + "This primitive performs a bulk mutation, causing all pointers to the elements of the + receiver to be replaced by pointers to the corresponding elements of otherArray. + At the same time, all pointers to the elements of otherArray are replaced by + pointers to the corresponding elements of this array. The identityHashes remain + with the pointers rather than with the objects so that objects in hashed structures + should still be properly indexed after the mutation." - "This primitive performs a bulk mutation, causing all pointers to the elements of this array to be replaced by pointers to the corresponding elements of otherArray. At the same time, all pointers to the elements of otherArray are replaced by pointers to the corresponding elements of this array. The identityHashes remain with the pointers rather than with the objects so that objects in hashed structures should still be properly indexed after the mutation." + + ec == #'bad receiver' ifTrue: + [^self error: 'receiver must be of class Array']. + ec == #'bad argument' ifTrue: + [^self error: (otherArray class == Array + ifTrue: ['arg must be of class Array'] + ifFalse: ['receiver and argument must have the same size'])]. + ec == #'inappropriate operation' ifTrue: + [^self error: 'can''t become immediates such as SmallIntegers or Characters']. + ec == #'no modification' ifTrue: + [^self error: 'can''t become immutable objects']. + ec == #'object is pinned' ifTrue: + [^self error: 'can''t become pinned objects']. + ec == #'insufficient object memory' ifTrue: + [Smalltalk garbageCollect < 1048576 ifTrue: + [Smalltalk growMemoryByAtLeast: 1048576]. + ^self elementsExchangeIdentityWith: otherArray]. + self primitiveFailed! - - otherArray class == Array ifFalse: [^ self error: 'arg must be array']. - self size = otherArray size ifFalse: [^ self error: 'arrays must be same size']. - (self anySatisfy: [:obj | obj class == SmallInteger]) ifTrue: [^ self error: 'can''t become SmallIntegers']. - (otherArray anySatisfy: [:obj | obj class == SmallInteger]) ifTrue: [^ self error: 'can''t become SmallIntegers']. - self with: otherArray do:[:a :b| a == b ifTrue:[^self error:'can''t become yourself']]. - - "Must have failed because not enough space in forwarding table (see ObjectMemory-prepareForwardingTableForBecoming:with:twoWay:). Do GC and try again only once" - (Smalltalk bytesLeft: true) = Smalltalk primitiveGarbageCollect - ifTrue: [^ self primitiveFailed]. - ^ self elementsExchangeIdentityWith: otherArray! Item was changed: ----- Method: Array>>elementsForwardIdentityTo: (in category 'converting') ----- elementsForwardIdentityTo: otherArray + "This primitive performs a bulk mutation, causing all pointers to the elements of the + receiver to be replaced by pointers to the corresponding elements of otherArray. + The identityHashes remain with the pointers rather than with the objects so that + the objects in this array should still be properly indexed in any existing hashed + structures after the mutation." + - "This primitive performs a bulk mutation, causing all pointers to the elements of this array to be replaced by pointers to the corresponding elements of otherArray. The identityHashes remain with the pointers rather than with the objects so that the objects in this array should still be properly indexed in any existing hashed structures after the mutation." - self primitiveFailed! Item was changed: ----- Method: Array>>elementsForwardIdentityTo:copyHash: (in category 'converting') ----- elementsForwardIdentityTo: otherArray copyHash: copyHash + "This primitive performs a bulk mutation, causing all pointers to the elements of the + receiver to be replaced by pointers to the corresponding elements of otherArray. + If copyHash is true, the identityHashes remain with the pointers rather than with the + objects so that the objects in the receiver should still be properly indexed in any + existing hashed structures after the mutation. If copyHash is false, then the hashes + of the objects in otherArray remain unchanged. If you know what you're doing this + may indeed be what you want." + - "This primitive performs a bulk mutation, causing all pointers to the elements of this array to be replaced by pointers to the corresponding elements of otherArray. The identityHashes remain with the pointers rather than with the objects so that the objects in this array should still be properly indexed in any existing hashed structures after the mutation." - self primitiveFailed! Item was changed: ==== ERROR === Error: Unrecognized class type 1 July 2015 11:55:48.283 pm VM: unix - a SmalltalkImage Image: Squeak3.11alpha [latest update: #8824] SecurityManager state: Restricted: false FileAccess: true SocketAccess: true Working Dir /home/squeaksource Trusted Dir /home/squeaksource/secure Untrusted Dir /home/squeaksource/My Squeak MCClassDefinition(Object)>>error: Receiver: a MCClassDefinition(Character) Arguments and temporary variables: aString: 'Unrecognized class type' Receiver's instance variables: name: #Character superclassName: #Magnitude variables: an OrderedCollection(a MCClassVariableDefinition(AlphaNumericMask) a...etc... category: #'Collections-Strings' type: #immediate comment: 'I represent a character by storing its associated Unicode as an unsig...etc... commentStamp: 'eem 8/12/2014 14:53' traitComposition: nil classTraitComposition: nil MCClassDefinition>>kindOfSubclass Receiver: a MCClassDefinition(Character) Arguments and temporary variables: Receiver's instance variables: name: #Character superclassName: #Magnitude variables: an OrderedCollection(a MCClassVariableDefinition(AlphaNumericMask) a...etc... category: #'Collections-Strings' type: #immediate comment: 'I represent a character by storing its associated Unicode as an unsig...etc... commentStamp: 'eem 8/12/2014 14:53' traitComposition: nil classTraitComposition: nil MCClassDefinition>>printDefinitionOn: Receiver: a MCClassDefinition(Character) Arguments and temporary variables: stream: a WriteStream Receiver's instance variables: name: #Character superclassName: #Magnitude variables: an OrderedCollection(a MCClassVariableDefinition(AlphaNumericMask) a...etc... category: #'Collections-Strings' type: #immediate comment: 'I represent a character by storing its associated Unicode as an unsig...etc... commentStamp: 'eem 8/12/2014 14:53' traitComposition: nil classTraitComposition: nil [] in MCDiffyTextWriter(MCStWriter)>>writeClassDefinition: Receiver: a MCDiffyTextWriter Arguments and temporary variables: definition: a WriteStream s: a MCClassDefinition(Character) Receiver's instance variables: stream: a WriteStream initStream: nil --- The full stack --- MCClassDefinition(Object)>>error: MCClassDefinition>>kindOfSubclass MCClassDefinition>>printDefinitionOn: [] in MCDiffyTextWriter(MCStWriter)>>writeClassDefinition: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - String class(SequenceableCollection class)>>new:streamContents: String class(SequenceableCollection class)>>streamContents: MCDiffyTextWriter(MCTextWriter)>>chunkContents: MCDiffyTextWriter(MCStWriter)>>writeClassDefinition: MCDiffyTextWriter(MCStWriter)>>visitClassDefinition: MCClassDefinition>>accept: [] in MCDiffyTextWriter(MCTextWriter)>>visitInFork: String class(SequenceableCollection class)>>new:streamContents: String class(SequenceableCollection class)>>streamContents: MCDiffyTextWriter(MCTextWriter)>>visitInFork: MCDiffyTextWriter>>writePatchFrom:to: MCDiffyTextWriter>>writeModification: [] in MCDiffyTextWriter>>writePatch: SortedCollection(OrderedCollection)>>do: MCDiffyTextWriter>>writePatch: SSDiffyTextWriter>>writePatch: [] in SSDiffyTextWriter>>writeVersion:for: BlockClosure>>on:do: SSDiffyTextWriter>>writeVersion:for: [] in SSEMailSubscription>>versionAdded:to: BlockClosure>>on:do: SSEMailSubscription>>versionAdded:to: [] in [] in SSProject>>versionAdded: [] in BlockClosure>>newProcess From commits at source.squeak.org Wed Jul 1 23:58:30 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 23:58:35 2015 Subject: [squeak-dev] The Trunk: System.spur-cmm.744.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System.spur-cmm.744.mcz ==================== Summary ==================== Name: System.spur-cmm.744 Author: eem Time: 1 July 2015, 4:54:21.88 pm UUID: ca1e2b42-db57-4dca-b847-1412de5c1b09 Ancestors: System-cmm.744, System.spur-topa.743 System-cmm.744 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Updated copyright year. =============== Diff against System-cmm.744 =============== Item was removed: - Object subclass: #ObjectHistory - instanceVariableNames: 'marks markProcess' - classVariableNames: 'Current ObjectHistoryEnabled' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! - ObjectHistory holds ObjectHistoryMark objects which are placed in the object memory at regular intervals by its markProcess in the background. Adjacent marks (with no remaining objects inbetween) are coalesced so over time the collection does not grow unnecessarily large. - - Using these markers it is possible to determine the age of objects in memory from the time the ObjectHistory was initialized. Try e.g.: - self oopTimestamp. - self oopAge. - ObjectHistory current oopClassesByDate. - - Instance Variables - marks: SortedCollection of ObjectHistoryMark objects - markProcess: a Process running our markLoop - ! Item was removed: - ----- Method: ObjectHistory class>>current (in category 'accessing') ----- - current - ^ Current ifNil: [Current := self new]! Item was removed: - ----- Method: ObjectHistory class>>initialize (in category 'class initialization') ----- - initialize - self current. - ! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category 'preferences') ----- - keepTrackOfObjectHistory - - ^ ObjectHistoryEnabled ifNil: [ - Current - ifNil: [false] - ifNotNil: [:objectHistory | objectHistory isRunning]]! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in category 'preferences') ----- - keepTrackOfObjectHistory: aBoolean - " Reflect the desired state by starting/stopping the process if necessary " - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. - ObjectHistoryEnabled := aBoolean. - - Current - ifNil: [aBoolean ifTrue: [self current]] - ifNotNil: [:objectHistory | - (objectHistory isRunning xor: aBoolean) "state switch needed" - ifTrue: [objectHistory toggleRunning]].! Item was removed: - ----- Method: ObjectHistory class>>obsolete (in category 'class initialization') ----- - obsolete - "Kill the mark process before removing the class." - Current ifNotNil: - [:objectHistory| - objectHistory terminate]. - super obsolete! Item was removed: - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- - ageOf: anObject - "Age of anObject in seconds" - | timestamp | - timestamp := self timestampOf: anObject. - timestamp ifNil: [^0]. - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! Item was removed: - ----- Method: ObjectHistory>>initialize (in category 'initializing') ----- - initialize - self restartMarkProcess. - - ! Item was removed: - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- - isRunning - ^ markProcess - ifNil: [false] - ifNotNil: [:process | - process isSuspended not and: [ - process isTerminated not]]! Item was removed: - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- - markLoop - [true] whileTrue: [ - self markUpdate. - (Delay forSeconds: self markRate) wait]! Item was removed: - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- - markRate - "rate of creating ObjectHistoryMarks" - ^60! Item was removed: - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- - markUpdate - "Add a new mark and compact the marks collection" - | mark prev | - "lazy init so this happens in the background process" - marks ifNil: [self reinitMarks]. - "add new mark to object memory" - mark := self newMark. - mark timestamp <= marks last timestamp ifTrue: [^self "could happen if clock is wrong"]. - marks addLast: mark. - "compact the table by removing adjacent marks" - prev := marks first. - marks removeAllSuchThat: [:each | | doDelete | - doDelete := prev objectAfter == each. - prev := each. - doDelete]. - "The loop above is O(n) in number of marks, but that number should never become so large to be an issue. Even if the number was large, this is running at system background priority so should not interfere with any user process, not even user background processes. The symptom should only be that the system is less idle. - - If we ever get to a point where the number of marks is an issue then the compacting here could be made partial: since old marks rarely get coalesced it would make sense to only check the newer ones often, and the old ones perhaps only at the system startup."! Item was removed: - ----- Method: ObjectHistory>>newMark (in category 'private') ----- - newMark - ^ ObjectHistoryMark new! Item was removed: - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- - oopClassesByAge - "Answer collection of (oopAge in seconds -> sorted counts of object classes) sorted from lowest age" - "ObjectHistory current oopClassesByAge" - - | stats prev endOfMemory now bag age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - bag := Bag new. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> bag sortedCounts]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') ----- - oopClassesByDate - "Answer collection of (Date -> sorted counts of object classes) sorted from newest date" - "ObjectHistory current oopClassesByDate" - - | stats prev endOfMemory bag date obj thisDate | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - thisDate := nil. - bag := Bag new. - marks do: [:mark | - prev ifNotNil: [ - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - date := mark timestamp asDate. - thisDate = date ifFalse: [ - stats addFirst: date -> bag sortedCounts. - bag := Bag new. - thisDate := date]]. - prev := mark]. - thisDate = date ifFalse: [ - stats addLast: date -> bag sortedCounts]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- - oopCountsByAge - "Answer collection of (oopAge in seconds -> number of objects) sorted from lowest age" - "ObjectHistory current oopCountsByAge" - - | stats prev endOfMemory now n age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - n := 0. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - n := n + 1. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> n]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- - reinitMarks - marks := ObjectHistoryMark allInstances asOrderedCollection. - marks - ifEmpty: [marks add: self newMark] - ifNotEmpty: [ | prev | - prev := nil. - marks removeAllSuchThat: [:obj | - prev notNil and: [prev timestamp >= obj timestamp]]]. - ! Item was removed: - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') ----- - restartMarkProcess - markProcess ifNotNil: [markProcess terminate]. - markProcess := [self markLoop] - forkAt: Processor systemBackgroundPriority - named: 'ObjectHistory''s markProcess'. - ! Item was removed: - ----- Method: ObjectHistory>>terminate (in category 'private') ----- - terminate - markProcess ifNotNil: - [markProcess terminate]! Item was removed: - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- - timestampOf: anObject - "Timestamp of anObject, or nil if too new" - | endOfMemory mark | - anObject class == SmallInteger ifTrue: [^nil]. - mark := anObject. - endOfMemory := Object new. - [mark class == ObjectHistoryMark] whileFalse: [ - mark := mark nextObject. - mark == endOfMemory ifTrue: [^nil]]. - ^mark timestamp! Item was removed: - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- - toggleRunning - self isRunning - ifTrue: [self terminate] - ifFalse: [self restartMarkProcess]! Item was removed: - Object subclass: #ObjectHistoryMark - instanceVariableNames: 'timestamp' - classVariableNames: '' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! - An ObjectHistoryMark is a permanent mark in the object memory. It holds a timestamp. - - While the timestamp could be used directly as mark by ObjectHistory, it's conceivable that its format might change in the future, and we do not want the mark's relative position in memory to change (which would be the case if it was migrated to a new format). So we use a distinct object instead (and we protect it against accidental become-ing by overriding those methods).! Item was removed: - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- - become: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') ----- - becomeForward: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>initialize (in category 'initialization') ----- - initialize - timestamp := DateAndTime now floor. - ! Item was removed: - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') ----- - objectAfter - "Answer the next object in memory after me and my timestamp" - | successor | - successor := self nextObject. - successor == timestamp - ifTrue: [successor := successor nextObject]. - ^ successor! Item was removed: - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- - printOn: aStream - aStream - nextPutAll: self class name; - nextPut: $(; - print: timestamp; - nextPut: $)! Item was removed: - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') ----- - timestamp - ^timestamp - ! Item was changed: ----- Method: SmalltalkImage>>compactClassesArray (in category 'special objects') ----- compactClassesArray "Smalltalk compactClassesArray" + "Backward-compatibility support. Spur does not have compact classes." + ^{}! - "Return the array of 31 classes whose instances may be - represented compactly" - ^ self specialObjectsArray at: 29! Item was added: + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Essential. Fail if no memory is available." + + (numBytes isInteger and: [numBytes > 0]) ifTrue: + [OutOfMemory signal]. + ^self primitiveFailed! Item was added: + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was changed: ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') ----- primBytesLeft + "Primitive. Answer the number of free bytes available in old space. + Not accurate unless preceded by - "Primitive. Answer the number of bytes available for new object data. - Not accurate unless preceded by Smalltalk garbageCollectMost (for reasonable accuracy), or Smalltalk garbageCollect (for real accuracy). + See Object documentation whatIsAPrimitive." - See Object documentation whatIsAPrimitive." + ^0! - ^ 0! Item was changed: ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category 'memory space') ----- primitiveGarbageCollect + "Primitive. Reclaims all garbage and answers the size of the largest free chunk in old space.." - "Primitive. Reclaims all garbage and answers the number of bytes of available space." + ^self primitiveFailed! - ^ self primBytesLeft! Item was changed: ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category 'special objects') ----- recreateSpecialObjectsArray "Smalltalk recreateSpecialObjectsArray" "To external package developers: **** DO NOT OVERRIDE THIS METHOD. ***** If you are writing a plugin and need additional special object(s) for your own use, use addGCRoot() function and use own, separate special objects registry " "The Special Objects Array is an array of objects used by the Squeak virtual machine. Its contents are critical and accesses to it by the VM are unchecked, so don't even think of playing here unless you know what you are doing." | newArray | + newArray := Array new: 60. - newArray := Array new: 58. "Nil false and true get used throughout the interpreter" newArray at: 1 put: nil. newArray at: 2 put: false. newArray at: 3 put: true. "This association holds the active process (a ProcessScheduler)" newArray at: 4 put: (self specialObjectsArray at: 4) "(self bindingOf: #Processor) but it answers an Alias". "Numerous classes below used for type checking and instantiation" newArray at: 5 put: Bitmap. newArray at: 6 put: SmallInteger. newArray at: 7 put: ByteString. newArray at: 8 put: Array. newArray at: 9 put: Smalltalk. + newArray at: 10 put: BoxedFloat64. + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: [self globals at: #Context]). + newArray at: 12 put: nil. "was BlockContext." - newArray at: 10 put: Float. - newArray at: 11 put: MethodContext. - newArray at: 12 put: BlockContext. newArray at: 13 put: Point. newArray at: 14 put: LargePositiveInteger. newArray at: 15 put: Display. newArray at: 16 put: Message. newArray at: 17 put: CompiledMethod. + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: [Semaphore new]). "low space Semaphore" - newArray at: 18 put: (self specialObjectsArray at: 18). - "(low space Semaphore)" newArray at: 19 put: Semaphore. newArray at: 20 put: Character. newArray at: 21 put: #doesNotUnderstand:. newArray at: 22 put: #cannotReturn:. newArray at: 23 put: nil. "This is the process signalling low space." "An array of the 32 selectors that are compiled as special bytecodes, paired alternately with the number of arguments each takes." newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 #* 1 #/ 1 #\\ 1 #@ 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 #at: 1 #at:put: 2 #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 #blockCopy: 1 #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). "An array of the 255 Characters in ascii order. + Cog inlines table into machine code at: prim so do not regenerate it. + This is nil in Spur, which has immediate Characters." - Cog inlines table into machine code at: prim so do not regenerate it." newArray at: 25 put: (self specialObjectsArray at: 25). newArray at: 26 put: #mustBeBoolean. newArray at: 27 put: ByteArray. newArray at: 28 put: Process. + "An array of up to 31 classes whose instances will have compact headers; an empty array in Spur" - "An array of up to 31 classes whose instances will have compact headers" newArray at: 29 put: self compactClassesArray. + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: [Semaphore new]). "delay Semaphore" + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: [Semaphore new]). "user interrupt Semaphore" - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay Semaphore)" - newArray at: 31 put: (self specialObjectsArray at: 31). "(user interrupt Semaphore)" "Entries 32 - 34 unreferenced. Previously these contained prototype instances to be copied for fast initialization" + newArray at: 32 put: nil. "was the prototype Float" + newArray at: 33 put: nil. "was the prototype 4-byte LargePositiveInteger" + newArray at: 34 put: nil. "was the prototype Point" - newArray at: 32 put: nil. "was (Float new: 2)" - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" - newArray at: 34 put: nil. "was Point new" newArray at: 35 put: #cannotInterpret:. + newArray at: 36 put: nil. "was the prototype MethodContext" - "Note: This must be fixed once we start using context prototypes (yeah, right)" - "(MethodContext new: CompiledMethod fullFrameSize)." - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the prototype MethodContext (unused by the VM)" newArray at: 37 put: BlockClosure. + newArray at: 38 put: nil. "was the prototype BlockContext" - "(BlockContext new: CompiledMethod fullFrameSize)." - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the prototype BlockContext (unused by the VM)" "array of objects referred to by external code" + newArray at: 39 put: (self specialObjectsArray at: 39). "external semaphores" - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve external semaphores" newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls in CogMT" + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). "finalization Semaphore" - newArray at: 41 put: nil. "Reserved for a LinkedList instance for overlapped calls in CogMT" - "finalization Semaphore" - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). newArray at: 43 put: LargeNegativeInteger. "External objects for callout. Note: Written so that one can actually completely remove the FFI." newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). newArray at: 46 put: (self at: #ExternalData ifAbsent: []). newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). newArray at: 49 put: #aboutToReturn:through:. newArray at: 50 put: #run:with:in:. "51 reserved for immutability message" + newArray at: 51 put: #attemptToAssign:withIndex:. - "newArray at: 51 put: #attemptToAssign:withIndex:." - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: []). newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' #'bad argument' #'bad index' #'bad number of arguments' #'inappropriate operation' #'unsupported operation' #'no modification' #'insufficient object memory' #'insufficient C memory' #'not found' #'bad method' #'internal error in named primitive machinery' #'object may move' #'resource limit exceeded' + #'object is pinned' #'primitive write beyond end of object'). - #'object is pinned'). "53 to 55 are for Alien" newArray at: 53 put: (self at: #Alien ifAbsent: []). + newArray at: 54 put: #invokeCallbackContext:. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." - newArray at: 54 put: #invokeCallbackContext::. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). + "Used to be WeakFinalizationList for WeakFinalizationList hasNewFinalization, obsoleted by ephemeron support." + newArray at: 56 put: nil. - "Weak reference finalization" - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: []). "reserved for foreign callback process" newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: []). newArray at: 58 put: #unusedBytecode. + "59 reserved for Sista counter tripped message" + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. + "60 reserved for Sista class trap message" + newArray at: 60 put: #classTrapFor:. "Now replace the interpreter's reference in one atomic operation" + self specialObjectsArray becomeForward: newArray! - self specialObjectsArray becomeForward: newArray - ! Item was changed: ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and quit') ----- setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" - "Adjust the VM's default GC parameters to avoid premature tenuring." + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! - self vmParameterAt: 5 put: 4000. "do an incremental GC after this many allocations" - self vmParameterAt: 6 put: 2000. "tenure when more than this many objects survive the GC" - ! Item was changed: ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance size') ----- spaceForInstancesOf: aClass + "Answer a pair of the number of bytes consumed by all instances of the + given class, including their object headers, and the number of instances." - "Answer the number of bytes consumed by all instances of the given class, including their object headers and the number of instances." + | instances total | + instances := aClass allInstances. + instances isEmpty ifTrue: [^#(0 0)]. - | smallHeaderSize instVarBytes isVariable bytesPerElement total lastInstance instance instanceCount | - instance := aClass someInstance ifNil: [ ^#(0 0) ]. - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. - instVarBytes := aClass instSize * 4. - isVariable := aClass isVariable. - bytesPerElement := isVariable - ifFalse: [ 0 ] - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. total := 0. + aClass isVariable + ifTrue: + [instances do: + [:i| total := total + (aClass byteSizeOfInstanceOfSize: i basicSize)]] + ifFalse: + [total := instances size * aClass byteSizeOfInstance]. + ^{ total. instances size }! - instanceCount := 0. - "A modified version of #allInstancesDo: is inlined here. It avoids an infinite loop when another process is creating new instances of aClass." - self flag: #allInstancesDo:. - lastInstance := - aClass == CompiledMethod "CompiledMethod has special format, see its class comment" - ifTrue: [aClass new] - ifFalse: [aClass basicNew]. - [ instance == lastInstance ] whileFalse: [ - | contentBytes headerBytes | - contentBytes := instVarBytes + (isVariable - ifFalse: [ 0 ] - ifTrue: [ instance basicSize * bytesPerElement ]). - headerBytes := contentBytes > 255 - ifTrue: [ 12 ] - ifFalse: [ smallHeaderSize ]. - total := total + headerBytes + (contentBytes roundUpTo: 4). - instanceCount := instanceCount + 1. - instance := instance nextInstance ]. - ^{ total. instanceCount }! Item was added: + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Fail if no memory is available. Essential." + + ^(numBytes isInteger and: [numBytes > 0]) + ifTrue: [OutOfMemory signal] + ifFalse: [self primitiveFailed]! Item was added: + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was added: + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot and quit') ----- + setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" + + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! Item was added: + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- + allObjects + "Answer an Array of all objects in the system. Fail if + there isn't enough memory to instantiate the result." + + ^self primitiveFailed! Item was changed: ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- allObjectsDo: aBlock + "Evaluate the argument, aBlock, for each object in the system, excluding immediates + such as SmallInteger and Character." + self allObjectsOrNil + ifNotNil: [:allObjects| allObjects do: aBlock] + ifNil: + ["Fall back on the old single object primitive code. With closures, this needs + to use an end marker (lastObject) since activation of the block will create + new contexts and cause an infinite loop. The lastObject must be created + before calling someObject, so that the VM can settle the enumeration (e.g. + by flushing new space) as a side effect of someObject" + | object lastObject | + lastObject := Object new. + object := self someObject. + [lastObject == object or: [0 == object]] whileFalse: + [aBlock value: object. + object := object nextObject]]! - "Evaluate the argument, aBlock, for each object in the system - excluding SmallIntegers. With closures, this needs to use an end - marker (lastObject) since activation of the block will create new - contexts and cause an infinite loop." - | object lastObject | - object := self someObject. - lastObject := Object new. - [lastObject == object or: [0 == object]] - whileFalse: [aBlock value: object. - object := object nextObject]! Item was added: + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') ----- + allObjectsOrNil + "Answer an Array of all objects in the system. Fail if there isn't + enough memory to instantiate the result and answer nil." + + ^nil! From commits at source.squeak.org Wed Jul 1 23:58:30 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 23:58:43 2015 Subject: [squeak-dev] The Trunk: System.spur-eem.745.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System.spur-eem.745.mcz ==================== Summary ==================== Name: System.spur-eem.745 Author: eem Time: 1 July 2015, 4:54:30.011 pm UUID: 3a6680ac-9a99-45d5-87d8-a153d9a7e356 Ancestors: System-eem.745, System.spur-cmm.744 System-eem.745 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Rewrite Preferences to eliminate the AccessProtect. Use a copy, update copy, assign scheme to update the preferences dictionary atomically. Change Preferences access method compilation to use Object>>#value to eliminate a block creation. Change Preference initialization to eliminate the isKindOf: Symbol. This is step 1. Given SystemPreferences it is clear that the preferences dictionary should be stored in a class inst var, so that SystemPreferences and Preferences can share methods but access different dictionaries. The dictionaryOfProferences[:] accessors are dubious as they break encapsulatiopn. For example, the reportPreferences: method, which is the only external access, could insateaqd be moved into Preferences class. =============== Diff against System-eem.745 =============== Item was removed: - Object subclass: #ObjectHistory - instanceVariableNames: 'marks markProcess' - classVariableNames: 'Current ObjectHistoryEnabled' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! - ObjectHistory holds ObjectHistoryMark objects which are placed in the object memory at regular intervals by its markProcess in the background. Adjacent marks (with no remaining objects inbetween) are coalesced so over time the collection does not grow unnecessarily large. - - Using these markers it is possible to determine the age of objects in memory from the time the ObjectHistory was initialized. Try e.g.: - self oopTimestamp. - self oopAge. - ObjectHistory current oopClassesByDate. - - Instance Variables - marks: SortedCollection of ObjectHistoryMark objects - markProcess: a Process running our markLoop - ! Item was removed: - ----- Method: ObjectHistory class>>current (in category 'accessing') ----- - current - ^ Current ifNil: [Current := self new]! Item was removed: - ----- Method: ObjectHistory class>>initialize (in category 'class initialization') ----- - initialize - self current. - ! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category 'preferences') ----- - keepTrackOfObjectHistory - - ^ ObjectHistoryEnabled ifNil: [ - Current - ifNil: [false] - ifNotNil: [:objectHistory | objectHistory isRunning]]! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in category 'preferences') ----- - keepTrackOfObjectHistory: aBoolean - " Reflect the desired state by starting/stopping the process if necessary " - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. - ObjectHistoryEnabled := aBoolean. - - Current - ifNil: [aBoolean ifTrue: [self current]] - ifNotNil: [:objectHistory | - (objectHistory isRunning xor: aBoolean) "state switch needed" - ifTrue: [objectHistory toggleRunning]].! Item was removed: - ----- Method: ObjectHistory class>>obsolete (in category 'class initialization') ----- - obsolete - "Kill the mark process before removing the class." - Current ifNotNil: - [:objectHistory| - objectHistory terminate]. - super obsolete! Item was removed: - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- - ageOf: anObject - "Age of anObject in seconds" - | timestamp | - timestamp := self timestampOf: anObject. - timestamp ifNil: [^0]. - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! Item was removed: - ----- Method: ObjectHistory>>initialize (in category 'initializing') ----- - initialize - self restartMarkProcess. - - ! Item was removed: - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- - isRunning - ^ markProcess - ifNil: [false] - ifNotNil: [:process | - process isSuspended not and: [ - process isTerminated not]]! Item was removed: - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- - markLoop - [true] whileTrue: [ - self markUpdate. - (Delay forSeconds: self markRate) wait]! Item was removed: - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- - markRate - "rate of creating ObjectHistoryMarks" - ^60! Item was removed: - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- - markUpdate - "Add a new mark and compact the marks collection" - | mark prev | - "lazy init so this happens in the background process" - marks ifNil: [self reinitMarks]. - "add new mark to object memory" - mark := self newMark. - mark timestamp <= marks last timestamp ifTrue: [^self "could happen if clock is wrong"]. - marks addLast: mark. - "compact the table by removing adjacent marks" - prev := marks first. - marks removeAllSuchThat: [:each | | doDelete | - doDelete := prev objectAfter == each. - prev := each. - doDelete]. - "The loop above is O(n) in number of marks, but that number should never become so large to be an issue. Even if the number was large, this is running at system background priority so should not interfere with any user process, not even user background processes. The symptom should only be that the system is less idle. - - If we ever get to a point where the number of marks is an issue then the compacting here could be made partial: since old marks rarely get coalesced it would make sense to only check the newer ones often, and the old ones perhaps only at the system startup."! Item was removed: - ----- Method: ObjectHistory>>newMark (in category 'private') ----- - newMark - ^ ObjectHistoryMark new! Item was removed: - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- - oopClassesByAge - "Answer collection of (oopAge in seconds -> sorted counts of object classes) sorted from lowest age" - "ObjectHistory current oopClassesByAge" - - | stats prev endOfMemory now bag age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - bag := Bag new. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> bag sortedCounts]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') ----- - oopClassesByDate - "Answer collection of (Date -> sorted counts of object classes) sorted from newest date" - "ObjectHistory current oopClassesByDate" - - | stats prev endOfMemory bag date obj thisDate | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - thisDate := nil. - bag := Bag new. - marks do: [:mark | - prev ifNotNil: [ - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - date := mark timestamp asDate. - thisDate = date ifFalse: [ - stats addFirst: date -> bag sortedCounts. - bag := Bag new. - thisDate := date]]. - prev := mark]. - thisDate = date ifFalse: [ - stats addLast: date -> bag sortedCounts]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- - oopCountsByAge - "Answer collection of (oopAge in seconds -> number of objects) sorted from lowest age" - "ObjectHistory current oopCountsByAge" - - | stats prev endOfMemory now n age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - n := 0. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - n := n + 1. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> n]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- - reinitMarks - marks := ObjectHistoryMark allInstances asOrderedCollection. - marks - ifEmpty: [marks add: self newMark] - ifNotEmpty: [ | prev | - prev := nil. - marks removeAllSuchThat: [:obj | - prev notNil and: [prev timestamp >= obj timestamp]]]. - ! Item was removed: - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') ----- - restartMarkProcess - markProcess ifNotNil: [markProcess terminate]. - markProcess := [self markLoop] - forkAt: Processor systemBackgroundPriority - named: 'ObjectHistory''s markProcess'. - ! Item was removed: - ----- Method: ObjectHistory>>terminate (in category 'private') ----- - terminate - markProcess ifNotNil: - [markProcess terminate]! Item was removed: - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- - timestampOf: anObject - "Timestamp of anObject, or nil if too new" - | endOfMemory mark | - anObject class == SmallInteger ifTrue: [^nil]. - mark := anObject. - endOfMemory := Object new. - [mark class == ObjectHistoryMark] whileFalse: [ - mark := mark nextObject. - mark == endOfMemory ifTrue: [^nil]]. - ^mark timestamp! Item was removed: - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- - toggleRunning - self isRunning - ifTrue: [self terminate] - ifFalse: [self restartMarkProcess]! Item was removed: - Object subclass: #ObjectHistoryMark - instanceVariableNames: 'timestamp' - classVariableNames: '' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! - An ObjectHistoryMark is a permanent mark in the object memory. It holds a timestamp. - - While the timestamp could be used directly as mark by ObjectHistory, it's conceivable that its format might change in the future, and we do not want the mark's relative position in memory to change (which would be the case if it was migrated to a new format). So we use a distinct object instead (and we protect it against accidental become-ing by overriding those methods).! Item was removed: - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- - become: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') ----- - becomeForward: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>initialize (in category 'initialization') ----- - initialize - timestamp := DateAndTime now floor. - ! Item was removed: - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') ----- - objectAfter - "Answer the next object in memory after me and my timestamp" - | successor | - successor := self nextObject. - successor == timestamp - ifTrue: [successor := successor nextObject]. - ^ successor! Item was removed: - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- - printOn: aStream - aStream - nextPutAll: self class name; - nextPut: $(; - print: timestamp; - nextPut: $)! Item was removed: - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') ----- - timestamp - ^timestamp - ! Item was changed: ----- Method: SmalltalkImage>>compactClassesArray (in category 'special objects') ----- compactClassesArray "Smalltalk compactClassesArray" + "Backward-compatibility support. Spur does not have compact classes." + ^{}! - "Return the array of 31 classes whose instances may be - represented compactly" - ^ self specialObjectsArray at: 29! Item was added: + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Essential. Fail if no memory is available." + + (numBytes isInteger and: [numBytes > 0]) ifTrue: + [OutOfMemory signal]. + ^self primitiveFailed! Item was added: + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was changed: ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') ----- primBytesLeft + "Primitive. Answer the number of free bytes available in old space. + Not accurate unless preceded by - "Primitive. Answer the number of bytes available for new object data. - Not accurate unless preceded by Smalltalk garbageCollectMost (for reasonable accuracy), or Smalltalk garbageCollect (for real accuracy). + See Object documentation whatIsAPrimitive." - See Object documentation whatIsAPrimitive." + ^0! - ^ 0! Item was changed: ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category 'memory space') ----- primitiveGarbageCollect + "Primitive. Reclaims all garbage and answers the size of the largest free chunk in old space.." - "Primitive. Reclaims all garbage and answers the number of bytes of available space." + ^self primitiveFailed! - ^ self primBytesLeft! Item was changed: ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category 'special objects') ----- recreateSpecialObjectsArray "Smalltalk recreateSpecialObjectsArray" "To external package developers: **** DO NOT OVERRIDE THIS METHOD. ***** If you are writing a plugin and need additional special object(s) for your own use, use addGCRoot() function and use own, separate special objects registry " "The Special Objects Array is an array of objects used by the Squeak virtual machine. Its contents are critical and accesses to it by the VM are unchecked, so don't even think of playing here unless you know what you are doing." | newArray | + newArray := Array new: 60. - newArray := Array new: 58. "Nil false and true get used throughout the interpreter" newArray at: 1 put: nil. newArray at: 2 put: false. newArray at: 3 put: true. "This association holds the active process (a ProcessScheduler)" newArray at: 4 put: (self specialObjectsArray at: 4) "(self bindingOf: #Processor) but it answers an Alias". "Numerous classes below used for type checking and instantiation" newArray at: 5 put: Bitmap. newArray at: 6 put: SmallInteger. newArray at: 7 put: ByteString. newArray at: 8 put: Array. newArray at: 9 put: Smalltalk. + newArray at: 10 put: BoxedFloat64. + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: [self globals at: #Context]). + newArray at: 12 put: nil. "was BlockContext." - newArray at: 10 put: Float. - newArray at: 11 put: MethodContext. - newArray at: 12 put: BlockContext. newArray at: 13 put: Point. newArray at: 14 put: LargePositiveInteger. newArray at: 15 put: Display. newArray at: 16 put: Message. newArray at: 17 put: CompiledMethod. + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: [Semaphore new]). "low space Semaphore" - newArray at: 18 put: (self specialObjectsArray at: 18). - "(low space Semaphore)" newArray at: 19 put: Semaphore. newArray at: 20 put: Character. newArray at: 21 put: #doesNotUnderstand:. newArray at: 22 put: #cannotReturn:. newArray at: 23 put: nil. "This is the process signalling low space." "An array of the 32 selectors that are compiled as special bytecodes, paired alternately with the number of arguments each takes." newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 #* 1 #/ 1 #\\ 1 #@ 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 #at: 1 #at:put: 2 #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 #blockCopy: 1 #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). "An array of the 255 Characters in ascii order. + Cog inlines table into machine code at: prim so do not regenerate it. + This is nil in Spur, which has immediate Characters." - Cog inlines table into machine code at: prim so do not regenerate it." newArray at: 25 put: (self specialObjectsArray at: 25). newArray at: 26 put: #mustBeBoolean. newArray at: 27 put: ByteArray. newArray at: 28 put: Process. + "An array of up to 31 classes whose instances will have compact headers; an empty array in Spur" - "An array of up to 31 classes whose instances will have compact headers" newArray at: 29 put: self compactClassesArray. + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: [Semaphore new]). "delay Semaphore" + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: [Semaphore new]). "user interrupt Semaphore" - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay Semaphore)" - newArray at: 31 put: (self specialObjectsArray at: 31). "(user interrupt Semaphore)" "Entries 32 - 34 unreferenced. Previously these contained prototype instances to be copied for fast initialization" + newArray at: 32 put: nil. "was the prototype Float" + newArray at: 33 put: nil. "was the prototype 4-byte LargePositiveInteger" + newArray at: 34 put: nil. "was the prototype Point" - newArray at: 32 put: nil. "was (Float new: 2)" - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" - newArray at: 34 put: nil. "was Point new" newArray at: 35 put: #cannotInterpret:. + newArray at: 36 put: nil. "was the prototype MethodContext" - "Note: This must be fixed once we start using context prototypes (yeah, right)" - "(MethodContext new: CompiledMethod fullFrameSize)." - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the prototype MethodContext (unused by the VM)" newArray at: 37 put: BlockClosure. + newArray at: 38 put: nil. "was the prototype BlockContext" - "(BlockContext new: CompiledMethod fullFrameSize)." - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the prototype BlockContext (unused by the VM)" "array of objects referred to by external code" + newArray at: 39 put: (self specialObjectsArray at: 39). "external semaphores" - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve external semaphores" newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls in CogMT" + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). "finalization Semaphore" - newArray at: 41 put: nil. "Reserved for a LinkedList instance for overlapped calls in CogMT" - "finalization Semaphore" - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). newArray at: 43 put: LargeNegativeInteger. "External objects for callout. Note: Written so that one can actually completely remove the FFI." newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). newArray at: 46 put: (self at: #ExternalData ifAbsent: []). newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). newArray at: 49 put: #aboutToReturn:through:. newArray at: 50 put: #run:with:in:. "51 reserved for immutability message" + newArray at: 51 put: #attemptToAssign:withIndex:. - "newArray at: 51 put: #attemptToAssign:withIndex:." - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: []). newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' #'bad argument' #'bad index' #'bad number of arguments' #'inappropriate operation' #'unsupported operation' #'no modification' #'insufficient object memory' #'insufficient C memory' #'not found' #'bad method' #'internal error in named primitive machinery' #'object may move' #'resource limit exceeded' + #'object is pinned' #'primitive write beyond end of object'). - #'object is pinned'). "53 to 55 are for Alien" newArray at: 53 put: (self at: #Alien ifAbsent: []). + newArray at: 54 put: #invokeCallbackContext:. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." - newArray at: 54 put: #invokeCallbackContext::. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). + "Used to be WeakFinalizationList for WeakFinalizationList hasNewFinalization, obsoleted by ephemeron support." + newArray at: 56 put: nil. - "Weak reference finalization" - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: []). "reserved for foreign callback process" newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: []). newArray at: 58 put: #unusedBytecode. + "59 reserved for Sista counter tripped message" + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. + "60 reserved for Sista class trap message" + newArray at: 60 put: #classTrapFor:. "Now replace the interpreter's reference in one atomic operation" + self specialObjectsArray becomeForward: newArray! - self specialObjectsArray becomeForward: newArray - ! Item was changed: ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and quit') ----- setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" - "Adjust the VM's default GC parameters to avoid premature tenuring." + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! - self vmParameterAt: 5 put: 4000. "do an incremental GC after this many allocations" - self vmParameterAt: 6 put: 2000. "tenure when more than this many objects survive the GC" - ! Item was changed: ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance size') ----- spaceForInstancesOf: aClass + "Answer a pair of the number of bytes consumed by all instances of the + given class, including their object headers, and the number of instances." - "Answer the number of bytes consumed by all instances of the given class, including their object headers and the number of instances." + | instances total | + instances := aClass allInstances. + instances isEmpty ifTrue: [^#(0 0)]. - | smallHeaderSize instVarBytes isVariable bytesPerElement total lastInstance instance instanceCount | - instance := aClass someInstance ifNil: [ ^#(0 0) ]. - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. - instVarBytes := aClass instSize * 4. - isVariable := aClass isVariable. - bytesPerElement := isVariable - ifFalse: [ 0 ] - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. total := 0. + aClass isVariable + ifTrue: + [instances do: + [:i| total := total + (aClass byteSizeOfInstanceOfSize: i basicSize)]] + ifFalse: + [total := instances size * aClass byteSizeOfInstance]. + ^{ total. instances size }! - instanceCount := 0. - "A modified version of #allInstancesDo: is inlined here. It avoids an infinite loop when another process is creating new instances of aClass." - self flag: #allInstancesDo:. - lastInstance := - aClass == CompiledMethod "CompiledMethod has special format, see its class comment" - ifTrue: [aClass new] - ifFalse: [aClass basicNew]. - [ instance == lastInstance ] whileFalse: [ - | contentBytes headerBytes | - contentBytes := instVarBytes + (isVariable - ifFalse: [ 0 ] - ifTrue: [ instance basicSize * bytesPerElement ]). - headerBytes := contentBytes > 255 - ifTrue: [ 12 ] - ifFalse: [ smallHeaderSize ]. - total := total + headerBytes + (contentBytes roundUpTo: 4). - instanceCount := instanceCount + 1. - instance := instance nextInstance ]. - ^{ total. instanceCount }! Item was added: + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Fail if no memory is available. Essential." + + ^(numBytes isInteger and: [numBytes > 0]) + ifTrue: [OutOfMemory signal] + ifFalse: [self primitiveFailed]! Item was added: + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was added: + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot and quit') ----- + setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" + + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! Item was added: + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- + allObjects + "Answer an Array of all objects in the system. Fail if + there isn't enough memory to instantiate the result." + + ^self primitiveFailed! Item was changed: ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- allObjectsDo: aBlock + "Evaluate the argument, aBlock, for each object in the system, excluding immediates + such as SmallInteger and Character." + self allObjectsOrNil + ifNotNil: [:allObjects| allObjects do: aBlock] + ifNil: + ["Fall back on the old single object primitive code. With closures, this needs + to use an end marker (lastObject) since activation of the block will create + new contexts and cause an infinite loop. The lastObject must be created + before calling someObject, so that the VM can settle the enumeration (e.g. + by flushing new space) as a side effect of someObject" + | object lastObject | + lastObject := Object new. + object := self someObject. + [lastObject == object or: [0 == object]] whileFalse: + [aBlock value: object. + object := object nextObject]]! - "Evaluate the argument, aBlock, for each object in the system - excluding SmallIntegers. With closures, this needs to use an end - marker (lastObject) since activation of the block will create new - contexts and cause an infinite loop." - | object lastObject | - object := self someObject. - lastObject := Object new. - [lastObject == object or: [0 == object]] - whileFalse: [aBlock value: object. - object := object nextObject]! Item was added: + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') ----- + allObjectsOrNil + "Answer an Array of all objects in the system. Fail if there isn't + enough memory to instantiate the result and answer nil." + + ^nil! From commits at source.squeak.org Wed Jul 1 23:58:55 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 23:58:58 2015 Subject: [squeak-dev] The Trunk: System.spur-eem.746.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System.spur-eem.746.mcz ==================== Summary ==================== Name: System.spur-eem.746 Author: eem Time: 1 July 2015, 4:54:38.532 pm UUID: a263f608-f93f-40f8-8b60-eca6e440173f Ancestors: System-eem.746, System.spur-eem.745 System-eem.746 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 First part of Preferences putsch to move preferences dictionary from class var to inst var. Also update class comment to describe preference pragmas. =============== Diff against System-eem.746 =============== Item was removed: - Object subclass: #ObjectHistory - instanceVariableNames: 'marks markProcess' - classVariableNames: 'Current ObjectHistoryEnabled' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! - ObjectHistory holds ObjectHistoryMark objects which are placed in the object memory at regular intervals by its markProcess in the background. Adjacent marks (with no remaining objects inbetween) are coalesced so over time the collection does not grow unnecessarily large. - - Using these markers it is possible to determine the age of objects in memory from the time the ObjectHistory was initialized. Try e.g.: - self oopTimestamp. - self oopAge. - ObjectHistory current oopClassesByDate. - - Instance Variables - marks: SortedCollection of ObjectHistoryMark objects - markProcess: a Process running our markLoop - ! Item was removed: - ----- Method: ObjectHistory class>>current (in category 'accessing') ----- - current - ^ Current ifNil: [Current := self new]! Item was removed: - ----- Method: ObjectHistory class>>initialize (in category 'class initialization') ----- - initialize - self current. - ! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category 'preferences') ----- - keepTrackOfObjectHistory - - ^ ObjectHistoryEnabled ifNil: [ - Current - ifNil: [false] - ifNotNil: [:objectHistory | objectHistory isRunning]]! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in category 'preferences') ----- - keepTrackOfObjectHistory: aBoolean - " Reflect the desired state by starting/stopping the process if necessary " - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. - ObjectHistoryEnabled := aBoolean. - - Current - ifNil: [aBoolean ifTrue: [self current]] - ifNotNil: [:objectHistory | - (objectHistory isRunning xor: aBoolean) "state switch needed" - ifTrue: [objectHistory toggleRunning]].! Item was removed: - ----- Method: ObjectHistory class>>obsolete (in category 'class initialization') ----- - obsolete - "Kill the mark process before removing the class." - Current ifNotNil: - [:objectHistory| - objectHistory terminate]. - super obsolete! Item was removed: - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- - ageOf: anObject - "Age of anObject in seconds" - | timestamp | - timestamp := self timestampOf: anObject. - timestamp ifNil: [^0]. - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! Item was removed: - ----- Method: ObjectHistory>>initialize (in category 'initializing') ----- - initialize - self restartMarkProcess. - - ! Item was removed: - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- - isRunning - ^ markProcess - ifNil: [false] - ifNotNil: [:process | - process isSuspended not and: [ - process isTerminated not]]! Item was removed: - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- - markLoop - [true] whileTrue: [ - self markUpdate. - (Delay forSeconds: self markRate) wait]! Item was removed: - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- - markRate - "rate of creating ObjectHistoryMarks" - ^60! Item was removed: - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- - markUpdate - "Add a new mark and compact the marks collection" - | mark prev | - "lazy init so this happens in the background process" - marks ifNil: [self reinitMarks]. - "add new mark to object memory" - mark := self newMark. - mark timestamp <= marks last timestamp ifTrue: [^self "could happen if clock is wrong"]. - marks addLast: mark. - "compact the table by removing adjacent marks" - prev := marks first. - marks removeAllSuchThat: [:each | | doDelete | - doDelete := prev objectAfter == each. - prev := each. - doDelete]. - "The loop above is O(n) in number of marks, but that number should never become so large to be an issue. Even if the number was large, this is running at system background priority so should not interfere with any user process, not even user background processes. The symptom should only be that the system is less idle. - - If we ever get to a point where the number of marks is an issue then the compacting here could be made partial: since old marks rarely get coalesced it would make sense to only check the newer ones often, and the old ones perhaps only at the system startup."! Item was removed: - ----- Method: ObjectHistory>>newMark (in category 'private') ----- - newMark - ^ ObjectHistoryMark new! Item was removed: - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- - oopClassesByAge - "Answer collection of (oopAge in seconds -> sorted counts of object classes) sorted from lowest age" - "ObjectHistory current oopClassesByAge" - - | stats prev endOfMemory now bag age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - bag := Bag new. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> bag sortedCounts]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') ----- - oopClassesByDate - "Answer collection of (Date -> sorted counts of object classes) sorted from newest date" - "ObjectHistory current oopClassesByDate" - - | stats prev endOfMemory bag date obj thisDate | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - thisDate := nil. - bag := Bag new. - marks do: [:mark | - prev ifNotNil: [ - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - date := mark timestamp asDate. - thisDate = date ifFalse: [ - stats addFirst: date -> bag sortedCounts. - bag := Bag new. - thisDate := date]]. - prev := mark]. - thisDate = date ifFalse: [ - stats addLast: date -> bag sortedCounts]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- - oopCountsByAge - "Answer collection of (oopAge in seconds -> number of objects) sorted from lowest age" - "ObjectHistory current oopCountsByAge" - - | stats prev endOfMemory now n age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - n := 0. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - n := n + 1. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> n]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- - reinitMarks - marks := ObjectHistoryMark allInstances asOrderedCollection. - marks - ifEmpty: [marks add: self newMark] - ifNotEmpty: [ | prev | - prev := nil. - marks removeAllSuchThat: [:obj | - prev notNil and: [prev timestamp >= obj timestamp]]]. - ! Item was removed: - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') ----- - restartMarkProcess - markProcess ifNotNil: [markProcess terminate]. - markProcess := [self markLoop] - forkAt: Processor systemBackgroundPriority - named: 'ObjectHistory''s markProcess'. - ! Item was removed: - ----- Method: ObjectHistory>>terminate (in category 'private') ----- - terminate - markProcess ifNotNil: - [markProcess terminate]! Item was removed: - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- - timestampOf: anObject - "Timestamp of anObject, or nil if too new" - | endOfMemory mark | - anObject class == SmallInteger ifTrue: [^nil]. - mark := anObject. - endOfMemory := Object new. - [mark class == ObjectHistoryMark] whileFalse: [ - mark := mark nextObject. - mark == endOfMemory ifTrue: [^nil]]. - ^mark timestamp! Item was removed: - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- - toggleRunning - self isRunning - ifTrue: [self terminate] - ifFalse: [self restartMarkProcess]! Item was removed: - Object subclass: #ObjectHistoryMark - instanceVariableNames: 'timestamp' - classVariableNames: '' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! - An ObjectHistoryMark is a permanent mark in the object memory. It holds a timestamp. - - While the timestamp could be used directly as mark by ObjectHistory, it's conceivable that its format might change in the future, and we do not want the mark's relative position in memory to change (which would be the case if it was migrated to a new format). So we use a distinct object instead (and we protect it against accidental become-ing by overriding those methods).! Item was removed: - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- - become: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') ----- - becomeForward: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>initialize (in category 'initialization') ----- - initialize - timestamp := DateAndTime now floor. - ! Item was removed: - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') ----- - objectAfter - "Answer the next object in memory after me and my timestamp" - | successor | - successor := self nextObject. - successor == timestamp - ifTrue: [successor := successor nextObject]. - ^ successor! Item was removed: - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- - printOn: aStream - aStream - nextPutAll: self class name; - nextPut: $(; - print: timestamp; - nextPut: $)! Item was removed: - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') ----- - timestamp - ^timestamp - ! Item was changed: ----- Method: SmalltalkImage>>compactClassesArray (in category 'special objects') ----- compactClassesArray "Smalltalk compactClassesArray" + "Backward-compatibility support. Spur does not have compact classes." + ^{}! - "Return the array of 31 classes whose instances may be - represented compactly" - ^ self specialObjectsArray at: 29! Item was added: + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Essential. Fail if no memory is available." + + (numBytes isInteger and: [numBytes > 0]) ifTrue: + [OutOfMemory signal]. + ^self primitiveFailed! Item was added: + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was changed: ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') ----- primBytesLeft + "Primitive. Answer the number of free bytes available in old space. + Not accurate unless preceded by - "Primitive. Answer the number of bytes available for new object data. - Not accurate unless preceded by Smalltalk garbageCollectMost (for reasonable accuracy), or Smalltalk garbageCollect (for real accuracy). + See Object documentation whatIsAPrimitive." - See Object documentation whatIsAPrimitive." + ^0! - ^ 0! Item was changed: ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category 'memory space') ----- primitiveGarbageCollect + "Primitive. Reclaims all garbage and answers the size of the largest free chunk in old space.." - "Primitive. Reclaims all garbage and answers the number of bytes of available space." + ^self primitiveFailed! - ^ self primBytesLeft! Item was changed: ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category 'special objects') ----- recreateSpecialObjectsArray "Smalltalk recreateSpecialObjectsArray" "To external package developers: **** DO NOT OVERRIDE THIS METHOD. ***** If you are writing a plugin and need additional special object(s) for your own use, use addGCRoot() function and use own, separate special objects registry " "The Special Objects Array is an array of objects used by the Squeak virtual machine. Its contents are critical and accesses to it by the VM are unchecked, so don't even think of playing here unless you know what you are doing." | newArray | + newArray := Array new: 60. - newArray := Array new: 58. "Nil false and true get used throughout the interpreter" newArray at: 1 put: nil. newArray at: 2 put: false. newArray at: 3 put: true. "This association holds the active process (a ProcessScheduler)" newArray at: 4 put: (self specialObjectsArray at: 4) "(self bindingOf: #Processor) but it answers an Alias". "Numerous classes below used for type checking and instantiation" newArray at: 5 put: Bitmap. newArray at: 6 put: SmallInteger. newArray at: 7 put: ByteString. newArray at: 8 put: Array. newArray at: 9 put: Smalltalk. + newArray at: 10 put: BoxedFloat64. + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: [self globals at: #Context]). + newArray at: 12 put: nil. "was BlockContext." - newArray at: 10 put: Float. - newArray at: 11 put: MethodContext. - newArray at: 12 put: BlockContext. newArray at: 13 put: Point. newArray at: 14 put: LargePositiveInteger. newArray at: 15 put: Display. newArray at: 16 put: Message. newArray at: 17 put: CompiledMethod. + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: [Semaphore new]). "low space Semaphore" - newArray at: 18 put: (self specialObjectsArray at: 18). - "(low space Semaphore)" newArray at: 19 put: Semaphore. newArray at: 20 put: Character. newArray at: 21 put: #doesNotUnderstand:. newArray at: 22 put: #cannotReturn:. newArray at: 23 put: nil. "This is the process signalling low space." "An array of the 32 selectors that are compiled as special bytecodes, paired alternately with the number of arguments each takes." newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 #* 1 #/ 1 #\\ 1 #@ 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 #at: 1 #at:put: 2 #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 #blockCopy: 1 #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). "An array of the 255 Characters in ascii order. + Cog inlines table into machine code at: prim so do not regenerate it. + This is nil in Spur, which has immediate Characters." - Cog inlines table into machine code at: prim so do not regenerate it." newArray at: 25 put: (self specialObjectsArray at: 25). newArray at: 26 put: #mustBeBoolean. newArray at: 27 put: ByteArray. newArray at: 28 put: Process. + "An array of up to 31 classes whose instances will have compact headers; an empty array in Spur" - "An array of up to 31 classes whose instances will have compact headers" newArray at: 29 put: self compactClassesArray. + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: [Semaphore new]). "delay Semaphore" + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: [Semaphore new]). "user interrupt Semaphore" - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay Semaphore)" - newArray at: 31 put: (self specialObjectsArray at: 31). "(user interrupt Semaphore)" "Entries 32 - 34 unreferenced. Previously these contained prototype instances to be copied for fast initialization" + newArray at: 32 put: nil. "was the prototype Float" + newArray at: 33 put: nil. "was the prototype 4-byte LargePositiveInteger" + newArray at: 34 put: nil. "was the prototype Point" - newArray at: 32 put: nil. "was (Float new: 2)" - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" - newArray at: 34 put: nil. "was Point new" newArray at: 35 put: #cannotInterpret:. + newArray at: 36 put: nil. "was the prototype MethodContext" - "Note: This must be fixed once we start using context prototypes (yeah, right)" - "(MethodContext new: CompiledMethod fullFrameSize)." - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the prototype MethodContext (unused by the VM)" newArray at: 37 put: BlockClosure. + newArray at: 38 put: nil. "was the prototype BlockContext" - "(BlockContext new: CompiledMethod fullFrameSize)." - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the prototype BlockContext (unused by the VM)" "array of objects referred to by external code" + newArray at: 39 put: (self specialObjectsArray at: 39). "external semaphores" - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve external semaphores" newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls in CogMT" + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). "finalization Semaphore" - newArray at: 41 put: nil. "Reserved for a LinkedList instance for overlapped calls in CogMT" - "finalization Semaphore" - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). newArray at: 43 put: LargeNegativeInteger. "External objects for callout. Note: Written so that one can actually completely remove the FFI." newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). newArray at: 46 put: (self at: #ExternalData ifAbsent: []). newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). newArray at: 49 put: #aboutToReturn:through:. newArray at: 50 put: #run:with:in:. "51 reserved for immutability message" + newArray at: 51 put: #attemptToAssign:withIndex:. - "newArray at: 51 put: #attemptToAssign:withIndex:." - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: []). newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' #'bad argument' #'bad index' #'bad number of arguments' #'inappropriate operation' #'unsupported operation' #'no modification' #'insufficient object memory' #'insufficient C memory' #'not found' #'bad method' #'internal error in named primitive machinery' #'object may move' #'resource limit exceeded' + #'object is pinned' #'primitive write beyond end of object'). - #'object is pinned'). "53 to 55 are for Alien" newArray at: 53 put: (self at: #Alien ifAbsent: []). + newArray at: 54 put: #invokeCallbackContext:. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." - newArray at: 54 put: #invokeCallbackContext::. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). + "Used to be WeakFinalizationList for WeakFinalizationList hasNewFinalization, obsoleted by ephemeron support." + newArray at: 56 put: nil. - "Weak reference finalization" - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: []). "reserved for foreign callback process" newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: []). newArray at: 58 put: #unusedBytecode. + "59 reserved for Sista counter tripped message" + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. + "60 reserved for Sista class trap message" + newArray at: 60 put: #classTrapFor:. "Now replace the interpreter's reference in one atomic operation" + self specialObjectsArray becomeForward: newArray! - self specialObjectsArray becomeForward: newArray - ! Item was changed: ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and quit') ----- setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" - "Adjust the VM's default GC parameters to avoid premature tenuring." + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! - self vmParameterAt: 5 put: 4000. "do an incremental GC after this many allocations" - self vmParameterAt: 6 put: 2000. "tenure when more than this many objects survive the GC" - ! Item was changed: ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance size') ----- spaceForInstancesOf: aClass + "Answer a pair of the number of bytes consumed by all instances of the + given class, including their object headers, and the number of instances." - "Answer the number of bytes consumed by all instances of the given class, including their object headers and the number of instances." + | instances total | + instances := aClass allInstances. + instances isEmpty ifTrue: [^#(0 0)]. - | smallHeaderSize instVarBytes isVariable bytesPerElement total lastInstance instance instanceCount | - instance := aClass someInstance ifNil: [ ^#(0 0) ]. - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. - instVarBytes := aClass instSize * 4. - isVariable := aClass isVariable. - bytesPerElement := isVariable - ifFalse: [ 0 ] - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. total := 0. + aClass isVariable + ifTrue: + [instances do: + [:i| total := total + (aClass byteSizeOfInstanceOfSize: i basicSize)]] + ifFalse: + [total := instances size * aClass byteSizeOfInstance]. + ^{ total. instances size }! - instanceCount := 0. - "A modified version of #allInstancesDo: is inlined here. It avoids an infinite loop when another process is creating new instances of aClass." - self flag: #allInstancesDo:. - lastInstance := - aClass == CompiledMethod "CompiledMethod has special format, see its class comment" - ifTrue: [aClass new] - ifFalse: [aClass basicNew]. - [ instance == lastInstance ] whileFalse: [ - | contentBytes headerBytes | - contentBytes := instVarBytes + (isVariable - ifFalse: [ 0 ] - ifTrue: [ instance basicSize * bytesPerElement ]). - headerBytes := contentBytes > 255 - ifTrue: [ 12 ] - ifFalse: [ smallHeaderSize ]. - total := total + headerBytes + (contentBytes roundUpTo: 4). - instanceCount := instanceCount + 1. - instance := instance nextInstance ]. - ^{ total. instanceCount }! Item was added: + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Fail if no memory is available. Essential." + + ^(numBytes isInteger and: [numBytes > 0]) + ifTrue: [OutOfMemory signal] + ifFalse: [self primitiveFailed]! Item was added: + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was added: + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot and quit') ----- + setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" + + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! Item was added: + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- + allObjects + "Answer an Array of all objects in the system. Fail if + there isn't enough memory to instantiate the result." + + ^self primitiveFailed! Item was changed: ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- allObjectsDo: aBlock + "Evaluate the argument, aBlock, for each object in the system, excluding immediates + such as SmallInteger and Character." + self allObjectsOrNil + ifNotNil: [:allObjects| allObjects do: aBlock] + ifNil: + ["Fall back on the old single object primitive code. With closures, this needs + to use an end marker (lastObject) since activation of the block will create + new contexts and cause an infinite loop. The lastObject must be created + before calling someObject, so that the VM can settle the enumeration (e.g. + by flushing new space) as a side effect of someObject" + | object lastObject | + lastObject := Object new. + object := self someObject. + [lastObject == object or: [0 == object]] whileFalse: + [aBlock value: object. + object := object nextObject]]! - "Evaluate the argument, aBlock, for each object in the system - excluding SmallIntegers. With closures, this needs to use an end - marker (lastObject) since activation of the block will create new - contexts and cause an infinite loop." - | object lastObject | - object := self someObject. - lastObject := Object new. - [lastObject == object or: [0 == object]] - whileFalse: [aBlock value: object. - object := object nextObject]! Item was added: + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') ----- + allObjectsOrNil + "Answer an Array of all objects in the system. Fail if there isn't + enough memory to instantiate the result and answer nil." + + ^nil! From commits at source.squeak.org Wed Jul 1 23:59:54 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 1 23:59:55 2015 Subject: [squeak-dev] The Trunk: System.spur-eem.747.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System.spur-eem.747.mcz ==================== Summary ==================== Name: System.spur-eem.747 Author: eem Time: 1 July 2015, 4:54:47.257 pm UUID: 737986ab-6f35-47e3-b8b2-1cc5190152ac Ancestors: System-eem.747, System.spur-eem.746 System-eem.747 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Second part of putsch. Move preferences dictionary from class var to inst var. Remove the setter, and makde the getter, currently used only by SystemReporter, answer a copy. =============== Diff against System-eem.747 =============== Item was removed: - Object subclass: #ObjectHistory - instanceVariableNames: 'marks markProcess' - classVariableNames: 'Current ObjectHistoryEnabled' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! - ObjectHistory holds ObjectHistoryMark objects which are placed in the object memory at regular intervals by its markProcess in the background. Adjacent marks (with no remaining objects inbetween) are coalesced so over time the collection does not grow unnecessarily large. - - Using these markers it is possible to determine the age of objects in memory from the time the ObjectHistory was initialized. Try e.g.: - self oopTimestamp. - self oopAge. - ObjectHistory current oopClassesByDate. - - Instance Variables - marks: SortedCollection of ObjectHistoryMark objects - markProcess: a Process running our markLoop - ! Item was removed: - ----- Method: ObjectHistory class>>current (in category 'accessing') ----- - current - ^ Current ifNil: [Current := self new]! Item was removed: - ----- Method: ObjectHistory class>>initialize (in category 'class initialization') ----- - initialize - self current. - ! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category 'preferences') ----- - keepTrackOfObjectHistory - - ^ ObjectHistoryEnabled ifNil: [ - Current - ifNil: [false] - ifNotNil: [:objectHistory | objectHistory isRunning]]! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in category 'preferences') ----- - keepTrackOfObjectHistory: aBoolean - " Reflect the desired state by starting/stopping the process if necessary " - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. - ObjectHistoryEnabled := aBoolean. - - Current - ifNil: [aBoolean ifTrue: [self current]] - ifNotNil: [:objectHistory | - (objectHistory isRunning xor: aBoolean) "state switch needed" - ifTrue: [objectHistory toggleRunning]].! Item was removed: - ----- Method: ObjectHistory class>>obsolete (in category 'class initialization') ----- - obsolete - "Kill the mark process before removing the class." - Current ifNotNil: - [:objectHistory| - objectHistory terminate]. - super obsolete! Item was removed: - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- - ageOf: anObject - "Age of anObject in seconds" - | timestamp | - timestamp := self timestampOf: anObject. - timestamp ifNil: [^0]. - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! Item was removed: - ----- Method: ObjectHistory>>initialize (in category 'initializing') ----- - initialize - self restartMarkProcess. - - ! Item was removed: - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- - isRunning - ^ markProcess - ifNil: [false] - ifNotNil: [:process | - process isSuspended not and: [ - process isTerminated not]]! Item was removed: - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- - markLoop - [true] whileTrue: [ - self markUpdate. - (Delay forSeconds: self markRate) wait]! Item was removed: - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- - markRate - "rate of creating ObjectHistoryMarks" - ^60! Item was removed: - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- - markUpdate - "Add a new mark and compact the marks collection" - | mark prev | - "lazy init so this happens in the background process" - marks ifNil: [self reinitMarks]. - "add new mark to object memory" - mark := self newMark. - mark timestamp <= marks last timestamp ifTrue: [^self "could happen if clock is wrong"]. - marks addLast: mark. - "compact the table by removing adjacent marks" - prev := marks first. - marks removeAllSuchThat: [:each | | doDelete | - doDelete := prev objectAfter == each. - prev := each. - doDelete]. - "The loop above is O(n) in number of marks, but that number should never become so large to be an issue. Even if the number was large, this is running at system background priority so should not interfere with any user process, not even user background processes. The symptom should only be that the system is less idle. - - If we ever get to a point where the number of marks is an issue then the compacting here could be made partial: since old marks rarely get coalesced it would make sense to only check the newer ones often, and the old ones perhaps only at the system startup."! Item was removed: - ----- Method: ObjectHistory>>newMark (in category 'private') ----- - newMark - ^ ObjectHistoryMark new! Item was removed: - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- - oopClassesByAge - "Answer collection of (oopAge in seconds -> sorted counts of object classes) sorted from lowest age" - "ObjectHistory current oopClassesByAge" - - | stats prev endOfMemory now bag age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - bag := Bag new. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> bag sortedCounts]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') ----- - oopClassesByDate - "Answer collection of (Date -> sorted counts of object classes) sorted from newest date" - "ObjectHistory current oopClassesByDate" - - | stats prev endOfMemory bag date obj thisDate | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - thisDate := nil. - bag := Bag new. - marks do: [:mark | - prev ifNotNil: [ - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - date := mark timestamp asDate. - thisDate = date ifFalse: [ - stats addFirst: date -> bag sortedCounts. - bag := Bag new. - thisDate := date]]. - prev := mark]. - thisDate = date ifFalse: [ - stats addLast: date -> bag sortedCounts]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- - oopCountsByAge - "Answer collection of (oopAge in seconds -> number of objects) sorted from lowest age" - "ObjectHistory current oopCountsByAge" - - | stats prev endOfMemory now n age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - n := 0. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - n := n + 1. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> n]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- - reinitMarks - marks := ObjectHistoryMark allInstances asOrderedCollection. - marks - ifEmpty: [marks add: self newMark] - ifNotEmpty: [ | prev | - prev := nil. - marks removeAllSuchThat: [:obj | - prev notNil and: [prev timestamp >= obj timestamp]]]. - ! Item was removed: - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') ----- - restartMarkProcess - markProcess ifNotNil: [markProcess terminate]. - markProcess := [self markLoop] - forkAt: Processor systemBackgroundPriority - named: 'ObjectHistory''s markProcess'. - ! Item was removed: - ----- Method: ObjectHistory>>terminate (in category 'private') ----- - terminate - markProcess ifNotNil: - [markProcess terminate]! Item was removed: - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- - timestampOf: anObject - "Timestamp of anObject, or nil if too new" - | endOfMemory mark | - anObject class == SmallInteger ifTrue: [^nil]. - mark := anObject. - endOfMemory := Object new. - [mark class == ObjectHistoryMark] whileFalse: [ - mark := mark nextObject. - mark == endOfMemory ifTrue: [^nil]]. - ^mark timestamp! Item was removed: - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- - toggleRunning - self isRunning - ifTrue: [self terminate] - ifFalse: [self restartMarkProcess]! Item was removed: - Object subclass: #ObjectHistoryMark - instanceVariableNames: 'timestamp' - classVariableNames: '' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! - An ObjectHistoryMark is a permanent mark in the object memory. It holds a timestamp. - - While the timestamp could be used directly as mark by ObjectHistory, it's conceivable that its format might change in the future, and we do not want the mark's relative position in memory to change (which would be the case if it was migrated to a new format). So we use a distinct object instead (and we protect it against accidental become-ing by overriding those methods).! Item was removed: - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- - become: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') ----- - becomeForward: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>initialize (in category 'initialization') ----- - initialize - timestamp := DateAndTime now floor. - ! Item was removed: - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') ----- - objectAfter - "Answer the next object in memory after me and my timestamp" - | successor | - successor := self nextObject. - successor == timestamp - ifTrue: [successor := successor nextObject]. - ^ successor! Item was removed: - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- - printOn: aStream - aStream - nextPutAll: self class name; - nextPut: $(; - print: timestamp; - nextPut: $)! Item was removed: - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') ----- - timestamp - ^timestamp - ! Item was changed: ----- Method: SmalltalkImage>>compactClassesArray (in category 'special objects') ----- compactClassesArray "Smalltalk compactClassesArray" + "Backward-compatibility support. Spur does not have compact classes." + ^{}! - "Return the array of 31 classes whose instances may be - represented compactly" - ^ self specialObjectsArray at: 29! Item was added: + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Essential. Fail if no memory is available." + + (numBytes isInteger and: [numBytes > 0]) ifTrue: + [OutOfMemory signal]. + ^self primitiveFailed! Item was added: + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was changed: ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') ----- primBytesLeft + "Primitive. Answer the number of free bytes available in old space. + Not accurate unless preceded by - "Primitive. Answer the number of bytes available for new object data. - Not accurate unless preceded by Smalltalk garbageCollectMost (for reasonable accuracy), or Smalltalk garbageCollect (for real accuracy). + See Object documentation whatIsAPrimitive." - See Object documentation whatIsAPrimitive." + ^0! - ^ 0! Item was changed: ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category 'memory space') ----- primitiveGarbageCollect + "Primitive. Reclaims all garbage and answers the size of the largest free chunk in old space.." - "Primitive. Reclaims all garbage and answers the number of bytes of available space." + ^self primitiveFailed! - ^ self primBytesLeft! Item was changed: ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category 'special objects') ----- recreateSpecialObjectsArray "Smalltalk recreateSpecialObjectsArray" "To external package developers: **** DO NOT OVERRIDE THIS METHOD. ***** If you are writing a plugin and need additional special object(s) for your own use, use addGCRoot() function and use own, separate special objects registry " "The Special Objects Array is an array of objects used by the Squeak virtual machine. Its contents are critical and accesses to it by the VM are unchecked, so don't even think of playing here unless you know what you are doing." | newArray | + newArray := Array new: 60. - newArray := Array new: 58. "Nil false and true get used throughout the interpreter" newArray at: 1 put: nil. newArray at: 2 put: false. newArray at: 3 put: true. "This association holds the active process (a ProcessScheduler)" newArray at: 4 put: (self specialObjectsArray at: 4) "(self bindingOf: #Processor) but it answers an Alias". "Numerous classes below used for type checking and instantiation" newArray at: 5 put: Bitmap. newArray at: 6 put: SmallInteger. newArray at: 7 put: ByteString. newArray at: 8 put: Array. newArray at: 9 put: Smalltalk. + newArray at: 10 put: BoxedFloat64. + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: [self globals at: #Context]). + newArray at: 12 put: nil. "was BlockContext." - newArray at: 10 put: Float. - newArray at: 11 put: MethodContext. - newArray at: 12 put: BlockContext. newArray at: 13 put: Point. newArray at: 14 put: LargePositiveInteger. newArray at: 15 put: Display. newArray at: 16 put: Message. newArray at: 17 put: CompiledMethod. + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: [Semaphore new]). "low space Semaphore" - newArray at: 18 put: (self specialObjectsArray at: 18). - "(low space Semaphore)" newArray at: 19 put: Semaphore. newArray at: 20 put: Character. newArray at: 21 put: #doesNotUnderstand:. newArray at: 22 put: #cannotReturn:. newArray at: 23 put: nil. "This is the process signalling low space." "An array of the 32 selectors that are compiled as special bytecodes, paired alternately with the number of arguments each takes." newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 #* 1 #/ 1 #\\ 1 #@ 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 #at: 1 #at:put: 2 #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 #blockCopy: 1 #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). "An array of the 255 Characters in ascii order. + Cog inlines table into machine code at: prim so do not regenerate it. + This is nil in Spur, which has immediate Characters." - Cog inlines table into machine code at: prim so do not regenerate it." newArray at: 25 put: (self specialObjectsArray at: 25). newArray at: 26 put: #mustBeBoolean. newArray at: 27 put: ByteArray. newArray at: 28 put: Process. + "An array of up to 31 classes whose instances will have compact headers; an empty array in Spur" - "An array of up to 31 classes whose instances will have compact headers" newArray at: 29 put: self compactClassesArray. + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: [Semaphore new]). "delay Semaphore" + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: [Semaphore new]). "user interrupt Semaphore" - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay Semaphore)" - newArray at: 31 put: (self specialObjectsArray at: 31). "(user interrupt Semaphore)" "Entries 32 - 34 unreferenced. Previously these contained prototype instances to be copied for fast initialization" + newArray at: 32 put: nil. "was the prototype Float" + newArray at: 33 put: nil. "was the prototype 4-byte LargePositiveInteger" + newArray at: 34 put: nil. "was the prototype Point" - newArray at: 32 put: nil. "was (Float new: 2)" - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" - newArray at: 34 put: nil. "was Point new" newArray at: 35 put: #cannotInterpret:. + newArray at: 36 put: nil. "was the prototype MethodContext" - "Note: This must be fixed once we start using context prototypes (yeah, right)" - "(MethodContext new: CompiledMethod fullFrameSize)." - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the prototype MethodContext (unused by the VM)" newArray at: 37 put: BlockClosure. + newArray at: 38 put: nil. "was the prototype BlockContext" - "(BlockContext new: CompiledMethod fullFrameSize)." - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the prototype BlockContext (unused by the VM)" "array of objects referred to by external code" + newArray at: 39 put: (self specialObjectsArray at: 39). "external semaphores" - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve external semaphores" newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls in CogMT" + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). "finalization Semaphore" - newArray at: 41 put: nil. "Reserved for a LinkedList instance for overlapped calls in CogMT" - "finalization Semaphore" - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). newArray at: 43 put: LargeNegativeInteger. "External objects for callout. Note: Written so that one can actually completely remove the FFI." newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). newArray at: 46 put: (self at: #ExternalData ifAbsent: []). newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). newArray at: 49 put: #aboutToReturn:through:. newArray at: 50 put: #run:with:in:. "51 reserved for immutability message" + newArray at: 51 put: #attemptToAssign:withIndex:. - "newArray at: 51 put: #attemptToAssign:withIndex:." - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: []). newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' #'bad argument' #'bad index' #'bad number of arguments' #'inappropriate operation' #'unsupported operation' #'no modification' #'insufficient object memory' #'insufficient C memory' #'not found' #'bad method' #'internal error in named primitive machinery' #'object may move' #'resource limit exceeded' + #'object is pinned' #'primitive write beyond end of object'). - #'object is pinned'). "53 to 55 are for Alien" newArray at: 53 put: (self at: #Alien ifAbsent: []). + newArray at: 54 put: #invokeCallbackContext:. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." - newArray at: 54 put: #invokeCallbackContext::. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). + "Used to be WeakFinalizationList for WeakFinalizationList hasNewFinalization, obsoleted by ephemeron support." + newArray at: 56 put: nil. - "Weak reference finalization" - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: []). "reserved for foreign callback process" newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: []). newArray at: 58 put: #unusedBytecode. + "59 reserved for Sista counter tripped message" + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. + "60 reserved for Sista class trap message" + newArray at: 60 put: #classTrapFor:. "Now replace the interpreter's reference in one atomic operation" + self specialObjectsArray becomeForward: newArray! - self specialObjectsArray becomeForward: newArray - ! Item was changed: ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and quit') ----- setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" - "Adjust the VM's default GC parameters to avoid premature tenuring." + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! - self vmParameterAt: 5 put: 4000. "do an incremental GC after this many allocations" - self vmParameterAt: 6 put: 2000. "tenure when more than this many objects survive the GC" - ! Item was changed: ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance size') ----- spaceForInstancesOf: aClass + "Answer a pair of the number of bytes consumed by all instances of the + given class, including their object headers, and the number of instances." - "Answer the number of bytes consumed by all instances of the given class, including their object headers and the number of instances." + | instances total | + instances := aClass allInstances. + instances isEmpty ifTrue: [^#(0 0)]. - | smallHeaderSize instVarBytes isVariable bytesPerElement total lastInstance instance instanceCount | - instance := aClass someInstance ifNil: [ ^#(0 0) ]. - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. - instVarBytes := aClass instSize * 4. - isVariable := aClass isVariable. - bytesPerElement := isVariable - ifFalse: [ 0 ] - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. total := 0. + aClass isVariable + ifTrue: + [instances do: + [:i| total := total + (aClass byteSizeOfInstanceOfSize: i basicSize)]] + ifFalse: + [total := instances size * aClass byteSizeOfInstance]. + ^{ total. instances size }! - instanceCount := 0. - "A modified version of #allInstancesDo: is inlined here. It avoids an infinite loop when another process is creating new instances of aClass." - self flag: #allInstancesDo:. - lastInstance := - aClass == CompiledMethod "CompiledMethod has special format, see its class comment" - ifTrue: [aClass new] - ifFalse: [aClass basicNew]. - [ instance == lastInstance ] whileFalse: [ - | contentBytes headerBytes | - contentBytes := instVarBytes + (isVariable - ifFalse: [ 0 ] - ifTrue: [ instance basicSize * bytesPerElement ]). - headerBytes := contentBytes > 255 - ifTrue: [ 12 ] - ifFalse: [ smallHeaderSize ]. - total := total + headerBytes + (contentBytes roundUpTo: 4). - instanceCount := instanceCount + 1. - instance := instance nextInstance ]. - ^{ total. instanceCount }! Item was added: + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Fail if no memory is available. Essential." + + ^(numBytes isInteger and: [numBytes > 0]) + ifTrue: [OutOfMemory signal] + ifFalse: [self primitiveFailed]! Item was added: + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was added: + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot and quit') ----- + setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" + + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! Item was added: + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- + allObjects + "Answer an Array of all objects in the system. Fail if + there isn't enough memory to instantiate the result." + + ^self primitiveFailed! Item was changed: ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- allObjectsDo: aBlock + "Evaluate the argument, aBlock, for each object in the system, excluding immediates + such as SmallInteger and Character." + self allObjectsOrNil + ifNotNil: [:allObjects| allObjects do: aBlock] + ifNil: + ["Fall back on the old single object primitive code. With closures, this needs + to use an end marker (lastObject) since activation of the block will create + new contexts and cause an infinite loop. The lastObject must be created + before calling someObject, so that the VM can settle the enumeration (e.g. + by flushing new space) as a side effect of someObject" + | object lastObject | + lastObject := Object new. + object := self someObject. + [lastObject == object or: [0 == object]] whileFalse: + [aBlock value: object. + object := object nextObject]]! - "Evaluate the argument, aBlock, for each object in the system - excluding SmallIntegers. With closures, this needs to use an end - marker (lastObject) since activation of the block will create new - contexts and cause an infinite loop." - | object lastObject | - object := self someObject. - lastObject := Object new. - [lastObject == object or: [0 == object]] - whileFalse: [aBlock value: object. - object := object nextObject]! Item was added: + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') ----- + allObjectsOrNil + "Answer an Array of all objects in the system. Fail if there isn't + enough memory to instantiate the result and answer nil." + + ^nil! From commits at source.squeak.org Thu Jul 2 00:01:03 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 2 00:01:06 2015 Subject: [squeak-dev] The Trunk: System.spur-ul.748.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System.spur-ul.748.mcz ==================== Summary ==================== Name: System.spur-ul.748 Author: eem Time: 1 July 2015, 4:54:55.643 pm UUID: 78213f81-dba6-4054-860d-e0490dda1d4e Ancestors: System-ul.748, System.spur-eem.747 System-ul.748 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 - Iterate over pragmas once per method instead of once per pragma in Preferences class>>prefEvent:. - There's no need to copy preferencesDictionary in Preferences class>>storePreferencesIn:, because it's a read-only data structure. - Ensure the durability of the changes of preferencesDictionary in Preferences class>>atomicUpdatePreferences: by checking for changes before overwriting it. =============== Diff against System-ul.748 =============== Item was removed: - Object subclass: #ObjectHistory - instanceVariableNames: 'marks markProcess' - classVariableNames: 'Current ObjectHistoryEnabled' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! - ObjectHistory holds ObjectHistoryMark objects which are placed in the object memory at regular intervals by its markProcess in the background. Adjacent marks (with no remaining objects inbetween) are coalesced so over time the collection does not grow unnecessarily large. - - Using these markers it is possible to determine the age of objects in memory from the time the ObjectHistory was initialized. Try e.g.: - self oopTimestamp. - self oopAge. - ObjectHistory current oopClassesByDate. - - Instance Variables - marks: SortedCollection of ObjectHistoryMark objects - markProcess: a Process running our markLoop - ! Item was removed: - ----- Method: ObjectHistory class>>current (in category 'accessing') ----- - current - ^ Current ifNil: [Current := self new]! Item was removed: - ----- Method: ObjectHistory class>>initialize (in category 'class initialization') ----- - initialize - self current. - ! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category 'preferences') ----- - keepTrackOfObjectHistory - - ^ ObjectHistoryEnabled ifNil: [ - Current - ifNil: [false] - ifNotNil: [:objectHistory | objectHistory isRunning]]! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in category 'preferences') ----- - keepTrackOfObjectHistory: aBoolean - " Reflect the desired state by starting/stopping the process if necessary " - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. - ObjectHistoryEnabled := aBoolean. - - Current - ifNil: [aBoolean ifTrue: [self current]] - ifNotNil: [:objectHistory | - (objectHistory isRunning xor: aBoolean) "state switch needed" - ifTrue: [objectHistory toggleRunning]].! Item was removed: - ----- Method: ObjectHistory class>>obsolete (in category 'class initialization') ----- - obsolete - "Kill the mark process before removing the class." - Current ifNotNil: - [:objectHistory| - objectHistory terminate]. - super obsolete! Item was removed: - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- - ageOf: anObject - "Age of anObject in seconds" - | timestamp | - timestamp := self timestampOf: anObject. - timestamp ifNil: [^0]. - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! Item was removed: - ----- Method: ObjectHistory>>initialize (in category 'initializing') ----- - initialize - self restartMarkProcess. - - ! Item was removed: - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- - isRunning - ^ markProcess - ifNil: [false] - ifNotNil: [:process | - process isSuspended not and: [ - process isTerminated not]]! Item was removed: - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- - markLoop - [true] whileTrue: [ - self markUpdate. - (Delay forSeconds: self markRate) wait]! Item was removed: - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- - markRate - "rate of creating ObjectHistoryMarks" - ^60! Item was removed: - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- - markUpdate - "Add a new mark and compact the marks collection" - | mark prev | - "lazy init so this happens in the background process" - marks ifNil: [self reinitMarks]. - "add new mark to object memory" - mark := self newMark. - mark timestamp <= marks last timestamp ifTrue: [^self "could happen if clock is wrong"]. - marks addLast: mark. - "compact the table by removing adjacent marks" - prev := marks first. - marks removeAllSuchThat: [:each | | doDelete | - doDelete := prev objectAfter == each. - prev := each. - doDelete]. - "The loop above is O(n) in number of marks, but that number should never become so large to be an issue. Even if the number was large, this is running at system background priority so should not interfere with any user process, not even user background processes. The symptom should only be that the system is less idle. - - If we ever get to a point where the number of marks is an issue then the compacting here could be made partial: since old marks rarely get coalesced it would make sense to only check the newer ones often, and the old ones perhaps only at the system startup."! Item was removed: - ----- Method: ObjectHistory>>newMark (in category 'private') ----- - newMark - ^ ObjectHistoryMark new! Item was removed: - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- - oopClassesByAge - "Answer collection of (oopAge in seconds -> sorted counts of object classes) sorted from lowest age" - "ObjectHistory current oopClassesByAge" - - | stats prev endOfMemory now bag age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - bag := Bag new. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> bag sortedCounts]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') ----- - oopClassesByDate - "Answer collection of (Date -> sorted counts of object classes) sorted from newest date" - "ObjectHistory current oopClassesByDate" - - | stats prev endOfMemory bag date obj thisDate | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - thisDate := nil. - bag := Bag new. - marks do: [:mark | - prev ifNotNil: [ - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - date := mark timestamp asDate. - thisDate = date ifFalse: [ - stats addFirst: date -> bag sortedCounts. - bag := Bag new. - thisDate := date]]. - prev := mark]. - thisDate = date ifFalse: [ - stats addLast: date -> bag sortedCounts]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- - oopCountsByAge - "Answer collection of (oopAge in seconds -> number of objects) sorted from lowest age" - "ObjectHistory current oopCountsByAge" - - | stats prev endOfMemory now n age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - n := 0. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - n := n + 1. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> n]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- - reinitMarks - marks := ObjectHistoryMark allInstances asOrderedCollection. - marks - ifEmpty: [marks add: self newMark] - ifNotEmpty: [ | prev | - prev := nil. - marks removeAllSuchThat: [:obj | - prev notNil and: [prev timestamp >= obj timestamp]]]. - ! Item was removed: - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') ----- - restartMarkProcess - markProcess ifNotNil: [markProcess terminate]. - markProcess := [self markLoop] - forkAt: Processor systemBackgroundPriority - named: 'ObjectHistory''s markProcess'. - ! Item was removed: - ----- Method: ObjectHistory>>terminate (in category 'private') ----- - terminate - markProcess ifNotNil: - [markProcess terminate]! Item was removed: - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- - timestampOf: anObject - "Timestamp of anObject, or nil if too new" - | endOfMemory mark | - anObject class == SmallInteger ifTrue: [^nil]. - mark := anObject. - endOfMemory := Object new. - [mark class == ObjectHistoryMark] whileFalse: [ - mark := mark nextObject. - mark == endOfMemory ifTrue: [^nil]]. - ^mark timestamp! Item was removed: - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- - toggleRunning - self isRunning - ifTrue: [self terminate] - ifFalse: [self restartMarkProcess]! Item was removed: - Object subclass: #ObjectHistoryMark - instanceVariableNames: 'timestamp' - classVariableNames: '' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! - An ObjectHistoryMark is a permanent mark in the object memory. It holds a timestamp. - - While the timestamp could be used directly as mark by ObjectHistory, it's conceivable that its format might change in the future, and we do not want the mark's relative position in memory to change (which would be the case if it was migrated to a new format). So we use a distinct object instead (and we protect it against accidental become-ing by overriding those methods).! Item was removed: - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- - become: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') ----- - becomeForward: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>initialize (in category 'initialization') ----- - initialize - timestamp := DateAndTime now floor. - ! Item was removed: - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') ----- - objectAfter - "Answer the next object in memory after me and my timestamp" - | successor | - successor := self nextObject. - successor == timestamp - ifTrue: [successor := successor nextObject]. - ^ successor! Item was removed: - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- - printOn: aStream - aStream - nextPutAll: self class name; - nextPut: $(; - print: timestamp; - nextPut: $)! Item was removed: - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') ----- - timestamp - ^timestamp - ! Item was changed: ----- Method: SmalltalkImage>>compactClassesArray (in category 'special objects') ----- compactClassesArray "Smalltalk compactClassesArray" + "Backward-compatibility support. Spur does not have compact classes." + ^{}! - "Return the array of 31 classes whose instances may be - represented compactly" - ^ self specialObjectsArray at: 29! Item was added: + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Essential. Fail if no memory is available." + + (numBytes isInteger and: [numBytes > 0]) ifTrue: + [OutOfMemory signal]. + ^self primitiveFailed! Item was added: + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was changed: ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') ----- primBytesLeft + "Primitive. Answer the number of free bytes available in old space. + Not accurate unless preceded by - "Primitive. Answer the number of bytes available for new object data. - Not accurate unless preceded by Smalltalk garbageCollectMost (for reasonable accuracy), or Smalltalk garbageCollect (for real accuracy). + See Object documentation whatIsAPrimitive." - See Object documentation whatIsAPrimitive." + ^0! - ^ 0! Item was changed: ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category 'memory space') ----- primitiveGarbageCollect + "Primitive. Reclaims all garbage and answers the size of the largest free chunk in old space.." - "Primitive. Reclaims all garbage and answers the number of bytes of available space." + ^self primitiveFailed! - ^ self primBytesLeft! Item was changed: ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category 'special objects') ----- recreateSpecialObjectsArray "Smalltalk recreateSpecialObjectsArray" "To external package developers: **** DO NOT OVERRIDE THIS METHOD. ***** If you are writing a plugin and need additional special object(s) for your own use, use addGCRoot() function and use own, separate special objects registry " "The Special Objects Array is an array of objects used by the Squeak virtual machine. Its contents are critical and accesses to it by the VM are unchecked, so don't even think of playing here unless you know what you are doing." | newArray | + newArray := Array new: 60. - newArray := Array new: 58. "Nil false and true get used throughout the interpreter" newArray at: 1 put: nil. newArray at: 2 put: false. newArray at: 3 put: true. "This association holds the active process (a ProcessScheduler)" newArray at: 4 put: (self specialObjectsArray at: 4) "(self bindingOf: #Processor) but it answers an Alias". "Numerous classes below used for type checking and instantiation" newArray at: 5 put: Bitmap. newArray at: 6 put: SmallInteger. newArray at: 7 put: ByteString. newArray at: 8 put: Array. newArray at: 9 put: Smalltalk. + newArray at: 10 put: BoxedFloat64. + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: [self globals at: #Context]). + newArray at: 12 put: nil. "was BlockContext." - newArray at: 10 put: Float. - newArray at: 11 put: MethodContext. - newArray at: 12 put: BlockContext. newArray at: 13 put: Point. newArray at: 14 put: LargePositiveInteger. newArray at: 15 put: Display. newArray at: 16 put: Message. newArray at: 17 put: CompiledMethod. + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: [Semaphore new]). "low space Semaphore" - newArray at: 18 put: (self specialObjectsArray at: 18). - "(low space Semaphore)" newArray at: 19 put: Semaphore. newArray at: 20 put: Character. newArray at: 21 put: #doesNotUnderstand:. newArray at: 22 put: #cannotReturn:. newArray at: 23 put: nil. "This is the process signalling low space." "An array of the 32 selectors that are compiled as special bytecodes, paired alternately with the number of arguments each takes." newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 #* 1 #/ 1 #\\ 1 #@ 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 #at: 1 #at:put: 2 #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 #blockCopy: 1 #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). "An array of the 255 Characters in ascii order. + Cog inlines table into machine code at: prim so do not regenerate it. + This is nil in Spur, which has immediate Characters." - Cog inlines table into machine code at: prim so do not regenerate it." newArray at: 25 put: (self specialObjectsArray at: 25). newArray at: 26 put: #mustBeBoolean. newArray at: 27 put: ByteArray. newArray at: 28 put: Process. + "An array of up to 31 classes whose instances will have compact headers; an empty array in Spur" - "An array of up to 31 classes whose instances will have compact headers" newArray at: 29 put: self compactClassesArray. + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: [Semaphore new]). "delay Semaphore" + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: [Semaphore new]). "user interrupt Semaphore" - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay Semaphore)" - newArray at: 31 put: (self specialObjectsArray at: 31). "(user interrupt Semaphore)" "Entries 32 - 34 unreferenced. Previously these contained prototype instances to be copied for fast initialization" + newArray at: 32 put: nil. "was the prototype Float" + newArray at: 33 put: nil. "was the prototype 4-byte LargePositiveInteger" + newArray at: 34 put: nil. "was the prototype Point" - newArray at: 32 put: nil. "was (Float new: 2)" - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" - newArray at: 34 put: nil. "was Point new" newArray at: 35 put: #cannotInterpret:. + newArray at: 36 put: nil. "was the prototype MethodContext" - "Note: This must be fixed once we start using context prototypes (yeah, right)" - "(MethodContext new: CompiledMethod fullFrameSize)." - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the prototype MethodContext (unused by the VM)" newArray at: 37 put: BlockClosure. + newArray at: 38 put: nil. "was the prototype BlockContext" - "(BlockContext new: CompiledMethod fullFrameSize)." - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the prototype BlockContext (unused by the VM)" "array of objects referred to by external code" + newArray at: 39 put: (self specialObjectsArray at: 39). "external semaphores" - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve external semaphores" newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls in CogMT" + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). "finalization Semaphore" - newArray at: 41 put: nil. "Reserved for a LinkedList instance for overlapped calls in CogMT" - "finalization Semaphore" - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). newArray at: 43 put: LargeNegativeInteger. "External objects for callout. Note: Written so that one can actually completely remove the FFI." newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). newArray at: 46 put: (self at: #ExternalData ifAbsent: []). newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). newArray at: 49 put: #aboutToReturn:through:. newArray at: 50 put: #run:with:in:. "51 reserved for immutability message" + newArray at: 51 put: #attemptToAssign:withIndex:. - "newArray at: 51 put: #attemptToAssign:withIndex:." - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: []). newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' #'bad argument' #'bad index' #'bad number of arguments' #'inappropriate operation' #'unsupported operation' #'no modification' #'insufficient object memory' #'insufficient C memory' #'not found' #'bad method' #'internal error in named primitive machinery' #'object may move' #'resource limit exceeded' + #'object is pinned' #'primitive write beyond end of object'). - #'object is pinned'). "53 to 55 are for Alien" newArray at: 53 put: (self at: #Alien ifAbsent: []). + newArray at: 54 put: #invokeCallbackContext:. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." - newArray at: 54 put: #invokeCallbackContext::. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). + "Used to be WeakFinalizationList for WeakFinalizationList hasNewFinalization, obsoleted by ephemeron support." + newArray at: 56 put: nil. - "Weak reference finalization" - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: []). "reserved for foreign callback process" newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: []). newArray at: 58 put: #unusedBytecode. + "59 reserved for Sista counter tripped message" + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. + "60 reserved for Sista class trap message" + newArray at: 60 put: #classTrapFor:. "Now replace the interpreter's reference in one atomic operation" + self specialObjectsArray becomeForward: newArray! - self specialObjectsArray becomeForward: newArray - ! Item was changed: ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and quit') ----- setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" - "Adjust the VM's default GC parameters to avoid premature tenuring." + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! - self vmParameterAt: 5 put: 4000. "do an incremental GC after this many allocations" - self vmParameterAt: 6 put: 2000. "tenure when more than this many objects survive the GC" - ! Item was changed: ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance size') ----- spaceForInstancesOf: aClass + "Answer a pair of the number of bytes consumed by all instances of the + given class, including their object headers, and the number of instances." - "Answer the number of bytes consumed by all instances of the given class, including their object headers and the number of instances." + | instances total | + instances := aClass allInstances. + instances isEmpty ifTrue: [^#(0 0)]. - | smallHeaderSize instVarBytes isVariable bytesPerElement total lastInstance instance instanceCount | - instance := aClass someInstance ifNil: [ ^#(0 0) ]. - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. - instVarBytes := aClass instSize * 4. - isVariable := aClass isVariable. - bytesPerElement := isVariable - ifFalse: [ 0 ] - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. total := 0. + aClass isVariable + ifTrue: + [instances do: + [:i| total := total + (aClass byteSizeOfInstanceOfSize: i basicSize)]] + ifFalse: + [total := instances size * aClass byteSizeOfInstance]. + ^{ total. instances size }! - instanceCount := 0. - "A modified version of #allInstancesDo: is inlined here. It avoids an infinite loop when another process is creating new instances of aClass." - self flag: #allInstancesDo:. - lastInstance := - aClass == CompiledMethod "CompiledMethod has special format, see its class comment" - ifTrue: [aClass new] - ifFalse: [aClass basicNew]. - [ instance == lastInstance ] whileFalse: [ - | contentBytes headerBytes | - contentBytes := instVarBytes + (isVariable - ifFalse: [ 0 ] - ifTrue: [ instance basicSize * bytesPerElement ]). - headerBytes := contentBytes > 255 - ifTrue: [ 12 ] - ifFalse: [ smallHeaderSize ]. - total := total + headerBytes + (contentBytes roundUpTo: 4). - instanceCount := instanceCount + 1. - instance := instance nextInstance ]. - ^{ total. instanceCount }! Item was added: + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Fail if no memory is available. Essential." + + ^(numBytes isInteger and: [numBytes > 0]) + ifTrue: [OutOfMemory signal] + ifFalse: [self primitiveFailed]! Item was added: + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was added: + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot and quit') ----- + setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" + + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! Item was added: + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- + allObjects + "Answer an Array of all objects in the system. Fail if + there isn't enough memory to instantiate the result." + + ^self primitiveFailed! Item was changed: ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- allObjectsDo: aBlock + "Evaluate the argument, aBlock, for each object in the system, excluding immediates + such as SmallInteger and Character." + self allObjectsOrNil + ifNotNil: [:allObjects| allObjects do: aBlock] + ifNil: + ["Fall back on the old single object primitive code. With closures, this needs + to use an end marker (lastObject) since activation of the block will create + new contexts and cause an infinite loop. The lastObject must be created + before calling someObject, so that the VM can settle the enumeration (e.g. + by flushing new space) as a side effect of someObject" + | object lastObject | + lastObject := Object new. + object := self someObject. + [lastObject == object or: [0 == object]] whileFalse: + [aBlock value: object. + object := object nextObject]]! - "Evaluate the argument, aBlock, for each object in the system - excluding SmallIntegers. With closures, this needs to use an end - marker (lastObject) since activation of the block will create new - contexts and cause an infinite loop." - | object lastObject | - object := self someObject. - lastObject := Object new. - [lastObject == object or: [0 == object]] - whileFalse: [aBlock value: object. - object := object nextObject]! Item was added: + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') ----- + allObjectsOrNil + "Answer an Array of all objects in the system. Fail if there isn't + enough memory to instantiate the result and answer nil." + + ^nil! From commits at source.squeak.org Thu Jul 2 00:01:52 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 2 00:01:55 2015 Subject: [squeak-dev] The Trunk: System.spur-eem.749.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System.spur-eem.749.mcz ==================== Summary ==================== Name: System.spur-eem.749 Author: eem Time: 1 July 2015, 4:55:03.654 pm UUID: 2c60523f-54e9-4204-b5ea-25b60e690cab Ancestors: System-eem.749, System.spur-ul.748 System-eem.749 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Revert storePreferencesIn: to work with a copy, which accords with the old code. Go for brevity in prefEvent:. =============== Diff against System-eem.749 =============== Item was removed: - Object subclass: #ObjectHistory - instanceVariableNames: 'marks markProcess' - classVariableNames: 'Current ObjectHistoryEnabled' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! - ObjectHistory holds ObjectHistoryMark objects which are placed in the object memory at regular intervals by its markProcess in the background. Adjacent marks (with no remaining objects inbetween) are coalesced so over time the collection does not grow unnecessarily large. - - Using these markers it is possible to determine the age of objects in memory from the time the ObjectHistory was initialized. Try e.g.: - self oopTimestamp. - self oopAge. - ObjectHistory current oopClassesByDate. - - Instance Variables - marks: SortedCollection of ObjectHistoryMark objects - markProcess: a Process running our markLoop - ! Item was removed: - ----- Method: ObjectHistory class>>current (in category 'accessing') ----- - current - ^ Current ifNil: [Current := self new]! Item was removed: - ----- Method: ObjectHistory class>>initialize (in category 'class initialization') ----- - initialize - self current. - ! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category 'preferences') ----- - keepTrackOfObjectHistory - - ^ ObjectHistoryEnabled ifNil: [ - Current - ifNil: [false] - ifNotNil: [:objectHistory | objectHistory isRunning]]! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in category 'preferences') ----- - keepTrackOfObjectHistory: aBoolean - " Reflect the desired state by starting/stopping the process if necessary " - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. - ObjectHistoryEnabled := aBoolean. - - Current - ifNil: [aBoolean ifTrue: [self current]] - ifNotNil: [:objectHistory | - (objectHistory isRunning xor: aBoolean) "state switch needed" - ifTrue: [objectHistory toggleRunning]].! Item was removed: - ----- Method: ObjectHistory class>>obsolete (in category 'class initialization') ----- - obsolete - "Kill the mark process before removing the class." - Current ifNotNil: - [:objectHistory| - objectHistory terminate]. - super obsolete! Item was removed: - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- - ageOf: anObject - "Age of anObject in seconds" - | timestamp | - timestamp := self timestampOf: anObject. - timestamp ifNil: [^0]. - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! Item was removed: - ----- Method: ObjectHistory>>initialize (in category 'initializing') ----- - initialize - self restartMarkProcess. - - ! Item was removed: - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- - isRunning - ^ markProcess - ifNil: [false] - ifNotNil: [:process | - process isSuspended not and: [ - process isTerminated not]]! Item was removed: - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- - markLoop - [true] whileTrue: [ - self markUpdate. - (Delay forSeconds: self markRate) wait]! Item was removed: - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- - markRate - "rate of creating ObjectHistoryMarks" - ^60! Item was removed: - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- - markUpdate - "Add a new mark and compact the marks collection" - | mark prev | - "lazy init so this happens in the background process" - marks ifNil: [self reinitMarks]. - "add new mark to object memory" - mark := self newMark. - mark timestamp <= marks last timestamp ifTrue: [^self "could happen if clock is wrong"]. - marks addLast: mark. - "compact the table by removing adjacent marks" - prev := marks first. - marks removeAllSuchThat: [:each | | doDelete | - doDelete := prev objectAfter == each. - prev := each. - doDelete]. - "The loop above is O(n) in number of marks, but that number should never become so large to be an issue. Even if the number was large, this is running at system background priority so should not interfere with any user process, not even user background processes. The symptom should only be that the system is less idle. - - If we ever get to a point where the number of marks is an issue then the compacting here could be made partial: since old marks rarely get coalesced it would make sense to only check the newer ones often, and the old ones perhaps only at the system startup."! Item was removed: - ----- Method: ObjectHistory>>newMark (in category 'private') ----- - newMark - ^ ObjectHistoryMark new! Item was removed: - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- - oopClassesByAge - "Answer collection of (oopAge in seconds -> sorted counts of object classes) sorted from lowest age" - "ObjectHistory current oopClassesByAge" - - | stats prev endOfMemory now bag age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - bag := Bag new. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> bag sortedCounts]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') ----- - oopClassesByDate - "Answer collection of (Date -> sorted counts of object classes) sorted from newest date" - "ObjectHistory current oopClassesByDate" - - | stats prev endOfMemory bag date obj thisDate | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - thisDate := nil. - bag := Bag new. - marks do: [:mark | - prev ifNotNil: [ - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - date := mark timestamp asDate. - thisDate = date ifFalse: [ - stats addFirst: date -> bag sortedCounts. - bag := Bag new. - thisDate := date]]. - prev := mark]. - thisDate = date ifFalse: [ - stats addLast: date -> bag sortedCounts]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- - oopCountsByAge - "Answer collection of (oopAge in seconds -> number of objects) sorted from lowest age" - "ObjectHistory current oopCountsByAge" - - | stats prev endOfMemory now n age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - n := 0. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - n := n + 1. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> n]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- - reinitMarks - marks := ObjectHistoryMark allInstances asOrderedCollection. - marks - ifEmpty: [marks add: self newMark] - ifNotEmpty: [ | prev | - prev := nil. - marks removeAllSuchThat: [:obj | - prev notNil and: [prev timestamp >= obj timestamp]]]. - ! Item was removed: - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') ----- - restartMarkProcess - markProcess ifNotNil: [markProcess terminate]. - markProcess := [self markLoop] - forkAt: Processor systemBackgroundPriority - named: 'ObjectHistory''s markProcess'. - ! Item was removed: - ----- Method: ObjectHistory>>terminate (in category 'private') ----- - terminate - markProcess ifNotNil: - [markProcess terminate]! Item was removed: - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- - timestampOf: anObject - "Timestamp of anObject, or nil if too new" - | endOfMemory mark | - anObject class == SmallInteger ifTrue: [^nil]. - mark := anObject. - endOfMemory := Object new. - [mark class == ObjectHistoryMark] whileFalse: [ - mark := mark nextObject. - mark == endOfMemory ifTrue: [^nil]]. - ^mark timestamp! Item was removed: - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- - toggleRunning - self isRunning - ifTrue: [self terminate] - ifFalse: [self restartMarkProcess]! Item was removed: - Object subclass: #ObjectHistoryMark - instanceVariableNames: 'timestamp' - classVariableNames: '' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! - An ObjectHistoryMark is a permanent mark in the object memory. It holds a timestamp. - - While the timestamp could be used directly as mark by ObjectHistory, it's conceivable that its format might change in the future, and we do not want the mark's relative position in memory to change (which would be the case if it was migrated to a new format). So we use a distinct object instead (and we protect it against accidental become-ing by overriding those methods).! Item was removed: - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- - become: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') ----- - becomeForward: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>initialize (in category 'initialization') ----- - initialize - timestamp := DateAndTime now floor. - ! Item was removed: - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') ----- - objectAfter - "Answer the next object in memory after me and my timestamp" - | successor | - successor := self nextObject. - successor == timestamp - ifTrue: [successor := successor nextObject]. - ^ successor! Item was removed: - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- - printOn: aStream - aStream - nextPutAll: self class name; - nextPut: $(; - print: timestamp; - nextPut: $)! Item was removed: - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') ----- - timestamp - ^timestamp - ! Item was changed: ----- Method: SmalltalkImage>>compactClassesArray (in category 'special objects') ----- compactClassesArray "Smalltalk compactClassesArray" + "Backward-compatibility support. Spur does not have compact classes." + ^{}! - "Return the array of 31 classes whose instances may be - represented compactly" - ^ self specialObjectsArray at: 29! Item was added: + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Essential. Fail if no memory is available." + + (numBytes isInteger and: [numBytes > 0]) ifTrue: + [OutOfMemory signal]. + ^self primitiveFailed! Item was added: + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was changed: ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') ----- primBytesLeft + "Primitive. Answer the number of free bytes available in old space. + Not accurate unless preceded by - "Primitive. Answer the number of bytes available for new object data. - Not accurate unless preceded by Smalltalk garbageCollectMost (for reasonable accuracy), or Smalltalk garbageCollect (for real accuracy). + See Object documentation whatIsAPrimitive." - See Object documentation whatIsAPrimitive." + ^0! - ^ 0! Item was changed: ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category 'memory space') ----- primitiveGarbageCollect + "Primitive. Reclaims all garbage and answers the size of the largest free chunk in old space.." - "Primitive. Reclaims all garbage and answers the number of bytes of available space." + ^self primitiveFailed! - ^ self primBytesLeft! Item was changed: ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category 'special objects') ----- recreateSpecialObjectsArray "Smalltalk recreateSpecialObjectsArray" "To external package developers: **** DO NOT OVERRIDE THIS METHOD. ***** If you are writing a plugin and need additional special object(s) for your own use, use addGCRoot() function and use own, separate special objects registry " "The Special Objects Array is an array of objects used by the Squeak virtual machine. Its contents are critical and accesses to it by the VM are unchecked, so don't even think of playing here unless you know what you are doing." | newArray | + newArray := Array new: 60. - newArray := Array new: 58. "Nil false and true get used throughout the interpreter" newArray at: 1 put: nil. newArray at: 2 put: false. newArray at: 3 put: true. "This association holds the active process (a ProcessScheduler)" newArray at: 4 put: (self specialObjectsArray at: 4) "(self bindingOf: #Processor) but it answers an Alias". "Numerous classes below used for type checking and instantiation" newArray at: 5 put: Bitmap. newArray at: 6 put: SmallInteger. newArray at: 7 put: ByteString. newArray at: 8 put: Array. newArray at: 9 put: Smalltalk. + newArray at: 10 put: BoxedFloat64. + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: [self globals at: #Context]). + newArray at: 12 put: nil. "was BlockContext." - newArray at: 10 put: Float. - newArray at: 11 put: MethodContext. - newArray at: 12 put: BlockContext. newArray at: 13 put: Point. newArray at: 14 put: LargePositiveInteger. newArray at: 15 put: Display. newArray at: 16 put: Message. newArray at: 17 put: CompiledMethod. + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: [Semaphore new]). "low space Semaphore" - newArray at: 18 put: (self specialObjectsArray at: 18). - "(low space Semaphore)" newArray at: 19 put: Semaphore. newArray at: 20 put: Character. newArray at: 21 put: #doesNotUnderstand:. newArray at: 22 put: #cannotReturn:. newArray at: 23 put: nil. "This is the process signalling low space." "An array of the 32 selectors that are compiled as special bytecodes, paired alternately with the number of arguments each takes." newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 #* 1 #/ 1 #\\ 1 #@ 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 #at: 1 #at:put: 2 #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 #blockCopy: 1 #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). "An array of the 255 Characters in ascii order. + Cog inlines table into machine code at: prim so do not regenerate it. + This is nil in Spur, which has immediate Characters." - Cog inlines table into machine code at: prim so do not regenerate it." newArray at: 25 put: (self specialObjectsArray at: 25). newArray at: 26 put: #mustBeBoolean. newArray at: 27 put: ByteArray. newArray at: 28 put: Process. + "An array of up to 31 classes whose instances will have compact headers; an empty array in Spur" - "An array of up to 31 classes whose instances will have compact headers" newArray at: 29 put: self compactClassesArray. + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: [Semaphore new]). "delay Semaphore" + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: [Semaphore new]). "user interrupt Semaphore" - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay Semaphore)" - newArray at: 31 put: (self specialObjectsArray at: 31). "(user interrupt Semaphore)" "Entries 32 - 34 unreferenced. Previously these contained prototype instances to be copied for fast initialization" + newArray at: 32 put: nil. "was the prototype Float" + newArray at: 33 put: nil. "was the prototype 4-byte LargePositiveInteger" + newArray at: 34 put: nil. "was the prototype Point" - newArray at: 32 put: nil. "was (Float new: 2)" - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" - newArray at: 34 put: nil. "was Point new" newArray at: 35 put: #cannotInterpret:. + newArray at: 36 put: nil. "was the prototype MethodContext" - "Note: This must be fixed once we start using context prototypes (yeah, right)" - "(MethodContext new: CompiledMethod fullFrameSize)." - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the prototype MethodContext (unused by the VM)" newArray at: 37 put: BlockClosure. + newArray at: 38 put: nil. "was the prototype BlockContext" - "(BlockContext new: CompiledMethod fullFrameSize)." - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the prototype BlockContext (unused by the VM)" "array of objects referred to by external code" + newArray at: 39 put: (self specialObjectsArray at: 39). "external semaphores" - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve external semaphores" newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls in CogMT" + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). "finalization Semaphore" - newArray at: 41 put: nil. "Reserved for a LinkedList instance for overlapped calls in CogMT" - "finalization Semaphore" - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). newArray at: 43 put: LargeNegativeInteger. "External objects for callout. Note: Written so that one can actually completely remove the FFI." newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). newArray at: 46 put: (self at: #ExternalData ifAbsent: []). newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). newArray at: 49 put: #aboutToReturn:through:. newArray at: 50 put: #run:with:in:. "51 reserved for immutability message" + newArray at: 51 put: #attemptToAssign:withIndex:. - "newArray at: 51 put: #attemptToAssign:withIndex:." - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: []). newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' #'bad argument' #'bad index' #'bad number of arguments' #'inappropriate operation' #'unsupported operation' #'no modification' #'insufficient object memory' #'insufficient C memory' #'not found' #'bad method' #'internal error in named primitive machinery' #'object may move' #'resource limit exceeded' + #'object is pinned' #'primitive write beyond end of object'). - #'object is pinned'). "53 to 55 are for Alien" newArray at: 53 put: (self at: #Alien ifAbsent: []). + newArray at: 54 put: #invokeCallbackContext:. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." - newArray at: 54 put: #invokeCallbackContext::. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). + "Used to be WeakFinalizationList for WeakFinalizationList hasNewFinalization, obsoleted by ephemeron support." + newArray at: 56 put: nil. - "Weak reference finalization" - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: []). "reserved for foreign callback process" newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: []). newArray at: 58 put: #unusedBytecode. + "59 reserved for Sista counter tripped message" + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. + "60 reserved for Sista class trap message" + newArray at: 60 put: #classTrapFor:. "Now replace the interpreter's reference in one atomic operation" + self specialObjectsArray becomeForward: newArray! - self specialObjectsArray becomeForward: newArray - ! Item was changed: ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and quit') ----- setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" - "Adjust the VM's default GC parameters to avoid premature tenuring." + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! - self vmParameterAt: 5 put: 4000. "do an incremental GC after this many allocations" - self vmParameterAt: 6 put: 2000. "tenure when more than this many objects survive the GC" - ! Item was changed: ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance size') ----- spaceForInstancesOf: aClass + "Answer a pair of the number of bytes consumed by all instances of the + given class, including their object headers, and the number of instances." - "Answer the number of bytes consumed by all instances of the given class, including their object headers and the number of instances." + | instances total | + instances := aClass allInstances. + instances isEmpty ifTrue: [^#(0 0)]. - | smallHeaderSize instVarBytes isVariable bytesPerElement total lastInstance instance instanceCount | - instance := aClass someInstance ifNil: [ ^#(0 0) ]. - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. - instVarBytes := aClass instSize * 4. - isVariable := aClass isVariable. - bytesPerElement := isVariable - ifFalse: [ 0 ] - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. total := 0. + aClass isVariable + ifTrue: + [instances do: + [:i| total := total + (aClass byteSizeOfInstanceOfSize: i basicSize)]] + ifFalse: + [total := instances size * aClass byteSizeOfInstance]. + ^{ total. instances size }! - instanceCount := 0. - "A modified version of #allInstancesDo: is inlined here. It avoids an infinite loop when another process is creating new instances of aClass." - self flag: #allInstancesDo:. - lastInstance := - aClass == CompiledMethod "CompiledMethod has special format, see its class comment" - ifTrue: [aClass new] - ifFalse: [aClass basicNew]. - [ instance == lastInstance ] whileFalse: [ - | contentBytes headerBytes | - contentBytes := instVarBytes + (isVariable - ifFalse: [ 0 ] - ifTrue: [ instance basicSize * bytesPerElement ]). - headerBytes := contentBytes > 255 - ifTrue: [ 12 ] - ifFalse: [ smallHeaderSize ]. - total := total + headerBytes + (contentBytes roundUpTo: 4). - instanceCount := instanceCount + 1. - instance := instance nextInstance ]. - ^{ total. instanceCount }! Item was added: + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Fail if no memory is available. Essential." + + ^(numBytes isInteger and: [numBytes > 0]) + ifTrue: [OutOfMemory signal] + ifFalse: [self primitiveFailed]! Item was added: + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was added: + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot and quit') ----- + setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" + + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! Item was added: + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- + allObjects + "Answer an Array of all objects in the system. Fail if + there isn't enough memory to instantiate the result." + + ^self primitiveFailed! Item was changed: ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- allObjectsDo: aBlock + "Evaluate the argument, aBlock, for each object in the system, excluding immediates + such as SmallInteger and Character." + self allObjectsOrNil + ifNotNil: [:allObjects| allObjects do: aBlock] + ifNil: + ["Fall back on the old single object primitive code. With closures, this needs + to use an end marker (lastObject) since activation of the block will create + new contexts and cause an infinite loop. The lastObject must be created + before calling someObject, so that the VM can settle the enumeration (e.g. + by flushing new space) as a side effect of someObject" + | object lastObject | + lastObject := Object new. + object := self someObject. + [lastObject == object or: [0 == object]] whileFalse: + [aBlock value: object. + object := object nextObject]]! - "Evaluate the argument, aBlock, for each object in the system - excluding SmallIntegers. With closures, this needs to use an end - marker (lastObject) since activation of the block will create new - contexts and cause an infinite loop." - | object lastObject | - object := self someObject. - lastObject := Object new. - [lastObject == object or: [0 == object]] - whileFalse: [aBlock value: object. - object := object nextObject]! Item was added: + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') ----- + allObjectsOrNil + "Answer an Array of all objects in the system. Fail if there isn't + enough memory to instantiate the result and answer nil." + + ^nil! From commits at source.squeak.org Thu Jul 2 00:01:55 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 2 00:02:00 2015 Subject: [squeak-dev] The Trunk: System.spur-eem.750.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System.spur-eem.750.mcz ==================== Summary ==================== Name: System.spur-eem.750 Author: eem Time: 1 July 2015, 4:55:12.118 pm UUID: d721e23d-2afc-4112-89c0-46293a02047e Ancestors: System-eem.750, System.spur-eem.749 System-eem.750 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Provide a defaultAction for Warning that gives the user the option of debugging, ignoring or terminating when a Warning is raised in normal execution, or allows the Debugger to handle it if a Warning is raised during debugging. =============== Diff against System-eem.750 =============== Item was removed: - Object subclass: #ObjectHistory - instanceVariableNames: 'marks markProcess' - classVariableNames: 'Current ObjectHistoryEnabled' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! - ObjectHistory holds ObjectHistoryMark objects which are placed in the object memory at regular intervals by its markProcess in the background. Adjacent marks (with no remaining objects inbetween) are coalesced so over time the collection does not grow unnecessarily large. - - Using these markers it is possible to determine the age of objects in memory from the time the ObjectHistory was initialized. Try e.g.: - self oopTimestamp. - self oopAge. - ObjectHistory current oopClassesByDate. - - Instance Variables - marks: SortedCollection of ObjectHistoryMark objects - markProcess: a Process running our markLoop - ! Item was removed: - ----- Method: ObjectHistory class>>current (in category 'accessing') ----- - current - ^ Current ifNil: [Current := self new]! Item was removed: - ----- Method: ObjectHistory class>>initialize (in category 'class initialization') ----- - initialize - self current. - ! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category 'preferences') ----- - keepTrackOfObjectHistory - - ^ ObjectHistoryEnabled ifNil: [ - Current - ifNil: [false] - ifNotNil: [:objectHistory | objectHistory isRunning]]! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in category 'preferences') ----- - keepTrackOfObjectHistory: aBoolean - " Reflect the desired state by starting/stopping the process if necessary " - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. - ObjectHistoryEnabled := aBoolean. - - Current - ifNil: [aBoolean ifTrue: [self current]] - ifNotNil: [:objectHistory | - (objectHistory isRunning xor: aBoolean) "state switch needed" - ifTrue: [objectHistory toggleRunning]].! Item was removed: - ----- Method: ObjectHistory class>>obsolete (in category 'class initialization') ----- - obsolete - "Kill the mark process before removing the class." - Current ifNotNil: - [:objectHistory| - objectHistory terminate]. - super obsolete! Item was removed: - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- - ageOf: anObject - "Age of anObject in seconds" - | timestamp | - timestamp := self timestampOf: anObject. - timestamp ifNil: [^0]. - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! Item was removed: - ----- Method: ObjectHistory>>initialize (in category 'initializing') ----- - initialize - self restartMarkProcess. - - ! Item was removed: - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- - isRunning - ^ markProcess - ifNil: [false] - ifNotNil: [:process | - process isSuspended not and: [ - process isTerminated not]]! Item was removed: - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- - markLoop - [true] whileTrue: [ - self markUpdate. - (Delay forSeconds: self markRate) wait]! Item was removed: - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- - markRate - "rate of creating ObjectHistoryMarks" - ^60! Item was removed: - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- - markUpdate - "Add a new mark and compact the marks collection" - | mark prev | - "lazy init so this happens in the background process" - marks ifNil: [self reinitMarks]. - "add new mark to object memory" - mark := self newMark. - mark timestamp <= marks last timestamp ifTrue: [^self "could happen if clock is wrong"]. - marks addLast: mark. - "compact the table by removing adjacent marks" - prev := marks first. - marks removeAllSuchThat: [:each | | doDelete | - doDelete := prev objectAfter == each. - prev := each. - doDelete]. - "The loop above is O(n) in number of marks, but that number should never become so large to be an issue. Even if the number was large, this is running at system background priority so should not interfere with any user process, not even user background processes. The symptom should only be that the system is less idle. - - If we ever get to a point where the number of marks is an issue then the compacting here could be made partial: since old marks rarely get coalesced it would make sense to only check the newer ones often, and the old ones perhaps only at the system startup."! Item was removed: - ----- Method: ObjectHistory>>newMark (in category 'private') ----- - newMark - ^ ObjectHistoryMark new! Item was removed: - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- - oopClassesByAge - "Answer collection of (oopAge in seconds -> sorted counts of object classes) sorted from lowest age" - "ObjectHistory current oopClassesByAge" - - | stats prev endOfMemory now bag age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - bag := Bag new. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> bag sortedCounts]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') ----- - oopClassesByDate - "Answer collection of (Date -> sorted counts of object classes) sorted from newest date" - "ObjectHistory current oopClassesByDate" - - | stats prev endOfMemory bag date obj thisDate | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - thisDate := nil. - bag := Bag new. - marks do: [:mark | - prev ifNotNil: [ - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - date := mark timestamp asDate. - thisDate = date ifFalse: [ - stats addFirst: date -> bag sortedCounts. - bag := Bag new. - thisDate := date]]. - prev := mark]. - thisDate = date ifFalse: [ - stats addLast: date -> bag sortedCounts]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- - oopCountsByAge - "Answer collection of (oopAge in seconds -> number of objects) sorted from lowest age" - "ObjectHistory current oopCountsByAge" - - | stats prev endOfMemory now n age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - n := 0. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - n := n + 1. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> n]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- - reinitMarks - marks := ObjectHistoryMark allInstances asOrderedCollection. - marks - ifEmpty: [marks add: self newMark] - ifNotEmpty: [ | prev | - prev := nil. - marks removeAllSuchThat: [:obj | - prev notNil and: [prev timestamp >= obj timestamp]]]. - ! Item was removed: - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') ----- - restartMarkProcess - markProcess ifNotNil: [markProcess terminate]. - markProcess := [self markLoop] - forkAt: Processor systemBackgroundPriority - named: 'ObjectHistory''s markProcess'. - ! Item was removed: - ----- Method: ObjectHistory>>terminate (in category 'private') ----- - terminate - markProcess ifNotNil: - [markProcess terminate]! Item was removed: - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- - timestampOf: anObject - "Timestamp of anObject, or nil if too new" - | endOfMemory mark | - anObject class == SmallInteger ifTrue: [^nil]. - mark := anObject. - endOfMemory := Object new. - [mark class == ObjectHistoryMark] whileFalse: [ - mark := mark nextObject. - mark == endOfMemory ifTrue: [^nil]]. - ^mark timestamp! Item was removed: - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- - toggleRunning - self isRunning - ifTrue: [self terminate] - ifFalse: [self restartMarkProcess]! Item was removed: - Object subclass: #ObjectHistoryMark - instanceVariableNames: 'timestamp' - classVariableNames: '' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! - An ObjectHistoryMark is a permanent mark in the object memory. It holds a timestamp. - - While the timestamp could be used directly as mark by ObjectHistory, it's conceivable that its format might change in the future, and we do not want the mark's relative position in memory to change (which would be the case if it was migrated to a new format). So we use a distinct object instead (and we protect it against accidental become-ing by overriding those methods).! Item was removed: - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- - become: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') ----- - becomeForward: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>initialize (in category 'initialization') ----- - initialize - timestamp := DateAndTime now floor. - ! Item was removed: - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') ----- - objectAfter - "Answer the next object in memory after me and my timestamp" - | successor | - successor := self nextObject. - successor == timestamp - ifTrue: [successor := successor nextObject]. - ^ successor! Item was removed: - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- - printOn: aStream - aStream - nextPutAll: self class name; - nextPut: $(; - print: timestamp; - nextPut: $)! Item was removed: - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') ----- - timestamp - ^timestamp - ! Item was changed: ----- Method: SmalltalkImage>>compactClassesArray (in category 'special objects') ----- compactClassesArray "Smalltalk compactClassesArray" + "Backward-compatibility support. Spur does not have compact classes." + ^{}! - "Return the array of 31 classes whose instances may be - represented compactly" - ^ self specialObjectsArray at: 29! Item was added: + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Essential. Fail if no memory is available." + + (numBytes isInteger and: [numBytes > 0]) ifTrue: + [OutOfMemory signal]. + ^self primitiveFailed! Item was added: + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was changed: ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') ----- primBytesLeft + "Primitive. Answer the number of free bytes available in old space. + Not accurate unless preceded by - "Primitive. Answer the number of bytes available for new object data. - Not accurate unless preceded by Smalltalk garbageCollectMost (for reasonable accuracy), or Smalltalk garbageCollect (for real accuracy). + See Object documentation whatIsAPrimitive." - See Object documentation whatIsAPrimitive." + ^0! - ^ 0! Item was changed: ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category 'memory space') ----- primitiveGarbageCollect + "Primitive. Reclaims all garbage and answers the size of the largest free chunk in old space.." - "Primitive. Reclaims all garbage and answers the number of bytes of available space." + ^self primitiveFailed! - ^ self primBytesLeft! Item was changed: ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category 'special objects') ----- recreateSpecialObjectsArray "Smalltalk recreateSpecialObjectsArray" "To external package developers: **** DO NOT OVERRIDE THIS METHOD. ***** If you are writing a plugin and need additional special object(s) for your own use, use addGCRoot() function and use own, separate special objects registry " "The Special Objects Array is an array of objects used by the Squeak virtual machine. Its contents are critical and accesses to it by the VM are unchecked, so don't even think of playing here unless you know what you are doing." | newArray | + newArray := Array new: 60. - newArray := Array new: 58. "Nil false and true get used throughout the interpreter" newArray at: 1 put: nil. newArray at: 2 put: false. newArray at: 3 put: true. "This association holds the active process (a ProcessScheduler)" newArray at: 4 put: (self specialObjectsArray at: 4) "(self bindingOf: #Processor) but it answers an Alias". "Numerous classes below used for type checking and instantiation" newArray at: 5 put: Bitmap. newArray at: 6 put: SmallInteger. newArray at: 7 put: ByteString. newArray at: 8 put: Array. newArray at: 9 put: Smalltalk. + newArray at: 10 put: BoxedFloat64. + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: [self globals at: #Context]). + newArray at: 12 put: nil. "was BlockContext." - newArray at: 10 put: Float. - newArray at: 11 put: MethodContext. - newArray at: 12 put: BlockContext. newArray at: 13 put: Point. newArray at: 14 put: LargePositiveInteger. newArray at: 15 put: Display. newArray at: 16 put: Message. newArray at: 17 put: CompiledMethod. + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: [Semaphore new]). "low space Semaphore" - newArray at: 18 put: (self specialObjectsArray at: 18). - "(low space Semaphore)" newArray at: 19 put: Semaphore. newArray at: 20 put: Character. newArray at: 21 put: #doesNotUnderstand:. newArray at: 22 put: #cannotReturn:. newArray at: 23 put: nil. "This is the process signalling low space." "An array of the 32 selectors that are compiled as special bytecodes, paired alternately with the number of arguments each takes." newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 #* 1 #/ 1 #\\ 1 #@ 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 #at: 1 #at:put: 2 #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 #blockCopy: 1 #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). "An array of the 255 Characters in ascii order. + Cog inlines table into machine code at: prim so do not regenerate it. + This is nil in Spur, which has immediate Characters." - Cog inlines table into machine code at: prim so do not regenerate it." newArray at: 25 put: (self specialObjectsArray at: 25). newArray at: 26 put: #mustBeBoolean. newArray at: 27 put: ByteArray. newArray at: 28 put: Process. + "An array of up to 31 classes whose instances will have compact headers; an empty array in Spur" - "An array of up to 31 classes whose instances will have compact headers" newArray at: 29 put: self compactClassesArray. + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: [Semaphore new]). "delay Semaphore" + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: [Semaphore new]). "user interrupt Semaphore" - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay Semaphore)" - newArray at: 31 put: (self specialObjectsArray at: 31). "(user interrupt Semaphore)" "Entries 32 - 34 unreferenced. Previously these contained prototype instances to be copied for fast initialization" + newArray at: 32 put: nil. "was the prototype Float" + newArray at: 33 put: nil. "was the prototype 4-byte LargePositiveInteger" + newArray at: 34 put: nil. "was the prototype Point" - newArray at: 32 put: nil. "was (Float new: 2)" - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" - newArray at: 34 put: nil. "was Point new" newArray at: 35 put: #cannotInterpret:. + newArray at: 36 put: nil. "was the prototype MethodContext" - "Note: This must be fixed once we start using context prototypes (yeah, right)" - "(MethodContext new: CompiledMethod fullFrameSize)." - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the prototype MethodContext (unused by the VM)" newArray at: 37 put: BlockClosure. + newArray at: 38 put: nil. "was the prototype BlockContext" - "(BlockContext new: CompiledMethod fullFrameSize)." - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the prototype BlockContext (unused by the VM)" "array of objects referred to by external code" + newArray at: 39 put: (self specialObjectsArray at: 39). "external semaphores" - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve external semaphores" newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls in CogMT" + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). "finalization Semaphore" - newArray at: 41 put: nil. "Reserved for a LinkedList instance for overlapped calls in CogMT" - "finalization Semaphore" - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). newArray at: 43 put: LargeNegativeInteger. "External objects for callout. Note: Written so that one can actually completely remove the FFI." newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). newArray at: 46 put: (self at: #ExternalData ifAbsent: []). newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). newArray at: 49 put: #aboutToReturn:through:. newArray at: 50 put: #run:with:in:. "51 reserved for immutability message" + newArray at: 51 put: #attemptToAssign:withIndex:. - "newArray at: 51 put: #attemptToAssign:withIndex:." - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: []). newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' #'bad argument' #'bad index' #'bad number of arguments' #'inappropriate operation' #'unsupported operation' #'no modification' #'insufficient object memory' #'insufficient C memory' #'not found' #'bad method' #'internal error in named primitive machinery' #'object may move' #'resource limit exceeded' + #'object is pinned' #'primitive write beyond end of object'). - #'object is pinned'). "53 to 55 are for Alien" newArray at: 53 put: (self at: #Alien ifAbsent: []). + newArray at: 54 put: #invokeCallbackContext:. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." - newArray at: 54 put: #invokeCallbackContext::. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). + "Used to be WeakFinalizationList for WeakFinalizationList hasNewFinalization, obsoleted by ephemeron support." + newArray at: 56 put: nil. - "Weak reference finalization" - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: []). "reserved for foreign callback process" newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: []). newArray at: 58 put: #unusedBytecode. + "59 reserved for Sista counter tripped message" + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. + "60 reserved for Sista class trap message" + newArray at: 60 put: #classTrapFor:. "Now replace the interpreter's reference in one atomic operation" + self specialObjectsArray becomeForward: newArray! - self specialObjectsArray becomeForward: newArray - ! Item was changed: ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and quit') ----- setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" - "Adjust the VM's default GC parameters to avoid premature tenuring." + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! - self vmParameterAt: 5 put: 4000. "do an incremental GC after this many allocations" - self vmParameterAt: 6 put: 2000. "tenure when more than this many objects survive the GC" - ! Item was changed: ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance size') ----- spaceForInstancesOf: aClass + "Answer a pair of the number of bytes consumed by all instances of the + given class, including their object headers, and the number of instances." - "Answer the number of bytes consumed by all instances of the given class, including their object headers and the number of instances." + | instances total | + instances := aClass allInstances. + instances isEmpty ifTrue: [^#(0 0)]. - | smallHeaderSize instVarBytes isVariable bytesPerElement total lastInstance instance instanceCount | - instance := aClass someInstance ifNil: [ ^#(0 0) ]. - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. - instVarBytes := aClass instSize * 4. - isVariable := aClass isVariable. - bytesPerElement := isVariable - ifFalse: [ 0 ] - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. total := 0. + aClass isVariable + ifTrue: + [instances do: + [:i| total := total + (aClass byteSizeOfInstanceOfSize: i basicSize)]] + ifFalse: + [total := instances size * aClass byteSizeOfInstance]. + ^{ total. instances size }! - instanceCount := 0. - "A modified version of #allInstancesDo: is inlined here. It avoids an infinite loop when another process is creating new instances of aClass." - self flag: #allInstancesDo:. - lastInstance := - aClass == CompiledMethod "CompiledMethod has special format, see its class comment" - ifTrue: [aClass new] - ifFalse: [aClass basicNew]. - [ instance == lastInstance ] whileFalse: [ - | contentBytes headerBytes | - contentBytes := instVarBytes + (isVariable - ifFalse: [ 0 ] - ifTrue: [ instance basicSize * bytesPerElement ]). - headerBytes := contentBytes > 255 - ifTrue: [ 12 ] - ifFalse: [ smallHeaderSize ]. - total := total + headerBytes + (contentBytes roundUpTo: 4). - instanceCount := instanceCount + 1. - instance := instance nextInstance ]. - ^{ total. instanceCount }! Item was added: + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Fail if no memory is available. Essential." + + ^(numBytes isInteger and: [numBytes > 0]) + ifTrue: [OutOfMemory signal] + ifFalse: [self primitiveFailed]! Item was added: + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was added: + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot and quit') ----- + setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" + + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! Item was added: + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- + allObjects + "Answer an Array of all objects in the system. Fail if + there isn't enough memory to instantiate the result." + + ^self primitiveFailed! Item was changed: ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- allObjectsDo: aBlock + "Evaluate the argument, aBlock, for each object in the system, excluding immediates + such as SmallInteger and Character." + self allObjectsOrNil + ifNotNil: [:allObjects| allObjects do: aBlock] + ifNil: + ["Fall back on the old single object primitive code. With closures, this needs + to use an end marker (lastObject) since activation of the block will create + new contexts and cause an infinite loop. The lastObject must be created + before calling someObject, so that the VM can settle the enumeration (e.g. + by flushing new space) as a side effect of someObject" + | object lastObject | + lastObject := Object new. + object := self someObject. + [lastObject == object or: [0 == object]] whileFalse: + [aBlock value: object. + object := object nextObject]]! - "Evaluate the argument, aBlock, for each object in the system - excluding SmallIntegers. With closures, this needs to use an end - marker (lastObject) since activation of the block will create new - contexts and cause an infinite loop." - | object lastObject | - object := self someObject. - lastObject := Object new. - [lastObject == object or: [0 == object]] - whileFalse: [aBlock value: object. - object := object nextObject]! Item was added: + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') ----- + allObjectsOrNil + "Answer an Array of all objects in the system. Fail if there isn't + enough memory to instantiate the result and answer nil." + + ^nil! From eliot.miranda at gmail.com Thu Jul 2 00:38:15 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu Jul 2 00:38:18 2015 Subject: [squeak-dev] The Trunk: Tools-eem.626.mcz In-Reply-To: References: Message-ID: Hi Levente, You're right. The asString sends here are, I think, to guard against being given a text and Text not being protocol-compatible with String. That they're not protocol-compatible is a bug, but the system should still work. I'll take a look. On Wed, Jul 1, 2015 at 1:48 PM, Levente Uzonyi wrote: > Hi Eliot, > > I think an #asString send is missing from the line > > ifTrue: [(methodRef findTokens: '>>') fold: > [:a :b| (a findTokens: ' '), {b first = $# ifTrue: [b allButFirst] ifFalse: > [b]}]] > > It should be > > ifTrue: [(methodRef asString findTokens: > '>>') fold: [:a :b| (a findTokens: ' '), {b first = $# ifTrue: [b > allButFirst] ifFalse: [b]}]] > > It would be even better to store "methodRef asString" in a temporary > variable. > But taking a closer look at the code the #asString sends are unnecessary, > because we already know that methodRef #isString is true. And there's no > point in converting Symbols to Strings for #includesSubString: or > #findTokens:. > > Levente > > > On Tue, 30 Jun 2015, commits@source.squeak.org wrote: > > Eliot Miranda uploaded a new version of Tools to project The Trunk: >> http://source.squeak.org/trunk/Tools-eem.626.mcz >> >> ==================== Summary ==================== >> >> Name: Tools-eem.626 >> Author: eem >> Time: 30 June 2015, 3:05:48.319 pm >> UUID: 0bfae54b-3e68-4252-98d8-ddb1e56fc869 >> Ancestors: Tools-mt.625 >> >> Upgrade MessageSet class>>parse:toClassAndSelector: >> to allow one to construct text links in modern syntax, e.g. >> BitBlt class>>#subPixelRenderColorFonts >> >> =============== Diff against Tools-mt.625 =============== >> >> Item was changed: >> ----- Method: MessageSet class>>parse:toClassAndSelector: (in category >> 'utilities') ----- >> parse: methodRef toClassAndSelector: csBlock >> "Decode strings of the form [class] ." >> >> | tuple cl | >> >> >> self flag: #mref. "compatibility with pre-MethodReference >> lists" >> >> methodRef ifNil: [^ csBlock value: nil value: nil]. >> methodRef isString ifFalse: >> [^methodRef setClassAndSelectorIn: csBlock]. >> methodRef isEmpty ifTrue: >> [^csBlock value: nil value: nil]. >> + tuple := (methodRef asString includesSubString: '>>') >> + ifTrue: [(methodRef findTokens: '>>') >> fold: [:a :b| (a findTokens: ' '), {b first = $# ifTrue: [b allButFirst] >> ifFalse: [b]}]] >> + ifFalse: [methodRef asString findTokens: >> ' .']. >> - tuple := methodRef asString findTokens: ' .'. >> cl := Smalltalk at: tuple first asSymbol ifAbsent: [^ csBlock >> value: nil value: nil]. >> ^(tuple size = 2 or: [tuple size > 2 and: [(tuple at: 2) ~= >> 'class']]) >> ifTrue: [csBlock value: cl value: (tuple at: 2) asSymbol] >> ifFalse: [csBlock value: cl class value: (tuple at: 3) >> asSymbol]! >> >> >> >> > -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150701/8d7e48b8/attachment.htm From commits at source.squeak.org Thu Jul 2 01:27:40 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 2 01:27:42 2015 Subject: [squeak-dev] Squeak 4.6: Tools-eem.628.mcz Message-ID: Chris Muller uploaded a new version of Tools to project Squeak 4.6: http://source.squeak.org/squeak46/Tools-eem.628.mcz ==================== Summary ==================== Name: Tools-eem.628 Author: eem Time: 1 July 2015, 4:40:15.806 pm UUID: 9f27ada3-52e9-4acb-83fe-2c117840e385 Ancestors: Tools-eem.627 Debugger: Extract the exception notification handler into its own method and use it for Through support also. =============== Diff against Tools-eem.626 =============== Item was changed: ----- Method: Debugger>>doStep (in category 'context stack menu') ----- doStep "Send the selected message in the accessed method, and regain control after the invoked method returns." | currentContext newContext | self okToChange ifFalse: [^ self]. self checkContextSelection. currentContext := self selectedContext. + newContext := self handleLabelUpdatesIn: [interruptedProcess completeStep: currentContext] + whenExecuting: currentContext. + newContext == currentContext ifTrue: + [newContext := interruptedProcess stepToSendOrReturn]. - newContext := interruptedProcess completeStep: currentContext. - newContext == currentContext ifTrue: [ - newContext := interruptedProcess stepToSendOrReturn]. self contextStackIndex > 1 ifTrue: [self resetContext: newContext] + ifFalse: + [newContext == currentContext - ifFalse: [newContext == currentContext ifTrue: [self changed: #contentsSelection. self updateInspectors] ifFalse: [self resetContext: newContext]]. ! Item was added: + ----- Method: Debugger>>handleLabelUpdatesIn:whenExecuting: (in category 'context stack menu') ----- + handleLabelUpdatesIn: aBlock whenExecuting: aContext + "Send the selected message in the accessed method, and regain control + after the invoked method returns." + + ^aBlock + on: Notification + do: [:ex| + (ex tag isArray + and: [ex tag size = 2 + and: [(ex tag first == aContext or: [ex tag first hasSender: aContext])]]) + ifTrue: + [self labelString: ex tag second description. + ex resume] + ifFalse: + [ex pass]]! Item was changed: ----- Method: Debugger>>stepIntoBlock (in category 'context stack menu') ----- stepIntoBlock "Send messages until you return to the present method context. Used to step into a block in the method." + self handleLabelUpdatesIn: + [interruptedProcess stepToHome: self selectedContext] + whenExecuting: self selectedContext. + self resetContext: interruptedProcess stepToSendOrReturn! - interruptedProcess stepToHome: self selectedContext. - self resetContext: interruptedProcess stepToSendOrReturn.! From commits at source.squeak.org Thu Jul 2 01:28:31 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 2 01:28:32 2015 Subject: [squeak-dev] Squeak 4.6: Kernel-eem.932.mcz Message-ID: Chris Muller uploaded a new version of Kernel to project Squeak 4.6: http://source.squeak.org/squeak46/Kernel-eem.932.mcz ==================== Summary ==================== Name: Kernel-eem.932 Author: eem Time: 1 July 2015, 4:38:42.065 pm UUID: 12b4ce38-269d-4f6f-9b12-eae61d403a03 Ancestors: Kernel-eem.931 Provide the same Debugger label support as complete: for the step into block support. =============== Diff against Kernel-eem.929 =============== Item was added: + ----- Method: Exception>>canSearchForSignalerContext (in category 'debug support') ----- + canSearchForSignalerContext + "This method is /only/ to support the debugger's catching of exceptions in stepIntoBlock." + ^signalContext isContext! Item was changed: + ----- Method: Exception>>signalerContext (in category 'handling') ----- - ----- Method: Exception>>signalerContext (in category 'printing') ----- signalerContext "Find the first sender of signal(:)" ^ signalContext findContextSuchThat: [:ctxt | (ctxt receiver == self or: [ctxt receiver == self class]) not]! Item was changed: ----- Method: Process>>complete: (in category 'changing suspended state') ----- complete: aContext "Run self until aContext is popped or an unhandled error is raised. Return self's new top context, unless an unhandled error was raised then return the signaler context (rather than open a debugger)." | ctxt pair error | ctxt := suspendedContext. suspendedContext := nil. "disable this process while running its stack in active process below" pair := Processor activeProcess evaluate: [ctxt runUntilErrorOrReturnFrom: aContext] onBehalfOf: self. suspendedContext := pair first. error := pair second. + error ifNotNil: + ["Give a debugger a chance to update its title to reflect the new exception" + Notification new + tag: {aContext. error}; + signal. + ^error signalerContext]. - error ifNotNil: [^ error signalerContext]. ^ suspendedContext! Item was changed: ----- Method: Process>>stepToHome: (in category 'changing suspended state') ----- stepToHome: aContext + "Resume self until the home of top context is aContext. Top context may be a block context. + Catch any UnhandledErrors that are created while stepping, answering the relevant signalerContext + if so. Note that this will cause weird effects if using through to step through UnhandledError + code, but as the doctor ordered, don't do that; use over or into instead." - "Resume self until the home of top context is aContext. Top context may be a block context." + ^Processor activeProcess + evaluate: + [| home anError | + home := aContext home. + [suspendedContext := suspendedContext step. + home == suspendedContext home or: [home isDead]] whileFalse: + [(suspendedContext selector == #signalForException: + and: [suspendedContext receiver == UnhandledError + and: [anError := suspendedContext tempAt: 1. + ((suspendedContext objectClass: anError) includesBehavior: Exception) + and: [anError canSearchForSignalerContext]]]) ifTrue: + [anError signalerContext ifNotNil: + [:unhandledErrorSignalerContext| + [unhandledErrorSignalerContext == suspendedContext] whileFalse: + [self completeStep: suspendedContext]. + "Give a debugger a chance to update its title to reflect the new exception" + Notification new + tag: {unhandledErrorSignalerContext. anError}; + signal. + ^unhandledErrorSignalerContext]]]. + suspendedContext] + onBehalfOf: self! - | home ctxt | - home := aContext home. - [ ctxt := self step. - home == ctxt home. - ] whileFalse: [ - home isDead ifTrue: [^ self suspendedContext]. - ]. - ^ self suspendedContext! From commits at source.squeak.org Thu Jul 2 01:28:41 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 2 01:28:43 2015 Subject: [squeak-dev] Squeak 4.6: Morphic-cmm.991.mcz Message-ID: Chris Muller uploaded a new version of Morphic to project Squeak 4.6: http://source.squeak.org/squeak46/Morphic-cmm.991.mcz ==================== Summary ==================== Name: Morphic-cmm.991 Author: cmm Time: 1 July 2015, 8:10:43.406 pm UUID: bd6be721-c07f-4128-84a0-930b5453d4ba Ancestors: Morphic-eem.990 Remove codename per board request. =============== Diff against Morphic-cmm.989 =============== From commits at source.squeak.org Thu Jul 2 01:29:14 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 2 01:29:15 2015 Subject: [squeak-dev] Squeak 4.6: System-eem.750.mcz Message-ID: Chris Muller uploaded a new version of System to project Squeak 4.6: http://source.squeak.org/squeak46/System-eem.750.mcz ==================== Summary ==================== Name: System-eem.750 Author: eem Time: 1 July 2015, 4:20:21.905 pm UUID: dde31c47-a8ec-451a-a343-5820a048c91c Ancestors: System-eem.749 Provide a defaultAction for Warning that gives the user the option of debugging, ignoring or terminating when a Warning is raised in normal execution, or allows the Debugger to handle it if a Warning is raised during debugging. =============== Diff against System-eem.749 =============== Item was changed: ----- Method: Warning>>defaultAction (in category '*System-exceptionDescription') ----- defaultAction + "Inform the user of a Warning, giving them the choice of ignoring the warning (proceeding), debugging, + or terminating the compuation. If in the context of a debugger, instead allow the debugger to display + the wasrning in context." + | inDebugger | + inDebugger := [UnhandledError signal] + on: UnhandledError + do: [:uhe| uhe isNested]. + inDebugger ifTrue: + [^UnhandledError signalForException: self]. + (UIManager default + chooseFrom: #(proceed debug close) + values: #(proceed debug close) + title: 'Warning: ', self messageText) + caseOf: { + [#proceed] -> [self resume]. + [#debug] -> [UnhandledError signalForException: self]. + [#close] -> [| condemned | + condemned := Processor activeProcess. + Project current spawnNewProcessIfThisIsUI: condemned. + condemned terminate] }! - "The user should be notified of the occurrence of an exceptional occurrence and given an option of continuing or aborting the computation. The description of the occurrence should include any text specified as the argument of the #signal: message." - ToolSet - debugContext: thisContext - label: 'Warning' - contents: self messageText, '\\Select Proceed to continue, or close this window to cancel the operation.' withCRs. - self resume. - ! From leves at elte.hu Thu Jul 2 07:27:13 2015 From: leves at elte.hu (Levente Uzonyi) Date: Thu Jul 2 07:27:17 2015 Subject: [squeak-dev] The Trunk: Tools-eem.626.mcz In-Reply-To: References: Message-ID: Hi Eliot, Sending #isString to a Text instance will return false, which sounds right to me. When #asString is sent to methodRef in the code, the receiver is already a String. Levente On Wed, 1 Jul 2015, Eliot Miranda wrote: > Hi Levente, > You're right.? The asString sends here are, I think, to guard against being given a text and Text not being protocol-compatible with String.? That they're not protocol-compatible is a bug, but the system should still work.? I'll take a look. > > > On Wed, Jul 1, 2015 at 1:48 PM, Levente Uzonyi wrote: > Hi Eliot, > > I think an #asString send is missing from the line > > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ifTrue: [(methodRef findTokens: '>>') fold: [:a :b| (a findTokens: ' '), {b first = $# ifTrue: [b allButFirst] ifFalse: [b]}]] > > It should be > > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ifTrue: [(methodRef asString findTokens: '>>') fold: [:a :b| (a findTokens: ' '), {b first = $# ifTrue: [b allButFirst] ifFalse: [b]}]] > > It would be even better to store "methodRef asString" in a temporary variable. > But taking a closer look at the code the #asString sends are unnecessary, because we already know that methodRef #isString is true. And there's no point in converting Symbols to Strings for #includesSubString: or #findTokens:. > > Levente > > On Tue, 30 Jun 2015, commits@source.squeak.org wrote: > > Eliot Miranda uploaded a new version of Tools to project The Trunk: > http://source.squeak.org/trunk/Tools-eem.626.mcz > > ==================== Summary ==================== > > Name: Tools-eem.626 > Author: eem > Time: 30 June 2015, 3:05:48.319 pm > UUID: 0bfae54b-3e68-4252-98d8-ddb1e56fc869 > Ancestors: Tools-mt.625 > > Upgrade MessageSet class>>parse:toClassAndSelector: > to allow one to construct text links in modern syntax, e.g. > BitBlt class>>#subPixelRenderColorFonts > > =============== Diff against Tools-mt.625 =============== > > Item was changed: > ?----- Method: MessageSet class>>parse:toClassAndSelector: (in category 'utilities') ----- > ?parse: methodRef toClassAndSelector: csBlock > ? ? ? ? "Decode strings of the form [class] ." > > ? ? ? ? | tuple cl | > > > ? ? ? ? self flag: #mref.? ? ? ?"compatibility with pre-MethodReference lists" > > ? ? ? ? methodRef ifNil: [^ csBlock value: nil value: nil]. > ? ? ? ? methodRef isString ifFalse: > ? ? ? ? ? ? ? ? [^methodRef setClassAndSelectorIn: csBlock]. > ? ? ? ? methodRef isEmpty ifTrue: > ? ? ? ? ? ? ? ? [^csBlock value: nil value: nil]. > +? ? ? ?tuple := (methodRef asString includesSubString: '>>') > +? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ifTrue: [(methodRef findTokens: '>>') fold: [:a :b| (a findTokens: ' '), {b first = $# ifTrue: [b allButFirst] ifFalse: [b]}]] > +? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ifFalse: [methodRef asString findTokens: ' .']. > -? ? ? ?tuple := methodRef asString findTokens: ' .'. > ? ? ? ? cl := Smalltalk at: tuple first asSymbol ifAbsent: [^ csBlock value: nil value: nil]. > ? ? ? ? ^(tuple size = 2 or: [tuple size > 2 and: [(tuple at: 2) ~= 'class']]) > ? ? ? ? ? ? ? ? ifTrue: [csBlock value: cl value: (tuple at: 2) asSymbol] > ? ? ? ? ? ? ? ? ifFalse: [csBlock value: cl class value: (tuple at: 3) asSymbol]! > > > > > > > > -- > best,Eliot > > From hannes.hirzel at gmail.com Thu Jul 2 13:01:47 2015 From: hannes.hirzel at gmail.com (H. Hirzel) Date: Thu Jul 2 13:01:50 2015 Subject: [squeak-dev] Re: Re: [ANN] The Squeak Website In-Reply-To: <20150701022251.GA55832@shell.msen.com> References: <8EB28068-6FBD-4E7B-8819-3B559B8A2EDA@gmx.de> <1EDA2D9E-E782-4828-BFE6-6D945B7882BC@gmail.com> <1435675047151-4834937.post@n4.nabble.com> <20150701022251.GA55832@shell.msen.com> Message-ID: The downloads page is well structured and comprehensive! I answers typical questions in fine print. Also noteworthy the 'Research' page which contains a bibliography of otherwise difficult to find material. Well done. --Hannes On 7/1/15, David T. Lewis wrote: > On Tue, Jun 30, 2015 at 07:37:27AM -0700, Sean P. DeNigris wrote: >> Louis LaBrunda wrote >> > Hear, Hear, Edgar is a very worthwhile and often under appreciated >> > member >> > of the Squeak community!! >> >> Indeed! >> > > +1000 > > Dave > > > From commits at source.squeak.org Thu Jul 2 16:24:15 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 2 16:24:17 2015 Subject: [squeak-dev] The Trunk: Tools-cmm.629.mcz Message-ID: Chris Muller uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-cmm.629.mcz ==================== Summary ==================== Name: Tools-cmm.629 Author: cmm Time: 2 July 2015, 11:23:44.144 am UUID: 3123de24-8e6a-4ac2-957c-a599484fbfc6 Ancestors: Tools-eem.628 Restore the classic Warning window because it supports application-formatted messages which can wrap and scroll as needed. =============== Diff against Tools-eem.628 =============== Item was changed: ----- Method: Debugger>>openNotifierContents:label: (in category 'initialize') ----- openNotifierContents: msgString label: label "Create, schedule and answer a notifier view with the given label and message. A notifier view shows just the message or the first several lines of the stack, with a menu that allows the user to open a full debugger if so desired." "NOTE: When this method returns, a new process has been scheduled to run the windows, and thus this notifier, but the previous active process has not been suspended. The sender will do this." | msg builder spec | Sensor flushKeyboard. savedCursor := Cursor currentCursor. Cursor currentCursor: Cursor normal. + msg := (label beginsWith: 'Space is low') + ifTrue: [self lowSpaceChoices, (msgString ifNil: [String empty])] + ifFalse: [msgString]. - (label beginsWith: 'Space is low') - ifTrue: [msg := self lowSpaceChoices, (msgString ifNil: [''])] - ifFalse: [msg := msgString]. builder := ToolBuilder default. + spec := self buildNotifierWith: builder label: label message: (msg ifNil: [label]). - spec := self buildNotifierWith: builder label: label message: msg. self expandStack. ^[builder openDebugger: spec] ensure: [errorWasInUIProcess := Project current spawnNewProcessIfThisIsUI: interruptedProcess] ! From commits at source.squeak.org Thu Jul 2 16:24:58 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 2 16:25:01 2015 Subject: [squeak-dev] The Trunk: System-cmm.751.mcz Message-ID: Chris Muller uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-cmm.751.mcz ==================== Summary ==================== Name: System-cmm.751 Author: cmm Time: 2 July 2015, 11:24:19.221 am UUID: 1bf201e2-c482-44b3-8685-e31275e4b2a2 Ancestors: System-eem.750 Restore classic Warning window because it supports application-formatted messages which can wrap and scroll as needed. =============== Diff against System-eem.750 =============== Item was changed: ----- Method: Warning>>defaultAction (in category '*System-exceptionDescription') ----- defaultAction + "Inform the user of a Warning, giving them the choice of ignoring the warning (proceeding), debugging, or terminating the computation." + UnhandledError signalForException: self! - "Inform the user of a Warning, giving them the choice of ignoring the warning (proceeding), debugging, - or terminating the compuation. If in the context of a debugger, instead allow the debugger to display - the wasrning in context." - | inDebugger | - inDebugger := [UnhandledError signal] - on: UnhandledError - do: [:uhe| uhe isNested]. - inDebugger ifTrue: - [^UnhandledError signalForException: self]. - (UIManager default - chooseFrom: #(proceed debug close) - values: #(proceed debug close) - title: 'Warning: ', self messageText) - caseOf: { - [#proceed] -> [self resume]. - [#debug] -> [UnhandledError signalForException: self]. - [#close] -> [| condemned | - condemned := Processor activeProcess. - Project current spawnNewProcessIfThisIsUI: condemned. - condemned terminate] }! From asqueaker at gmail.com Thu Jul 2 17:30:13 2015 From: asqueaker at gmail.com (Chris Muller) Date: Thu Jul 2 17:30:18 2015 Subject: [squeak-dev] The Trunk: System-cmm.751.mcz In-Reply-To: <559565e0.0b908c0a.5381.139aSMTPIN_ADDED_MISSING@mx.google.com> References: <559565e0.0b908c0a.5381.139aSMTPIN_ADDED_MISSING@mx.google.com> Message-ID: I will get a Squeak 4.6 release-candidate uploaded tonight or tomorrow for your review. On Thu, Jul 2, 2015 at 11:24 AM, wrote: > Chris Muller uploaded a new version of System to project The Trunk: > http://source.squeak.org/trunk/System-cmm.751.mcz > > ==================== Summary ==================== > > Name: System-cmm.751 > Author: cmm > Time: 2 July 2015, 11:24:19.221 am > UUID: 1bf201e2-c482-44b3-8685-e31275e4b2a2 > Ancestors: System-eem.750 > > Restore classic Warning window because it supports application-formatted messages which can wrap and scroll as needed. > > =============== Diff against System-eem.750 =============== > > Item was changed: > ----- Method: Warning>>defaultAction (in category '*System-exceptionDescription') ----- > defaultAction > + "Inform the user of a Warning, giving them the choice of ignoring the warning (proceeding), debugging, or terminating the computation." > + UnhandledError signalForException: self! > - "Inform the user of a Warning, giving them the choice of ignoring the warning (proceeding), debugging, > - or terminating the compuation. If in the context of a debugger, instead allow the debugger to display > - the wasrning in context." > - | inDebugger | > - inDebugger := [UnhandledError signal] > - on: UnhandledError > - do: [:uhe| uhe isNested]. > - inDebugger ifTrue: > - [^UnhandledError signalForException: self]. > - (UIManager default > - chooseFrom: #(proceed debug close) > - values: #(proceed debug close) > - title: 'Warning: ', self messageText) > - caseOf: { > - [#proceed] -> [self resume]. > - [#debug] -> [UnhandledError signalForException: self]. > - [#close] -> [| condemned | > - condemned := Processor activeProcess. > - Project current spawnNewProcessIfThisIsUI: condemned. > - condemned terminate] }! > > From ma.chris.m at gmail.com Thu Jul 2 19:26:23 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Thu Jul 2 19:26:26 2015 Subject: [squeak-dev] Squeak 4.6 release candidate Message-ID: We have a release candidate image. http://ftp.squeak.org/4.6/ The new sources file is required. Please test your apps. This could be the final image unless major issues are uncovered. Thanks. From nicolaihess at web.de Thu Jul 2 20:16:57 2015 From: nicolaihess at web.de (Nicolai Hess) Date: Thu Jul 2 20:17:01 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: 2015-07-02 21:26 GMT+02:00 Chris Muller : > We have a release candidate image. > > http://ftp.squeak.org/4.6/ > > The new sources file is required. > > Please test your apps. This could be the final image unless major > issues are uncovered. > > Thanks. > > Is there a release candidate vm too? -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150702/79dc0b75/attachment.htm From bert at freudenbergs.de Thu Jul 2 20:20:02 2015 From: bert at freudenbergs.de (Bert Freudenberg) Date: Thu Jul 2 20:20:10 2015 Subject: [squeak-dev] The Trunk: Network-cmm.161.mcz In-Reply-To: References: Message-ID: <8E71C84A-66AE-4F85-AB17-CCFABF335703@freudenbergs.de> > On 01.07.2015, at 14:55, Chris Muller wrote: > > Do MC overrides actually somehow "reload" the code that was overridden > when you unload the overriding code? Yes. It goes through the method history in the changes/sources file and loads the overridden definition. > If so, that is kind of amazing. Indeed. Although scary, too. Overrides are still evil, and should not be used unless really necessary. > My purpose of doing this is to avoid having dirty packages in the release. The overridden package shouldn?t actually be dirty. Did you do ?changes? on it? - Bert - > > I can no longer even use the old HTTPSocket code in my apps. Is it > still usable? WebClient works a lot better. Is there a solution that > addresses all concerns? > > On Wed, Jul 1, 2015 at 4:10 PM, Levente Uzonyi wrote: >> Hi Chris, >> >> This change is a bit against modularity, because the HTTP protocol will no >> longer work once you unload the WebClient package. >> >> Levente >> >> >> On Wed, 1 Jul 2015, commits@source.squeak.org wrote: >> >>> Chris Muller uploaded a new version of Network to project The Trunk: >>> http://source.squeak.org/trunk/Network-cmm.161.mcz >>> >>> ==================== Summary ==================== >>> >>> Name: Network-cmm.161 >>> Author: cmm >>> Time: 1 July 2015, 3:26:03.655 pm >>> UUID: af917aa1-ce76-460b-ba1a-7fb49700f44a >>> Ancestors: Network-ul.160 >>> >>> Remove the methods overridden by WebClient, since that has now been folded >>> into base Squeak. >>> >>> =============== Diff against Network-ul.160 =============== >>> >>> Item was removed: >>> - ----- Method: HTTPSocket class>>httpGet:args:user:passwd: (in category >>> 'get the page') ----- >>> - httpGet: url args: args user: user passwd: passwd >>> - "Upload the contents of the stream to a file on the server. >>> - >>> - WARNING: This method will send a basic auth header proactively. >>> - This is necessary to avoid breaking MC and SqueakSource since SS >>> does not >>> - return a 401 when accessing a private (global no access) >>> repository." >>> - >>> - | authorization result | >>> - authorization := (user , ':' , passwd) base64Encoded. >>> - result := self >>> - httpGet: url args: args accept: '*/*' >>> - request: 'Authorization: Basic ' , authorization , String >>> crlf. >>> - ^result >>> - ! >>> >>> Item was removed: >>> - ----- Method: HTTPSocket class>>httpGetDocument:args:accept:request: (in >>> category 'get the page') ----- >>> - httpGetDocument: url args: args accept: mimeType request: requestString >>> - "Return the exact contents of a web object. Asks for the given >>> MIME type. If mimeType is nil, use 'text/html'. An extra requestString may >>> be submitted and must end with crlf. The parsed header is saved. Use a >>> proxy server if one has been registered. tk 7/23/97 17:12" >>> - >>> - "Note: To fetch raw data, you can use the MIME type >>> 'application/octet-stream'." >>> - >>> - | urlString | >>> - "Normalize the url" >>> - urlString := (Url absoluteFromText: url) asString. >>> - >>> - args ifNotNil: [ >>> - urlString := urlString, (self argString: args) >>> - ]. >>> - >>> - ^(self httpRequestHandler) >>> - httpRequest: 'GET' url: urlString headers:( >>> - (mimeType ifNil:[''] ifNotNil:['Accept: ', >>> mimeType, String crlf]), >>> - 'Accept: text/html', String crlf, >>> - HTTPProxyCredentials, >>> - HTTPBlabEmail, >>> - requestString >>> - ) content: nil response: nil.! >>> >>> Item was removed: >>> - ----- Method: HTTPSocket class>>httpPost:args:user:passwd: (in category >>> 'get the page') ----- >>> - httpPost: url args: args user: user passwd: passwd >>> - >>> - "WARNING: This method will send a basic auth header proactively. >>> - This is necessary to avoid breaking MC and SqueakSource since SS >>> does not >>> - return a 401 when accessing a private (global no access) >>> repository." >>> - >>> - | authorization | >>> - authorization := (user , ':' , passwd) base64Encoded. >>> - ^self >>> - httpPostDocument: url args: args accept: '*/*' >>> - request: 'Authorization: Basic ' , authorization , String >>> crlf >>> - ! >>> >>> Item was removed: >>> - ----- Method: HTTPSocket class>>httpPost:content:type:accept:request: >>> (in category 'get the page') ----- >>> - httpPost: url content: postData type: contentType accept: mimeType >>> request: requestString >>> - "like httpGET, except it does a POST instead of a GET. POST >>> allows data to be uploaded" >>> - >>> - | urlString | >>> - "Normalize the url" >>> - urlString := (Url absoluteFromText: url) asString. >>> - >>> - ^(self httpRequestHandler) >>> - httpRequest: 'POST' url: urlString headers:( >>> - 'Accept: ', mimeType, String crlf, >>> - 'Accept: text/html', String crlf, >>> - 'Content-Type: ', contentType, String crlf, >>> - 'Content-Length: ', (postData ifNil:['']) size, >>> String crlf, >>> - HTTPProxyCredentials, >>> - HTTPBlabEmail, >>> - requestString "extra user request. Authorization" >>> - ) content: (postData ifNil:['']) response: nil! >>> >>> Item was removed: >>> - ----- Method: HTTPSocket class>>httpPostDocument:args:accept:request: >>> (in category 'get the page') ----- >>> - httpPostDocument: url args: args accept: mimeType request: >>> requestString >>> - "like httpGET, except it does a POST instead of a GET. POST >>> allows data to be uploaded" >>> - >>> - | argString | >>> - args ifNotNil: [ >>> - argString := self argString: args. >>> - argString first = $? ifTrue: [argString := argString >>> allButFirst]. >>> - ]. >>> - >>> - ^self httpPost: url >>> - content: argString >>> - type: 'application/x-www-form-urlencoded' >>> - accept: mimeType >>> - request: requestString! >>> >>> Item was removed: >>> - ----- Method: HTTPSocket class>>httpPostMultipart:args:accept:request: >>> (in category 'get the page') ----- >>> - httpPostMultipart: url args: argsDict accept: mimeType request: >>> requestString >>> - " do multipart/form-data encoding rather than x-www-urlencoded " >>> - >>> - | mimeBorder argsStream | >>> - mimeBorder := '----squeak-georgia-tech-', Time >>> millisecondClockValue printString, '-csl-cool-stuff-----'. >>> - "encode the arguments dictionary" >>> - argsStream := WriteStream on: String new. >>> - argsDict associationsDo: [:assoc | >>> - assoc value do: [ :value | | fieldValue | >>> - "print the boundary" >>> - argsStream nextPutAll: '--', mimeBorder, String crlf. >>> - " check if it's a non-text field " >>> - argsStream nextPutAll: 'Content-disposition: >>> multipart/form-data; name="', assoc key, '"'. >>> - (value isKindOf: MIMEDocument) >>> - ifFalse: [fieldValue := value] >>> - ifTrue: [argsStream nextPutAll: ' filename="', >>> value url pathForFile, '"', String crlf, 'Content-Type: ', value >>> contentType. >>> - fieldValue := (value content >>> - ifNil: [(FileStream fileNamed: >>> value url pathForFile) contentsOfEntireFile] >>> - ifNotNil: [value content]) >>> asString]. >>> - " Transcript show: 'field=', key, '; value=', fieldValue; cr. " >>> - argsStream nextPutAll: String crlf, String crlf, >>> fieldValue, String crlf. >>> - ]]. >>> - argsStream nextPutAll: '--', mimeBorder, '--'. >>> - >>> - ^self httpPost: url >>> - content: argsStream contents >>> - type: 'multipart/form-data; boundary=', >>> mimeBorder >>> - accept: mimeType >>> - request: requestString >>> - ! >>> >>> Item was removed: >>> - ----- Method: HTTPSocket >>> class>>httpPostToSuperSwiki:args:accept:request: (in category 'get the >>> page') ----- >>> - httpPostToSuperSwiki: url args: argsDict accept: mimeType request: >>> requestString >>> - >>> - | mimeBorder argString | >>> - mimeBorder := '---------SuperSwiki',Time millisecondClockValue >>> printString,'-----'. >>> - argString := String streamContents: [ :strm | >>> - strm nextPutAll: mimeBorder, String crlf. >>> - argsDict associationsDo: [:assoc | >>> - assoc value do: [ :value | >>> - strm >>> - nextPutAll: 'Content-disposition: >>> form-data; name="', assoc key, '"'; >>> - nextPutAll: String crlf; >>> - nextPutAll: String crlf; >>> - nextPutAll: value; >>> - nextPutAll: String crlf; >>> - nextPutAll: String crlf; >>> - nextPutAll: mimeBorder; >>> - nextPutAll: String crlf. >>> - ] >>> - ]. >>> - ]. >>> - >>> - ^self httpPost: url >>> - content: argString >>> - type: 'multipart/form-data; boundary=', >>> mimeBorder >>> - accept: mimeType >>> - request: requestString >>> - ! >>> >>> Item was removed: >>> - ----- Method: HTTPSocket class>>httpPut:to:user:passwd: (in category >>> 'get the page') ----- >>> - httpPut: contents to: url user: user passwd: passwd >>> - "Upload the contents of the stream to a file on the server >>> - >>> - WARNING: This method will send a basic auth header proactively. >>> - This is necessary to avoid breaking MC and SqueakSource since SS >>> does not >>> - return a 401 when accessing a private (global no access) >>> repository." >>> - >>> - | urlString resp header | >>> - >>> - "Normalize the url" >>> - urlString := (Url absoluteFromText: url) asString. >>> - >>> - resp := (self httpRequestHandler) >>> - httpRequest: 'PUT' url: urlString headers:( >>> - 'Authorization: Basic ', (user, ':', passwd) >>> base64Encoded, String crlf, >>> - 'Accept: */*', String crlf, >>> - 'Content-Type: application/octet-stream', String >>> crlf, >>> - 'Content-Length: ', (contents ifNil:['']) size, >>> String crlf, >>> - HTTPProxyCredentials, >>> - HTTPBlabEmail >>> - ) content: contents response:[:rr| header := rr]. >>> - ^resp isString ifTrue:[header, resp] ifFalse:[header, resp >>> content]! >>> >>> >>> >> > -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 4115 bytes Desc: not available Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150702/b28248b0/smime.bin From karlramberg at gmail.com Thu Jul 2 20:25:58 2015 From: karlramberg at gmail.com (karl ramberg) Date: Thu Jul 2 20:26:01 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: Nice work. Two things: Saving projects does not work, this could be mentioned in compability issues.it (It would be nice to recover more gracefully from trying to save a project) In the HelpBrowser selecting Squeak/The Project : MessageNotUnderstood: TheWorldMainDockingBar class>>releaseNotes Karl On Thu, Jul 2, 2015 at 9:26 PM, Chris Muller wrote: > We have a release candidate image. > > http://ftp.squeak.org/4.6/ > > The new sources file is required. > > Please test your apps. This could be the final image unless major > issues are uncovered. > > Thanks. > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150702/724ff423/attachment.htm From asqueaker at gmail.com Thu Jul 2 21:25:52 2015 From: asqueaker at gmail.com (Chris Muller) Date: Thu Jul 2 21:25:57 2015 Subject: [squeak-dev] The Trunk: Network-cmm.161.mcz In-Reply-To: <8E71C84A-66AE-4F85-AB17-CCFABF335703@freudenbergs.de> References: <8E71C84A-66AE-4F85-AB17-CCFABF335703@freudenbergs.de> Message-ID: >> Do MC overrides actually somehow "reload" the code that was overridden >> when you unload the overriding code? > > Yes. It goes through the method history in the changes/sources file and loads the overridden definition. > >> If so, that is kind of amazing. > > Indeed. Although scary, too. Overrides are still evil, and should not be used unless really necessary. I wonder if it would work even after condenseSources. That's been done for this release. >> My purpose of doing this is to avoid having dirty packages in the release. > > The overridden package shouldn?t actually be dirty. Did you do ?changes? on it? ReleaseBuilder prepareNewRelease ends up doing that check and complains if it finds any. That's how I came to know about it. From eliot.miranda at gmail.com Thu Jul 2 21:36:35 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu Jul 2 21:36:45 2015 Subject: [squeak-dev] The Trunk: Network-cmm.161.mcz In-Reply-To: References: <8E71C84A-66AE-4F85-AB17-CCFABF335703@freudenbergs.de> Message-ID: Hi Chris, On Jul 2, 2015, at 2:25 PM, Chris Muller wrote: >>> Do MC overrides actually somehow "reload" the code that was overridden >>> when you unload the overriding code? >> >> Yes. It goes through the method history in the changes/sources file and loads the overridden definition. >> >>> If so, that is kind of amazing. >> >> Indeed. Although scary, too. Overrides are still evil, and should not be used unless really necessary. > > I wonder if it would work even after condenseSources. That's been > done for this release. Should do given that condenseSources now preserves history right? > >>> My purpose of doing this is to avoid having dirty packages in the release. >> >> The overridden package shouldn?t actually be dirty. Did you do ?changes? on it? > > ReleaseBuilder prepareNewRelease ends up doing that check and > complains if it finds any. That's how I came to know about it. > From bert at freudenbergs.de Thu Jul 2 21:53:07 2015 From: bert at freudenbergs.de (Bert Freudenberg) Date: Thu Jul 2 21:53:13 2015 Subject: [squeak-dev] The Trunk: Network-cmm.161.mcz In-Reply-To: References: <8E71C84A-66AE-4F85-AB17-CCFABF335703@freudenbergs.de> Message-ID: > On 02.07.2015, at 14:36, Eliot Miranda wrote: > > Hi Chris, > > On Jul 2, 2015, at 2:25 PM, Chris Muller wrote: > >>>> Do MC overrides actually somehow "reload" the code that was overridden >>>> when you unload the overriding code? >>> >>> Yes. It goes through the method history in the changes/sources file and loads the overridden definition. >>> >>>> If so, that is kind of amazing. >>> >>> Indeed. Although scary, too. Overrides are still evil, and should not be used unless really necessary. >> >> I wonder if it would work even after condenseSources. That's been >> done for this release. > > Should do given that condenseSources now preserves history right? Yes, condenseSources specifically keeps the history of methods in *-override protocols. - Bert - -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 4115 bytes Desc: not available Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150702/f60a71fe/smime.bin From commits at source.squeak.org Thu Jul 2 21:55:03 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 2 21:55:05 2015 Subject: [squeak-dev] Daily Commit Log Message-ID: <20150702215503.15481.qmail@box4.squeakfoundation.org> Changes to Trunk (http://source.squeak.org/trunk.html) in the last 24 hours: http://lists.squeakfoundation.org/pipermail/packages/2015-July/008772.html Name: Morphic-eem.990 Ancestors: Morphic-cmm.989 Update the CurvierMorph's drawCurvier preference to the recommended style., eliminating the only send of addPreference:category:default:balloonHelp: in trunk outside of Preferences. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008773.html Name: Kernel-eem.930 Ancestors: Kernel-eem.929 Fix the bug with the Debugger's through such that the Debugger would appear to freeze when encountering an MNU. The example is Debug It on: Object flushDependents do: [ : e | ] followed by Over, Through. But in fact one can see the same issue doing Debug It and then Through on nil zork What was happening is that Through was stepping through the uncaught and looping MNUs (of do: or zork in the above examples) since the Debugger did not catch unhandled errors during Through, and sicne doesNotUnderstand:'s default if uncaught is to resend. The fix is merely to catch unhandled errors when doing Through to the same effect as runUntilErrorOrReturnFrom: caching errors for Over. Also speed up Through. The changes made in Kernel-eem.857 through Kernel-eem.896 to provide process-faithful debugging slowed down Process>>step a lot. These changes restore the performance by using evaluate:onBehalfOf: once for each Through, rather than once for each step within Through. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008774.html Name: System-eem.750 Ancestors: System-eem.749 Provide a defaultAction for Warning that gives the user the option of debugging, ignoring or terminating when a Warning is raised in normal execution, or allows the Debugger to handle it if a Warning is raised during debugging. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008775.html Name: Kernel-eem.931 Ancestors: Kernel-eem.930 When an error occurs during complete:, which is used by the Debugger, raise a Notification to allow the Debugger to learn of the error's description. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008776.html Name: Tools-eem.627 Ancestors: Tools-eem.626 Use Kernel-eem.931 to have the debugger update its label to the description of an exception raised while debugging. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008777.html Name: Kernel-eem.932 Ancestors: Kernel-eem.931 Provide the same Debugger label support as complete: for the step into block support. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008778.html Name: Tools-eem.628 Ancestors: Tools-eem.627 Debugger: Extract the exception notification handler into its own method and use it for Through support also. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008779.html Name: Collections.spur-topa.637 Ancestors: Collections-topa.637, Collections.spur-eem.636 Collections-topa.637 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Always store Characters as if they had one instance variable with their value, regardless whether they are actually shaped that way. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008780.html Name: Kernel.spur-eem.930 Ancestors: Kernel-eem.930, Kernel.spur-eem.929 Kernel-eem.930 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Fix the bug with the Debugger's through such that the Debugger would appear to freeze when encountering an MNU. The example is Debug It on: Object flushDependents do: [ : e | ] followed by Over, Through. But in fact one can see the same issue doing Debug It and then Through on nil zork What was happening is that Through was stepping through the uncaught and looping MNUs (of do: or zork in the above examples) since the Debugger did not catch unhandled errors during Through, and sicne doesNotUnderstand:'s default if uncaught is to resend. The fix is merely to catch unhandled errors when doing Through to the same effect as runUntilErrorOrReturnFrom: caching errors for Over. Also speed up Through. The changes made in Kernel-eem.857 through Kernel-eem.896 to provide process-faithful debugging slowed down Process>>step a lot. These changes restore the performance by using evaluate:onBehalfOf: once for each Through, rather than once for each step within Through. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008781.html Name: Kernel.spur-eem.931 Ancestors: Kernel-eem.931, Kernel.spur-eem.930 Kernel-eem.931 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 When an error occurs during complete:, which is used by the Debugger, raise a Notification to allow the Debugger to learn of the error's description. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008782.html Name: System.spur-cmm.744 Ancestors: System-cmm.744, System.spur-topa.743 System-cmm.744 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Updated copyright year. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008783.html Name: Kernel.spur-eem.932 Ancestors: Kernel-eem.932, Kernel.spur-eem.931 Kernel-eem.932 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Provide the same Debugger label support as complete: for the step into block support. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008784.html Name: System.spur-eem.745 Ancestors: System-eem.745, System.spur-cmm.744 System-eem.745 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Rewrite Preferences to eliminate the AccessProtect. Use a copy, update copy, assign scheme to update the preferences dictionary atomically. Change Preferences access method compilation to use Object>>#value to eliminate a block creation. Change Preference initialization to eliminate the isKindOf: Symbol. This is step 1. Given SystemPreferences it is clear that the preferences dictionary should be stored in a class inst var, so that SystemPreferences and Preferences can share methods but access different dictionaries. The dictionaryOfProferences[:] accessors are dubious as they break encapsulatiopn. For example, the reportPreferences: method, which is the only external access, could insateaqd be moved into Preferences class. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008785.html Name: System.spur-eem.746 Ancestors: System-eem.746, System.spur-eem.745 System-eem.746 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 First part of Preferences putsch to move preferences dictionary from class var to inst var. Also update class comment to describe preference pragmas. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008786.html Name: System.spur-eem.747 Ancestors: System-eem.747, System.spur-eem.746 System-eem.747 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Second part of putsch. Move preferences dictionary from class var to inst var. Remove the setter, and makde the getter, currently used only by SystemReporter, answer a copy. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008787.html Name: System.spur-ul.748 Ancestors: System-ul.748, System.spur-eem.747 System-ul.748 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 - Iterate over pragmas once per method instead of once per pragma in Preferences class>>prefEvent:. - There's no need to copy preferencesDictionary in Preferences class>>storePreferencesIn:, because it's a read-only data structure. - Ensure the durability of the changes of preferencesDictionary in Preferences class>>atomicUpdatePreferences: by checking for changes before overwriting it. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008788.html Name: System.spur-eem.749 Ancestors: System-eem.749, System.spur-ul.748 System-eem.749 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Revert storePreferencesIn: to work with a copy, which accords with the old code. Go for brevity in prefEvent:. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008789.html Name: System.spur-eem.750 Ancestors: System-eem.750, System.spur-eem.749 System-eem.750 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Provide a defaultAction for Warning that gives the user the option of debugging, ignoring or terminating when a Warning is raised in normal execution, or allows the Debugger to handle it if a Warning is raised during debugging. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008790.html Name: Tools-cmm.629 Ancestors: Tools-eem.628 Restore the classic Warning window because it supports application-formatted messages which can wrap and scroll as needed. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008791.html Name: System-cmm.751 Ancestors: System-eem.750 Restore classic Warning window because it supports application-formatted messages which can wrap and scroll as needed. ============================================= From lecteur at zogotounga.net Thu Jul 2 22:18:14 2015 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Thu Jul 2 22:18:17 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: <5595B8A6.90703@zogotounga.net> > Please test your apps. This could be the final image unless major > issues are uncovered. A little glitch: It seems that the little arrows at the ends of browser scrollbars have disappeared... Actually they still exist as submorphs, as you can see if you explore a scrollbar, but they do not appear, which makes browsers kind of unfinished. Stef From lecteur at zogotounga.net Thu Jul 2 22:21:41 2015 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Thu Jul 2 22:21:44 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: <5595B975.2090309@zogotounga.net> Another feedback: The overall grey tones of the display are rather depressing to me. I know some people consider that Squeak used to be way too colorful, but now it seems we jumped right to the other end of the spectrum... Stef From lecteur at zogotounga.net Thu Jul 2 22:29:07 2015 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Thu Jul 2 22:29:10 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <5595B8A6.90703@zogotounga.net> References: <5595B8A6.90703@zogotounga.net> Message-ID: <5595BB33.7040606@zogotounga.net> > A little glitch: > > It seems that the little arrows at the ends of browser scrollbars have > disappeared... > > Actually they still exist as submorphs, as you can see if you explore a > scrollbar, but they do not appear, which makes browsers kind of unfinished. Oops. I now see it's only a preference. My bad... Stef From lecteur at zogotounga.net Thu Jul 2 22:40:25 2015 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Thu Jul 2 22:40:28 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: <5595BDD9.6010708@zogotounga.net> Another thing: If you enable the flaps, you can see that they can not be resized as before (for example in 4.5) by dragging their handle: instead, they simply close. Stef From commits at source.squeak.org Thu Jul 2 23:49:26 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 2 23:49:29 2015 Subject: [squeak-dev] The Trunk: Morphic-dtl.992.mcz Message-ID: David T. Lewis uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-dtl.992.mcz ==================== Summary ==================== Name: Morphic-dtl.992 Author: dtl Time: 2 July 2015, 7:46:47.79 pm UUID: 96c32ec8-85fb-4cef-9ecc-e90640a00000 Ancestors: Morphic-cmm.991 Editing correction: "Like most Smalltalk's" should be "Like most Smalltalks" =============== Diff against Morphic-cmm.991 =============== Item was changed: ----- Method: TheWorldMainDockingBar>>workingWithSqueak (in category 'submenu - help') ----- workingWithSqueak ^'Starting and Quitting + Like most Smalltalks, the machine-executable portion is a relatively small program known as the "virtual machine" (VM). The VM''s job is to provide services from the physical machine to real Smalltalk objects. Services like input and output. The Smalltalk system, including all data and code, is a system of objects, built from the ground up, and interpreted by this virtual computer. This affords Smalltalk system platform portability. - Like most Smalltalk''s, the machine-executable portion is a relatively small program known as the "virtual machine" (VM). The VM''s job is to provide services from the physical machine to real Smalltalk objects. Services like input and output. The Smalltalk system, including all data and code, is a system of objects, built from the ground up, and interpreted by this virtual computer. This affords Smalltalk system platform portability. Smalltalk cannot run without the VM. The VM can''t do anything useful except process Smalltalk systems. To start the system, drag the ".image" data file to the VM executable "squeak". There are myriad command-line options for starting the system via the command-line (see squeak --help). By default, the system will open on the screen in a single OS window. To quit a Squeak session, choose ''quit'' from the menu bar. If you save, the image file will be overwritten and resume from that place the next time it''s launched. The Image File Squeak is an environment built in its own objects from the ground up, including one or more end-user applications. All of the objects in the system -- Classes, Dictionaries, Windows, Customers and other objects that make up the Squeak environment are stored in a binary ".image" file. This is the "object-data file" loaded by the VM when Squeak is launched. When an image is started, every object resumes exactly from where it was last saved. The Sources File Smalltalk is traditionally includes the source code in the running system. However, keeping multiple copies of the same source code in all images files is wasteful. Therefore, the source code itself is kept in a read-only .sources file and accessed by all images. The image files merely have pointers into this file, which is read on-the-fly to present original source code. The code of the base system is stored in the file "SqueakV46.sources". This file does not change except between releases of Squeak. Normally this file should be placed in the folder containing the VM executable. The Changes File The purpose of Squeak is to develop new programs and systems. Code changes to the running system are effective immediately. But since multiple images can be running, they cannot all update the .sources file safely. Therefore, each image file is accompanied by a ".changes" file which contains source code changes for that and only that Smalltalk system.. The changes file is important for project work. It keeps a sequential log of development activity for the purpose of recovering work performed since the last image-save. Any of several events could lead to the need to recover work, including a power-outage or making an erroneous change to code required to keep the system running. The changes file does not consume memory space, so Squeak is able to keep a complete history of all program changes. This makes it easy to examine or even reinstate older versions of methods (see ''versions'' option in browser selector pane). This encourages experimentation, since you can easily revert to the original versions of any set of methods. In extreme cases where sources and/or changes files are not available, the system can still run, and will automatically decompile the bytecode methods in image memory, if necessary, into readable and editable versions of the original source code (only comments and temporary variable names are lost). Transferring Code-Snippets Between Images In addition to the ''save'' command that saves the entire state of the system, the code of individual methods, categories or classes may be ''filed out'' and then filed-in to another image. Packages The code of an entire project is encapsulated by a Package. This allows users to share their code with other users. Code of packages are delineated by the categories of their classes, and methods. The Monticello browser is then used to wrap that code into a Package object which can be saved to a Monticello repository at http://ss3.gemtalksystems.com/ss. Some projects end up using the resources provided by several packages, resulting in a hierarchy of packages that make up a system. Installer can be used to install such systems.!! ]style[(21 970 14 448 16 396 11 188 16 321 4 1025 41 188 8 52 10 55 2 420)bu,,bu,,bu,,u,,bu,,u,,bu,,bu,,i,,i,!!' readStream nextChunkText! From commits at source.squeak.org Thu Jul 2 23:50:15 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 2 23:50:17 2015 Subject: [squeak-dev] The Trunk: Help-Squeak-Project-dtl.26.mcz Message-ID: David T. Lewis uploaded a new version of Help-Squeak-Project to project The Trunk: http://source.squeak.org/trunk/Help-Squeak-Project-dtl.26.mcz ==================== Summary ==================== Name: Help-Squeak-Project-dtl.26 Author: dtl Time: 2 July 2015, 7:50:00.887 pm UUID: f80c8ff5-ece3-4f1c-a882-462e7cfe0000 Ancestors: Help-Squeak-Project-cmm.25 Editing correction: "Like most Smalltalk's" should be "Like most Smalltalks" =============== Diff against Help-Squeak-Project-cmm.25 =============== Item was changed: ----- Method: SqueakProjectHelp class>>workingWithSqueak (in category 'pages') ----- workingWithSqueak ^HelpTopic title: 'Working with Squeak' icon: (HelpIcons iconNamed: #squeakIcon) contents: 'Starting and Quitting + Like most Smalltalks, the machine-executable portion is a relatively small program known as the "virtual machine" (VM). The VM''s job is to provide services from the physical machine to real Smalltalk objects. Services like input and output. The Smalltalk system, including all data and code, is a system of objects, built from the ground up, and interpreted by this virtual computer. This affords Smalltalk system platform portability. - Like most Smalltalk''s, the machine-executable portion is a relatively small program known as the "virtual machine" (VM). The VM''s job is to provide services from the physical machine to real Smalltalk objects. Services like input and output. The Smalltalk system, including all data and code, is a system of objects, built from the ground up, and interpreted by this virtual computer. This affords Smalltalk system platform portability. Smalltalk cannot run without the VM. The VM can''t do anything useful except process Smalltalk systems. To start the system, drag the ".image" data file to the VM executable "squeak". There are myriad command-line options for starting the system via the command-line (see squeak --help). By default, the system will open on the screen in a single OS window. To quit a Squeak session, choose ''quit'' from the menu bar. If you save, the image file will be overwritten and resume from that place the next time it''s launched. The Image File Squeak is an environment built in its own objects from the ground up, including one or more end-user applications. All of the objects in the system -- Classes, Dictionaries, Windows, Customers and other objects that make up the Squeak environment are stored in a binary ".image" file. This is the "object-data file" loaded by the VM when Squeak is launched. When an image is started, every object resumes exactly from where it was last saved. The Sources File Smalltalk is traditionally includes the source code in the running system. However, keeping multiple copies of the same source code in all images files is wasteful. Therefore, the source code itself is kept in a read-only .sources file and accessed by all images. The image files merely have pointers into this file, which is read on-the-fly to present original source code. The code of the base system is stored in the file "SqueakV41.sources". This file does not change except between releases of Squeak. Normally this file should be placed in the folder containing the VM executable. The Changes File The purpose of Squeak is to develop new programs and systems. Code changes to the running system are effective immediately. But since multiple images can be running, they cannot all update the .sources file safely. Therefore, each image file is accompanied by a ".changes" file which contains source code changes for that and only that Smalltalk system.. The changes file is important for project work. It keeps a sequential log of development activity for the purpose of recovering work performed since the last image-save. Any of several events could lead to the need to recover work, including a power-outage or making an erroneous change to code required to keep the system running. The changes file does not consume memory space, so Squeak is able to keep a complete history of all program changes. This makes it easy to examine or even reinstate older versions of methods (see ''versions'' option in browser selector pane). This encourages experimentation, since you can easily revert to the original versions of any set of methods. In extreme cases where sources and/or changes files are not available, the system can still run, and will automatically decompile the bytecode methods in image memory, if necessary, into readable and editable versions of the original source code (only comments and temporary variable names are lost). Transferring Code-Snippets Between Images In addition to the ''save'' command that saves the entire state of the system, the code of individual methods, categories or classes may be ''filed out'' and then filed-in to another image. Packages The code of an entire project is encapsulated by a Package. This allows users to share their code with other users. Code of packages are delineated by the categories of their classes, and methods. The Monticello browser is then used to wrap that code into a Package object which can be saved to a Monticello repository at http://ss3.gemtalksystems.com/ss. Some projects end up using the resources provided by several packages, resulting in a hierarchy of packages that make up a system. Installer can be used to install such systems.!! ]style[(21 970 14 448 16 396 11 188 16 321 4 1025 41 188 8 52 10 55 2 420)bu,,bu,,bu,,u,,bu,,u,,bu,,bu,,i,,i,!!' readStream nextChunkText! From lewis at mail.msen.com Thu Jul 2 23:53:50 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Thu Jul 2 23:53:53 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: <20150702235350.GA73597@shell.msen.com> On Thu, Jul 02, 2015 at 02:26:23PM -0500, Chris Muller wrote: > We have a release candidate image. > > http://ftp.squeak.org/4.6/ Bravo! Thanks Chris. > > The new sources file is required. > > Please test your apps. This could be the final image unless major > issues are uncovered. > > Thanks. In the help browser, I get a DNU for TheWordMainDockingBar class>>releaseNotes called from SqueakProjectHelp class>>releaseNotes. This is from a Help browser opening Help -> Squeak -> The Project -> ... There is a minor edit required for the "Working with Squeak" window. I updated it in trunk for Morphic and Help-Squeak-Project. Dave From lewis at mail.msen.com Thu Jul 2 23:59:10 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Thu Jul 2 23:59:12 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <5595B975.2090309@zogotounga.net> References: <5595B975.2090309@zogotounga.net> Message-ID: <20150702235910.GB73597@shell.msen.com> On Fri, Jul 03, 2015 at 12:21:41AM +0200, St??phane Rollandin wrote: > Another feedback: > > The overall grey tones of the display are rather depressing to me. I > know some people consider that Squeak used to be way too colorful, but > now it seems we jumped right to the other end of the spectrum... > > Stef Maybe this is a mistake in setting the window colors preferences? They have preferences that seem to be not set, so maybe that is why they are showing up as gray. It looks like a bug related to preference setting for the release image. Dave From lewis at mail.msen.com Fri Jul 3 00:12:56 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Fri Jul 3 00:12:57 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: <20150703001256.GA82475@shell.msen.com> On Thu, Jul 02, 2015 at 02:26:23PM -0500, Chris Muller wrote: > We have a release candidate image. > > http://ftp.squeak.org/4.6/ > > The new sources file is required. > > Please test your apps. This could be the final image unless major > issues are uncovered. > Running under interpreter VM, do this: toolbar Help -> Help Browser expand Squeak --> The Project (get a DNU) click Debug to open a debugger highlight SqueakProjectHelp class>>releaseNotes in the top pane of the debugger right click, and select Versions to open a versions browser on the selected methode ==> VM crash with "sweep failed to find exact end of memory" This suggests corruption of the object memory image. It is hard to say what might be the cause, but it would be a good safety measure to save the release image once from an interpreter VM prior to final release. In past releases we have done this anyway as part of the release process in order to ensure that people with old VMs (on Mac) can still run the image. Dave From asqueaker at gmail.com Fri Jul 3 03:35:33 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 3 03:35:37 2015 Subject: [squeak-dev] The Trunk: Network-cmm.161.mcz In-Reply-To: References: <8E71C84A-66AE-4F85-AB17-CCFABF335703@freudenbergs.de> Message-ID: I believe the ReleaseBuilder process checks the "Changes" of every package. When we brought in WebClient, those extension methods became no longer in the Network package (in "*WebClient-HTTP-override"). For Changes to be smart enough it would have see if the "deleted" methods were truly deleted, or just moved to another package as an "override" and then.. not changed? Hmm.. I think I'm gaining new respect for MC overrides that someone went to such lengths for them. Maybe there is something to them.. On Thu, Jul 2, 2015 at 4:53 PM, Bert Freudenberg wrote: > >> On 02.07.2015, at 14:36, Eliot Miranda wrote: >> >> Hi Chris, >> >> On Jul 2, 2015, at 2:25 PM, Chris Muller wrote: >> >>>>> Do MC overrides actually somehow "reload" the code that was overridden >>>>> when you unload the overriding code? >>>> >>>> Yes. It goes through the method history in the changes/sources file and loads the overridden definition. >>>> >>>>> If so, that is kind of amazing. >>>> >>>> Indeed. Although scary, too. Overrides are still evil, and should not be used unless really necessary. >>> >>> I wonder if it would work even after condenseSources. That's been >>> done for this release. >> >> Should do given that condenseSources now preserves history right? > > Yes, condenseSources specifically keeps the history of methods in *-override protocols. > > - Bert - > > > > > > From asqueaker at gmail.com Fri Jul 3 03:54:44 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 3 03:54:47 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: > Two things: > > Saving projects does not work, this could be mentioned in compability > issues.it > (It would be nice to recover more gracefully from trying to save a project) > > In the HelpBrowser selecting Squeak/The Project : > MessageNotUnderstood: TheWorldMainDockingBar class>>releaseNotes Thanks for the feedback. I've made those updates and will include them with more twiddly-tweaks tomorrow I'm sure a few more will accumulate. From herbertkoenig at gmx.net Fri Jul 3 05:24:10 2015 From: herbertkoenig at gmx.net (=?UTF-8?Q?Herbert_K=c3=b6nig?=) Date: Fri Jul 3 05:24:15 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: <55961C7A.5000805@gmx.net> Hi, in the Preference Browser, browsing, syntaxHighlightingAsYouTypeAnsiAssignment cannot be enabled any more. If one enables syntaxHighlightingAsYouTypeLeftArrowAssignment it's enabled as well. halos, halo theme the themes classic and simple have lost some icons in the halo buttons. That's already so in 4.5. updates, update URL still points to 4.5 In a workspace the bottom arrow of a scrollbar cannot be used. The cursor turns to the resize cursor already when hoverin above the arrow. Same seems to be valid for any window with a vertical scroller on the bottom left, e.g. browsing a mc repository. Try to check more later. Cheers, Herbert Am 02.07.2015 um 21:26 schrieb Chris Muller: > We have a release candidate image. > > http://ftp.squeak.org/4.6/ > > The new sources file is required. > > Please test your apps. This could be the final image unless major > issues are uncovered. > > Thanks. > From jdelgado.pin at gmail.com Fri Jul 3 05:32:34 2015 From: jdelgado.pin at gmail.com (Jordi Delgado) Date: Fri Jul 3 05:32:36 2015 Subject: [squeak-dev] ESUG 2015, 12th Innovation Technology Awards Message-ID: Apologies if you receive this message more than once... ESUG 2015, 12th Innovation Technology Awards Have you written innovative Smalltalk? The developers of any Smalltalk-based software can enter by submitting a 3-5min video of their software. Entrants demo their systems in a session at the end of Monday July 13th 2015, after which the conference attendees vote. (A vote consists in providing a sorted list of 3 preferred pieces of software.) The top 3 teams with the most innovative software will receive, respectively, 500 Euros, 300 Euros and 200 Euros. The results are announced in the Awards ceremony that is held during the social event. Applicants should provide the following information on the conference registration server. Once you have registered your personal info, an 'Awards' menu allows submitting your software. You can provide this information when you first register, or login again later and update your details. Info to provide: Name of the software Licence information (free, shareware, or commercial) Name of the Smalltalk dialect used Name, Affiliation and Country of developers Besides, it would be great if the submission could include: URL for a video (3-5 min) showing a screencast / demo of the software URL for downloading the software or at least a runnable demo Deadline: July 12 Any Smalltalker can apply (students, companies, ...). The presented piece of code/software should be written in Smalltalk or directly support Smalltalk (e.g. Smalltalk VM). All Smalltalk dialects are accepted. The applicant should be "strongly related" to the presented code, be it as an author, as owner of the copyright/copyleft, or as an official representative of the copyright/copyleft owner. Bests, Jordi -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150703/7e6ee9b1/attachment.htm From asqueaker at gmail.com Fri Jul 3 18:32:42 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 3 18:32:48 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <55961C7A.5000805@gmx.net> References: <55961C7A.5000805@gmx.net> Message-ID: Hi Herbert, > in the Preference Browser, > browsing, syntaxHighlightingAsYouTypeAnsiAssignment cannot be enabled any > more. > If one enables syntaxHighlightingAsYouTypeLeftArrowAssignment it's enabled > as well. Yep, strange.. It seems to be a legacy problem since at least 4.5, so this can wait a little longer until 5.1. > halos, halo theme the themes classic and simple have lost some icons in the > halo buttons. That's already so in 4.5. Okay, not part of this release. > updates, update URL still points to 4.5 Hm, says http://source.squeak.org/squeak46. You have to check the actual release image, you can't just update your trunk image. > In a workspace the bottom arrow of a scrollbar cannot be used. The cursor > turns to the resize cursor already when hoverin above the arrow. Same seems > to be valid for any window with a vertical scroller on the bottom left, e.g. > browsing a mc repository. Confirmed. It seems the mouse-over zone for resizing is quite large, extending upward into the bounds of the window more than normal. Marcel do you know anything about that? > Try to check more later. Thanks! From asqueaker at gmail.com Fri Jul 3 18:43:23 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 3 18:43:27 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <5595BDD9.6010708@zogotounga.net> References: <5595BDD9.6010708@zogotounga.net> Message-ID: > Another thing: > > If you enable the flaps, you can see that they can not be resized as before > (for example in 4.5) by dragging their handle: instead, they simply close. Confirmed. And some of the flaps don't open far enough to access all the tools so they're basically inaccessible. It also looks like the FlapTabs look more like beveled rectangles than the classic flap-tab. If anyone knows a fast fix over the weekend, the release will be grateful. From eliot.miranda at gmail.com Fri Jul 3 19:21:50 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri Jul 3 19:21:57 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <5595B975.2090309@zogotounga.net> References: <5595B975.2090309@zogotounga.net> Message-ID: On Jul 2, 2015, at 3:21 PM, St?phane Rollandin wrote: > Another feedback: > > The overall grey tones of the display are rather depressing to me. I know some people consider that Squeak used to be way too colorful, but now it seems we jumped right to the other end of the spectrum... +1000. Personally I like the rice paper. Why can't we keep it? > > Stef > From Das.Linux at gmx.de Fri Jul 3 19:31:07 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Fri Jul 3 19:31:10 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: <5595B975.2090309@zogotounga.net> Message-ID: <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> Hi all On 03.07.2015, at 21:21, Eliot Miranda wrote: > > > On Jul 2, 2015, at 3:21 PM, St?phane Rollandin wrote: > >> Another feedback: >> >> The overall grey tones of the display are rather depressing to me. I know some people consider that Squeak used to be way too colorful, but now it seems we jumped right to the other end of the spectrum... > > +1000. Personally I like the rice paper. Why can't we keep it? For 8 years now we have 80 students per year that have their first contact with Squeak, and an unobtrusive background as plain as possible hast gotten the "best"[1] responses. A release is an outwards-activity; everyone here who posts at least once a year is able to change the background in no time, yet newcomers can actually be offended and turned away. Best regards -Tobias [1]: in the sense of the fewest bad words. The rice paper mostly got "really ugly" or "childish" and the ulam spiral "strangely distracting". Don't shoot the messenger, I'm just reporting. From karlramberg at gmail.com Fri Jul 3 19:40:49 2015 From: karlramberg at gmail.com (karl ramberg) Date: Fri Jul 3 19:40:54 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: <5595BDD9.6010708@zogotounga.net> Message-ID: Something must have happened to event handling. This will make it work again. ReferenceMorph>>handlesMouseMove: anEvent ^true Marcel did some work with the corner rounding for this release. I think FlapTabs prior had some special handling of corner rounding, so only two corners were rounded, not all of them. Karl On Fri, Jul 3, 2015 at 8:43 PM, Chris Muller wrote: > > Another thing: > > > > If you enable the flaps, you can see that they can not be resized as > before > > (for example in 4.5) by dragging their handle: instead, they simply > close. > > Confirmed. And some of the flaps don't open far enough to access all > the tools so they're basically inaccessible. > > It also looks like the FlapTabs look more like beveled rectangles than > the classic flap-tab. > > If anyone knows a fast fix over the weekend, the release will be grateful. > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150703/21393b91/attachment.htm From asqueaker at gmail.com Fri Jul 3 19:53:53 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 3 19:53:55 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: <5595BDD9.6010708@zogotounga.net> Message-ID: On Fri, Jul 3, 2015 at 2:40 PM, karl ramberg wrote: > Something must have happened to event handling. > This will make it work again. > > ReferenceMorph>>handlesMouseMove: anEvent > ^true Cool, thanks. I'll commit that by Sunday. > Marcel did some work with the corner rounding for this release. > I think FlapTabs prior had some special handling of corner rounding, so only > two corners were rounded, not all of them. Yes, and FlapTab>>#roundedCorners seems to answer for-element Array correctly, but perhaps the rendering is what's been changed, to not respect #roundedCorners..? From lewis at mail.msen.com Fri Jul 3 21:00:26 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Fri Jul 3 21:00:29 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> References: <5595B975.2090309@zogotounga.net> <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> Message-ID: <20150703210026.GA76403@shell.msen.com> On Fri, Jul 03, 2015 at 09:31:07PM +0200, Tobias Pape wrote: > > A release is an outwards-activity; everyone here who posts at least once > a year is able to change the background in no time, ... OK, I'll bite. How do I restore the colored windows and background to the previous defaults? Dave From frank.shearar at gmail.com Fri Jul 3 21:03:45 2015 From: frank.shearar at gmail.com (Frank Shearar) Date: Fri Jul 3 21:03:48 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> References: <5595B975.2090309@zogotounga.net> <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> Message-ID: > For 8 years now we have 80 students per year that have their first > contact with Squeak, and an unobtrusive background as plain > as possible hast gotten the "best"[1] responses. > > [1]: in the sense of the fewest bad words. The rice paper mostly got > "really ugly" or "childish" and the ulam spiral "strangely > distracting". Don't shoot the messenger, I'm just reporting. Heh, as the maker of the ulam spiral, I find that interesting. Yeah, I guess I can see how it might be a bit distracting: it _does_ have an intriguing almost-pattern to it. frank From Das.Linux at gmx.de Fri Jul 3 21:04:51 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Fri Jul 3 21:04:57 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <20150703210026.GA76403@shell.msen.com> References: <5595B975.2090309@zogotounga.net> <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> <20150703210026.GA76403@shell.msen.com> Message-ID: On 03.07.2015, at 23:00, David T. Lewis wrote: > On Fri, Jul 03, 2015 at 09:31:07PM +0200, Tobias Pape wrote: >> >> A release is an outwards-activity; everyone here who posts at least once >> a year is able to change the background in no time, ... > > OK, I'll bite. How do I restore the colored windows and background to > the previous defaults? Which previous defaults do you mean? (In the sense, from when?) From robert.hirschfeld at gmx.net Fri Jul 3 21:17:33 2015 From: robert.hirschfeld at gmx.net (Robert Hirschfeld) Date: Fri Jul 3 21:17:38 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: <5595B975.2090309@zogotounga.net> <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> <20150703210026.GA76403@shell.msen.com> Message-ID: <2E8A72EE-DE1B-42A7-9E7E-5BA1E90FBBB0@gmx.net> > On 2015-07-03, at 23:04, Tobias Pape wrote: > > > On 03.07.2015, at 23:00, David T. Lewis wrote: > >> On Fri, Jul 03, 2015 at 09:31:07PM +0200, Tobias Pape wrote: >>> >>> A release is an outwards-activity; everyone here who posts at least once >>> a year is able to change the background in no time, ... >> >> OK, I'll bite. How do I restore the colored windows and background to >> the previous defaults? > > Which previous defaults do you mean? (In the sense, from when?) > > -------------- next part -------------- Skipped content of type multipart/related From lewis at mail.msen.com Fri Jul 3 21:19:08 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Fri Jul 3 21:19:10 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: <5595B975.2090309@zogotounga.net> <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> <20150703210026.GA76403@shell.msen.com> Message-ID: <20150703211908.GA79764@shell.msen.com> On Fri, Jul 03, 2015 at 11:04:51PM +0200, Tobias Pape wrote: > > On 03.07.2015, at 23:00, David T. Lewis wrote: > > > On Fri, Jul 03, 2015 at 09:31:07PM +0200, Tobias Pape wrote: > >> > >> A release is an outwards-activity; everyone here who posts at least once > >> a year is able to change the background in no time, ... > > > > OK, I'll bite. How do I restore the colored windows and background to > > the previous defaults? > > Which previous defaults do you mean? (In the sense, from when?) > Like my working trunk image, a 4.5 image kept up to date through the update stream. Windows are light pastel colors with gradients. Thanks, Dave From commits at source.squeak.org Fri Jul 3 21:36:10 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Fri Jul 3 21:36:12 2015 Subject: [squeak-dev] The Trunk: ShoutCore-ul.52.mcz Message-ID: Levente Uzonyi uploaded a new version of ShoutCore to project The Trunk: http://source.squeak.org/trunk/ShoutCore-ul.52.mcz ==================== Summary ==================== Name: ShoutCore-ul.52 Author: ul Time: 3 July 2015, 11:34:54.984 pm UUID: 8d3fd95b-a5a6-4e10-9769-e0b0359fc30a Ancestors: ShoutCore-mt.51 The syntaxHighlightingAsYouTypeAnsiAssignment preference should return the value of SyntaxHighlightingAsYouTypeAnsiAssignment instead of SyntaxHighlightingAsYouTypeLeftArrowAssignment. =============== Diff against ShoutCore-mt.51 =============== Item was changed: ----- Method: SHTextStylerST80 class>>syntaxHighlightingAsYouTypeAnsiAssignment (in category 'preferences') ----- syntaxHighlightingAsYouTypeAnsiAssignment + ^SyntaxHighlightingAsYouTypeAnsiAssignment ifNil: [true]! - ^SyntaxHighlightingAsYouTypeLeftArrowAssignment ifNil: [true]! From asqueaker at gmail.com Fri Jul 3 21:51:33 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 3 21:51:35 2015 Subject: [squeak-dev] The Trunk: ShoutCore-ul.52.mcz In-Reply-To: <55970050.4def8c0a.7487.2d32SMTPIN_ADDED_MISSING@mx.google.com> References: <55970050.4def8c0a.7487.2d32SMTPIN_ADDED_MISSING@mx.google.com> Message-ID: Ha! On Fri, Jul 3, 2015 at 4:36 PM, wrote: > Levente Uzonyi uploaded a new version of ShoutCore to project The Trunk: > http://source.squeak.org/trunk/ShoutCore-ul.52.mcz > > ==================== Summary ==================== > > Name: ShoutCore-ul.52 > Author: ul > Time: 3 July 2015, 11:34:54.984 pm > UUID: 8d3fd95b-a5a6-4e10-9769-e0b0359fc30a > Ancestors: ShoutCore-mt.51 > > The syntaxHighlightingAsYouTypeAnsiAssignment preference should return the value of SyntaxHighlightingAsYouTypeAnsiAssignment instead of SyntaxHighlightingAsYouTypeLeftArrowAssignment. > > =============== Diff against ShoutCore-mt.51 =============== > > Item was changed: > ----- Method: SHTextStylerST80 class>>syntaxHighlightingAsYouTypeAnsiAssignment (in category 'preferences') ----- > syntaxHighlightingAsYouTypeAnsiAssignment > category: 'browsing' > description: 'If true, and syntaxHighlightingAsYouType is enabled, all left arrow assignments ( _ ) will be converted to the ANSI format ( := ) when a method is selected in a Browser. Whilst editing a method, this setting has no effect - both the left arrow and the ansi format may be used.' > type: #Boolean> > + ^SyntaxHighlightingAsYouTypeAnsiAssignment ifNil: [true]! > - ^SyntaxHighlightingAsYouTypeLeftArrowAssignment ifNil: [true]! > > From commits at source.squeak.org Fri Jul 3 21:55:03 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Fri Jul 3 21:55:05 2015 Subject: [squeak-dev] Daily Commit Log Message-ID: <20150703215503.24395.qmail@box4.squeakfoundation.org> Changes to Trunk (http://source.squeak.org/trunk.html) in the last 24 hours: http://lists.squeakfoundation.org/pipermail/packages/2015-July/008792.html Name: Morphic-dtl.992 Ancestors: Morphic-cmm.991 Editing correction: "Like most Smalltalk's" should be "Like most Smalltalks" ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008793.html Name: Help-Squeak-Project-dtl.26 Ancestors: Help-Squeak-Project-cmm.25 Editing correction: "Like most Smalltalk's" should be "Like most Smalltalks" ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008794.html Name: ShoutCore-ul.52 Ancestors: ShoutCore-mt.51 The syntaxHighlightingAsYouTypeAnsiAssignment preference should return the value of SyntaxHighlightingAsYouTypeAnsiAssignment instead of SyntaxHighlightingAsYouTypeLeftArrowAssignment. ============================================= From tim at rowledge.org Fri Jul 3 22:57:53 2015 From: tim at rowledge.org (tim Rowledge) Date: Fri Jul 3 22:58:02 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <20150703210026.GA76403@shell.msen.com> References: <5595B975.2090309@zogotounga.net> <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> <20150703210026.GA76403@shell.msen.com> Message-ID: On 03-07-2015, at 2:00 PM, David T. Lewis wrote: > On Fri, Jul 03, 2015 at 09:31:07PM +0200, Tobias Pape wrote: >> >> A release is an outwards-activity; everyone here who posts at least once >> a year is able to change the background in no time, ... > > OK, I'll bite. How do I restore the colored windows and background to > the previous defaults? You could save your old image?s preferences to file and load from file in the new image. That?s what I tend to do, though it can seem to save rather a lot. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim "Yummy" said Pooh, as he rotated Piglet slowly on the spit. From tim at rowledge.org Fri Jul 3 23:03:11 2015 From: tim at rowledge.org (tim Rowledge) Date: Fri Jul 3 23:03:15 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> References: <5595B975.2090309@zogotounga.net> <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> Message-ID: <24597EBD-6DAC-49AE-9758-5ACE48B2ED1F@rowledge.org> On 03-07-2015, at 12:31 PM, Tobias Pape wrote: > [1]: in the sense of the fewest bad words. The rice paper mostly got > "really ugly" or "childish" and the ulam spiral "strangely > distracting". Don't shoot the messenger, I'm just reporting. > People get really strongly attached to their views on what are really pretty trivial choices. We?re an odd bunch. Remember all the screaming in pain when iOS changed from cartoon-reality to flat simplicity? Metro? Vista? I suppose we could try to include some tool to read skin specifications, segmented bitmaps or even svg files. Scratch uses a large dictionary of bitmaps, and it works ok as a concept. I?d prefer scalable data though. I guess if someone really wants baroque curliques and Elvis(h) fonts then maybe we should try to support them. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Strange OpCodes: DTF: Dump Tape to Floor From tim at rowledge.org Sat Jul 4 00:14:20 2015 From: tim at rowledge.org (tim Rowledge) Date: Sat Jul 4 00:14:28 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <20150703211908.GA79764@shell.msen.com> References: <5595B975.2090309@zogotounga.net> <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> <20150703210026.GA76403@shell.msen.com> <20150703211908.GA79764@shell.msen.com> Message-ID: Giving the RC image a play whilst labouriously logging the SUnit testrunner on ARMCogSpur to see why ALSA hates us so much? Immediate impression - wow, that?s a dark grey background. Like, dark, man. The stack of introductory workspaces windows seems in the wrong order to me; perhaps the ?working with Squeak? one at the front, followed by the ?The Squeak User Interface? ? If had been able to make time to work out how the damn thing works I?d have submitted changes to the Help Browser so that it could be the one thing open at startup, with everything within. Speaking of which, open the help browser and click on ?Squeak? then ?The Project? -> MNU TheWorldMainDockingBar class>>releaseNotes appears. I see the notifier no longer has the stack displayed, nor does clicking on it?s content do anything anymore. After ?debug?, we see that SqueakProjectHelp class>releaseNotes claims to have been automagically generated and sends #releaseNotes to TheWorldMainDockingBar - but the method is on the class side, not the instance side. So the code that *generated* the method should probably be fixed, whichever method that might be. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Useful Latin Phrases:- Fac ut gaudeam = Make my day. From lewis at mail.msen.com Sat Jul 4 00:41:23 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Sat Jul 4 00:41:25 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: <5595B975.2090309@zogotounga.net> <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> <20150703210026.GA76403@shell.msen.com> Message-ID: <20150704004123.GA7524@shell.msen.com> On Fri, Jul 03, 2015 at 03:57:53PM -0700, tim Rowledge wrote: > > On 03-07-2015, at 2:00 PM, David T. Lewis wrote: > > > On Fri, Jul 03, 2015 at 09:31:07PM +0200, Tobias Pape wrote: > >> > >> A release is an outwards-activity; everyone here who posts at least once > >> a year is able to change the background in no time, ... > > > > OK, I'll bite. How do I restore the colored windows and background to > > the previous defaults? > > You could save your old image?s preferences to file and load from file in the new image. That?s what I tend to do, though it can seem to save rather a lot. > OK that's good, but the pastel theme of the 4.5 era represents someone's idea of a nice color scheme, and it was not too bad IMHO. I do not want to maintain my own personal set of preferences, I just want to know how to disable the dystopia theme and return to a world of color and light. I am guessing that there may be a single preference setting for this, but I do not know how to find it. Dave From eliot.miranda at gmail.com Sat Jul 4 02:23:27 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 4 02:23:30 2015 Subject: preserving history with breakpoints [Was Re: [squeak-dev] Squeak 4.6 release candidate] Message-ID: Hi Chris, Hi All, On Thu, Jul 2, 2015 at 12:26 PM, Chris Muller wrote: > We have a release candidate image. > > http://ftp.squeak.org/4.6/ > > The new sources file is required. > > Please test your apps. This could be the final image unless major > issues are uncovered. > One issue that I'm very tempted to address before the final release is the bug to do with inadvertent editing of a breakpointed method. When a breakpointed method is installed, the original is kept in a class var of BreakpointManager, and the new method, while it has full source, has that source stored in the method's trailer, not on the changes file, and so there is no back pointer to the source. If one doesn't realise the method contains a break and one redefines it, then the version history for the method will be broken. The new version fo the method will appear to be the only version. There are two things that IMO should be done: 1. a special warning should be raised when the compiler encounters a self break in method source. The BreakpointManager can catch and squash this warning when it is raised, but the warning can alert the programmer and give them a chance to abort the compilation, revert the method, and resubmit. 2. when ClassDescription>>logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: looks for the previous version of a method it can query the BreakpointManager to find out if the current version is a breakpointed method and get the real method from the BreakpointManager to preserve the history links. #1 is nice to have, and likely reduces the need for #2, but #2 is a must-have because it prevents history links being broken. My issue is how ClassDescription>>logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: queries the BreakpointManager. The issue is the dependency it introduces in a key Kernel method on the SYstem package. Right now there are probably lots of such dependencies and unloading System is impossible anyway, but I don't want to introduce any more dependencies. I can see two approaches that avoid the dependency. One is to use CompiledMethod>>#hasBreakpoint: logMethodSource: aText forMethodWithNode: aCompiledMethodWithNode inCategory: category withStamp: changeStamp notifying: requestor | priorMethodOrNil newText | priorMethodOrNil := self compiledMethodAt: aCompiledMethodWithNode selector ifAbsent: []. (priorMethodOrNil notNil and: [priorMethodOrNil hasBreakpoint]) ifTrue: [priorMethodOrNil := priorMethodOrNil nonBreakpointedOriginal]. newText := (requestor notNil and: [Preferences confirmFirstUseOfStyle]) ifTrue: [aText askIfAddStyle: priorMethodOrNil req: requestor] ifFalse: [aText]. aCompiledMethodWithNode method putSource: newText fromParseNode: aCompiledMethodWithNode node class: self category: category withStamp: changeStamp inFile: 2 priorMethod: priorMethodOrNil. where CompiledMethod>> nonBreakpointedOriginal is a new method that gets the original from BreakpointManager. But for this to be a good approach CompiledMethod>> hasBreakpoint needs to be an override. Currently hasBreakpoint is a System method: !CompiledMethod methodsFor: '*System-Tools-debugger support' stamp: 'emm 5/30/2002 09:22'! hasBreakpoint ^BreakpointManager methodHasBreakpoint: self! ! SO the question is how do I introduce an original that read !CompiledMethod methodsFor: 'debugger support' stamp: 'blah de blah'! hasBreakpoint ^false! ! so that System's version overrides it? Also how do I write an update that accomplishes that? The second approach is merely to use Smalltalk classNamed:, but that's ugly: logMethodSource: aText forMethodWithNode: aCompiledMethodWithNode inCategory: category withStamp: changeStamp notifying: requestor | priorMethodOrNil newText | priorMethodOrNil := self compiledMethodAt: aCompiledMethodWithNode selector ifAbsent: []. priorMethodOrNil ifNotNil: [(Smalltalk classNamed: #BreakpointManager) ifNotNil: [priorMethodOrNil := priorMethodOrNil nonBreakpointedOriginalFor: priorMethodOrNil]]. newText := (requestor notNil and: [Preferences confirmFirstUseOfStyle]) ifTrue: [aText askIfAddStyle: priorMethodOrNil req: requestor] ifFalse: [aText]. aCompiledMethodWithNode method putSource: newText fromParseNode: aCompiledMethodWithNode node class: self category: category withStamp: changeStamp inFile: 2 priorMethod: priorMethodOrNil. or something similar. I wouldn't suggest this except that I've made this error several times in the VMMaker package over the past few weeks. it's very easy to do, and it screws up history horribly. i really think we should fix this. It makes breakpoints dangerous otherwise. What d'y'all think? -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150703/74263766/attachment.htm From lewis at mail.msen.com Sat Jul 4 04:10:41 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Sat Jul 4 04:10:43 2015 Subject: preserving history with breakpoints [Was Re: [squeak-dev] Squeak 4.6 release candidate] In-Reply-To: References: Message-ID: <20150704041041.GA37370@shell.msen.com> On Fri, Jul 03, 2015 at 07:23:27PM -0700, Eliot Miranda wrote: > Hi Chris, Hi All, > > On Thu, Jul 2, 2015 at 12:26 PM, Chris Muller wrote: > > > We have a release candidate image. > > > > http://ftp.squeak.org/4.6/ > > > > The new sources file is required. > > > > Please test your apps. This could be the final image unless major > > issues are uncovered. > > One issue that I'm very tempted to address before the final release is the > bug to do with inadvertent editing of a breakpointed method. Squeak 4.6 needs to be frozen. This sounds like something that can be addressed in a next release after 4.6, so lets do that please. Dave From jakob.reschke at student.hpi.de Sat Jul 4 09:08:47 2015 From: jakob.reschke at student.hpi.de (Jakob Reschke) Date: Sat Jul 4 09:09:11 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <93678e4dad7a4b17973c330f5214ec2d@OWA-2012.hpi.uni-potsdam.de> References: <5595B975.2090309@zogotounga.net> <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> <20150703210026.GA76403@shell.msen.com> <93678e4dad7a4b17973c330f5214ec2d@OWA-2012.hpi.uni-potsdam.de> Message-ID: 2015-07-04 2:41 GMT+02:00 David T. Lewis : > > I just want to know how to > disable the dystopia theme and return to a world of color and light. > Yesterday, Robert posted a screenshot which shows that you can change the window colors quickly from the Extras menu. Btw there is this facility of "themes" in the preferences browser and world menu > appearance > choose theme, but there currently is no theme which matches the default preferences. Not really important for the imminent release, but maybe there should be a theme to go back to the defaults at some time? There also is a 'default' button in the preferences browser but it does not reset the rounded window corners of the old outOfTheBox theme, for example. Jakob From lewis at mail.msen.com Sat Jul 4 13:49:56 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Sat Jul 4 13:49:59 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: <5595B975.2090309@zogotounga.net> <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> <20150703210026.GA76403@shell.msen.com> <93678e4dad7a4b17973c330f5214ec2d@OWA-2012.hpi.uni-potsdam.de> Message-ID: <20150704134956.GA26567@shell.msen.com> On Sat, Jul 04, 2015 at 11:08:47AM +0200, Jakob Reschke wrote: > 2015-07-04 2:41 GMT+02:00 David T. Lewis : > > > > I just want to know how to > > disable the dystopia theme and return to a world of color and light. > > > > Yesterday, Robert posted a screenshot which shows that you can change > the window colors quickly from the Extras menu. Thank you, that's what I was looking for. I had forgotten about that menu option :-) > > Btw there is this facility of "themes" in the preferences browser and > world menu > appearance > choose theme, but there currently is no > theme which matches the default preferences. Not really important for > the imminent release, but maybe there should be a theme to go back to > the defaults at some time? There also is a 'default' button in the > preferences browser but it does not reset the rounded window corners > of the old outOfTheBox theme, for example. > Good ideas! Dave From lewis at mail.msen.com Sat Jul 4 14:15:07 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Sat Jul 4 14:15:08 2015 Subject: preserving history with breakpoints [Was Re: [squeak-dev] Squeak 4.6 release candidate] In-Reply-To: <20150704041041.GA37370@shell.msen.com> References: <20150704041041.GA37370@shell.msen.com> Message-ID: <20150704141507.GB26567@shell.msen.com> On Sat, Jul 04, 2015 at 12:10:41AM -0400, David T. Lewis wrote: > On Fri, Jul 03, 2015 at 07:23:27PM -0700, Eliot Miranda wrote: > > Hi Chris, Hi All, > > > > On Thu, Jul 2, 2015 at 12:26 PM, Chris Muller wrote: > > > > > We have a release candidate image. > > > > > > http://ftp.squeak.org/4.6/ > > > > > > The new sources file is required. > > > > > > Please test your apps. This could be the final image unless major > > > issues are uncovered. > > > > One issue that I'm very tempted to address before the final release is the > > bug to do with inadvertent editing of a breakpointed method. > > Squeak 4.6 needs to be frozen. This sounds like something that can be > addressed in a next release after 4.6, so lets do that please. > I guess that is entirely the wrong thing for me to say, since I don't even know what would be involved in the fix. What I should have said is that it is great that we have the release candidate prepared in time for ECOOP (thanks!), so I think it would be good to avoid any late changes to that release package unless really necessary. Dave From eliot.miranda at gmail.com Sat Jul 4 14:25:24 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 4 14:25:30 2015 Subject: preserving history with breakpoints [Was Re: [squeak-dev] Squeak 4.6 release candidate] In-Reply-To: <20150704141507.GB26567@shell.msen.com> References: <20150704041041.GA37370@shell.msen.com> <20150704141507.GB26567@shell.msen.com> Message-ID: <7BDFD2B7-40EC-4B9A-A52C-DFC2D65878C3@gmail.com> Hi Dave, On Jul 4, 2015, at 7:15 AM, "David T. Lewis" wrote: > On Sat, Jul 04, 2015 at 12:10:41AM -0400, David T. Lewis wrote: >> On Fri, Jul 03, 2015 at 07:23:27PM -0700, Eliot Miranda wrote: >>> Hi Chris, Hi All, >>> >>> On Thu, Jul 2, 2015 at 12:26 PM, Chris Muller wrote: >>> >>>> We have a release candidate image. >>>> >>>> http://ftp.squeak.org/4.6/ >>>> >>>> The new sources file is required. >>>> >>>> Please test your apps. This could be the final image unless major >>>> issues are uncovered. >>> >>> One issue that I'm very tempted to address before the final release is the >>> bug to do with inadvertent editing of a breakpointed method. >> >> Squeak 4.6 needs to be frozen. This sounds like something that can be >> addressed in a next release after 4.6, so lets do that please. > > I guess that is entirely the wrong thing for me to say, since I don't > even know what would be involved in the fix. > > What I should have said is that it is great that we have the release > candidate prepared in time for ECOOP (thanks!), so I think it would be > good to avoid any late changes to that release package unless really > necessary. I was about to say that I agree with your first reply even though, having slept on it, I woke up realizing the #2 fix above is easy. So given yiur second message I'll implement #2 and leave #1 for after the release. To get the override in place, create a config for the status quo, commit a version of Kernel containing the default CompiledMethod>>#hasBreakpoint, create a config, then commit a version of System which restores the override. I guess I was tired last night cuz this is obvious. Ok time to get up, have a cup of tea and do this :) > Dave > > From commits at source.squeak.org Sat Jul 4 14:59:11 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sat Jul 4 14:59:13 2015 Subject: [squeak-dev] The Trunk: Kernel-eem.933.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.933.mcz ==================== Summary ==================== Name: Kernel-eem.933 Author: eem Time: 4 July 2015, 7:58:36.434 am UUID: a36cc963-e938-4707-b373-145dd2b049c8 Ancestors: Kernel-eem.932 Version of Kernel providing base version if CompiledMethod>>hasBreakpoint which System will override. =============== Diff against Kernel-eem.932 =============== Item was added: + ----- Method: CompiledMethod>>hasBreakpoint (in category 'testing') ----- + hasBreakpoint + ^false! From commits at source.squeak.org Sat Jul 4 15:02:57 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sat Jul 4 15:02:59 2015 Subject: [squeak-dev] The Trunk: System-eem.752.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-eem.752.mcz ==================== Summary ==================== Name: System-eem.752 Author: eem Time: 4 July 2015, 8:02:18.883 am UUID: bf3bb9ac-c571-4fd7-9446-4ee00ac31416 Ancestors: System-cmm.751 Provide support for uninstaling breakpoints in ClassDescription>>#logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: =============== Diff against System-cmm.751 =============== Item was added: + ----- Method: BreakpointManager class>>forget: (in category 'install-uninstall') ----- + forget: breakMethod + "Answer the original unbreakpointed method, removing the original from the BreakpointManager's collection. + Use with care!!!!" + ^self installed removeKey: breakMethod ifAbsent: []! Item was added: + ----- Method: CompiledMethod>>getAndForgetUnbreakpointedOriginal (in category '*System-Tools-debugger support') ----- + getAndForgetUnbreakpointedOriginal + "Answer the original unbreakpointed method, removing the original from the BreakpointManager's collection. + Use with care!!!!" + self assert: self hasBreakpoint. + ^BreakpointManager forget: self! From commits at source.squeak.org Sat Jul 4 15:07:33 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sat Jul 4 15:07:37 2015 Subject: [squeak-dev] The Trunk: Kernel-eem.934.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.934.mcz ==================== Summary ==================== Name: Kernel-eem.934 Author: eem Time: 4 July 2015, 8:06:46.434 am UUID: 7ab39047-e820-41a4-989e-f9bfac8b4415 Ancestors: Kernel-eem.933 Make sure that any breakpointed version of a method has been removed from BreakpointManager and that the original unbreakpointed methid is in hand when method source is logged, hence preserving method history even if the programmer mistakenly redefines a breakpointed method (something which this poor author is susceptible to). =============== Diff against Kernel-eem.933 =============== Item was changed: ----- Method: ClassDescription>>logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: (in category 'private') ----- logMethodSource: aText forMethodWithNode: aCompiledMethodWithNode inCategory: category withStamp: changeStamp notifying: requestor | priorMethodOrNil newText | priorMethodOrNil := self compiledMethodAt: aCompiledMethodWithNode selector ifAbsent: []. + (priorMethodOrNil notNil and: [priorMethodOrNil hasBreakpoint]) ifTrue: + [priorMethodOrNil := priorMethodOrNil getAndForgetUnbreakpointedOriginal]. + newText := (requestor notNil and: [Preferences confirmFirstUseOfStyle]) + ifTrue: [aText askIfAddStyle: priorMethodOrNil req: requestor] + ifFalse: [aText]. + aCompiledMethodWithNode method + putSource: newText - newText := (requestor notNil - and: [Preferences confirmFirstUseOfStyle]) - ifTrue: [aText askIfAddStyle: priorMethodOrNil req: requestor] - ifFalse: [aText]. - aCompiledMethodWithNode method putSource: newText fromParseNode: aCompiledMethodWithNode node + class: self + category: category + withStamp: changeStamp + inFile: 2 + priorMethod: priorMethodOrNil! - class: self category: category withStamp: changeStamp - inFile: 2 priorMethod: priorMethodOrNil.! Item was removed: - ----- Method: CompiledMethod>>hasBreakpoint (in category 'testing') ----- - hasBreakpoint - ^false! From eliot.miranda at gmail.com Sat Jul 4 15:10:35 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 4 15:10:39 2015 Subject: preserving history with breakpoints [Was Re: [squeak-dev] Squeak 4.6 release candidate] In-Reply-To: <7BDFD2B7-40EC-4B9A-A52C-DFC2D65878C3@gmail.com> References: <20150704041041.GA37370@shell.msen.com> <20150704141507.GB26567@shell.msen.com> <7BDFD2B7-40EC-4B9A-A52C-DFC2D65878C3@gmail.com> Message-ID: Hi David, On Sat, Jul 4, 2015 at 7:25 AM, Eliot Miranda wrote: > Hi Dave, > > On Jul 4, 2015, at 7:15 AM, "David T. Lewis" wrote: > > > On Sat, Jul 04, 2015 at 12:10:41AM -0400, David T. Lewis wrote: > >> On Fri, Jul 03, 2015 at 07:23:27PM -0700, Eliot Miranda wrote: > >>> Hi Chris, Hi All, > >>> > >>> On Thu, Jul 2, 2015 at 12:26 PM, Chris Muller > wrote: > >>> > >>>> We have a release candidate image. > >>>> > >>>> http://ftp.squeak.org/4.6/ > >>>> > >>>> The new sources file is required. > >>>> > >>>> Please test your apps. This could be the final image unless major > >>>> issues are uncovered. > >>> > >>> One issue that I'm very tempted to address before the final release is > the > >>> bug to do with inadvertent editing of a breakpointed method. > >> > >> Squeak 4.6 needs to be frozen. This sounds like something that can be > >> addressed in a next release after 4.6, so lets do that please. > > > > I guess that is entirely the wrong thing for me to say, since I don't > > even know what would be involved in the fix. > > > > What I should have said is that it is great that we have the release > > candidate prepared in time for ECOOP (thanks!), so I think it would be > > good to avoid any late changes to that release package unless really > > necessary. > > I was about to say that I agree with your first reply even though, having > slept on it, I woke up realizing the #2 fix above is easy. So given yiur > second message I'll implement #2 and leave #1 for after the release. > > To get the override in place, create a config for the status quo, commit a > version of Kernel containing the default CompiledMethod>>#hasBreakpoint, > create a config, then commit a version of System which restores the > override. I guess I was tired last night cuz this is obvious. Ok time to > get up, have a cup of tea and do this :) > OK, #2 is implemented and committed. #1, the warning on defining a method containing a break, can wait until after the release. I think it's important to fix #2, though, because destroying method history is a bad bug. Cheers! > Dave > > > > -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150704/9fec186f/attachment.htm From eliot.miranda at gmail.com Sat Jul 4 15:49:11 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 4 15:49:13 2015 Subject: Things that need fixing in the new Squeak Website [Was [squeak-dev] [ANN] The Squeak Website] Message-ID: Hi Both, first and foremost warm congratulations and deep thanks; this is truly lovely and communicative. It looks great. Here are a few things I think really need fixing: 1. Features. The Features page /must/ have a More... link that links to Projects. The current page can give the mis-impression that the only application-oriented feature is support for Web Development. But the Projects page is rich with more features, and the More... link will reach it quickly and is in keeping with the More... links on the front page. 2. "interpreting" in "There are several fast Squeak VMs that also support other languages of the Smalltalk family. Meta-tracing, just-in-time compilation, stack-to-register mapping, and aggressive in-line message caching yield efficiency in interpreting Smalltalk byte code." must read "executing". The VM doesn't interpret Smalltalk code most of the time. 3, One project glaring in its absence from the Projects page is: "VMMaker The framework for creating the virtual machine. This is a Smalltalk program called the simulator that is used to develop the VM using the full power of the IDE, and a Smalltalk-to-C or Smalltalk-to-JavaScript translator that produces the sources for the production VM. So even the VM is implemented in Smalltalk!" I would use the Cog Squeak VM icon for this: http://squeak.org/img/dev/interpreter.png Alternatively, if you want to keep this on the Development page, "Build Your Own VM" needs to come first, stating that all the other projects, Cog, SqueakJS, Interpreter VM etc are variations on VMMaker. I think the VMMaker paragraph shoudl read "Build Your Own VM VMMaker allows any programmer to *develop* a customized virtual machine for any platform. VMMaker comprises the VM simulator that is used to develop the VM using the full power of the IDE, and a Smalltalk-to-C or Smalltalk-to-JavaScript translator that produces the sources for the production VM." Here are some quibbles. Personally I find the "It's Smalltalk!" paragraph is missing one of the most essential things, that the system is implemented in itself. So I would either extend it to read something like "Everything is an object. Objects collaborate by exchanging messages to achieve the desired application behavior. The Smalltalk programming language has a concise syntax and simple execution semantics. The Smalltalk system is implemented in itself, the compiler, debugger, programming tools and so on being Smalltalk code the user can read and modify. Novice programmers can get started easily and experts can engineer elegant solutions at large." or I would add a new subsection in Features that states "It's Smalltalk All The Way Down! Typical dynamic language implementations hide key components such as the compiler in the virtual machine. Smalltalk is different; it implements everything except the execution engine in the system itself. The compiler, the class system, the exception system, the programming tools are all Smalltalk and can be read and extended by the programmer. Smalltalk is truly an open system. Smalltalk supports developing one's own programming tools as one programs; it really is a meta-programming system!" and have it displace the Fast Virtual Machine section, which can happily live on the Features page. Another quibble is that Lively, Frank and arguably Newspeak aren't Squeak projects. They're systems in their own right and one can't merely load them into Squeak. They either use Squeak as an implementation vehicle, in Newspeak's case rendering the original system non-functional, or they are hosted on an entirely different platform. I wonder if they would work better in a Related Projects section. I would also have a link to Pharo as a sibling system with a different philosophy. Finally another quibble is that Terf isn't described as being a version of Croquet oriented to wrads business communication. Wow, I /love/ this new site. Thank you so much! On Mon, Jun 29, 2015 at 5:40 AM, Tobias Pape wrote: > Dear Smalltalkers > > I am pleased to announce new look of the Squeak Website > > http://squeak.org > > Personally, I want to thank Fabio Niephaus, who invested a lot > of effort into the new site. > > Within the next week, the source for the site should be arrive > at our github organization[1] so that changes can be easily done > via pull requests. > > Best regards > -Tobias > > > [1]: https://github.com/squeak-smalltalk/ > > > > -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150704/ee836c81/attachment.htm From lewis at mail.msen.com Sat Jul 4 15:55:07 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Sat Jul 4 15:55:09 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: <20150704155507.GA48353@shell.msen.com> On Thu, Jul 02, 2015 at 02:26:23PM -0500, Chris Muller wrote: > We have a release candidate image. > > http://ftp.squeak.org/4.6/ > > The new sources file is required. > > Please test your apps. This could be the final image unless major > issues are uncovered. > When loading OSProcess from SqueakMap, I get an error in SMSimpleInstaller>>fileIntoChangeSetNamed:fromStream: due to SystemVersion current highestUpdate ==> 10 The SqueakMap loader is doing this: oldChanges := (SystemVersion current highestUpdate < 5302) ifFalse: [global := ChangeSet. ChangeSet current] ifTrue: [global := Smalltalk. Smalltalk changes]. Is the highestUpdate set wrong in the release candidate, or is this something that needs to be fixed in the squeakmap loader? Dave From eliot.miranda at gmail.com Sat Jul 4 16:16:00 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 4 16:16:05 2015 Subject: [squeak-dev] New Cog VMs available Message-ID: ... at http://www.mirandabanda.org/files/Cog/VM/VM.r3395 These include the Squeak 4.6 & 5.0 release candidate VMs. Also included is a Newspeak ARM JIT VM. CogVM binaries as per VMMaker.oscog-eem.1403/r3395 Fix long-standing bug in primitiveVMParameter for setting, and hence allow Spur to set maxOldSpaceSize. Spur: Provide a limit to the size of old space on Spur. Access maxOldSpaceSize via vmParameterAt: 67 & command line parameter -maxoldspace. Cogit: Simplify pushRemoteTemp register management to be able to improve further the overall register management. -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150704/af8fb955/attachment.htm From lewis at mail.msen.com Sat Jul 4 16:20:22 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Sat Jul 4 16:20:26 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: <20150704162022.GB48353@shell.msen.com> On Thu, Jul 02, 2015 at 02:26:23PM -0500, Chris Muller wrote: > We have a release candidate image. > > http://ftp.squeak.org/4.6/ > > The new sources file is required. > > Please test your apps. This could be the final image unless major > issues are uncovered. > When running the release candidate image on an interpreter VM, I am getting VM crashes apparently related to scanning memory. Symptoms are not consistent, but examples include: lewis@LexIT:~/squeak/Squeak4.6$ sweep failed to find exact end of memory 27167072 GradientFillStyle>scaledAlphaMix:of:with: 27166824 GradientFillStyle>computePixelRampOfSize: 27164672 OrderedCollection>do: 27163608 GradientFillStyle>computePixelRampOfSize: 27163516 GradientFillStyle class>? 27163332 LRUCache>at: ... lewis@LexIT:~/squeak/Squeak4.6$ Recursive not understood error encountered 26746900 WeakKeyDictionary>fixCollisionsFrom: 26746808 Dictionary>removeKey:ifAbsent: 26746716 WeakRegistry>remove:ifAbsent: 26746624 BlockClosure>on:do: 26746508 BlockClosure>ifError: 26746392 Semaphore>critical:ifError: 26746300 Semaphore>critical: 26746208 BlockClosure>ensure: 26746056 Semaphore>critical: 26745920 Semaphore>critical:ifError: 26745808 WeakRegistry>protected: 26745692 WeakRegistry>remove:ifAbsent: 26745600 StandardFileStream class>unregister: 26745508 StandardFileStream>unregister 26745416 StandardFileStream>close ... Initially, I thought that saving the image from the interpreter VM resolved the problem, but it turns out not to be the case. This happens with the unix VM downloaded from squeakvm.org (which is now a couple of years old), and it also happens with a fully up to date VM that I compile myself. It does not happen with Cog. Interestingly, just scanning through object memory like this does not cause a crash: obj := Object someObject. [obj := obj nextObject. obj ~= 0] whileTrue. This does not happen on my updated trunk image, so it appears to be related to something in the release candidate image only. I'm sorry I cannot be more specific as to the cause, but I thought it worth reporting. Dave From lists at fniephaus.com Sat Jul 4 17:49:00 2015 From: lists at fniephaus.com (Fabio Niephaus) Date: Sat Jul 4 17:49:12 2015 Subject: Things that need fixing in the new Squeak Website [Was [squeak-dev] [ANN] The Squeak Website] In-Reply-To: References: Message-ID: Hi Eliot, Thank you for the comprehensive feedback! It shouldn't be too much work to incorporate your notes and I'll try to do it in the next couple of days while I'm at ECOOP. :) Best, Fabio On Sat, Jul 4, 2015 at 4:49 PM Eliot Miranda wrote: > Hi Both, > > first and foremost warm congratulations and deep thanks; this is truly > lovely and communicative. It looks great. > > Here are a few things I think really need fixing: > > 1. Features. The Features page /must/ have a More... link that links to > Projects. The current page can give the mis-impression that the only > application-oriented feature is support for Web Development. But the > Projects page is rich with more features, and the More... link will reach > it quickly and is in keeping with the More... links on the front page. > > 2. "interpreting" in "There are several fast Squeak VMs that also support > other languages of the Smalltalk family. Meta-tracing, just-in-time > compilation, stack-to-register mapping, and aggressive in-line message > caching yield efficiency in interpreting Smalltalk byte code." must read > "executing". The VM doesn't interpret Smalltalk code most of the time. > > 3, One project glaring in its absence from the Projects page is: > > "VMMaker > > The framework for creating the virtual machine. This is a Smalltalk > program called the simulator that is used to develop the VM using the full > power of the IDE, and a Smalltalk-to-C or Smalltalk-to-JavaScript > translator that produces the sources for the production VM. So even the VM > is implemented in Smalltalk!" > > I would use the Cog Squeak VM icon for this: > http://squeak.org/img/dev/interpreter.png > > Alternatively, if you want to keep this on the Development page, "Build > Your Own VM" needs to come first, stating that all the other projects, Cog, > SqueakJS, Interpreter VM etc are variations on VMMaker. I think the > VMMaker paragraph shoudl read > > "Build Your Own VM > > VMMaker allows any programmer to *develop* a customized virtual > machine for any platform. VMMaker comprises the VM simulator that is used > to develop the VM using the full power of the IDE, and a Smalltalk-to-C or > Smalltalk-to-JavaScript translator that produces the sources for the > production VM." > > > Here are some quibbles. Personally I find the "It's Smalltalk!" paragraph > is missing one of the most essential things, that the system is implemented > in itself. So I would either extend it to read something like > > "Everything is an object. Objects collaborate by exchanging messages > to achieve the desired application behavior. The Smalltalk programming > language has a concise syntax and simple execution semantics. The Smalltalk > system is implemented in itself, the compiler, debugger, programming tools > and so on being Smalltalk code the user can read and modify. Novice > programmers can get started easily and experts can engineer elegant > solutions at large." > > or I would add a new subsection in Features that states > > "It's Smalltalk All The Way Down! > > Typical dynamic language implementations hide key components such as > the compiler in the virtual machine. Smalltalk is different; it implements > everything except the execution engine in the system itself. The compiler, > the class system, the exception system, the programming tools are all > Smalltalk and can be read and extended by the programmer. Smalltalk is > truly an open system. Smalltalk supports developing one's own programming > tools as one programs; it really is a meta-programming system!" > > and have it displace the Fast Virtual Machine section, which can happily > live on the Features page. > > Another quibble is that Lively, Frank and arguably Newspeak aren't Squeak > projects. They're systems in their own right and one can't merely load > them into Squeak. They either use Squeak as an implementation vehicle, in > Newspeak's case rendering the original system non-functional, or they are > hosted on an entirely different platform. I wonder if they would work > better in a Related Projects section. I would also have a link to Pharo as > a sibling system with a different philosophy. > > Finally another quibble is that Terf isn't described as being a version of > Croquet oriented to wrads business communication. > > Wow, I /love/ this new site. Thank you so much! > > On Mon, Jun 29, 2015 at 5:40 AM, Tobias Pape wrote: > >> Dear Smalltalkers >> >> I am pleased to announce new look of the Squeak Website >> >> http://squeak.org >> >> Personally, I want to thank Fabio Niephaus, who invested a lot >> of effort into the new site. >> >> Within the next week, the source for the site should be arrive >> at our github organization[1] so that changes can be easily done >> via pull requests. >> >> Best regards >> -Tobias >> >> >> [1]: https://github.com/squeak-smalltalk/ >> >> >> >> > > > -- > best, > Eliot > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150704/47317a8a/attachment.htm From herbertkoenig at gmx.net Sat Jul 4 19:02:37 2015 From: herbertkoenig at gmx.net (=?UTF-8?Q?Herbert_K=c3=b6nig?=) Date: Sat Jul 4 19:02:43 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: <55961C7A.5000805@gmx.net> Message-ID: <55982DCD.5030500@gmx.net> >> updates, update URL still points to 4.5 > Hm, says http://source.squeak.org/squeak46. You have to check the > actual release image, you can't just update your trunk image. sorry my bad, I had saved my preferences from a 4.5 image and loaded them in 4.6 :-( Herbert From eliot.miranda at gmail.com Sat Jul 4 20:09:40 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 4 20:09:48 2015 Subject: Things that need fixing in the new Squeak Website [Was [squeak-dev] [ANN] The Squeak Website] In-Reply-To: References: Message-ID: On Jul 4, 2015, at 10:49 AM, Fabio Niephaus wrote: > Hi Eliot, > > Thank you for the comprehensive feedback! > It shouldn't be too much work to incorporate your notes and I'll try to do it in the next couple of days while I'm at ECOOP. :) Thanks Fabio, and again congratulations and thanks on a great job! > > Best, > Fabio > > On Sat, Jul 4, 2015 at 4:49 PM Eliot Miranda wrote: >> Hi Both, >> >> first and foremost warm congratulations and deep thanks; this is truly lovely and communicative. It looks great. >> >> Here are a few things I think really need fixing: >> >> 1. Features. The Features page /must/ have a More... link that links to Projects. The current page can give the mis-impression that the only application-oriented feature is support for Web Development. But the Projects page is rich with more features, and the More... link will reach it quickly and is in keeping with the More... links on the front page. >> >> 2. "interpreting" in "There are several fast Squeak VMs that also support other languages of the Smalltalk family. Meta-tracing, just-in-time compilation, stack-to-register mapping, and aggressive in-line message caching yield efficiency in interpreting Smalltalk byte code." must read "executing". The VM doesn't interpret Smalltalk code most of the time. >> >> 3, One project glaring in its absence from the Projects page is: >> >> "VMMaker >> >> The framework for creating the virtual machine. This is a Smalltalk program called the simulator that is used to develop the VM using the full power of the IDE, and a Smalltalk-to-C or Smalltalk-to-JavaScript translator that produces the sources for the production VM. So even the VM is implemented in Smalltalk!" >> >> I would use the Cog Squeak VM icon for this: http://squeak.org/img/dev/interpreter.png >> >> Alternatively, if you want to keep this on the Development page, "Build Your Own VM" needs to come first, stating that all the other projects, Cog, SqueakJS, Interpreter VM etc are variations on VMMaker. I think the VMMaker paragraph shoudl read >> >> "Build Your Own VM >> >> VMMaker allows any programmer to develop a customized virtual machine for any platform. VMMaker comprises the VM simulator that is used to develop the VM using the full power of the IDE, and a Smalltalk-to-C or Smalltalk-to-JavaScript translator that produces the sources for the production VM." >> >> >> Here are some quibbles. Personally I find the "It's Smalltalk!" paragraph is missing one of the most essential things, that the system is implemented in itself. So I would either extend it to read something like >> >> "Everything is an object. Objects collaborate by exchanging messages to achieve the desired application behavior. The Smalltalk programming language has a concise syntax and simple execution semantics. The Smalltalk system is implemented in itself, the compiler, debugger, programming tools and so on being Smalltalk code the user can read and modify. Novice programmers can get started easily and experts can engineer elegant solutions at large." >> >> or I would add a new subsection in Features that states >> >> "It's Smalltalk All The Way Down! >> >> Typical dynamic language implementations hide key components such as the compiler in the virtual machine. Smalltalk is different; it implements everything except the execution engine in the system itself. The compiler, the class system, the exception system, the programming tools are all Smalltalk and can be read and extended by the programmer. Smalltalk is truly an open system. Smalltalk supports developing one's own programming tools as one programs; it really is a meta-programming system!" >> >> and have it displace the Fast Virtual Machine section, which can happily live on the Features page. >> >> Another quibble is that Lively, Frank and arguably Newspeak aren't Squeak projects. They're systems in their own right and one can't merely load them into Squeak. They either use Squeak as an implementation vehicle, in Newspeak's case rendering the original system non-functional, or they are hosted on an entirely different platform. I wonder if they would work better in a Related Projects section. I would also have a link to Pharo as a sibling system with a different philosophy. >> >> Finally another quibble is that Terf isn't described as being a version of Croquet oriented to wrads business communication. >> >> Wow, I /love/ this new site. Thank you so much! >> >> On Mon, Jun 29, 2015 at 5:40 AM, Tobias Pape wrote: >>> Dear Smalltalkers >>> >>> I am pleased to announce new look of the Squeak Website >>> >>> http://squeak.org >>> >>> Personally, I want to thank Fabio Niephaus, who invested a lot >>> of effort into the new site. >>> >>> Within the next week, the source for the site should be arrive >>> at our github organization[1] so that changes can be easily done >>> via pull requests. >>> >>> Best regards >>> -Tobias >>> >>> >>> [1]: https://github.com/squeak-smalltalk/ >> >> >> >> -- >> best, >> Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150704/0ae5bc0c/attachment.htm From commits at source.squeak.org Sat Jul 4 21:55:02 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sat Jul 4 21:55:05 2015 Subject: [squeak-dev] Daily Commit Log Message-ID: <20150704215502.2136.qmail@box4.squeakfoundation.org> Changes to Trunk (http://source.squeak.org/trunk.html) in the last 24 hours: http://lists.squeakfoundation.org/pipermail/packages/2015-July/008795.html Name: Kernel-eem.933 Ancestors: Kernel-eem.932 Version of Kernel providing base version if CompiledMethod>>hasBreakpoint which System will override. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008796.html Name: System-eem.752 Ancestors: System-cmm.751 Provide support for uninstaling breakpoints in ClassDescription>>#logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008797.html Name: Kernel-eem.934 Ancestors: Kernel-eem.933 Make sure that any breakpointed version of a method has been removed from BreakpointManager and that the original unbreakpointed methid is in hand when method source is logged, hence preserving method history even if the programmer mistakenly redefines a breakpointed method (something which this poor author is susceptible to). ============================================= From tim at rowledge.org Sun Jul 5 03:29:55 2015 From: tim at rowledge.org (tim Rowledge) Date: Sun Jul 5 03:30:03 2015 Subject: [squeak-dev] Some VM plugins not currently being built Message-ID: <805444B5-5F81-4E68-8A3E-A16674B2DFB5@rowledge.org> Whilst checking Scratch functionality on the new ARM Cog VM I noticed that at least a couple of important plugins weren?t being built; it wasn?t too hard to fix that particular set. However, there are some that simply aren?t in the build process right now for the cog family. I?m wondering which ones we should consider important enough to sort out and which are no longer wanted. My list includes - ClipboardExtendedPlugin DBusPlugin FT2Plugin GStreamerPlugin ImmX11Plugin OggPlugin RomePlugin PrintJobPlugin (not even in vmmaker) VideoForLinuxPlugin (ditto) Any more we should know about? tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Drugs may lead to nowhere, but at least it's the scenic route. From herbertkoenig at gmx.net Sun Jul 5 03:46:58 2015 From: herbertkoenig at gmx.net (=?UTF-8?Q?Herbert_K=c3=b6nig?=) Date: Sun Jul 5 03:47:02 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: <5598A8B2.40102@gmx.net> Hi, > We have a release candidate image. > > http://ftp.squeak.org/4.6/ > trying to change the dark background colour, bring up the halo on the World's background. The red (menu) halo button responds with a MNU: SolidFillStyle>>addFillStyleMenuItems:hand:from: This does not happen, if the fillStyle is the InfiniteForm imported via Preferences from 4.5. If from there I change back to solidFill the MNU is gone. From lewis at mail.msen.com Sun Jul 5 04:39:13 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Sun Jul 5 04:39:16 2015 Subject: [squeak-dev] Some VM plugins not currently being built In-Reply-To: <805444B5-5F81-4E68-8A3E-A16674B2DFB5@rowledge.org> References: <805444B5-5F81-4E68-8A3E-A16674B2DFB5@rowledge.org> Message-ID: <20150705043913.GA68566@shell.msen.com> On Sat, Jul 04, 2015 at 08:29:55PM -0700, tim Rowledge wrote: > Whilst checking Scratch functionality on the new ARM Cog VM I noticed that at least a couple of important plugins weren?t being built; it wasn?t too hard to fix that particular set. > > However, there are some that simply aren?t in the build process right now for the cog family. I?m wondering which ones we should consider important enough to sort out and which are no longer wanted. My list includes - > ClipboardExtendedPlugin > DBusPlugin > FT2Plugin > GStreamerPlugin > ImmX11Plugin > OggPlugin > RomePlugin > PrintJobPlugin (not even in vmmaker) > VideoForLinuxPlugin (ditto) > > Any more we should know about? > I do not know the whereabouts of PrintJobPlugin and VideoForLinuxPlugin, but the default unix configuration according to VMMakerTool class>>defaultUnixSpec is: defaultUnixSpec "Typical VMMaker spec for a unix/linux target platform" "VMMakerTool defaultUnixSpec" ^#( #( "internal plugins" #ADPCMCodecPlugin #AsynchFilePlugin #BMPReadWriterPlugin #BalloonEnginePlugin #BitBltSimulation #CroquetPlugin #DSAPlugin #DeflatePlugin #DropPlugin #FFTPlugin #FilePlugin #FloatArrayPlugin #FloatMathPlugin #GeniePlugin #JPEGReadWriter2Plugin #JPEGReaderPlugin #JoystickTabletPlugin #KlattSynthesizerPlugin #LargeIntegersPlugin #LocalePlugin #MD5Plugin #Matrix2x3Plugin #MiscPrimitivePlugin #RandPlugin #RePlugin #SHA256Plugin #SecurityPlugin #SerialPlugin #SlangTestPlugin #SlangTestSupportPlugin #SocketPlugin #SoundCodecPlugin #SoundGenerationPlugin #SoundPlugin #StarSqueakPlugin #SurfacePlugin ) #( "external plugins" #B3DAcceleratorPlugin #B3DEnginePlugin #ClipboardExtendedPlugin #DBusPlugin #FFIPlugin #FileCopyPlugin #FT2Plugin #GStreamerPlugin #HostWindowPlugin #KedamaPlugin2 #MIDIPlugin #Mpeg3Plugin #RomePlugin #UUIDPlugin #UnixAioPlugin #UnixOSProcessPlugin #XDisplayControlPlugin #CameraPlugin #ScratchPlugin #UnicodePlugin #WeDoPlugin #SqueakSSLPlugin ) true "inline flag" false "forBrowser flag" 'unix' "platform" 'src' "source directory for generated sources" 'platforms' "path to platform sources" 4 "unused, was bytesPerWord which is now a compile time definition" true "unused, was flag for source directtory pathname is relative" true "unused, was flag for platforms directory path is relative" 'Interpreter' "interpreter class name" ) From karlramberg at gmail.com Sun Jul 5 04:46:50 2015 From: karlramberg at gmail.com (karl ramberg) Date: Sun Jul 5 04:46:54 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <5598A8B2.40102@gmx.net> References: <5598A8B2.40102@gmx.net> Message-ID: Confirmed. SolidFillStyle does not implement addFillStyleMenuItems: aMenu hand: aHand from: aMorph It should be the same as in Color>>addFillStyleMenuItems: aMenu hand: aHand from: aMorph "Add the items for changing the current fill style of the receiver" aMenu add: 'change color...' translated target: self selector: #changeColorIn:event: argument: aMorph Karl On Sun, Jul 5, 2015 at 5:46 AM, Herbert K?nig wrote: > Hi, > >> We have a release candidate image. >> >> http://ftp.squeak.org/4.6/ >> >> trying to change the dark background colour, bring up the halo on the > World's background. The red (menu) halo button responds with a MNU: > SolidFillStyle>>addFillStyleMenuItems:hand:from: > This does not happen, if the fillStyle is the InfiniteForm imported via > Preferences from 4.5. If from there I change back to solidFill the MNU is > gone. > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150705/3805dd62/attachment.htm From Marcel.Taeumel at hpi.de Sun Jul 5 08:34:01 2015 From: Marcel.Taeumel at hpi.de (marcel.taeumel) Date: Sun Jul 5 08:56:49 2015 Subject: [squeak-dev] Re: Squeak 4.6 release candidate In-Reply-To: References: <5595B975.2090309@zogotounga.net> <47541E19-27EA-43BA-928F-47B468482A31@gmx.de> <20150703210026.GA76403@shell.msen.com> Message-ID: <1436085241199-4835810.post@n4.nabble.com> Themes are deprecated and should be removed in future releases. This also includes a re-design of the preferences browser, preference-related classes, and the way the ReleaseBuilder configures preferences. There is even the idea of a "reset of factory defaults" but it is not working either. This is all quite messy. There also should be a Morphic-style "First Time Wizard" that lets you choose and explore the most important look-and-feel settings instead of having to browse the numerous settings the preferences browser has to offer. We will not and cannot fix all this for 4.6. ;-) @window_colors: You can find it in the preferences browser, too. Just select one color and the list of color specifications will appear. Best, Marcel -- View this message in context: http://forum.world.st/Squeak-4-6-release-candidate-tp4835432p4835810.html Sent from the Squeak - Dev mailing list archive at Nabble.com. From commits at source.squeak.org Sun Jul 5 14:37:54 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sun Jul 5 14:37:55 2015 Subject: [squeak-dev] The Trunk: Help-Squeak-Project-dtl.27.mcz Message-ID: David T. Lewis uploaded a new version of Help-Squeak-Project to project The Trunk: http://source.squeak.org/trunk/Help-Squeak-Project-dtl.27.mcz ==================== Summary ==================== Name: Help-Squeak-Project-dtl.27 Author: dtl Time: 5 July 2015, 10:37:43.338 am UUID: 0c360d55-b3b9-444e-a3ef-27d99df70000 Ancestors: Help-Squeak-Project-dtl.26 Fix opening the release notes page in help browser (Help Browser -> Squeak -> The Project -> Release Notes) =============== Diff against Help-Squeak-Project-dtl.26 =============== Item was changed: ----- Method: SqueakProjectHelp class>>releaseNotes (in category 'pages') ----- releaseNotes "This method was automatically generated. Edit it using:" "a HelpBrowser edit: #releaseNotes" ^HelpTopic title: 'Release Notes' + contents: TheWorldMainDockingBar new releaseNotes "<--- ugh, we will fix this later, for now may we not have TWO copies of the 8K release notes string in memory?"! - contents: TheWorldMainDockingBar releaseNotes "<--- ugh, we will fix this later, for now may we not have TWO copies of the 8K release notes string in memory?"! From commits at source.squeak.org Sun Jul 5 14:48:55 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sun Jul 5 14:48:57 2015 Subject: [squeak-dev] Squeak 4.6: Help-Squeak-Project-dtl.26.mcz Message-ID: David T. Lewis uploaded a new version of Help-Squeak-Project to project Squeak 4.6: http://source.squeak.org/squeak46/Help-Squeak-Project-dtl.26.mcz ==================== Summary ==================== Name: Help-Squeak-Project-dtl.26 Author: dtl Time: 2 July 2015, 7:50:00.887 pm UUID: f80c8ff5-ece3-4f1c-a882-462e7cfe0000 Ancestors: Help-Squeak-Project-cmm.25 Editing correction: "Like most Smalltalk's" should be "Like most Smalltalks" =============== Diff against Help-Squeak-Project-cmm.25 =============== Item was added: + SystemOrganization addCategory: #'Help-Squeak-Project'! Item was added: + ----- Method: HelpIcons class>>squeakIcon (in category '*help-squeak-project') ----- + squeakIcon + ^(Form + extent: 12@12 + depth: 32 + fromArray: #( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 75398782 26843545 0 0 1159996452 1378823983 338044454 0 0 0 0 455682345 1295266868 1126376227 0 0 1040582150 0 1328097577 0 0 0 23488102 1277502757 0 1076834095 0 0 1075781407 0 287647013 472854319 0 0 471472666 204089898 0 1092756002 0 0 1041963803 36909875 0 1880232466 454761243 287515427 1342572038 0 104939841 974460181 0 0 270080281 354690084 86846765 3674539269 1394219546 1611599631 3557427722 86123042 388244516 204287277 0 26843545 605558808 1025055001 1008014613 1159141143 522264865 739710743 1159141143 571083274 570820102 188891714 0 942550574 1411391520 1143021857 1312241463 1428563494 3205040393 3708159494 1663576104 1511067921 1579887403 1629758500 958472481 656679972 439563059 1294608938 839913488 739644950 172246084 221459251 840900383 1075978786 1209933342 724512559 707077413 0 0 0 0 0 0 0 0 0 0 38488907 0 0 0 0 0 0 0 0 0 0 0 0 0) + offset: 0@0)! Item was added: + CustomHelp subclass: #SqueakHelp + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Help-Squeak-Project'! Item was added: + ----- Method: SqueakHelp class>>bookName (in category 'accessing') ----- + bookName + ^'Squeak'! Item was added: + ----- Method: SqueakHelp class>>icon (in category 'accessing') ----- + icon + (self name = #SqueakHelp) ifTrue: [^HelpIcons iconNamed: #squeakIcon]. + ^nil! Item was added: + ----- Method: SqueakHelp class>>introduction (in category 'as yet unclassified') ----- + introduction + "This method was automatically generated. Edit it using:" + "a HelpBrowser edit: #introduction" + ^HelpTopic + title: 'Welcome' + contents: + 'WELCOME + + Squeak is a modern, open source, full-featured implementation of the powerful Smalltalk programming language and environment. + + Squeak is highly-portable - even its virtual machine is written entirely in Smalltalk making it easy to debug, analyze, and change. + + Squeak is the vehicle for a wide range of projects from multimedia applications, educational platforms to commercial web application development.!! + ]style[(7 2 6 72 9 41 6 70 9 49 6 139)bc000000000a0FBitstreamVeraSerif#20.0,c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000!!' readStream nextChunkText! Item was added: + ----- Method: SqueakHelp class>>pages (in category 'accessing') ----- + pages + ^#(introduction SqueakProjectHelp SqueakToolsHelp SqueakTutorials)! Item was added: + SqueakProjectHelp subclass: #SqueakLicenseHelp + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Help-Squeak-Project'! Item was added: + ----- Method: SqueakLicenseHelp class>>bookName (in category 'accessing') ----- + bookName + ^'License'! Item was added: + ----- Method: SqueakLicenseHelp class>>licenseChange (in category 'pages') ----- + licenseChange + ^HelpTopic + title: 'License has changed with 4.0' + contents: 'On 23 September 1996, Apple Computer Inc. released Squeak V1.1 under the "Squeak License" (SqL). + + On May 8, 2006 Apple agreed to relicense original Squeak V1.1 under the Apple Public Source License. + + On October 12, 2006 Apple granted permission to relicense under Apache license 2.0. + + In 2006, VPRI began to collect "Distribution Agreements" for all contributors to Squeak since V1.1 up to V3.8, asking them to relicense their contributions, which were originally licensed under SqL, to the MIT license. This was a great effort on behalf of many and VPRI has 100s of signed documents agreeing to this. + + Do you want to contribute source to Squeak?All new contributions since 4.0 must be under the MIT license. When you make your code available, please state explicitly in some form such as the description on a web site or email announcement that your contribution is under the MIT license. (It doesn''t have to be exclusive; you can release it under difference licenses at the same time.) + + Have you contributed source to Squeak? If you believe you have, but have not sent in an agreement to allow your submission(s) to be licensed under the MIT license then please see http://netjam.org/squeak/contributors. There you can find a list of known contributors and a PDF of the agreement with instructions. The snail mail address is found in the agreement PDF file. + + Also there are a few people for which we are lacking full contact information. If you think you can help please also visit the link above and see if you can identify any of the unknown developer initials or any of the developers for whom we do not have a current email address.' ! Item was added: + ----- Method: SqueakLicenseHelp class>>officialLicense (in category 'pages') ----- + officialLicense + ^HelpTopic + title: 'Official License - 4.0' + contents: 'Copyright (c) The individual, corporate, and institutional contributors who have collectively contributed elements to this software ("The Squeak Community"), 1996-2011 All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Portions of Squeak are covered by the following license + + + Copyright (c) Xerox Corp. 1981, 1982 All rights reserved. + Copyright (c) Apple Computer, Inc. 1985-1996 All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.'! Item was added: + ----- Method: SqueakLicenseHelp class>>pages (in category 'accessing') ----- + pages + ^#(licenseChange officialLicense)! Item was added: + SqueakHelp subclass: #SqueakProjectHelp + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Help-Squeak-Project'! Item was added: + ----- Method: SqueakProjectHelp class>>bookName (in category 'accessing') ----- + bookName + ^'The Project'! Item was added: + ----- Method: SqueakProjectHelp class>>extendingTheSystem (in category 'pages') ----- + extendingTheSystem + ^HelpTopic + title: 'Extending The System' + icon: (HelpIcons iconNamed: #squeakIcon) + contents: + 'SqueakMap is an integrated catalog of external applications for Squeak. It is accessible from the "Apps" menu. This catalog does not host the projects, it merely documents the load scripts required to correctly bring them into the image. + + Many SqueakMap packages use Installer, which defines several packages in its package-definitions protocol. Any of these can be loaded with an expression like the following: + + Installer new merge: #openGL + + Change #openGL to the selector name of the package you want to load. The latest version of that package and all of its prerequisites will be merged into the image. Merging a package is no different from loading it unless the package is already loaded, in which case it is upgraded to the latest version in a way that preserves any local changes you may already have made. + + --------------- + This remainder of this workspace documents load-scripts for packages that are not documented in either SqueakMap or Installer. + + OCompletion + "Provides source code completion as you type" + (Installer ss project: ''OCompletion'') install: ''Ocompletion''. + (Smalltalk at: #ECToolSet) register. + (Smalltalk at: #ToolSet) default: (Smalltalk at: #ECToolSet). + + Omnibrowser + "Including Refactoring engine" + (Installer ss project: ''MetacelloRepository'') install: ''ConfigurationOfOmniBrowser''. + ((Smalltalk at: #ConfigurationOfOmniBrowser) project perform: #lastVersion) load: #( Dev ). + + Pier CMS + "Pier CMS: http://www.piercms.com" + (Installer ss project: ''MetacelloRepository'') install: ''ConfigurationOfPier2''. + (Smalltalk at: #ConfigurationOfPier2) load. + + (Installer lukas project: ''pier2'') install: ''Pier-Blog''. + (Installer lukas project: ''pier2'') install: ''Pier-Book''. + (Installer lukas project: ''pier2addons'') install: ''Pier-Setup''. + (Smalltalk at: #PRDistribution) new register. + + Open Cobalt + "http://opencobalt.org (Best to run this from an image in an open cobalt directory)" + Installer ss project: ''TweakCore''; install: ''update''. + [Installer ss project: ''TweakExtras''; install: ''update''] + on: (Smalltalk at: #CUnsynchronizedModification) do: [:ex | ex resume]. + Installer cobalt project: ''Tweak''; + answer: ''Would you like to conserve memory at all costs?'' with: true; + answer: ''Password for interactive VNC connections?'' with: ''cobalt''; + answer: ''Would you like to add the RFBServer to the World open menu?'' with: true; + install: ''update'' + !! + ]style[(9 309 19 252 6 126 8 237 11 209 11 210 8 386 11 547)dSMLoaderPlus open;;,,d| newBrowser | + newBrowser := Browser new selectSystemCategory: ''Installer-Core''; selectClass: Installer; metaClassIndicated: false; selectMessageCategoryNamed: ''package-definitions''; selectMessageNamed: #openGL. + Browser openBrowserView: (newBrowser openMessageCatEditString: nil) label: ''External Package Definitions'';;,,i,,u,,bu,,bu,,bu,,bu,!!' readStream nextChunkText! Item was added: + ----- Method: SqueakProjectHelp class>>pages (in category 'accessing') ----- + pages + ^#(releaseNotes extendingTheSystem squeakResourcesOnline squeakUserInterface workingWithSqueak)! Item was added: + ----- Method: SqueakProjectHelp class>>releaseNotes (in category 'pages') ----- + releaseNotes + "This method was automatically generated. Edit it using:" + "a HelpBrowser edit: #releaseNotes" + ^HelpTopic + title: 'Release Notes' + contents: TheWorldMainDockingBar releaseNotes "<--- ugh, we will fix this later, for now may we not have TWO copies of the 8K release notes string in memory?"! Item was added: + ----- Method: SqueakProjectHelp class>>squeakResourcesOnline (in category 'pages') ----- + squeakResourcesOnline + ^HelpTopic + title: 'Squeak Resources Online' + icon: (HelpIcons iconNamed: #squeakIcon) + contents: + 'Squeak web sites + Main Squeak site http://www.squeak.org + Weekly Squeak http://news.squeak.org + Oversight Board http://board.squeak.org + Downloads for many versions http://ftp.squeak.org + Development of the virtual machine http://squeakvm.org + Google+ Page + https://plus.google.com/u/0/b/115950529692424242526/ + + Squeak-dev - The main Squeak mailing list + http://lists.squeakfoundation.org/mailman/listinfo/squeak-dev + http://dir.gmane.org/gmane.comp.lang.smalltalk.squeak.general + http://n4.nabble.com/Squeak-Dev-f45488.html + + Squeak-Beginners - The place to ask even the most basic questions + http://lists.squeakfoundation.org/mailman/listinfo/beginners + http://dir.gmane.org/gmane.comp.lang.smalltalk.squeak.beginners + http://n4.nabble.com/Squeak-Beginners-f107673.html + + Squeak By Example + http://www.squeakbyexample.org/ + + Squeak, Open Personal Computing and Multimedia + http://coweb.cc.gatech.edu/squeakbook/ + http://stephane.ducasse.free.fr/FreeBooks/CollectiveNBlueBook/ + + Squeak, Open Personal Computing for Multimedia + http://www.cc.gatech.edu/~mark.guzdial/drafts/ + http://stephane.ducasse.free.fr/FreeBooks/GuzdialBookDrafts/ + + More Books about Squeak and Smalltalk + http://stephane.ducasse.free.fr/FreeBooks.html + !! + ]style[(16 316 41 173 65 181 17 35 46 106 46 112 37 49)bu,,bu,,bu,,bu,,bu,,bu,,bu,!!' readStream nextChunkText + ! Item was added: + ----- Method: SqueakProjectHelp class>>squeakUserInterface (in category 'pages') ----- + squeakUserInterface + ^HelpTopic + title: 'Squeak User Interface' + icon: (HelpIcons iconNamed: #squeakIcon) + contents: + 'The Squeak UI has some unusual elements that you may not have seen before. Here is a brief introduction to those elements: + + Projects + A project is an entire Squeak desktop full of windows. Projects are can be used to change quickly from one task to another. An inactive project is represented by a project window that shows a thumbnail of that project''s windows. Project windows are actually more like doors than windows, since you can enter the project just by clicking on its project window. You can create a new project by choosing ''open...project'' from the screen menu. To exit a project (and return to its parent project), choose ''previous project'' from the screen menu. Each project maintains its set of windows, plus its own set of Smalltalk changes and its own screen color depth. + + Morphic Halos + In a morphic project, cmd-click (alt-click) on a window or other graphical object will bring up a constellation of colored circles called "halo handles" around that object. Additional clicks will cycle through the halos for other graphical objects in the nesting structure. If you hold down the Shift key while cmd-clicking, the nested morphs will be traversed from innermost outward. Clicking without the cmd (alt) key will dismiss the halo. While the halo is up, letting the cursor linger over one of the halo handles for a few seconds will cause a balloon to pop up with the name of that handle. Three useful handles are the top-left "X" handle (delete), the bottom-right yellow handle (resize), and the brown handle (slide the object within its containing object). Halos allow complex graphical objects to be explored--or even disassembled (using the black halo handle). Usually no harm results from taking apart an object; you can just discard the pieces and create a new one. + + Flaps + To enable Flaps, click on the desktop to show the world menu, choose the "Flaps..." menu and "show shared tags". Tabs labeled "Squeak", "Tools", "Supplies", etc., will appear along the edges of the Squeak desktop. Click on any tab to open the corresponding flap. Drag a tab to resize the flap and to relocate the tab. Bring up the halo on any tab and click on its menu handle to be presented with many options relating to the flap. Use the "Flaps..." menu, reached via the desktop menu, to control which flaps are visible and for other flap-related options and assistance. + + Parts Bins + You can obtain new objects in many ways. The "Objects Catalog" (choose "objects'' from the world menu or open the objects flap) and several of the standard flaps (e.g. "Tools" and "Supplies") serve as "Parts Bins" the for new objects. Drag any icon you see in a Parts Bin and a fresh copy of the kind of object it represents will appear "in your hand"; click to deposit the new object anywhere you wish. You can also add your own objects to any of the flaps -- just drag your object over the tab, wait for the flap to pop open, then drop the object at the desired position in the flap. + !! + ]style[(123 9 663 13 991 5 579 10 589),bu,,bu,,bu,,bu,!!' readStream nextChunkText! Item was added: + ----- Method: SqueakProjectHelp class>>workingWithSqueak (in category 'pages') ----- + workingWithSqueak + ^HelpTopic + title: 'Working with Squeak' + icon: (HelpIcons iconNamed: #squeakIcon) + contents: + 'Starting and Quitting + Like most Smalltalks, the machine-executable portion is a relatively small program known as the "virtual machine" (VM). The VM''s job is to provide services from the physical machine to real Smalltalk objects. Services like input and output. The Smalltalk system, including all data and code, is a system of objects, built from the ground up, and interpreted by this virtual computer. This affords Smalltalk system platform portability. + + Smalltalk cannot run without the VM. The VM can''t do anything useful except process Smalltalk systems. + + To start the system, drag the ".image" data file to the VM executable "squeak". There are myriad command-line options for starting the system via the command-line (see squeak --help). By default, the system will open on the screen in a single OS window. + + To quit a Squeak session, choose ''quit'' from the menu bar. If you save, the image file will be overwritten and resume from that place the next time it''s launched. + + The Image File + Squeak is an environment built in its own objects from the ground up, including one or more end-user applications. All of the objects in the system -- Classes, Dictionaries, Windows, Customers and other objects that make up the Squeak environment are stored in a binary ".image" file. This is the "object-data file" loaded by the VM when Squeak is launched. + + When an image is started, every object resumes exactly from where it was last saved. + + The Sources File + Smalltalk is traditionally includes the source code in the running system. However, keeping multiple copies of the same source code in all images files is wasteful. Therefore, the source code itself is kept in a read-only .sources file and accessed by all images. The image files merely have pointers into this file, which is read on-the-fly to present original source code. + + The code of the base system is stored in the file "SqueakV41.sources". This file does not change except between releases of Squeak. Normally this file should be placed in the folder containing the VM executable. + + The Changes File + The purpose of Squeak is to develop new programs and systems. Code changes to the running system are effective immediately. But since multiple images can be running, they cannot all update the .sources file safely. Therefore, each image file is accompanied by a ".changes" file which contains source code changes for that and only that Smalltalk system.. + + The changes file is important for project work. It keeps a sequential log of development activity for the purpose of recovering work performed since the last image-save. Any of several events could lead to the need to recover work, including a power-outage or making an erroneous change to code required to keep the system running. + + The changes file does not consume memory space, so Squeak is able to keep a complete history of all program changes. This makes it easy to examine or even reinstate older versions of methods (see ''versions'' option in browser selector pane). This encourages experimentation, since you can easily revert to the original versions of any set of methods. + + In extreme cases where sources and/or changes files are not available, the system can still run, and will automatically decompile the bytecode methods in image memory, if necessary, into readable and editable versions of the original source code (only comments and temporary variable names are lost). + + Transferring Code-Snippets Between Images + In addition to the ''save'' command that saves the entire state of the system, the code of individual methods, categories or classes may be ''filed out'' and then filed-in to another image. + + Packages + The code of an entire project is encapsulated by a Package. This allows users to share their code with other users. Code of packages are delineated by the categories of their classes, and methods. The Monticello browser is then used to wrap that code into a Package object which can be saved to a Monticello repository at http://ss3.gemtalksystems.com/ss. + + Some projects end up using the resources provided by several packages, resulting in a hierarchy of packages that make up a system. Installer can be used to install such systems.!! + ]style[(21 970 14 448 16 396 11 188 16 321 4 1025 41 188 8 52 10 55 2 420)bu,,bu,,bu,,u,,bu,,u,,bu,,bu,,i,,i,!!' readStream nextChunkText! Item was added: + SqueakToolsHelp subclass: #SqueakToolsDebuggerHelp + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Help-Squeak-Project'! Item was added: + ----- Method: SqueakToolsDebuggerHelp class>>bookName (in category 'accessing') ----- + bookName + ^'Debugger'! Item was added: + ----- Method: SqueakToolsDebuggerHelp class>>openingTheDebugger (in category 'pages') ----- + openingTheDebugger + ^HelpTopic + title: 'Open a Debugger.' + contents: 'A debugger window is opened in response to an unhandled exception condition. Evaluating the expression ''self halt'' in a workspace or as an expression in a method will cause a debugger window to be opened. The debugger provides direct interactive access to the interrupted process. + + The debugger permits its interrupted process to be inspected and modified. Source code and variables may be modified interactively, and the process can be stepped through its execution in various ways.'! Item was added: + ----- Method: SqueakToolsDebuggerHelp class>>pages (in category 'accessing') ----- + pages + ^# (whatIsADebugger openingTheDebugger usingTheDebugger)! Item was added: + ----- Method: SqueakToolsDebuggerHelp class>>showForm: (in category 'pages') ----- + showForm: aSymbol + | form contents | + form := ScriptingSystem formAtKey: aSymbol. + contents := (String with: Character cr) asText, + (Text string: ' ' + attribute: (TextFontReference toFont: + (FormSetFont new + fromFormArray: (Array with: form) + asciiStart: Character space asInteger + ascent: form height))), + (String with: Character cr) asText. + ^contents! Item was added: + ----- Method: SqueakToolsDebuggerHelp class>>usingTheDebugger (in category 'pages') ----- + usingTheDebugger + ^HelpTopic + title: 'Debugging Loops.' + contents: 'There are a few ways to get out of a loop. The best way is to just let the loop run. + + To do that select the space on your code (while in the Debugger) you want to jump to, right click and select: ''run to here.'' + + ' asText, + (self showForm: #Debugger1), + ' + + That will take you to the place you clicked on in your code. + + There is another trick, loops usually have an index. This is Smalltalk after all. In the case above we just selected this code and selected ''Debug it'' + + 1 to: 100 do: [:i | Transcript show: i asString]. + Transcript show: ''done'' + + While in the outer content evaluating the loop, select i change the value to 100 hit accept and ''bobs your uncle'' the loop is done. + + Ok so a bit of a hack but this can be used it to skip over some processing, and since you are debugging and know what you are doing it should be fine. + + ' asText, + (self showForm: #Debugger2), + ' + Proceed is just continue and stop debugging. + + Restart will stop debugging at the selected method and restart that method from the beginning. + + Into goes into the execution of the next method and shows you what it does. + + Over executes the next message and moves over it to the next message. + + Through steps you through a block of code, so if you are about to execute a block, this steps you through that block + + Full Stack increases the number of levels you see in the upper panel. That normally shows you a subset of the execution stack. Full stack will show you the rest of the stack that called this method. + + Where is useful if you click around a method during debugging. It will highlight the code at its execution point. You can also just select the stack method again to do the same thing. + + Tally is supposed to tally selected code, but may not be reliable within the debugger. If you want to tally something do it outside a debugger.' asText! Item was added: + ----- Method: SqueakToolsDebuggerHelp class>>whatIsADebugger (in category 'pages') ----- + whatIsADebugger + ^HelpTopic + title: 'What is a Debugger.' + contents: 'A debugger represents the machine state at the time of an interrupted process. It also represent a query path into the state of the process. + + The debugger is typically viewed through a window that views the stack of suspended contexts, the code for, and execution point in, the currently selected message, and inspectors on both the receiver of the currently selected message, and the variables in the current context.'! Item was added: + SqueakHelp subclass: #SqueakToolsHelp + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Help-Squeak-Project'! Item was added: + ----- Method: SqueakToolsHelp class>>basicDevelopmentTools (in category 'pages') ----- + basicDevelopmentTools + ^HelpTopic + title: 'Basic Development Tools' + contents: 'Smalltalk environments have some of the best user interfaces for programmers ever devised. Those who have programmed in Lisp under Emacs have some idea, but Smalltalk is even better. + + You should learn these basic tools thoroughly: + - Workspace + - Transcript + - Browser + - Inspector + - File List + - Change Sorter + - Debugger + - Method Finder + '! Item was added: + ----- Method: SqueakToolsHelp class>>bookName (in category 'accessing') ----- + bookName + ^'Tools'! Item was added: + ----- Method: SqueakToolsHelp class>>pages (in category 'accessing') ----- + pages + ^#(basicDevelopmentTools)! Item was added: + SqueakToolsHelp subclass: #SqueakToolsTranscriptHelp + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Help-Squeak-Project'! Item was added: + ----- Method: SqueakToolsTranscriptHelp class>>bookName (in category 'accessing') ----- + bookName + ^'Transcript'! Item was added: + ----- Method: SqueakToolsTranscriptHelp class>>pages (in category 'accessing') ----- + pages + ^# (transcript)! Item was added: + ----- Method: SqueakToolsTranscriptHelp class>>transcript (in category 'pages') ----- + transcript + ^HelpTopic + title: 'The Transcript window' + contents: 'The Transcript window is often used for logging or printing results from text only code. + To open the Transcript use TheWorldMenu and choose ''open...''. Then choose ''Transcript''. + You can also type + + Transcript open + + in a Workspace and doIt. + '! Item was added: + SqueakToolsHelp subclass: #SqueakToolsWorkspaceHelp + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Help-Squeak-Project'! Item was added: + ----- Method: SqueakToolsWorkspaceHelp class>>bookName (in category 'accessing') ----- + bookName + ^'Workspace'! Item was added: + ----- Method: SqueakToolsWorkspaceHelp class>>openWorkspace (in category 'pages') ----- + openWorkspace + ^HelpTopic + title: 'Open a Workspace' + contents: 'You can open a Workspace window in any of the following ways: + + - Keyboard Shortcut: while pointing at an empty part of the Squeak window, press alt-k (in Windows) or cmd-k (on a Mac) + - World Menu: select "Workspace" + - Tools Flap: click on the Tools Flap. When it comes out, drag the Workspace icon out. + - Doit: select inside the following quote and doit: "Workspace open"'! Item was added: + ----- Method: SqueakToolsWorkspaceHelp class>>pages (in category 'accessing') ----- + pages + ^#(workspace openWorkspace saveWorkspace)! Item was added: + ----- Method: SqueakToolsWorkspaceHelp class>>saveWorkspace (in category 'pages') ----- + saveWorkspace + ^HelpTopic + title: 'Saving Workspace to a File' + contents: 'You can save the text content of a Workspace to a file by choosing the workspace menu (from within the workspace), then ''more...'', then ''save contents to file...''.'! Item was added: + ----- Method: SqueakToolsWorkspaceHelp class>>workspace (in category 'pages') ----- + workspace + ^HelpTopic + title: 'What is a Workspace' + contents: 'A Workspace is a window used as a scratchpad area where fragments of Smalltalk code can be entered, stored, edited, and evaluated.'! Item was added: + SqueakHelp subclass: #SqueakTutorials + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Help-Squeak-Project'! Item was added: + ----- Method: SqueakTutorials class>>bookName (in category 'accessing') ----- + bookName + ^'Tutorials'! Item was added: + ----- Method: SqueakTutorials class>>introduction (in category 'pages') ----- + introduction + "This method was automatically generated. Edit it using:" + "SqueakTutorials edit: #introduction" + ^HelpTopic + title: 'Introduction' + contents: + 'Here you will some short tutorials on how to use Squeak for daily tasks. Feel free to add your own.!!' readStream nextChunkText! Item was added: + ----- Method: SqueakTutorials class>>pages (in category 'accessing') ----- + pages + ^#(introduction)! Item was added: + SqueakTutorials subclass: #SqueakTutorialsCommandKey + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Help-Squeak-Project'! Item was added: + ----- Method: SqueakTutorialsCommandKey class>>bookName (in category 'as yet unclassified') ----- + bookName + ^'Command Key Mappings'! Item was added: + ----- Method: SqueakTutorialsCommandKey class>>commandKeyMappings (in category 'as yet unclassified') ----- + commandKeyMappings + "This method was automatically generated. Edit it using:" + "SqueakTutorialsCommandKey edit: #commandKeyMappings" + ^HelpTopic + title: 'Command Key Mappings' + contents: + 'Lower-case command keys + (use with Cmd key on Mac and Alt key on other platforms) + a Select all + b Browse it (selection is a class name or cursor is over a class-list or message-list) + c Copy selection + d Do it (selection is a valid expression) + e Exchange selection with prior selection + f Find + g Find again + h Set selection as search string for find again + i Inspect it (selection is a valid expression, or selection is over an inspect-ilst) + j Again once (do the last text-related operation again) + k Set font + l Cancel + m Implementors of it (selection is a message selector or cursor is over a class-list or message-list) + n Senders of it (selection is a message selector or cursor is over a class-list or message-list) + o Spawn current method + p Print it (selection is a valid expression) + q Query symbol (toggle all possible completion for a given prefix) + r Recognizer + s Save (i.e. accept) + t Finds a Transcript (when cursor is over the desktop) + u Toggle alignment + v Paste + w Delete preceding word (over text); Close-window (over morphic desktop) + x Cut selection + y Swap characters + z Undo + + Note: for Do it, Senders of it, etc., a null selection will be expanded to a word or to the current line in an attempt to do what you want. Also note that Senders/Implementors of it will find the outermost keyword selector in a large selection, as when you have selected a bracketed expression or an entire line. Finally note that the same cmd-m and cmd-n (and cmd-v for versions) work in the message pane of most browsers. + + Upper-case command keys + (use with Shift-Cmd, or Ctrl on Mac + or Shift-Alt on other platforms; sometimes Ctrl works too) + A Advance argument + B Browse it in this same browser (in System browsers only) + C Compare the selected text to the clipboard contents + D Duplicate + E Method strings containing it + F Insert ''ifFalse:'' + G fileIn from it (a file name) + H cursor TopHome: + I Inspect via Object Explorer + J Again many (apply the previous text command repeatedly until the end of the text) + K Set style + L Outdent (move selection one tab-stop left) + M Select current type-in + N References to it (selection is a class name, or cursor is over a class-list or message-list) + O Open single-message browser (in message lists) + P Make project link + R Indent (move selection one tab-stap right) + S Search + T Insert ''ifTrue:'' + U Convert linefeeds to carriage returns in selection + V Paste author''s initials + W Selectors containing it (in text); show-world-menu (when issued with cursor over desktop) + X Force selection to lowercase + Y Force selection to uppercase + Z Capitalize all words in selection + + Other special keys + Backspace Backward delete character + Del Forward delete character + Shift-Bksp Backward delete word + Shift-Del Forward delete word + Esc Pop up the Desktop Menu + \ Send top window to back + + Cursor keys + left, right, + up, down Move cursor left, right, up or down + Ctrl-left Move cursor left one word + Ctrl-right Move cursor right one word + Home Move cursor to begin of line or begin of text + End Move cursor to end of line or end of text + PgUp, Ctrl-up Move cursor up one page + PgDown, Ctrl-Dn Move cursor down one page + + Note all these keys can be used together with Shift to define or enlarge the selection. You cannot however shrink that selection again, as in some other systems. + + Other Cmd-key combinations (not available on all platforms) + Return Insert return followed by as many tabs as the previous line + (with a further adjustment for additional brackets in that line) + Space Select the current word as with double clicking + + Enclose the selection in a kind of bracket. Each is a toggle. + (not available on all platforms) + Ctrl-( Enclose within ( and ), or remove enclosing ( and ) + Ctrl-[ Enclose within [ and ], or remove enclosing [ and ] + Crtl-{ Enclose within { and }, or remove enclosing { and } + Ctrl-< Enclose within < and >, or remove enclosing < and > + Ctrl-'' Enclose within '' and '', or remove enclosing '' and '' + Ctrl-" Enclose within " and ", or remove enclosing " and " + Note also that you can double-click just inside any of the above delimiters, + or at the beginning or end of a line, to select the text enclosed. + + Text Emphasis + (not available on all platforms) + Cmd-1 type the first method argument + Cmd-2 type the second method argument + Cmd-3 type the third method argument + Cmd-4 type the fourth method argument + Cmd-5 for future use + Cmd-6 color, action-on-click, link to class comment, link to method, url + Brings up a menu. To remove these properties, select + more than the active part and then use command-0. + Cmd-7 bold + Cmd-8 italic + Cmd-9 narrow (same as negative kern) + Cmd-0 plain text (resets all emphasis) + Cmd-- underlined (toggles it) + Cmd-= struck out (toggles it) + + Shift-Cmd-- (aka :=) negative kern (letters 1 pixel closer) + Shift-Cmd-+ positive kern (letters 1 pixel larger spread) + + Docking Bar + Ctrl- opens the n-th (where n is between 0 and 7) menu if such exists, otherwise it moves the keyboard focus to the Search Bar. Currently this means: + Ctrl-0 Activates Search Bar + Ctrl-1 Squeak menu + Ctrl-2 Projects menu + Ctrl-3 Tools menu + Ctrl-4 Apps menu + Ctrl-5 Extras menu + Ctrl-6 Windows menu + Ctrl-7 Help menu + !!' readStream nextChunkText! Item was added: + ----- Method: SqueakTutorialsCommandKey class>>pages (in category 'as yet unclassified') ----- + pages + ^# (commandKeyMappings)! Item was added: + SqueakTutorials subclass: #SqueakTutorialsOnImage + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Help-Squeak-Project'! Item was added: + ----- Method: SqueakTutorialsOnImage class>>bookName (in category 'as yet unclassified') ----- + bookName + ^'The Squeak Image'! Item was added: + ----- Method: SqueakTutorialsOnImage class>>pages (in category 'as yet unclassified') ----- + pages + ^# (theImage)! Item was added: + ----- Method: SqueakTutorialsOnImage class>>theImage (in category 'as yet unclassified') ----- + theImage + ^HelpTopic + title: 'Working with the Squeak Image' + contents: 'Working with the ecosystem of objects in a Smalltalk image. + + The basic tool for this is called an Inspector. Whenever you have an expression, like "3 + 4", you press cmd-i to "inspect it", which opens an inspector on the result. This works in any text area. Try for example inspecting "self" in a class browser, and you will inspect the underlying class object (which the browser shows a high-level view of). + + In the Inspector you see the objects referenced by this object (via instance variables or indexed fields) in the left panel. Select any of them and choose "inspect" from the context menu (or press cmd-i again). This way you can inspect all the objects in the system. + + A more modern tool than the Inspector (which was around 40 years ago already) is the Object Explorer. It presents you a tree view of an object and its "children", which again are the instance variables and indexed fields of the object. Open it with cmd-shift-i (or "explore" in the context menu). + + You can also do the reverse. If you choose "objects pointing to this value" you get an inspector showing all the objects that directly point to this object. Similarly there is a "reverse explorer", which you can open by selecting "explore pointers". + + There are two roots to all the objects in the system: + + Smalltalk specialObjectsArray + + which basically holds everything the Virtual Machine needs to know about, and in turn almost every object in the whole image, and + + thisContext + + which is the current execution context, holding onto temporary objects. When a garbage collection is performed, any object not reachable form either of these two roots is removed from memory. + + An "interesting" global object to explore is + + Project current + + which holds your current workspace, in particular + + Project current world + + , the root of all morphs in the world. And of course + + Smalltalk + + itself is the dictionary that holds all global objects, including all classes (unless they are defined in a non-global environment). + + There is also a low-level way to enumerate all objects in memory. "self someObject" will return the very first object in memory (which happens to be the nil object), and "anObject nextObject" will return the next one: + + | object count | + count := 0. + object := self someObject. + [0 == object] + whileFalse: [count := count + 1. + object := object nextObject]. + count + + Interestingly, this also finds objects that are due to be garbage-collected. For example, if you accidentally closed a text window, there is a good chance its contents will still be in memory, and can be retrieved using an expression like + + ByteString allInstances last: 10 + + This makes use of the someInstance/nextInstance methods, which are similar to someObject/nextObject, but restricted to instances of one class only. + '! Item was added: + SqueakTutorials subclass: #SqueakTutorialsOnXML + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Help-Squeak-Project'! Item was added: + ----- Method: SqueakTutorialsOnXML class>>bookName (in category 'accessing') ----- + bookName + ^'XML'! Item was added: + ----- Method: SqueakTutorialsOnXML class>>dataRetrieval (in category 'pages') ----- + dataRetrieval + ^HelpTopic + title: 'Retrieving XML data' + contents: + 'Retrieving data from XML documents is simple and easy in Squeak Smalltalk. This tutorial demonstrates the fundamentals with a straightforward approach where code can be tested right away either here or in a Workspace window. The beauty of Squeak Smalltalk resides in the possibility to evaluate, inspect, print and debug code anywhere and this window is no different. + + This tutorial demonstrates how to... + + * retrieve an XML document from the World Wide Web + * instantiate an XML document class + * inspect and understand the content of an XML document + * retrieve and display values from specific XML tags + + Retrieve an XML document from the World Wide Web + + There are many manners to retrieve data from the World Wide Web in Squeak Smalltalk. HTTPClient is among them and allows to download files in all simplicity. Select the following code snippet and inspect it (press alt-i). An Inspect window will open with the document loaded in memory. The result is a MIMEDocument object. + + HTTPClient httpGetDocument: ''http://source.squeak.org/trunk/feed.rss''. + + TIP: Select HTTPClient and browse it (press alt-b) to open a System Browser window on its class. HTTPClient does not have instance methods but it has class methods. Click on class to see class methods. + + Instantiate an XML Document + + An instance of MIMEDocument will not allow to retrieve XML data in a comprehensive manner because it does not understand the nature of XML. For this reason, it is necessary to parse the content of MIMEDocument using XMLDOMParser. XMLDOMParser>>parseDocumentFrom: requires a stream as a parameter and ReadStream will be used for this purpose. The following code snippet instantiates an XMLDocument using the content of the downloaded file. + + | doc | + doc := HTTPClient httpGetDocument: ''http://source.squeak.org/trunk/feed.rss''. + XMLDOMParser parseDocumentFrom: (ReadStream on: (doc content)). + + Inspect and understand the content of an XML document + + XML is a flexible document format and it is necessary to understand how each given XML file is structured in order to properly search, retrieve and manipulate data. Inspecting values is critical in a dynamic programming language and environment, such as Squeak Smalltalk. Select the previous code snippet and inspect it (press alt-i). + + Unfortunately, the Inspect window does not reveal a lot about the XML structure of the downloaded file. Select the previous code snippet once again and explore it (press alt and the capital letter i). An Explorer window will open with a tree outline on the instance of XMLDocument. + + The Inspect and Explorer windows tell a lot about an XMLDocument. The sections are instance variables and their values are displayed aside. In the Explorer window, unfold elementsAndContents. Unfold other sections as deemed necessary to understand the XML format and the data available. + + The gibberish coding is about to become clear. Open a Browser window from the world menu and right click in the first pane, select find class (press alt-f) and type XMLDocument to search for its class, or select the class name and browse it (press alt-b). However, it is suggested to read more about XMLParser and XMLParserTest first. + + Retrieve and display values from specific XML tags + + The downloaded XML file contains a list of items which are denoted by the tag name "item". The Explorer window revealed the content of interest is located at the array index 1 of the elementsAndContents, which can be accessed through XMLDocument>>root. + + TIP: Some XML documents have additional components contained within its file, such as XMLPI (XML Processing Instructions). For this reason, the root may lead to this rather than the data which will be indexed at 2 or more. It is necessary to use XMLNodeWithElements>>elements, e.g. (xml elements at: 2), in order to access subsequent data. + + The following code snippet will display items in a Transcript window. Open a Transcript window using the world menu before selecting and executing the code. Select the code snippet and execute it (press alt-d). + + | doc xml | + doc := HTTPClient httpGetDocument: ''http://source.squeak.org/trunk/feed.rss''. + xml := XMLDOMParser parseDocumentFrom: (ReadStream on: (doc content)). + xml root tagsNamed: #item do: [:e | + Transcript show: (e asString); cr. + ]. + + An XML item looks like this: + + + HelpSystem-Core-tbn.46.mcz + http://source.squeak.org/trunk.html + throw out pharo specific stuff since we are now integrated in squeak (and pharo too where squeak specific stuff was removed) + Sun, 02 May 2010 20:23:49 +0000 + Torsten Bergmann <Torsten.Bergmann@astares.de> + The Trunk + + + + The following code snippet uses information learned, retrieves each comment and displays them in a Transcript window. Notice an author can have a nil value and is handled accordingly. + + | doc xml | + doc := HTTPClient httpGetDocument: ''http://source.squeak.org/trunk/feed.rss''. + xml := XMLDOMParser parseDocumentFrom: (ReadStream on: (doc content)). + xml root tagsNamed: #item do: [:e | + Transcript + show: ''Date: '', ((e firstTagNamed: #pubDate) contentString); cr; + show: ''Title: '', ((e firstTagNamed: #title) contentString); cr; + show: ''Author: '', + (((e firstTagNamed: #author) notNil) + ifTrue: [(e firstTagNamed: #author) contentString] + ifFalse: ['''']); cr; + show: ''Description: '', ((e firstTagNamed: #description) contentString); cr; cr. + ]. + + An item will now look like: + + Date: Sun, 02 May 2010 20:23:49 +0000 + Title: HelpSystem-Core-tbn.46.mcz + Author: Torsten Bergmann + Description: throw out pharo specific stuff since we are now integrated in squeak (and pharo too where squeak specific stuff was removed) + '! Item was added: + ----- Method: SqueakTutorialsOnXML class>>pages (in category 'accessing') ----- + pages + ^# (dataRetrieval)! Item was added: + ----- Method: Utilities class>>openCommandKeyHelp (in category '*Help-Squeak-Project-support windows') ----- + openCommandKeyHelp + "Open a window giving command key help." + "Utilities openCommandKeyHelp" + + HelpBrowser openOn: SqueakTutorialsCommandKey! Item was added: + (PackageInfo named: 'Help-Squeak-Project') postscript: '| aForm aSecondForm | (excessive size, no diff calculated) From commits at source.squeak.org Sun Jul 5 14:49:22 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sun Jul 5 14:49:24 2015 Subject: [squeak-dev] Squeak 4.6: Help-Squeak-Project-dtl.27.mcz Message-ID: David T. Lewis uploaded a new version of Help-Squeak-Project to project Squeak 4.6: http://source.squeak.org/squeak46/Help-Squeak-Project-dtl.27.mcz ==================== Summary ==================== Name: Help-Squeak-Project-dtl.27 Author: dtl Time: 5 July 2015, 10:37:43.338 am UUID: 0c360d55-b3b9-444e-a3ef-27d99df70000 Ancestors: Help-Squeak-Project-dtl.26 Fix opening the release notes page in help browser (Help Browser -> Squeak -> The Project -> Release Notes) =============== Diff against Help-Squeak-Project-dtl.26 =============== Item was changed: ----- Method: SqueakProjectHelp class>>releaseNotes (in category 'pages') ----- releaseNotes "This method was automatically generated. Edit it using:" "a HelpBrowser edit: #releaseNotes" ^HelpTopic title: 'Release Notes' + contents: TheWorldMainDockingBar new releaseNotes "<--- ugh, we will fix this later, for now may we not have TWO copies of the 8K release notes string in memory?"! - contents: TheWorldMainDockingBar releaseNotes "<--- ugh, we will fix this later, for now may we not have TWO copies of the 8K release notes string in memory?"! From lewis at mail.msen.com Sun Jul 5 14:59:54 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Sun Jul 5 14:59:57 2015 Subject: [squeak-dev] Squeak 4.6: Help-Squeak-Project-dtl.27.mcz In-Reply-To: <201507051449.t65EnQRH067290@shell.msen.com> References: <201507051449.t65EnQRH067290@shell.msen.com> Message-ID: <20150705145954.GA68235@shell.msen.com> Chris, I copied the following from trunk to squeak46: Morphic-dtl.992 Help-Squeak-Project-dtl.27 Help-Squeak-Project-dtl.26 These are minor edits to the help text, plus a fix to allow the release notes to display from the help browser. Dave On Sun, Jul 05, 2015 at 02:49:12PM +0000, commits@source.squeak.org wrote: > David T. Lewis uploaded a new version of Help-Squeak-Project to project Squeak 4.6: > http://source.squeak.org/squeak46/Help-Squeak-Project-dtl.27.mcz > > ==================== Summary ==================== > > Name: Help-Squeak-Project-dtl.27 > Author: dtl > Time: 5 July 2015, 10:37:43.338 am > UUID: 0c360d55-b3b9-444e-a3ef-27d99df70000 > Ancestors: Help-Squeak-Project-dtl.26 > > Fix opening the release notes page in help browser (Help Browser -> Squeak -> The Project -> Release Notes) > > =============== Diff against Help-Squeak-Project-dtl.26 =============== > > Item was changed: > ----- Method: SqueakProjectHelp class>>releaseNotes (in category 'pages') ----- > releaseNotes > "This method was automatically generated. Edit it using:" > "a HelpBrowser edit: #releaseNotes" > ^HelpTopic > title: 'Release Notes' > + contents: TheWorldMainDockingBar new releaseNotes "<--- ugh, we will fix this later, for now may we not have TWO copies of the 8K release notes string in memory?"! > - contents: TheWorldMainDockingBar releaseNotes "<--- ugh, we will fix this later, for now may we not have TWO copies of the 8K release notes string in memory?"! > From commits at source.squeak.org Sun Jul 5 17:05:17 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sun Jul 5 17:05:18 2015 Subject: [squeak-dev] The Trunk: MonticelloConfigurations-dtl.136.mcz Message-ID: David T. Lewis uploaded a new version of MonticelloConfigurations to project The Trunk: http://source.squeak.org/trunk/MonticelloConfigurations-dtl.136.mcz ==================== Summary ==================== Name: MonticelloConfigurations-dtl.136 Author: dtl Time: 5 July 2015, 1:05:12.418 pm UUID: ce452136-fc06-4d15-b41c-efd42ac6c0f8 Ancestors: MonticelloConfigurations-dtl.135 Only the default MCMcmUpdater should update the system version. This fixes a condition in which loading a "head" package from SqueakMap using an update stream overwrote the system version. =============== Diff against MonticelloConfigurations-dtl.135 =============== Item was changed: ----- Method: MCMcmUpdater>>updateFrom: (in category 'updating') ----- updateFrom: url + "Update the image by loading all pending updates from the server. If this is + the default updater for the system, update the system version when complete." - "Update the image by loading all pending updates from the server." | config | "Flush all caches. If a previous download failed this is often helpful" MCFileBasedRepository flushAllCaches. config := self updateFromRepositories: { url }. config ifNil: [^self inform: 'Unable to retrieve updates from remote repository.' translated]. + MCMcmUpdater default == self + ifTrue: [ config setSystemVersion. + self inform: ('Update completed. + Current update number: ' translated, SystemVersion current highestUpdate).] + ifFalse: [self inform: 'Update completed.'] + ! - config setSystemVersion. - self inform: ('Update completed. - Current update number: ' translated, SystemVersion current highestUpdate).! From commits at source.squeak.org Sun Jul 5 17:05:52 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sun Jul 5 17:05:54 2015 Subject: [squeak-dev] Squeak 4.6: MonticelloConfigurations-dtl.136.mcz Message-ID: David T. Lewis uploaded a new version of MonticelloConfigurations to project Squeak 4.6: http://source.squeak.org/squeak46/MonticelloConfigurations-dtl.136.mcz ==================== Summary ==================== Name: MonticelloConfigurations-dtl.136 Author: dtl Time: 5 July 2015, 1:05:12.418 pm UUID: ce452136-fc06-4d15-b41c-efd42ac6c0f8 Ancestors: MonticelloConfigurations-dtl.135 Only the default MCMcmUpdater should update the system version. This fixes a condition in which loading a "head" package from SqueakMap using an update stream overwrote the system version. =============== Diff against MonticelloConfigurations-dtl.135 =============== Item was changed: ----- Method: MCMcmUpdater>>updateFrom: (in category 'updating') ----- updateFrom: url + "Update the image by loading all pending updates from the server. If this is + the default updater for the system, update the system version when complete." - "Update the image by loading all pending updates from the server." | config | "Flush all caches. If a previous download failed this is often helpful" MCFileBasedRepository flushAllCaches. config := self updateFromRepositories: { url }. config ifNil: [^self inform: 'Unable to retrieve updates from remote repository.' translated]. + MCMcmUpdater default == self + ifTrue: [ config setSystemVersion. + self inform: ('Update completed. + Current update number: ' translated, SystemVersion current highestUpdate).] + ifFalse: [self inform: 'Update completed.'] + ! - config setSystemVersion. - self inform: ('Update completed. - Current update number: ' translated, SystemVersion current highestUpdate).! From Marcel.Taeumel at hpi.de Sun Jul 5 18:43:49 2015 From: Marcel.Taeumel at hpi.de (marcel.taeumel) Date: Sun Jul 5 19:06:41 2015 Subject: [squeak-dev] Re: Squeak 4.6: Help-Squeak-Project-dtl.27.mcz In-Reply-To: References: Message-ID: <1436121829518-4835874.post@n4.nabble.com> Hmm... this might be overwritten on the next save in the help browser. Why not changing TheWorldMainDockingBar >> releaseNotes instead? Best, Marcel -- View this message in context: http://forum.world.st/Squeak-4-6-Help-Squeak-Project-dtl-27-mcz-tp4835855p4835874.html Sent from the Squeak - Dev mailing list archive at Nabble.com. From lewis at mail.msen.com Sun Jul 5 20:23:28 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Sun Jul 5 20:23:31 2015 Subject: [squeak-dev] Re: Squeak 4.6: Help-Squeak-Project-dtl.27.mcz In-Reply-To: <1436121829518-4835874.post@n4.nabble.com> References: <1436121829518-4835874.post@n4.nabble.com> Message-ID: <20150705202328.GA14027@shell.msen.com> On Sun, Jul 05, 2015 at 11:43:49AM -0700, marcel.taeumel wrote: > Hmm... this might be overwritten on the next save in the help browser. Why > not changing TheWorldMainDockingBar >> releaseNotes instead? I changed the text in TheWorldMainDockingBar also (in Morphic-dtl.992). The release notes text appears in two places. There in a comment about that in SqueakProjectHelp class>>releaseNotes. I don't know the background on this, so I did not change it. I just noticed that the squeak46 repository for package Morphic has a couple of empty packages in it (Morphic-cmm.991 and Morphic-cmm.989). Maybe this was an error copying the MCZ files to the squeak46 repo? Dave From lewis at mail.msen.com Sun Jul 5 20:38:11 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Sun Jul 5 20:38:13 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <20150704155507.GA48353@shell.msen.com> References: <20150704155507.GA48353@shell.msen.com> Message-ID: <20150705203811.GA16946@shell.msen.com> On Sat, Jul 04, 2015 at 11:55:07AM -0400, David T. Lewis wrote: > On Thu, Jul 02, 2015 at 02:26:23PM -0500, Chris Muller wrote: > > We have a release candidate image. > > > > http://ftp.squeak.org/4.6/ > > > > The new sources file is required. > > > > Please test your apps. This could be the final image unless major > > issues are uncovered. > > > > When loading OSProcess from SqueakMap, I get an error in > SMSimpleInstaller>>fileIntoChangeSetNamed:fromStream: due to > > SystemVersion current highestUpdate ==> 10 > > The SqueakMap loader is doing this: > > oldChanges := (SystemVersion current highestUpdate < 5302) > ifFalse: [global := ChangeSet. ChangeSet current] > ifTrue: [global := Smalltalk. Smalltalk changes]. > > Is the highestUpdate set wrong in the release candidate, or is this > something that needs to be fixed in the squeakmap loader? To follow up on this, the problem was caused by an error in my earlier refactoring of MCMcmUpdater, and is fixed now in MonticelloConfigurations-dtl.135 in trunk and in squeak46. Dave From commits at source.squeak.org Sun Jul 5 21:55:02 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sun Jul 5 21:55:05 2015 Subject: [squeak-dev] Daily Commit Log Message-ID: <20150705215502.11311.qmail@box4.squeakfoundation.org> Changes to Trunk (http://source.squeak.org/trunk.html) in the last 24 hours: http://lists.squeakfoundation.org/pipermail/packages/2015-July/008798.html Name: Help-Squeak-Project-dtl.27 Ancestors: Help-Squeak-Project-dtl.26 Fix opening the release notes page in help browser (Help Browser -> Squeak -> The Project -> Release Notes) ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008799.html Name: MonticelloConfigurations-dtl.136 Ancestors: MonticelloConfigurations-dtl.135 Only the default MCMcmUpdater should update the system version. This fixes a condition in which loading a "head" package from SqueakMap using an update stream overwrote the system version. ============================================= From lewis at mail.msen.com Sun Jul 5 23:41:49 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Sun Jul 5 23:41:51 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: References: Message-ID: <20150705234149.GA41192@shell.msen.com> On Thu, Jul 02, 2015 at 02:26:23PM -0500, Chris Muller wrote: > We have a release candidate image. > > http://ftp.squeak.org/4.6/ > > The new sources file is required. > > Please test your apps. This could be the final image unless major > issues are uncovered. > I am consistently getting VM crashes with the release candidate image on an interpreter VM. Some of the failures appear to be related to method lookup, based on the "Recursive not understood error encountered" message on console output. I am completely at a loss to explain this, since my working trunk images (based on 4.5, updated with the trunk stream) have no problem at all. I am baffled and do not know where to look. Can anyone suggest where to look for the problem? Is there anything in the Squeak 4.6 build process that might introduce problems that would not be seen in an updated 4.5 trunk image? To reproduce, start with the 4.6 release candidate image, run it on any interpreter VM, open a SqueakMap package loader, and try to load the (head) release of package TwosComplement. This results in a VM crash with the following console output: Thanks, Dave ==== lewis@LexIT:/mnt/sda8/lewis/squeak/Squeak4.6$ Recursive not understood error encountered 23544308 WeakIdentityKeyDictionary>scanFor: 23544216 Dictionary>removeKey:ifAbsent: 23544124 WeakRegistry>remove:ifAbsent: 23544032 BlockClosure>on:do: 23543916 BlockClosure>ifError: 23543800 Semaphore>critical:ifError: 23543708 Semaphore>critical: 23543616 BlockClosure>ensure: 23543464 Semaphore>critical: 23543328 Semaphore>critical:ifError: 23543216 WeakRegistry>protected: 23543100 WeakRegistry>remove:ifAbsent: 23543008 StandardFileStream class>unregister: 23542916 StandardFileStream>unregister 23542824 StandardFileStream>close 23542732 PackageInfo>changeRecordsForMethod:do: 23541136 SequenceableCollection>do: 23541044 PackageInfo>changeRecordsForMethod:do: 23540952 ContextPart>resume:through: 23500916 BlockClosure>ensure: 23487100 PackageInfo>changeRecordsForMethod:do: 23487008 PackageInfo>changeRecordForOverriddenMethod: 23486384 PackageInfo>isOverrideOfYourMethod: 23486256 PackageInfo>overriddenMethodsDo: 23486164 PackageInfo>methodsInCategory:ofClass:do: 23486052 SequenceableCollection>do: 23485868 PackageInfo>methodsInCategory:ofClass:do: 23485776 PackageInfo>overriddenMethodsInClass:do: 23485684 PackageInfo>overrideCategoriesForClass:do: 23484648 SequenceableCollection>do: 23484556 PackageInfo>overrideCategoriesForClass:do: 23484436 PackageInfo>overriddenMethodsInClass:do: 23484344 PackageInfo>allOverriddenMethodsDo: 23484228 Behavior>allSubclassesDo: 23398624 SequenceableCollection>do: 23398508 Class>subclassesDo: 23398416 Behavior>allSubclassesDo: 23398324 Behavior>allSubclassesDo: 23398232 SequenceableCollection>do: 23398116 Class>subclassesDo: 23398024 Behavior>allSubclassesDo: 23397860 Behavior>withAllSubclassesDo: 23397768 PackageInfo>allOverriddenMethodsDo: 23397216 PackageInfo>overriddenMethodsDo: 23397124 PackageInfo>overriddenMethods 23397032 SequenceableCollection class>new:streamContents: 23396940 SequenceableCollection class>streamContents: 23396848 PackageInfo>overriddenMethods 23396144 MCPackage>snapshot 23396052 BlockClosure>on:do: 23395960 CurrentReadOnlySourceFiles class>cacheDuring: 23395708 MCPackage>snapshot 23395500 MCReorganizationPreloader>addVersion: 23395408 MCReorganizationPreloader class>preloadMovesBetween: 23394940 OrderedCollection>do: 23394848 MCReorganizationPreloader class>preloadMovesBetween: 23308248 MCConfiguration>depsSatisfying:versionDo:displayingProgress: 23308156 MCFileBasedRepository>cacheAllFileNamesDuring: 23308064 MCConfiguration>cacheAllFileNamesDuring: 23307740 MCConfiguration>cacheAllFileNamesDuring: 23307648 MCConfiguration>depsSatisfying:versionDo:displayingProgress: 23307556 MCConfiguration>upgrade 23307376 MCMcmUpdater>updateFromConfig: 23307252 MCMcmUpdater>updateFromRepository: 23307160 Collection>do:displayingProgress:every: 23307068 OrderedCollection>do: 23306932 Collection>do:displayingProgress:every: 23306688 MorphicUIManager>displayProgress:at:from:to:during: 23306596 BlockClosure>on:do: 23306504 MorphicUIManager>displayProgress:at:from:to:during: 23306412 BlockClosure>ensure: 23306172 MorphicUIManager>displayProgress:at:from:to:during: 23306080 ProgressInitiationException>defaultResumeValue 23305988 Exception>resume 23305896 ProgressInitiationException>defaultAction 23305804 UndefinedObject>handleSignal: 23305712 ContextPart>handleSignal: 23305620 ContextPart>handleSignal: 23305516 ContextPart>handleSignal: 23305228 ContextPart>handleSignal: 23305136 ContextPart>handleSignal: 23305044 Exception>signal 23304952 ProgressInitiationException>display:at:from:to:during: 23304860 ProgressInitiationException class>display:at:from:to:during: 23304768 String>displayProgressAt:from:to:during: 23304676 String>displayProgressFrom:to:during: 23304584 Collection>do:displayingProgress:every: 23304492 Collection>do:displayingProgress: 23303720 MCMcmUpdater>updateFromRepository: 23303628 BlockClosure>valueWithPossibleArgument: 23303536 Collection>ifNotEmpty: 23303296 MCMcmUpdater>updateFromRepository: 23303204 BlockClosure>ensure: 23294836 MCFileBasedRepository>cacheAllFileNamesDuring: 23294708 MCMcmUpdater>updateFromRepository: 23294592 MCMcmUpdater>updateFromRepositories: 23294500 SequenceableCollection>do: 23294200 MCMcmUpdater>updateFromRepositories: 23294080 MCMcmUpdater>updateFrom: 23293988 MCMcmUpdater class>updateFromRepository:baseName: 23293896 UndefinedObject>? 23287640 Compiler>evaluateCue:ifFail: 23287548 Compiler>evaluateCue:ifFail:logged: 23287456 Compiler>evaluate:in:to:notifying:ifFail:logged: 23287364 Compiler class>evaluate:for:notifying:logged: 23287228 Compiler class>evaluate:for:logged: 23287136 Compiler class>evaluate:logged: 23287044 PositionableStream>fileInAnnouncing: 23286952 BlockClosure>on:do: 23286624 PositionableStream>fileInAnnouncing: 23286380 MorphicUIManager>displayProgress:at:from:to:during: 23286288 BlockClosure>on:do: 23286196 MorphicUIManager>displayProgress:at:from:to:during: 23286104 BlockClosure>ensure: 23285864 MorphicUIManager>displayProgress:at:from:to:during: 23285772 ProgressInitiationException>defaultResumeValue 23285680 Exception>resume 23285588 ProgressInitiationException>defaultAction 23285496 UndefinedObject>handleSignal: 23285392 ContextPart>handleSignal: 23285300 ContextPart>handleSignal: 23285208 ContextPart>handleSignal: 23285116 Exception>signal 23284976 ProgressInitiationException>display:at:from:to:during: 23284884 ProgressInitiationException class>display:at:from:to:during: 23284672 String>displayProgressAt:from:to:during: 23284580 String>displayProgressFrom:to:during: 23284488 PositionableStream>fileInAnnouncing: 23282956 SMSimpleInstaller>fileIntoChangeSetNamed:fromStream: 23282820 BlockClosure>ensure: 23282696 SMSimpleInstaller>fileIntoChangeSetNamed:fromStream: 23280044 SMDefaultInstaller>fileIn 23279916 SMDefaultInstaller>install 23279824 SMLoaderPlus>installPackageRelease: 23279732 UIManager>informUser:during: 23279488 MorphicUIManager>displayProgress:at:from:to:during: 23279396 BlockClosure>on:do: 23279304 MorphicUIManager>displayProgress:at:from:to:during: 23279212 BlockClosure>ensure: 23278940 MorphicUIManager>displayProgress:at:from:to:during: 23278848 ProgressInitiationException>defaultResumeValue 23278756 Exception>resume 23278664 ProgressInitiationException>defaultAction 23278560 UndefinedObject>handleSignal: 23278468 ContextPart>handleSignal: 23278376 ContextPart>handleSignal: 23278284 Exception>signal 23278144 ProgressInitiationException>display:at:from:to:during: 23278052 ProgressInitiationException class>display:at:from:to:during: 23277888 SystemProgressMorph class>informUserAt:during: 23277796 MorphicUIManager>informUserDuring: 23277704 UIManager>informUser:during: 23277364 SMLoaderPlus>installPackageRelease: 23277272 BlockClosure>on:do: 23041384 SMLoaderPlus>installPackageRelease: 23041292 SMLoaderPlus>installPackageRelease 23041200 PluggableButtonMorph>performAction 23041108 PluggableButtonMorphPlus>performAction 23040992 PluggableButtonMorph>mouseUp: 23040900 SequenceableCollection>do: 23040808 PluggableButtonMorph>mouseUp: 23040676 PluggableButtonMorphPlus>mouseUp: 23040584 Morph>handleMouseUp: 23040492 MouseButtonEvent>sentTo: 23040400 Morph>handleEvent: 23040244 Morph>handleFocusEvent: 23040152 HandMorph>sendFocusEvent:to:clear: 23040060 BlockClosure>on:do: 23039968 PasteUpMorph>becomeActiveDuring: 23039848 HandMorph>sendFocusEvent:to:clear: 23039756 HandMorph>sendEvent:focus:clear: 23039664 HandMorph>sendMouseEvent: 23039520 HandMorph>handleEvent: 23039324 HandMorph>processEvents 23039232 WorldState>doOneCycleNowFor: 23039140 SequenceableCollection>do: 23039048 WorldState>handsDo: 23038956 WorldState>doOneCycleNowFor: 23038864 WorldState>doOneCycleFor: 23038772 PasteUpMorph>doOneCycle 5017264 MorphicProject>? 5017136 BlockClosure>? From asqueaker at gmail.com Mon Jul 6 03:09:37 2015 From: asqueaker at gmail.com (Chris Muller) Date: Mon Jul 6 03:09:43 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <20150705234149.GA41192@shell.msen.com> References: <20150705234149.GA41192@shell.msen.com> Message-ID: Hi Dave, the process for building a release is the same as the CI server. The prior 4.5 release image updated from trunk and then it runs: ReleaseBuilder prepareNewRelease You may follow the same process to see at which step the interpreter vm starts crashing. On Sun, Jul 5, 2015 at 6:41 PM, David T. Lewis wrote: > On Thu, Jul 02, 2015 at 02:26:23PM -0500, Chris Muller wrote: >> We have a release candidate image. >> >> http://ftp.squeak.org/4.6/ >> >> The new sources file is required. >> >> Please test your apps. This could be the final image unless major >> issues are uncovered. >> > > I am consistently getting VM crashes with the release candidate image > on an interpreter VM. > > Some of the failures appear to be related to method lookup, based on > the "Recursive not understood error encountered" message on console > output. > > I am completely at a loss to explain this, since my working trunk images > (based on 4.5, updated with the trunk stream) have no problem at all. > > I am baffled and do not know where to look. Can anyone suggest where > to look for the problem? Is there anything in the Squeak 4.6 build > process that might introduce problems that would not be seen in an > updated 4.5 trunk image? > > To reproduce, start with the 4.6 release candidate image, run it on > any interpreter VM, open a SqueakMap package loader, and try to load > the (head) release of package TwosComplement. This results in a VM > crash with the following console output: > > Thanks, > Dave > > ==== > > lewis@LexIT:/mnt/sda8/lewis/squeak/Squeak4.6$ > Recursive not understood error encountered > > 23544308 WeakIdentityKeyDictionary>scanFor: > 23544216 Dictionary>removeKey:ifAbsent: > 23544124 WeakRegistry>remove:ifAbsent: > 23544032 BlockClosure>on:do: > 23543916 BlockClosure>ifError: > 23543800 Semaphore>critical:ifError: > 23543708 Semaphore>critical: > 23543616 BlockClosure>ensure: > 23543464 Semaphore>critical: > 23543328 Semaphore>critical:ifError: > 23543216 WeakRegistry>protected: > 23543100 WeakRegistry>remove:ifAbsent: > 23543008 StandardFileStream class>unregister: > 23542916 StandardFileStream>unregister > 23542824 StandardFileStream>close > 23542732 PackageInfo>changeRecordsForMethod:do: > 23541136 SequenceableCollection>do: > 23541044 PackageInfo>changeRecordsForMethod:do: > 23540952 ContextPart>resume:through: > 23500916 BlockClosure>ensure: > 23487100 PackageInfo>changeRecordsForMethod:do: > 23487008 PackageInfo>changeRecordForOverriddenMethod: > 23486384 PackageInfo>isOverrideOfYourMethod: > 23486256 PackageInfo>overriddenMethodsDo: > 23486164 PackageInfo>methodsInCategory:ofClass:do: > 23486052 SequenceableCollection>do: > 23485868 PackageInfo>methodsInCategory:ofClass:do: > 23485776 PackageInfo>overriddenMethodsInClass:do: > 23485684 PackageInfo>overrideCategoriesForClass:do: > 23484648 SequenceableCollection>do: > 23484556 PackageInfo>overrideCategoriesForClass:do: > 23484436 PackageInfo>overriddenMethodsInClass:do: > 23484344 PackageInfo>allOverriddenMethodsDo: > 23484228 Behavior>allSubclassesDo: > 23398624 SequenceableCollection>do: > 23398508 Class>subclassesDo: > 23398416 Behavior>allSubclassesDo: > 23398324 Behavior>allSubclassesDo: > 23398232 SequenceableCollection>do: > 23398116 Class>subclassesDo: > 23398024 Behavior>allSubclassesDo: > 23397860 Behavior>withAllSubclassesDo: > 23397768 PackageInfo>allOverriddenMethodsDo: > 23397216 PackageInfo>overriddenMethodsDo: > 23397124 PackageInfo>overriddenMethods > 23397032 SequenceableCollection class>new:streamContents: > 23396940 SequenceableCollection class>streamContents: > 23396848 PackageInfo>overriddenMethods > 23396144 MCPackage>snapshot > 23396052 BlockClosure>on:do: > 23395960 CurrentReadOnlySourceFiles class>cacheDuring: > 23395708 MCPackage>snapshot > 23395500 MCReorganizationPreloader>addVersion: > 23395408 MCReorganizationPreloader class>preloadMovesBetween: > 23394940 OrderedCollection>do: > 23394848 MCReorganizationPreloader class>preloadMovesBetween: > 23308248 MCConfiguration>depsSatisfying:versionDo:displayingProgress: > 23308156 MCFileBasedRepository>cacheAllFileNamesDuring: > 23308064 MCConfiguration>cacheAllFileNamesDuring: > 23307740 MCConfiguration>cacheAllFileNamesDuring: > 23307648 MCConfiguration>depsSatisfying:versionDo:displayingProgress: > 23307556 MCConfiguration>upgrade > 23307376 MCMcmUpdater>updateFromConfig: > 23307252 MCMcmUpdater>updateFromRepository: > 23307160 Collection>do:displayingProgress:every: > 23307068 OrderedCollection>do: > 23306932 Collection>do:displayingProgress:every: > 23306688 MorphicUIManager>displayProgress:at:from:to:during: > 23306596 BlockClosure>on:do: > 23306504 MorphicUIManager>displayProgress:at:from:to:during: > 23306412 BlockClosure>ensure: > 23306172 MorphicUIManager>displayProgress:at:from:to:during: > 23306080 ProgressInitiationException>defaultResumeValue > 23305988 Exception>resume > 23305896 ProgressInitiationException>defaultAction > 23305804 UndefinedObject>handleSignal: > 23305712 ContextPart>handleSignal: > 23305620 ContextPart>handleSignal: > 23305516 ContextPart>handleSignal: > 23305228 ContextPart>handleSignal: > 23305136 ContextPart>handleSignal: > 23305044 Exception>signal > 23304952 ProgressInitiationException>display:at:from:to:during: > 23304860 ProgressInitiationException class>display:at:from:to:during: > 23304768 String>displayProgressAt:from:to:during: > 23304676 String>displayProgressFrom:to:during: > 23304584 Collection>do:displayingProgress:every: > 23304492 Collection>do:displayingProgress: > 23303720 MCMcmUpdater>updateFromRepository: > 23303628 BlockClosure>valueWithPossibleArgument: > 23303536 Collection>ifNotEmpty: > 23303296 MCMcmUpdater>updateFromRepository: > 23303204 BlockClosure>ensure: > 23294836 MCFileBasedRepository>cacheAllFileNamesDuring: > 23294708 MCMcmUpdater>updateFromRepository: > 23294592 MCMcmUpdater>updateFromRepositories: > 23294500 SequenceableCollection>do: > 23294200 MCMcmUpdater>updateFromRepositories: > 23294080 MCMcmUpdater>updateFrom: > 23293988 MCMcmUpdater class>updateFromRepository:baseName: > 23293896 UndefinedObject>? > 23287640 Compiler>evaluateCue:ifFail: > 23287548 Compiler>evaluateCue:ifFail:logged: > 23287456 Compiler>evaluate:in:to:notifying:ifFail:logged: > 23287364 Compiler class>evaluate:for:notifying:logged: > 23287228 Compiler class>evaluate:for:logged: > 23287136 Compiler class>evaluate:logged: > 23287044 PositionableStream>fileInAnnouncing: > 23286952 BlockClosure>on:do: > 23286624 PositionableStream>fileInAnnouncing: > 23286380 MorphicUIManager>displayProgress:at:from:to:during: > 23286288 BlockClosure>on:do: > 23286196 MorphicUIManager>displayProgress:at:from:to:during: > 23286104 BlockClosure>ensure: > 23285864 MorphicUIManager>displayProgress:at:from:to:during: > 23285772 ProgressInitiationException>defaultResumeValue > 23285680 Exception>resume > 23285588 ProgressInitiationException>defaultAction > 23285496 UndefinedObject>handleSignal: > 23285392 ContextPart>handleSignal: > 23285300 ContextPart>handleSignal: > 23285208 ContextPart>handleSignal: > 23285116 Exception>signal > 23284976 ProgressInitiationException>display:at:from:to:during: > 23284884 ProgressInitiationException class>display:at:from:to:during: > 23284672 String>displayProgressAt:from:to:during: > 23284580 String>displayProgressFrom:to:during: > 23284488 PositionableStream>fileInAnnouncing: > 23282956 SMSimpleInstaller>fileIntoChangeSetNamed:fromStream: > 23282820 BlockClosure>ensure: > 23282696 SMSimpleInstaller>fileIntoChangeSetNamed:fromStream: > 23280044 SMDefaultInstaller>fileIn > 23279916 SMDefaultInstaller>install > 23279824 SMLoaderPlus>installPackageRelease: > 23279732 UIManager>informUser:during: > 23279488 MorphicUIManager>displayProgress:at:from:to:during: > 23279396 BlockClosure>on:do: > 23279304 MorphicUIManager>displayProgress:at:from:to:during: > 23279212 BlockClosure>ensure: > 23278940 MorphicUIManager>displayProgress:at:from:to:during: > 23278848 ProgressInitiationException>defaultResumeValue > 23278756 Exception>resume > 23278664 ProgressInitiationException>defaultAction > 23278560 UndefinedObject>handleSignal: > 23278468 ContextPart>handleSignal: > 23278376 ContextPart>handleSignal: > 23278284 Exception>signal > 23278144 ProgressInitiationException>display:at:from:to:during: > 23278052 ProgressInitiationException class>display:at:from:to:during: > 23277888 SystemProgressMorph class>informUserAt:during: > 23277796 MorphicUIManager>informUserDuring: > 23277704 UIManager>informUser:during: > 23277364 SMLoaderPlus>installPackageRelease: > 23277272 BlockClosure>on:do: > 23041384 SMLoaderPlus>installPackageRelease: > 23041292 SMLoaderPlus>installPackageRelease > 23041200 PluggableButtonMorph>performAction > 23041108 PluggableButtonMorphPlus>performAction > 23040992 PluggableButtonMorph>mouseUp: > 23040900 SequenceableCollection>do: > 23040808 PluggableButtonMorph>mouseUp: > 23040676 PluggableButtonMorphPlus>mouseUp: > 23040584 Morph>handleMouseUp: > 23040492 MouseButtonEvent>sentTo: > 23040400 Morph>handleEvent: > 23040244 Morph>handleFocusEvent: > 23040152 HandMorph>sendFocusEvent:to:clear: > 23040060 BlockClosure>on:do: > 23039968 PasteUpMorph>becomeActiveDuring: > 23039848 HandMorph>sendFocusEvent:to:clear: > 23039756 HandMorph>sendEvent:focus:clear: > 23039664 HandMorph>sendMouseEvent: > 23039520 HandMorph>handleEvent: > 23039324 HandMorph>processEvents > 23039232 WorldState>doOneCycleNowFor: > 23039140 SequenceableCollection>do: > 23039048 WorldState>handsDo: > 23038956 WorldState>doOneCycleNowFor: > 23038864 WorldState>doOneCycleFor: > 23038772 PasteUpMorph>doOneCycle > 5017264 MorphicProject>? > 5017136 BlockClosure>? > > From brasspen at gmail.com Mon Jul 6 03:10:12 2015 From: brasspen at gmail.com (Chris Cunnington) Date: Mon Jul 6 03:10:18 2015 Subject: [squeak-dev] Squeak 4.6 release candidate Message-ID: <7BAF0A1E-A91F-4B4D-AA42-4424BBFD6AD2@gmail.com> Your error is reproducible on a Linux 4.13.12-3323 vm with the RC by running this in a Workspace: MCMcmUpdater updateFromRepository: ?http://www.squeaksource.com/TwosComplement' baseName: ?update? I suggest that you developed these: MonticelloConfigurations-dtl.131.mcz MonticelloConfigurations-dtl.132.mcz MonticelloConfigurations-dtl.133.mcz on a Cog vm and now you?re seeing them in action on an interpreter vm for the first time. FWIW, Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150705/a0eb3d3e/attachment.htm From asqueaker at gmail.com Mon Jul 6 03:16:07 2015 From: asqueaker at gmail.com (Chris Muller) Date: Mon Jul 6 03:16:10 2015 Subject: [squeak-dev] Squeak 4.6: Help-Squeak-Project-dtl.27.mcz In-Reply-To: <20150705145954.GA68235@shell.msen.com> References: <201507051449.t65EnQRH067290@shell.msen.com> <20150705145954.GA68235@shell.msen.com> Message-ID: > I copied the following from trunk to squeak46: There's no need to do that. The release process is automated, it does that when the release is built. From asqueaker at gmail.com Mon Jul 6 03:24:38 2015 From: asqueaker at gmail.com (Chris Muller) Date: Mon Jul 6 03:24:43 2015 Subject: [squeak-dev] Squeak 4.6: MonticelloConfigurations-dtl.136.mcz In-Reply-To: <559963f5.86558c0a.0d46.20b1SMTPIN_ADDED_MISSING@mx.google.com> References: <559963f5.86558c0a.0d46.20b1SMTPIN_ADDED_MISSING@mx.google.com> Message-ID: On Sun, Jul 5, 2015 at 12:05 PM, wrote: > David T. Lewis uploaded a new version of MonticelloConfigurations to project Squeak 4.6: > http://source.squeak.org/squeak46/MonticelloConfigurations-dtl.136.mcz > > ==================== Summary ==================== > > Name: MonticelloConfigurations-dtl.136 > Author: dtl > Time: 5 July 2015, 1:05:12.418 pm > UUID: ce452136-fc06-4d15-b41c-efd42ac6c0f8 > Ancestors: MonticelloConfigurations-dtl.135 > > Only the default MCMcmUpdater should update the system version. > > This fixes a condition in which loading a "head" package from SqueakMap using an update stream overwrote the system version. > > =============== Diff against MonticelloConfigurations-dtl.135 =============== > > Item was changed: > ----- Method: MCMcmUpdater>>updateFrom: (in category 'updating') ----- > updateFrom: url > + "Update the image by loading all pending updates from the server. If this is > + the default updater for the system, update the system version when complete." > - "Update the image by loading all pending updates from the server." > | config | > "Flush all caches. If a previous download failed this is often helpful" > MCFileBasedRepository flushAllCaches. > config := self updateFromRepositories: { url }. > config ifNil: [^self inform: 'Unable to retrieve updates from remote repository.' translated]. > + MCMcmUpdater default == self > + ifTrue: [ config setSystemVersion. > + self inform: ('Update completed. > + Current update number: ' translated, SystemVersion current highestUpdate).] > + ifFalse: [self inform: 'Update completed.'] > + ! > - config setSystemVersion. > - self inform: ('Update completed. > - Current update number: ' translated, SystemVersion current highestUpdate).! > > -------------- next part -------------- A non-text attachment was scrubbed... Name: ee.png Type: image/png Size: 64011 bytes Desc: not available Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150705/bdca77cf/ee-0001.png From asqueaker at gmail.com Mon Jul 6 03:47:00 2015 From: asqueaker at gmail.com (Chris Muller) Date: Mon Jul 6 03:47:04 2015 Subject: [squeak-dev] Squeak 4.6: MonticelloConfigurations-dtl.136.mcz In-Reply-To: <559963f5.86558c0a.0d46.20b1SMTPIN_ADDED_MISSING@mx.google.com> References: <559963f5.86558c0a.0d46.20b1SMTPIN_ADDED_MISSING@mx.google.com> Message-ID: I want to build RC2 with All-In-One but am suddenly getting an emergency evaluator when trying to update my trunk image. Is it related to this? It's the last thing on the Progress bar .. On Sun, Jul 5, 2015 at 12:05 PM, wrote: > David T. Lewis uploaded a new version of MonticelloConfigurations to project Squeak 4.6: > http://source.squeak.org/squeak46/MonticelloConfigurations-dtl.136.mcz > > ==================== Summary ==================== > > Name: MonticelloConfigurations-dtl.136 > Author: dtl > Time: 5 July 2015, 1:05:12.418 pm > UUID: ce452136-fc06-4d15-b41c-efd42ac6c0f8 > Ancestors: MonticelloConfigurations-dtl.135 > > Only the default MCMcmUpdater should update the system version. > > This fixes a condition in which loading a "head" package from SqueakMap using an update stream overwrote the system version. > > =============== Diff against MonticelloConfigurations-dtl.135 =============== > > Item was changed: > ----- Method: MCMcmUpdater>>updateFrom: (in category 'updating') ----- > updateFrom: url > + "Update the image by loading all pending updates from the server. If this is > + the default updater for the system, update the system version when complete." > - "Update the image by loading all pending updates from the server." > | config | > "Flush all caches. If a previous download failed this is often helpful" > MCFileBasedRepository flushAllCaches. > config := self updateFromRepositories: { url }. > config ifNil: [^self inform: 'Unable to retrieve updates from remote repository.' translated]. > + MCMcmUpdater default == self > + ifTrue: [ config setSystemVersion. > + self inform: ('Update completed. > + Current update number: ' translated, SystemVersion current highestUpdate).] > + ifFalse: [self inform: 'Update completed.'] > + ! > - config setSystemVersion. > - self inform: ('Update completed. > - Current update number: ' translated, SystemVersion current highestUpdate).! > > From lewis at mail.msen.com Mon Jul 6 04:02:46 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Mon Jul 6 04:02:49 2015 Subject: [squeak-dev] Squeak 4.6: MonticelloConfigurations-dtl.136.mcz In-Reply-To: References: <559963f5.86558c0a.0d46.20b1SMTPIN_ADDED_MISSING@mx.google.com> Message-ID: <20150706040246.GA80657@shell.msen.com> On Sun, Jul 05, 2015 at 10:47:00PM -0500, Chris Muller wrote: > I want to build RC2 with All-In-One but am suddenly getting an > emergency evaluator when trying to update my trunk image. Is it > related to this? It's the last thing on the Progress bar .. No, I don't think it is related. This change is just to prevent a non-default update stream from changing the system version. For example, I have the SqueakMap "head" entries for OSProcess and CommandShell set to use the update maps in those repositories. The error (fixed in MonticelloConfigurations-dtl.136) was that those update processes were stomping on the system version that is supposed to apply to the default (trunk or squeak46) update stream. Thus, if you loaded OSProcess head from SqueakMap, the system version was getting set to a completely bogus value. The change here is to make sure that the system version is updated if and only if the updater is for the default update stream. Dave > > > On Sun, Jul 5, 2015 at 12:05 PM, wrote: > > David T. Lewis uploaded a new version of MonticelloConfigurations to project Squeak 4.6: > > http://source.squeak.org/squeak46/MonticelloConfigurations-dtl.136.mcz > > > > ==================== Summary ==================== > > > > Name: MonticelloConfigurations-dtl.136 > > Author: dtl > > Time: 5 July 2015, 1:05:12.418 pm > > UUID: ce452136-fc06-4d15-b41c-efd42ac6c0f8 > > Ancestors: MonticelloConfigurations-dtl.135 > > > > Only the default MCMcmUpdater should update the system version. > > > > This fixes a condition in which loading a "head" package from SqueakMap using an update stream overwrote the system version. > > > > =============== Diff against MonticelloConfigurations-dtl.135 =============== > > > > Item was changed: > > ----- Method: MCMcmUpdater>>updateFrom: (in category 'updating') ----- > > updateFrom: url > > + "Update the image by loading all pending updates from the server. If this is > > + the default updater for the system, update the system version when complete." > > - "Update the image by loading all pending updates from the server." > > | config | > > "Flush all caches. If a previous download failed this is often helpful" > > MCFileBasedRepository flushAllCaches. > > config := self updateFromRepositories: { url }. > > config ifNil: [^self inform: 'Unable to retrieve updates from remote repository.' translated]. > > + MCMcmUpdater default == self > > + ifTrue: [ config setSystemVersion. > > + self inform: ('Update completed. > > + Current update number: ' translated, SystemVersion current highestUpdate).] > > + ifFalse: [self inform: 'Update completed.'] > > + ! > > - config setSystemVersion. > > - self inform: ('Update completed. > > - Current update number: ' translated, SystemVersion current highestUpdate).! > > > > From lewis at mail.msen.com Mon Jul 6 04:13:18 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Mon Jul 6 04:13:20 2015 Subject: [squeak-dev] Squeak 4.6 release candidate In-Reply-To: <7BAF0A1E-A91F-4B4D-AA42-4424BBFD6AD2@gmail.com> References: <7BAF0A1E-A91F-4B4D-AA42-4424BBFD6AD2@gmail.com> Message-ID: <20150706041318.GB80657@shell.msen.com> On Sun, Jul 05, 2015 at 11:10:12PM -0400, Chris Cunnington wrote: > Your error is reproducible on a Linux 4.13.12-3323 vm with the RC by running this in a Workspace: > > MCMcmUpdater updateFromRepository: ???http://www.squeaksource.com/TwosComplement' baseName: ???update??? > > I suggest that you developed these: > > MonticelloConfigurations-dtl.131.mcz > MonticelloConfigurations-dtl.132.mcz > MonticelloConfigurations-dtl.133.mcz > > on a Cog vm and now you???re seeing them in action on an interpreter vm for the first time. > > FWIW, > Chris > Hi Chris, Thanks for checking. Actually no, I am fairly sure that most of my updates to trunk have been done from an interpreter VM, and usually from my working 64-bit image (image format 68002). But there certainly are other updates to the system that will have been done from other image and VM combinations, so it is not out of the question that there might be a problem related to one of those, perhaps related to Monticello binary snapshots or something of that nature. But I am totally guessing, I really can't figure this one out at all :-( Dave From ma.chris.m at gmail.com Mon Jul 6 04:14:06 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Mon Jul 6 04:14:08 2015 Subject: [squeak-dev] Squeak 4.6: MonticelloConfigurations-dtl.136.mcz In-Reply-To: <20150706040246.GA80657@shell.msen.com> References: <559963f5.86558c0a.0d46.20b1SMTPIN_ADDED_MISSING@mx.google.com> <20150706040246.GA80657@shell.msen.com> Message-ID: Ah, that makes sense. Good fix. Maybe the problem is that Compiler needs to be moved up in the mcm. Its too late I'll have to check tomorrow. On Sun, Jul 5, 2015 at 11:02 PM, David T. Lewis wrote: > On Sun, Jul 05, 2015 at 10:47:00PM -0500, Chris Muller wrote: >> I want to build RC2 with All-In-One but am suddenly getting an >> emergency evaluator when trying to update my trunk image. Is it >> related to this? It's the last thing on the Progress bar .. > > No, I don't think it is related. This change is just to prevent a > non-default update stream from changing the system version. For example, > I have the SqueakMap "head" entries for OSProcess and CommandShell > set to use the update maps in those repositories. The error (fixed > in MonticelloConfigurations-dtl.136) was that those update processes > were stomping on the system version that is supposed to apply to > the default (trunk or squeak46) update stream. Thus, if you loaded > OSProcess head from SqueakMap, the system version was getting set to > a completely bogus value. The change here is to make sure that the > system version is updated if and only if the updater is for the > default update stream. > > Dave > >> >> >> On Sun, Jul 5, 2015 at 12:05 PM, wrote: >> > David T. Lewis uploaded a new version of MonticelloConfigurations to project Squeak 4.6: >> > http://source.squeak.org/squeak46/MonticelloConfigurations-dtl.136.mcz >> > >> > ==================== Summary ==================== >> > >> > Name: MonticelloConfigurations-dtl.136 >> > Author: dtl >> > Time: 5 July 2015, 1:05:12.418 pm >> > UUID: ce452136-fc06-4d15-b41c-efd42ac6c0f8 >> > Ancestors: MonticelloConfigurations-dtl.135 >> > >> > Only the default MCMcmUpdater should update the system version. >> > >> > This fixes a condition in which loading a "head" package from SqueakMap using an update stream overwrote the system version. >> > >> > =============== Diff against MonticelloConfigurations-dtl.135 =============== >> > >> > Item was changed: >> > ----- Method: MCMcmUpdater>>updateFrom: (in category 'updating') ----- >> > updateFrom: url >> > + "Update the image by loading all pending updates from the server. If this is >> > + the default updater for the system, update the system version when complete." >> > - "Update the image by loading all pending updates from the server." >> > | config | >> > "Flush all caches. If a previous download failed this is often helpful" >> > MCFileBasedRepository flushAllCaches. >> > config := self updateFromRepositories: { url }. >> > config ifNil: [^self inform: 'Unable to retrieve updates from remote repository.' translated]. >> > + MCMcmUpdater default == self >> > + ifTrue: [ config setSystemVersion. >> > + self inform: ('Update completed. >> > + Current update number: ' translated, SystemVersion current highestUpdate).] >> > + ifFalse: [self inform: 'Update completed.'] >> > + ! >> > - config setSystemVersion. >> > - self inform: ('Update completed. >> > - Current update number: ' translated, SystemVersion current highestUpdate).! >> > >> > From Das.Linux at gmx.de Mon Jul 6 10:03:09 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Mon Jul 6 10:03:16 2015 Subject: [squeak-dev] re CM>>#hasBreakpoint Message-ID: <613E11CE-7CA4-448F-9A28-8ADFC43F9936@gmx.de> Hi, we might need a configuration for Eliot's recent #hasBreakpoint changes, the CI (and probably any update process) chokes on this: 2015-07-06T11:27:54.732+01:00: Installing Kernel-eem.934 vvvvvvvvvvvvvvvvvv MessageNotUnderstood: CompiledMethod>>hasBreakpoint vvvvvvvvvvvvvvvvvv The time is 2015-07-06T11:27:54.848+01:00 CompiledMethod(Object)>>doesNotUnderstand: #hasBreakpoint MCMcmUpdater class(ClassDescription)>>logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: MethodAddition>>writeSourceToLog MethodAddition>>createCompiledMethod [] in [] in [] in [] in [] in MCPackageLoader>>basicLoad [] in [] in OrderedCollection(Collection)>>do:displayingProgress:every: OrderedCollection>>do: [] in OrderedCollection(Collection)>>do:displayingProgress:every: [] in [] in MorphicUIManager>>displayProgress:at:from:to:during: BlockClosure>>on:do: [] in MorphicUIManager>>displayProgress:at:from:to:during: BlockClosure>>ensure: MorphicUIManager>>displayProgress:at:from:to:during: ProgressInitiationException>>defaultResumeValue ProgressInitiationException(Exception)>>resume [] in [] in UndefinedObject>>DoIt Best regards -Tobias From eliot.miranda at gmail.com Mon Jul 6 13:40:11 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon Jul 6 13:40:18 2015 Subject: [squeak-dev] re CM>>#hasBreakpoint In-Reply-To: <613E11CE-7CA4-448F-9A28-8ADFC43F9936@gmx.de> References: <613E11CE-7CA4-448F-9A28-8ADFC43F9936@gmx.de> Message-ID: <47A6938C-9D64-49FB-822A-8CDC218DE912@gmail.com> Hi Tobias, there /are/ configurations. Two if then :-(. Eliot (phone) On Jul 6, 2015, at 3:03 AM, Tobias Pape wrote: > Hi, > > we might need a configuration for Eliot's recent #hasBreakpoint changes, > the CI (and probably any update process) chokes on this: > > 2015-07-06T11:27:54.732+01:00: Installing Kernel-eem.934 > vvvvvvvvvvvvvvvvvv MessageNotUnderstood: CompiledMethod>>hasBreakpoint vvvvvvvvvvvvvvvvvv > The time is 2015-07-06T11:27:54.848+01:00 > CompiledMethod(Object)>>doesNotUnderstand: #hasBreakpoint > MCMcmUpdater class(ClassDescription)>>logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: > MethodAddition>>writeSourceToLog > MethodAddition>>createCompiledMethod > [] in [] in [] in [] in [] in MCPackageLoader>>basicLoad > [] in [] in OrderedCollection(Collection)>>do:displayingProgress:every: > OrderedCollection>>do: > [] in OrderedCollection(Collection)>>do:displayingProgress:every: > [] in [] in MorphicUIManager>>displayProgress:at:from:to:during: > BlockClosure>>on:do: > [] in MorphicUIManager>>displayProgress:at:from:to:during: > BlockClosure>>ensure: > MorphicUIManager>>displayProgress:at:from:to:during: > ProgressInitiationException>>defaultResumeValue > ProgressInitiationException(Exception)>>resume > [] in [] in UndefinedObject>>DoIt > > Best regards > -Tobias > > From commits at source.squeak.org Mon Jul 6 14:51:21 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 14:51:24 2015 Subject: [squeak-dev] The Trunk: Kernel-topa.935.mcz Message-ID: Tobias Pape uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-topa.935.mcz ==================== Summary ==================== Name: Kernel-topa.935 Author: topa Time: 6 July 2015, 4:50:44.188 pm UUID: d30beb7f-4706-4876-9aa1-fd8d45ba4733 Ancestors: Kernel-eem.934 Reinstall CompiledMethod>>#hasBreakpoint =============== Diff against Kernel-eem.934 =============== Item was added: + ----- Method: CompiledMethod>>hasBreakpoint (in category 'testing') ----- + hasBreakpoint + ^false! From commits at source.squeak.org Mon Jul 6 14:52:42 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 14:52:44 2015 Subject: [squeak-dev] The Trunk: System-topa.753.mcz Message-ID: Tobias Pape uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-topa.753.mcz ==================== Summary ==================== Name: System-topa.753 Author: topa Time: 6 July 2015, 4:52:01.028 pm UUID: f48f92bd-38a9-4556-b444-90f02b7050fa Ancestors: System-eem.752 Reinstall CompiledMethod>>#hasBreakpoint as an Override =============== Diff against System-eem.752 =============== Item was changed: + ----- Method: CompiledMethod>>hasBreakpoint (in category '*System-Tools-debugger support-override') ----- - ----- Method: CompiledMethod>>hasBreakpoint (in category '*System-Tools-debugger support') ----- hasBreakpoint ^BreakpointManager methodHasBreakpoint: self! From commits at source.squeak.org Mon Jul 6 14:57:19 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 14:57:21 2015 Subject: [squeak-dev] The Trunk: Help-Squeak-Project-cmm.28.mcz Message-ID: Chris Muller uploaded a new version of Help-Squeak-Project to project The Trunk: http://source.squeak.org/trunk/Help-Squeak-Project-cmm.28.mcz ==================== Summary ==================== Name: Help-Squeak-Project-cmm.28 Author: cmm Time: 6 July 2015, 9:57:04.419 am UUID: a57cf8f4-1ccc-4dba-9eb1-7e59e32a0517 Ancestors: Help-Squeak-Project-dtl.27 Don't deliver the release image with duplicate instance of big String literals. =============== Diff against Help-Squeak-Project-dtl.27 =============== Item was changed: ----- Method: SqueakProjectHelp class>>extendingTheSystem (in category 'pages') ----- extendingTheSystem ^HelpTopic title: 'Extending The System' icon: (HelpIcons iconNamed: #squeakIcon) contents: + TheWorldMainDockingBar new extendingTheSystem ! - 'SqueakMap is an integrated catalog of external applications for Squeak. It is accessible from the "Apps" menu. This catalog does not host the projects, it merely documents the load scripts required to correctly bring them into the image. - - Many SqueakMap packages use Installer, which defines several packages in its package-definitions protocol. Any of these can be loaded with an expression like the following: - - Installer new merge: #openGL - - Change #openGL to the selector name of the package you want to load. The latest version of that package and all of its prerequisites will be merged into the image. Merging a package is no different from loading it unless the package is already loaded, in which case it is upgraded to the latest version in a way that preserves any local changes you may already have made. - - --------------- - This remainder of this workspace documents load-scripts for packages that are not documented in either SqueakMap or Installer. - - OCompletion - "Provides source code completion as you type" - (Installer ss project: ''OCompletion'') install: ''Ocompletion''. - (Smalltalk at: #ECToolSet) register. - (Smalltalk at: #ToolSet) default: (Smalltalk at: #ECToolSet). - - Omnibrowser - "Including Refactoring engine" - (Installer ss project: ''MetacelloRepository'') install: ''ConfigurationOfOmniBrowser''. - ((Smalltalk at: #ConfigurationOfOmniBrowser) project perform: #lastVersion) load: #( Dev ). - - Pier CMS - "Pier CMS: http://www.piercms.com" - (Installer ss project: ''MetacelloRepository'') install: ''ConfigurationOfPier2''. - (Smalltalk at: #ConfigurationOfPier2) load. - - (Installer lukas project: ''pier2'') install: ''Pier-Blog''. - (Installer lukas project: ''pier2'') install: ''Pier-Book''. - (Installer lukas project: ''pier2addons'') install: ''Pier-Setup''. - (Smalltalk at: #PRDistribution) new register. - - Open Cobalt - "http://opencobalt.org (Best to run this from an image in an open cobalt directory)" - Installer ss project: ''TweakCore''; install: ''update''. - [Installer ss project: ''TweakExtras''; install: ''update''] - on: (Smalltalk at: #CUnsynchronizedModification) do: [:ex | ex resume]. - Installer cobalt project: ''Tweak''; - answer: ''Would you like to conserve memory at all costs?'' with: true; - answer: ''Password for interactive VNC connections?'' with: ''cobalt''; - answer: ''Would you like to add the RFBServer to the World open menu?'' with: true; - install: ''update'' - !! - ]style[(9 309 19 252 6 126 8 237 11 209 11 210 8 386 11 547)dSMLoaderPlus open;;,,d| newBrowser | - newBrowser := Browser new selectSystemCategory: ''Installer-Core''; selectClass: Installer; metaClassIndicated: false; selectMessageCategoryNamed: ''package-definitions''; selectMessageNamed: #openGL. - Browser openBrowserView: (newBrowser openMessageCatEditString: nil) label: ''External Package Definitions'';;,,i,,u,,bu,,bu,,bu,,bu,!!' readStream nextChunkText! Item was changed: ----- Method: SqueakProjectHelp class>>releaseNotes (in category 'pages') ----- releaseNotes "This method was automatically generated. Edit it using:" "a HelpBrowser edit: #releaseNotes" ^HelpTopic title: 'Release Notes' contents: TheWorldMainDockingBar new releaseNotes "<--- ugh, we will fix this later, for now may we not have TWO copies of the 8K release notes string in memory?"! Item was changed: ----- Method: SqueakProjectHelp class>>squeakResourcesOnline (in category 'pages') ----- squeakResourcesOnline ^HelpTopic title: 'Squeak Resources Online' icon: (HelpIcons iconNamed: #squeakIcon) contents: - 'Squeak web sites - Main Squeak site http://www.squeak.org - Weekly Squeak http://news.squeak.org - Oversight Board http://board.squeak.org - Downloads for many versions http://ftp.squeak.org - Development of the virtual machine http://squeakvm.org - Google+ Page - https://plus.google.com/u/0/b/115950529692424242526/ - - Squeak-dev - The main Squeak mailing list - http://lists.squeakfoundation.org/mailman/listinfo/squeak-dev - http://dir.gmane.org/gmane.comp.lang.smalltalk.squeak.general - http://n4.nabble.com/Squeak-Dev-f45488.html + TheWorldMainDockingBar new squeakOnlineResources! - Squeak-Beginners - The place to ask even the most basic questions - http://lists.squeakfoundation.org/mailman/listinfo/beginners - http://dir.gmane.org/gmane.comp.lang.smalltalk.squeak.beginners - http://n4.nabble.com/Squeak-Beginners-f107673.html - - Squeak By Example - http://www.squeakbyexample.org/ - - Squeak, Open Personal Computing and Multimedia - http://coweb.cc.gatech.edu/squeakbook/ - http://stephane.ducasse.free.fr/FreeBooks/CollectiveNBlueBook/ - - Squeak, Open Personal Computing for Multimedia - http://www.cc.gatech.edu/~mark.guzdial/drafts/ - http://stephane.ducasse.free.fr/FreeBooks/GuzdialBookDrafts/ - - More Books about Squeak and Smalltalk - http://stephane.ducasse.free.fr/FreeBooks.html - !! - ]style[(16 316 41 173 65 181 17 35 46 106 46 112 37 49)bu,,bu,,bu,,bu,,bu,,bu,,bu,!!' readStream nextChunkText - ! Item was changed: ----- Method: SqueakProjectHelp class>>squeakUserInterface (in category 'pages') ----- squeakUserInterface ^HelpTopic title: 'Squeak User Interface' icon: (HelpIcons iconNamed: #squeakIcon) contents: - 'The Squeak UI has some unusual elements that you may not have seen before. Here is a brief introduction to those elements: + TheWorldMainDockingBar new squeakUserInterface! - Projects - A project is an entire Squeak desktop full of windows. Projects are can be used to change quickly from one task to another. An inactive project is represented by a project window that shows a thumbnail of that project''s windows. Project windows are actually more like doors than windows, since you can enter the project just by clicking on its project window. You can create a new project by choosing ''open...project'' from the screen menu. To exit a project (and return to its parent project), choose ''previous project'' from the screen menu. Each project maintains its set of windows, plus its own set of Smalltalk changes and its own screen color depth. - - Morphic Halos - In a morphic project, cmd-click (alt-click) on a window or other graphical object will bring up a constellation of colored circles called "halo handles" around that object. Additional clicks will cycle through the halos for other graphical objects in the nesting structure. If you hold down the Shift key while cmd-clicking, the nested morphs will be traversed from innermost outward. Clicking without the cmd (alt) key will dismiss the halo. While the halo is up, letting the cursor linger over one of the halo handles for a few seconds will cause a balloon to pop up with the name of that handle. Three useful handles are the top-left "X" handle (delete), the bottom-right yellow handle (resize), and the brown handle (slide the object within its containing object). Halos allow complex graphical objects to be explored--or even disassembled (using the black halo handle). Usually no harm results from taking apart an object; you can just discard the pieces and create a new one. - - Flaps - To enable Flaps, click on the desktop to show the world menu, choose the "Flaps..." menu and "show shared tags". Tabs labeled "Squeak", "Tools", "Supplies", etc., will appear along the edges of the Squeak desktop. Click on any tab to open the corresponding flap. Drag a tab to resize the flap and to relocate the tab. Bring up the halo on any tab and click on its menu handle to be presented with many options relating to the flap. Use the "Flaps..." menu, reached via the desktop menu, to control which flaps are visible and for other flap-related options and assistance. - - Parts Bins - You can obtain new objects in many ways. The "Objects Catalog" (choose "objects'' from the world menu or open the objects flap) and several of the standard flaps (e.g. "Tools" and "Supplies") serve as "Parts Bins" the for new objects. Drag any icon you see in a Parts Bin and a fresh copy of the kind of object it represents will appear "in your hand"; click to deposit the new object anywhere you wish. You can also add your own objects to any of the flaps -- just drag your object over the tab, wait for the flap to pop open, then drop the object at the desired position in the flap. - !! - ]style[(123 9 663 13 991 5 579 10 589),bu,,bu,,bu,,bu,!!' readStream nextChunkText! Item was changed: ----- Method: SqueakProjectHelp class>>workingWithSqueak (in category 'pages') ----- workingWithSqueak ^HelpTopic title: 'Working with Squeak' icon: (HelpIcons iconNamed: #squeakIcon) contents: + TheWorldMainDockingBar new workingWithSqueak "avoid duplicate of big string until we fix this"! - 'Starting and Quitting - Like most Smalltalks, the machine-executable portion is a relatively small program known as the "virtual machine" (VM). The VM''s job is to provide services from the physical machine to real Smalltalk objects. Services like input and output. The Smalltalk system, including all data and code, is a system of objects, built from the ground up, and interpreted by this virtual computer. This affords Smalltalk system platform portability. - - Smalltalk cannot run without the VM. The VM can''t do anything useful except process Smalltalk systems. - - To start the system, drag the ".image" data file to the VM executable "squeak". There are myriad command-line options for starting the system via the command-line (see squeak --help). By default, the system will open on the screen in a single OS window. - - To quit a Squeak session, choose ''quit'' from the menu bar. If you save, the image file will be overwritten and resume from that place the next time it''s launched. - - The Image File - Squeak is an environment built in its own objects from the ground up, including one or more end-user applications. All of the objects in the system -- Classes, Dictionaries, Windows, Customers and other objects that make up the Squeak environment are stored in a binary ".image" file. This is the "object-data file" loaded by the VM when Squeak is launched. - - When an image is started, every object resumes exactly from where it was last saved. - - The Sources File - Smalltalk is traditionally includes the source code in the running system. However, keeping multiple copies of the same source code in all images files is wasteful. Therefore, the source code itself is kept in a read-only .sources file and accessed by all images. The image files merely have pointers into this file, which is read on-the-fly to present original source code. - - The code of the base system is stored in the file "SqueakV41.sources". This file does not change except between releases of Squeak. Normally this file should be placed in the folder containing the VM executable. - - The Changes File - The purpose of Squeak is to develop new programs and systems. Code changes to the running system are effective immediately. But since multiple images can be running, they cannot all update the .sources file safely. Therefore, each image file is accompanied by a ".changes" file which contains source code changes for that and only that Smalltalk system.. - - The changes file is important for project work. It keeps a sequential log of development activity for the purpose of recovering work performed since the last image-save. Any of several events could lead to the need to recover work, including a power-outage or making an erroneous change to code required to keep the system running. - - The changes file does not consume memory space, so Squeak is able to keep a complete history of all program changes. This makes it easy to examine or even reinstate older versions of methods (see ''versions'' option in browser selector pane). This encourages experimentation, since you can easily revert to the original versions of any set of methods. - - In extreme cases where sources and/or changes files are not available, the system can still run, and will automatically decompile the bytecode methods in image memory, if necessary, into readable and editable versions of the original source code (only comments and temporary variable names are lost). - - Transferring Code-Snippets Between Images - In addition to the ''save'' command that saves the entire state of the system, the code of individual methods, categories or classes may be ''filed out'' and then filed-in to another image. - - Packages - The code of an entire project is encapsulated by a Package. This allows users to share their code with other users. Code of packages are delineated by the categories of their classes, and methods. The Monticello browser is then used to wrap that code into a Package object which can be saved to a Monticello repository at http://ss3.gemtalksystems.com/ss. - - Some projects end up using the resources provided by several packages, resulting in a hierarchy of packages that make up a system. Installer can be used to install such systems.!! - ]style[(21 970 14 448 16 396 11 188 16 321 4 1025 41 188 8 52 10 55 2 420)bu,,bu,,bu,,u,,bu,,u,,bu,,bu,,i,,i,!!' readStream nextChunkText! From commits at source.squeak.org Mon Jul 6 15:01:39 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 15:01:41 2015 Subject: [squeak-dev] The Trunk: MorphicExtras-cmm.164.mcz Message-ID: Chris Muller uploaded a new version of MorphicExtras to project The Trunk: http://source.squeak.org/trunk/MorphicExtras-cmm.164.mcz ==================== Summary ==================== Name: MorphicExtras-cmm.164 Author: cmm Time: 6 July 2015, 10:00:42.97 am UUID: dfe6214e-4ebc-45a3-ba1c-ee6a19c1d814 Ancestors: MorphicExtras-nice.163 Allow flaps to be dragged again. =============== Diff against MorphicExtras-nice.163 =============== Item was added: + ----- Method: ReferenceMorph>>handlesMouseMove: (in category 'event handling') ----- + handlesMouseMove: anEvent + ^true! From commits at source.squeak.org Mon Jul 6 15:03:26 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 15:03:28 2015 Subject: [squeak-dev] The Trunk: ReleaseBuilder-cmm.126.mcz Message-ID: Chris Muller uploaded a new version of ReleaseBuilder to project The Trunk: http://source.squeak.org/trunk/ReleaseBuilder-cmm.126.mcz ==================== Summary ==================== Name: ReleaseBuilder-cmm.126 Author: cmm Time: 6 July 2015, 10:03:15.4 am UUID: 45ba00a2-427c-49f0-8b84-176d23eaaad7 Ancestors: ReleaseBuilder-mt.125 Now that condenseSources is working, make it a regular part of the release process. =============== Diff against ReleaseBuilder-mt.125 =============== Item was changed: ----- Method: ReleaseBuilder class>>prepareNewRelease (in category 'scripts') ----- prepareNewRelease "This method is run at time of release to transfer the top trunk versions into my releaseRepository, and produce a release image." self transferCurrentPackagesAsUser: Utilities authorInitials password: (UIManager default requestPassword: 'Enter password for ' , self projectUrl). + self prepareNewBuild: self releaseRepository. + Smalltalk condenseSources! - self prepareNewBuild: self releaseRepository! From Das.Linux at gmx.de Mon Jul 6 15:07:34 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Mon Jul 6 15:07:38 2015 Subject: [squeak-dev] re CM>>#hasBreakpoint In-Reply-To: <47A6938C-9D64-49FB-822A-8CDC218DE912@gmail.com> References: <613E11CE-7CA4-448F-9A28-8ADFC43F9936@gmx.de> <47A6938C-9D64-49FB-822A-8CDC218DE912@gmail.com> Message-ID: Hi Eliot On 06.07.2015, at 15:40, Eliot Miranda wrote: > Hi Tobias, > > there /are/ configurations. Two if then :-(. Sorry, it was just a guess because of the stack trace. So, I investigated. update-eem.319.mcm: (CompiledMethod methodDict includesKay: #hasBreakpoint) "true" CompiledMethod>>#hasBreakpoint ^BreakpointManager methodHasBreakpoint: self update-eem.320.mcm: (CompiledMethod methodDict includesKey: #hasBreakpoint) "true" CompiledMethod>>#hasBreakpoint ^false update-eem.320.mcm: (CompiledMethod methodDict includesKey: #hasBreakpoint) "true" CompiledMethod>>#hasBreakpoint ^false Kernel-eem.934 (CompiledMethod methodDict includesKey: #hasBreakpoint) "false" Ahaa. System misses to use an actual override and monticello thought the method had gone when it was saved for Kernel-eem.934. Soo: Kernel-topa.935: Reinstall CompiledMethod>>#hasBreakpoint System-topa.753: Reinstall CompiledMethod>>#hasBreakpoint as an Override Jenkins seems to be happy: http://build.squeak.org/job/SqueakTrunk/1549/console http://build.squeak.org/job/SqueakTrunk/1549/ I hope this fits everyones :) Best regards -Tobias PS: Have you looked at WrappedBreakpoint? > Eliot (phone) > > On Jul 6, 2015, at 3:03 AM, Tobias Pape wrote: > >> Hi, >> >> we might need a configuration for Eliot's recent #hasBreakpoint changes, >> the CI (and probably any update process) chokes on this: >> >> 2015-07-06T11:27:54.732+01:00: Installing Kernel-eem.934 >> vvvvvvvvvvvvvvvvvv MessageNotUnderstood: CompiledMethod>>hasBreakpoint vvvvvvvvvvvvvvvvvv >> The time is 2015-07-06T11:27:54.848+01:00 >> CompiledMethod(Object)>>doesNotUnderstand: #hasBreakpoint >> MCMcmUpdater class(ClassDescription)>>logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: >> MethodAddition>>writeSourceToLog >> MethodAddition>>createCompiledMethod >> [] in [] in [] in [] in [] in MCPackageLoader>>basicLoad >> [] in [] in OrderedCollection(Collection)>>do:displayingProgress:every: >> OrderedCollection>>do: >> [] in OrderedCollection(Collection)>>do:displayingProgress:every: >> [] in [] in MorphicUIManager>>displayProgress:at:from:to:during: >> BlockClosure>>on:do: >> [] in MorphicUIManager>>displayProgress:at:from:to:during: >> BlockClosure>>ensure: >> MorphicUIManager>>displayProgress:at:from:to:during: >> ProgressInitiationException>>defaultResumeValue >> ProgressInitiationException(Exception)>>resume >> [] in [] in UndefinedObject>>DoIt >> >> Best regards >> -Tobias From commits at source.squeak.org Mon Jul 6 15:23:32 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 15:23:34 2015 Subject: [squeak-dev] The Trunk: Compiler-topa.302.mcz Message-ID: Tobias Pape uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-topa.302.mcz ==================== Summary ==================== Name: Compiler-topa.302 Author: topa Time: 6 July 2015, 5:23:17.205 pm UUID: 503dc5a6-5953-49d7-ba6b-5ca0d7de4e3c Ancestors: Compiler-eem.301 Don't be too strict if BlockNode scope setting is idempotent =============== Diff against Compiler-eem.301 =============== Item was changed: ----- Method: TempVariableNode>>definingScope: (in category 'code generation (closures)') ----- definingScope: scopeBlock "" + definingScope = scopeBlock ifTrue: [^ self]. "No need to bail" definingScope ifNotNil: [self error: 'temp has more than one defining scope. This is probably a parser error']. definingScope := scopeBlock! From eliot.miranda at gmail.com Mon Jul 6 15:54:29 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon Jul 6 15:54:37 2015 Subject: [squeak-dev] re CM>>#hasBreakpoint In-Reply-To: References: <613E11CE-7CA4-448F-9A28-8ADFC43F9936@gmx.de> <47A6938C-9D64-49FB-822A-8CDC218DE912@gmail.com> Message-ID: Hi Tobias, On Jul 6, 2015, at 8:07 AM, Tobias Pape wrote: > Hi Eliot > On 06.07.2015, at 15:40, Eliot Miranda wrote: > >> Hi Tobias, >> >> there /are/ configurations. Two if then :-(. > > Sorry, it was just a guess because of the stack trace. > > So, I investigated. > > update-eem.319.mcm: > (CompiledMethod methodDict includesKay: #hasBreakpoint) "true" > > CompiledMethod>>#hasBreakpoint > ^BreakpointManager methodHasBreakpoint: self > > update-eem.320.mcm: > (CompiledMethod methodDict includesKey: #hasBreakpoint) "true" > > CompiledMethod>>#hasBreakpoint > ^false > > update-eem.320.mcm: > (CompiledMethod methodDict includesKey: #hasBreakpoint) "true" > > CompiledMethod>>#hasBreakpoint > ^false > > Kernel-eem.934 > > (CompiledMethod methodDict includesKey: #hasBreakpoint) "false" > > > Ahaa. > System misses to use an actual override and monticello thought the method had gone > when it was saved for Kernel-eem.934. > Soo: > Kernel-topa.935: Reinstall CompiledMethod>>#hasBreakpoint > System-topa.753: Reinstall CompiledMethod>>#hasBreakpoint as an Override > Jenkins seems to be happy: > http://build.squeak.org/job/SqueakTrunk/1549/console > http://build.squeak.org/job/SqueakTrunk/1549/ > > I hope this fits everyones :) > > Best regards > -Tobias > > > PS: Have you looked at WrappedBreakpoint? No. I'll try and take a look. What do you think the issue is? >> Eliot (phone) >> >> On Jul 6, 2015, at 3:03 AM, Tobias Pape wrote: >> >>> Hi, >>> >>> we might need a configuration for Eliot's recent #hasBreakpoint changes, >>> the CI (and probably any update process) chokes on this: >>> >>> 2015-07-06T11:27:54.732+01:00: Installing Kernel-eem.934 >>> vvvvvvvvvvvvvvvvvv MessageNotUnderstood: CompiledMethod>>hasBreakpoint vvvvvvvvvvvvvvvvvv >>> The time is 2015-07-06T11:27:54.848+01:00 >>> CompiledMethod(Object)>>doesNotUnderstand: #hasBreakpoint >>> MCMcmUpdater class(ClassDescription)>>logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: >>> MethodAddition>>writeSourceToLog >>> MethodAddition>>createCompiledMethod >>> [] in [] in [] in [] in [] in MCPackageLoader>>basicLoad >>> [] in [] in OrderedCollection(Collection)>>do:displayingProgress:every: >>> OrderedCollection>>do: >>> [] in OrderedCollection(Collection)>>do:displayingProgress:every: >>> [] in [] in MorphicUIManager>>displayProgress:at:from:to:during: >>> BlockClosure>>on:do: >>> [] in MorphicUIManager>>displayProgress:at:from:to:during: >>> BlockClosure>>ensure: >>> MorphicUIManager>>displayProgress:at:from:to:during: >>> ProgressInitiationException>>defaultResumeValue >>> ProgressInitiationException(Exception)>>resume >>> [] in [] in UndefinedObject>>DoIt >>> >>> Best regards >>> -Tobias > > > From eliot.miranda at gmail.com Mon Jul 6 15:55:31 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon Jul 6 15:55:34 2015 Subject: [squeak-dev] The Trunk: Compiler-topa.302.mcz In-Reply-To: <559a9d7c.74668c0a.6aeb.6804SMTPIN_ADDED_MISSING@mx.google.com> References: <559a9d7c.74668c0a.6aeb.6804SMTPIN_ADDED_MISSING@mx.google.com> Message-ID: <0B972D2C-A7E7-4642-BFA3-47D95FDE70DA@gmail.com> Hi Tobias, I'm curious. What tickles this bug? Eliot (phone) On Jul 6, 2015, at 8:50 AM, commits@source.squeak.org wrote: > Tobias Pape uploaded a new version of Compiler to project The Trunk: > http://source.squeak.org/trunk/Compiler-topa.302.mcz > > ==================== Summary ==================== > > Name: Compiler-topa.302 > Author: topa > Time: 6 July 2015, 5:23:17.205 pm > UUID: 503dc5a6-5953-49d7-ba6b-5ca0d7de4e3c > Ancestors: Compiler-eem.301 > > Don't be too strict if BlockNode scope setting is idempotent > > =============== Diff against Compiler-eem.301 =============== > > Item was changed: > ----- Method: TempVariableNode>>definingScope: (in category 'code generation (closures)') ----- > definingScope: scopeBlock "" > + definingScope = scopeBlock ifTrue: [^ self]. "No need to bail" > definingScope ifNotNil: > [self error: 'temp has more than one defining scope. This is probably a parser error']. > definingScope := scopeBlock! > > From commits at source.squeak.org Mon Jul 6 16:00:43 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 16:00:48 2015 Subject: [squeak-dev] Squeak 4.6: System-topa.753.mcz Message-ID: Chris Muller uploaded a new version of System to project Squeak 4.6: http://source.squeak.org/squeak46/System-topa.753.mcz ==================== Summary ==================== Name: System-topa.753 Author: topa Time: 6 July 2015, 4:52:01.028 pm UUID: f48f92bd-38a9-4556-b444-90f02b7050fa Ancestors: System-eem.752 Reinstall CompiledMethod>>#hasBreakpoint as an Override =============== Diff against System-cmm.751 =============== From commits at source.squeak.org Mon Jul 6 16:00:45 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 16:00:52 2015 Subject: [squeak-dev] Squeak 4.6: Kernel-topa.935.mcz Message-ID: Chris Muller uploaded a new version of Kernel to project Squeak 4.6: http://source.squeak.org/squeak46/Kernel-topa.935.mcz ==================== Summary ==================== Name: Kernel-topa.935 Author: topa Time: 6 July 2015, 4:50:44.188 pm UUID: d30beb7f-4706-4876-9aa1-fd8d45ba4733 Ancestors: Kernel-eem.934 Reinstall CompiledMethod>>#hasBreakpoint =============== Diff against Kernel-eem.932 =============== Item was changed: ----- Method: ClassDescription>>logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: (in category 'private') ----- logMethodSource: aText forMethodWithNode: aCompiledMethodWithNode inCategory: category withStamp: changeStamp notifying: requestor | priorMethodOrNil newText | priorMethodOrNil := self compiledMethodAt: aCompiledMethodWithNode selector ifAbsent: []. + (priorMethodOrNil notNil and: [priorMethodOrNil hasBreakpoint]) ifTrue: + [priorMethodOrNil := priorMethodOrNil getAndForgetUnbreakpointedOriginal]. + newText := (requestor notNil and: [Preferences confirmFirstUseOfStyle]) + ifTrue: [aText askIfAddStyle: priorMethodOrNil req: requestor] + ifFalse: [aText]. + aCompiledMethodWithNode method + putSource: newText - newText := (requestor notNil - and: [Preferences confirmFirstUseOfStyle]) - ifTrue: [aText askIfAddStyle: priorMethodOrNil req: requestor] - ifFalse: [aText]. - aCompiledMethodWithNode method putSource: newText fromParseNode: aCompiledMethodWithNode node + class: self + category: category + withStamp: changeStamp + inFile: 2 + priorMethod: priorMethodOrNil! - class: self category: category withStamp: changeStamp - inFile: 2 priorMethod: priorMethodOrNil.! Item was added: + ----- Method: CompiledMethod>>hasBreakpoint (in category 'testing') ----- + hasBreakpoint + ^false! From commits at source.squeak.org Mon Jul 6 16:01:50 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 16:01:52 2015 Subject: [squeak-dev] Squeak 4.6: Help-Squeak-Project-cmm.28.mcz Message-ID: Chris Muller uploaded a new version of Help-Squeak-Project to project Squeak 4.6: http://source.squeak.org/squeak46/Help-Squeak-Project-cmm.28.mcz ==================== Summary ==================== Name: Help-Squeak-Project-cmm.28 Author: cmm Time: 6 July 2015, 9:57:04.419 am UUID: a57cf8f4-1ccc-4dba-9eb1-7e59e32a0517 Ancestors: Help-Squeak-Project-dtl.27 Don't deliver the release image with duplicate instance of big String literals. =============== Diff against Help-Squeak-Project-dtl.27 =============== Item was removed: - SystemOrganization addCategory: #'Help-Squeak-Project'! Item was removed: - ----- Method: HelpIcons class>>squeakIcon (in category '*help-squeak-project') ----- - squeakIcon - ^(Form - extent: 12@12 - depth: 32 - fromArray: #( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 75398782 26843545 0 0 1159996452 1378823983 338044454 0 0 0 0 455682345 1295266868 1126376227 0 0 1040582150 0 1328097577 0 0 0 23488102 1277502757 0 1076834095 0 0 1075781407 0 287647013 472854319 0 0 471472666 204089898 0 1092756002 0 0 1041963803 36909875 0 1880232466 454761243 287515427 1342572038 0 104939841 974460181 0 0 270080281 354690084 86846765 3674539269 1394219546 1611599631 3557427722 86123042 388244516 204287277 0 26843545 605558808 1025055001 1008014613 1159141143 522264865 739710743 1159141143 571083274 570820102 188891714 0 942550574 1411391520 1143021857 1312241463 1428563494 3205040393 3708159494 1663576104 1511067921 1579887403 1629758500 958472481 656679972 439563059 1294608938 839913488 739644950 172246084 221459251 840900383 1075978786 1209933342 724512559 707077413 0 0 0 0 0 0 0 0 0 0 38488907 0 0 0 0 0 0 0 0 0 0 0 0 0) - offset: 0@0)! Item was removed: - CustomHelp subclass: #SqueakHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakHelp class>>bookName (in category 'accessing') ----- - bookName - ^'Squeak'! Item was removed: - ----- Method: SqueakHelp class>>icon (in category 'accessing') ----- - icon - (self name = #SqueakHelp) ifTrue: [^HelpIcons iconNamed: #squeakIcon]. - ^nil! Item was removed: - ----- Method: SqueakHelp class>>introduction (in category 'as yet unclassified') ----- - introduction - "This method was automatically generated. Edit it using:" - "a HelpBrowser edit: #introduction" - ^HelpTopic - title: 'Welcome' - contents: - 'WELCOME - - Squeak is a modern, open source, full-featured implementation of the powerful Smalltalk programming language and environment. - - Squeak is highly-portable - even its virtual machine is written entirely in Smalltalk making it easy to debug, analyze, and change. - - Squeak is the vehicle for a wide range of projects from multimedia applications, educational platforms to commercial web application development.!! - ]style[(7 2 6 72 9 41 6 70 9 49 6 139)bc000000000a0FBitstreamVeraSerif#20.0,c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000,FBitstreamVeraSerif#16.0ba0c000000000,FBitstreamVeraSerif#16.0a0c000000000!!' readStream nextChunkText! Item was removed: - ----- Method: SqueakHelp class>>pages (in category 'accessing') ----- - pages - ^#(introduction SqueakProjectHelp SqueakToolsHelp SqueakTutorials)! Item was removed: - SqueakProjectHelp subclass: #SqueakLicenseHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakLicenseHelp class>>bookName (in category 'accessing') ----- - bookName - ^'License'! Item was removed: - ----- Method: SqueakLicenseHelp class>>licenseChange (in category 'pages') ----- - licenseChange - ^HelpTopic - title: 'License has changed with 4.0' - contents: 'On 23 September 1996, Apple Computer Inc. released Squeak V1.1 under the "Squeak License" (SqL). - - On May 8, 2006 Apple agreed to relicense original Squeak V1.1 under the Apple Public Source License. - - On October 12, 2006 Apple granted permission to relicense under Apache license 2.0. - - In 2006, VPRI began to collect "Distribution Agreements" for all contributors to Squeak since V1.1 up to V3.8, asking them to relicense their contributions, which were originally licensed under SqL, to the MIT license. This was a great effort on behalf of many and VPRI has 100s of signed documents agreeing to this. - - Do you want to contribute source to Squeak?All new contributions since 4.0 must be under the MIT license. When you make your code available, please state explicitly in some form such as the description on a web site or email announcement that your contribution is under the MIT license. (It doesn''t have to be exclusive; you can release it under difference licenses at the same time.) - - Have you contributed source to Squeak? If you believe you have, but have not sent in an agreement to allow your submission(s) to be licensed under the MIT license then please see http://netjam.org/squeak/contributors. There you can find a list of known contributors and a PDF of the agreement with instructions. The snail mail address is found in the agreement PDF file. - - Also there are a few people for which we are lacking full contact information. If you think you can help please also visit the link above and see if you can identify any of the unknown developer initials or any of the developers for whom we do not have a current email address.' ! Item was removed: - ----- Method: SqueakLicenseHelp class>>officialLicense (in category 'pages') ----- - officialLicense - ^HelpTopic - title: 'Official License - 4.0' - contents: 'Copyright (c) The individual, corporate, and institutional contributors who have collectively contributed elements to this software ("The Squeak Community"), 1996-2011 All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - Portions of Squeak are covered by the following license - - - Copyright (c) Xerox Corp. 1981, 1982 All rights reserved. - Copyright (c) Apple Computer, Inc. 1985-1996 All rights reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.'! Item was removed: - ----- Method: SqueakLicenseHelp class>>pages (in category 'accessing') ----- - pages - ^#(licenseChange officialLicense)! Item was removed: - SqueakHelp subclass: #SqueakProjectHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakProjectHelp class>>bookName (in category 'accessing') ----- - bookName - ^'The Project'! Item was removed: - ----- Method: SqueakProjectHelp class>>extendingTheSystem (in category 'pages') ----- - extendingTheSystem - ^HelpTopic - title: 'Extending The System' - icon: (HelpIcons iconNamed: #squeakIcon) - contents: - 'SqueakMap is an integrated catalog of external applications for Squeak. It is accessible from the "Apps" menu. This catalog does not host the projects, it merely documents the load scripts required to correctly bring them into the image. - - Many SqueakMap packages use Installer, which defines several packages in its package-definitions protocol. Any of these can be loaded with an expression like the following: - - Installer new merge: #openGL - - Change #openGL to the selector name of the package you want to load. The latest version of that package and all of its prerequisites will be merged into the image. Merging a package is no different from loading it unless the package is already loaded, in which case it is upgraded to the latest version in a way that preserves any local changes you may already have made. - - --------------- - This remainder of this workspace documents load-scripts for packages that are not documented in either SqueakMap or Installer. - - OCompletion - "Provides source code completion as you type" - (Installer ss project: ''OCompletion'') install: ''Ocompletion''. - (Smalltalk at: #ECToolSet) register. - (Smalltalk at: #ToolSet) default: (Smalltalk at: #ECToolSet). - - Omnibrowser - "Including Refactoring engine" - (Installer ss project: ''MetacelloRepository'') install: ''ConfigurationOfOmniBrowser''. - ((Smalltalk at: #ConfigurationOfOmniBrowser) project perform: #lastVersion) load: #( Dev ). - - Pier CMS - "Pier CMS: http://www.piercms.com" - (Installer ss project: ''MetacelloRepository'') install: ''ConfigurationOfPier2''. - (Smalltalk at: #ConfigurationOfPier2) load. - - (Installer lukas project: ''pier2'') install: ''Pier-Blog''. - (Installer lukas project: ''pier2'') install: ''Pier-Book''. - (Installer lukas project: ''pier2addons'') install: ''Pier-Setup''. - (Smalltalk at: #PRDistribution) new register. - - Open Cobalt - "http://opencobalt.org (Best to run this from an image in an open cobalt directory)" - Installer ss project: ''TweakCore''; install: ''update''. - [Installer ss project: ''TweakExtras''; install: ''update''] - on: (Smalltalk at: #CUnsynchronizedModification) do: [:ex | ex resume]. - Installer cobalt project: ''Tweak''; - answer: ''Would you like to conserve memory at all costs?'' with: true; - answer: ''Password for interactive VNC connections?'' with: ''cobalt''; - answer: ''Would you like to add the RFBServer to the World open menu?'' with: true; - install: ''update'' - !! - ]style[(9 309 19 252 6 126 8 237 11 209 11 210 8 386 11 547)dSMLoaderPlus open;;,,d| newBrowser | - newBrowser := Browser new selectSystemCategory: ''Installer-Core''; selectClass: Installer; metaClassIndicated: false; selectMessageCategoryNamed: ''package-definitions''; selectMessageNamed: #openGL. - Browser openBrowserView: (newBrowser openMessageCatEditString: nil) label: ''External Package Definitions'';;,,i,,u,,bu,,bu,,bu,,bu,!!' readStream nextChunkText! Item was removed: - ----- Method: SqueakProjectHelp class>>pages (in category 'accessing') ----- - pages - ^#(releaseNotes extendingTheSystem squeakResourcesOnline squeakUserInterface workingWithSqueak)! Item was removed: - ----- Method: SqueakProjectHelp class>>releaseNotes (in category 'pages') ----- - releaseNotes - "This method was automatically generated. Edit it using:" - "a HelpBrowser edit: #releaseNotes" - ^HelpTopic - title: 'Release Notes' - contents: TheWorldMainDockingBar new releaseNotes "<--- ugh, we will fix this later, for now may we not have TWO copies of the 8K release notes string in memory?"! Item was removed: - ----- Method: SqueakProjectHelp class>>squeakResourcesOnline (in category 'pages') ----- - squeakResourcesOnline - ^HelpTopic - title: 'Squeak Resources Online' - icon: (HelpIcons iconNamed: #squeakIcon) - contents: - 'Squeak web sites - Main Squeak site http://www.squeak.org - Weekly Squeak http://news.squeak.org - Oversight Board http://board.squeak.org - Downloads for many versions http://ftp.squeak.org - Development of the virtual machine http://squeakvm.org - Google+ Page - https://plus.google.com/u/0/b/115950529692424242526/ - - Squeak-dev - The main Squeak mailing list - http://lists.squeakfoundation.org/mailman/listinfo/squeak-dev - http://dir.gmane.org/gmane.comp.lang.smalltalk.squeak.general - http://n4.nabble.com/Squeak-Dev-f45488.html - - Squeak-Beginners - The place to ask even the most basic questions - http://lists.squeakfoundation.org/mailman/listinfo/beginners - http://dir.gmane.org/gmane.comp.lang.smalltalk.squeak.beginners - http://n4.nabble.com/Squeak-Beginners-f107673.html - - Squeak By Example - http://www.squeakbyexample.org/ - - Squeak, Open Personal Computing and Multimedia - http://coweb.cc.gatech.edu/squeakbook/ - http://stephane.ducasse.free.fr/FreeBooks/CollectiveNBlueBook/ - - Squeak, Open Personal Computing for Multimedia - http://www.cc.gatech.edu/~mark.guzdial/drafts/ - http://stephane.ducasse.free.fr/FreeBooks/GuzdialBookDrafts/ - - More Books about Squeak and Smalltalk - http://stephane.ducasse.free.fr/FreeBooks.html - !! - ]style[(16 316 41 173 65 181 17 35 46 106 46 112 37 49)bu,,bu,,bu,,bu,,bu,,bu,,bu,!!' readStream nextChunkText - ! Item was removed: - ----- Method: SqueakProjectHelp class>>squeakUserInterface (in category 'pages') ----- - squeakUserInterface - ^HelpTopic - title: 'Squeak User Interface' - icon: (HelpIcons iconNamed: #squeakIcon) - contents: - 'The Squeak UI has some unusual elements that you may not have seen before. Here is a brief introduction to those elements: - - Projects - A project is an entire Squeak desktop full of windows. Projects are can be used to change quickly from one task to another. An inactive project is represented by a project window that shows a thumbnail of that project''s windows. Project windows are actually more like doors than windows, since you can enter the project just by clicking on its project window. You can create a new project by choosing ''open...project'' from the screen menu. To exit a project (and return to its parent project), choose ''previous project'' from the screen menu. Each project maintains its set of windows, plus its own set of Smalltalk changes and its own screen color depth. - - Morphic Halos - In a morphic project, cmd-click (alt-click) on a window or other graphical object will bring up a constellation of colored circles called "halo handles" around that object. Additional clicks will cycle through the halos for other graphical objects in the nesting structure. If you hold down the Shift key while cmd-clicking, the nested morphs will be traversed from innermost outward. Clicking without the cmd (alt) key will dismiss the halo. While the halo is up, letting the cursor linger over one of the halo handles for a few seconds will cause a balloon to pop up with the name of that handle. Three useful handles are the top-left "X" handle (delete), the bottom-right yellow handle (resize), and the brown handle (slide the object within its containing object). Halos allow complex graphical objects to be explored--or even disassembled (using the black halo handle). Usually no harm results from taking apart an object; you can just discard the pieces and create a new one. - - Flaps - To enable Flaps, click on the desktop to show the world menu, choose the "Flaps..." menu and "show shared tags". Tabs labeled "Squeak", "Tools", "Supplies", etc., will appear along the edges of the Squeak desktop. Click on any tab to open the corresponding flap. Drag a tab to resize the flap and to relocate the tab. Bring up the halo on any tab and click on its menu handle to be presented with many options relating to the flap. Use the "Flaps..." menu, reached via the desktop menu, to control which flaps are visible and for other flap-related options and assistance. - - Parts Bins - You can obtain new objects in many ways. The "Objects Catalog" (choose "objects'' from the world menu or open the objects flap) and several of the standard flaps (e.g. "Tools" and "Supplies") serve as "Parts Bins" the for new objects. Drag any icon you see in a Parts Bin and a fresh copy of the kind of object it represents will appear "in your hand"; click to deposit the new object anywhere you wish. You can also add your own objects to any of the flaps -- just drag your object over the tab, wait for the flap to pop open, then drop the object at the desired position in the flap. - !! - ]style[(123 9 663 13 991 5 579 10 589),bu,,bu,,bu,,bu,!!' readStream nextChunkText! Item was removed: - ----- Method: SqueakProjectHelp class>>workingWithSqueak (in category 'pages') ----- - workingWithSqueak - ^HelpTopic - title: 'Working with Squeak' - icon: (HelpIcons iconNamed: #squeakIcon) - contents: - 'Starting and Quitting - Like most Smalltalks, the machine-executable portion is a relatively small program known as the "virtual machine" (VM). The VM''s job is to provide services from the physical machine to real Smalltalk objects. Services like input and output. The Smalltalk system, including all data and code, is a system of objects, built from the ground up, and interpreted by this virtual computer. This affords Smalltalk system platform portability. - - Smalltalk cannot run without the VM. The VM can''t do anything useful except process Smalltalk systems. - - To start the system, drag the ".image" data file to the VM executable "squeak". There are myriad command-line options for starting the system via the command-line (see squeak --help). By default, the system will open on the screen in a single OS window. - - To quit a Squeak session, choose ''quit'' from the menu bar. If you save, the image file will be overwritten and resume from that place the next time it''s launched. - - The Image File - Squeak is an environment built in its own objects from the ground up, including one or more end-user applications. All of the objects in the system -- Classes, Dictionaries, Windows, Customers and other objects that make up the Squeak environment are stored in a binary ".image" file. This is the "object-data file" loaded by the VM when Squeak is launched. - - When an image is started, every object resumes exactly from where it was last saved. - - The Sources File - Smalltalk is traditionally includes the source code in the running system. However, keeping multiple copies of the same source code in all images files is wasteful. Therefore, the source code itself is kept in a read-only .sources file and accessed by all images. The image files merely have pointers into this file, which is read on-the-fly to present original source code. - - The code of the base system is stored in the file "SqueakV41.sources". This file does not change except between releases of Squeak. Normally this file should be placed in the folder containing the VM executable. - - The Changes File - The purpose of Squeak is to develop new programs and systems. Code changes to the running system are effective immediately. But since multiple images can be running, they cannot all update the .sources file safely. Therefore, each image file is accompanied by a ".changes" file which contains source code changes for that and only that Smalltalk system.. - - The changes file is important for project work. It keeps a sequential log of development activity for the purpose of recovering work performed since the last image-save. Any of several events could lead to the need to recover work, including a power-outage or making an erroneous change to code required to keep the system running. - - The changes file does not consume memory space, so Squeak is able to keep a complete history of all program changes. This makes it easy to examine or even reinstate older versions of methods (see ''versions'' option in browser selector pane). This encourages experimentation, since you can easily revert to the original versions of any set of methods. - - In extreme cases where sources and/or changes files are not available, the system can still run, and will automatically decompile the bytecode methods in image memory, if necessary, into readable and editable versions of the original source code (only comments and temporary variable names are lost). - - Transferring Code-Snippets Between Images - In addition to the ''save'' command that saves the entire state of the system, the code of individual methods, categories or classes may be ''filed out'' and then filed-in to another image. - - Packages - The code of an entire project is encapsulated by a Package. This allows users to share their code with other users. Code of packages are delineated by the categories of their classes, and methods. The Monticello browser is then used to wrap that code into a Package object which can be saved to a Monticello repository at http://ss3.gemtalksystems.com/ss. - - Some projects end up using the resources provided by several packages, resulting in a hierarchy of packages that make up a system. Installer can be used to install such systems.!! - ]style[(21 970 14 448 16 396 11 188 16 321 4 1025 41 188 8 52 10 55 2 420)bu,,bu,,bu,,u,,bu,,u,,bu,,bu,,i,,i,!!' readStream nextChunkText! Item was removed: - SqueakToolsHelp subclass: #SqueakToolsDebuggerHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakToolsDebuggerHelp class>>bookName (in category 'accessing') ----- - bookName - ^'Debugger'! Item was removed: - ----- Method: SqueakToolsDebuggerHelp class>>openingTheDebugger (in category 'pages') ----- - openingTheDebugger - ^HelpTopic - title: 'Open a Debugger.' - contents: 'A debugger window is opened in response to an unhandled exception condition. Evaluating the expression ''self halt'' in a workspace or as an expression in a method will cause a debugger window to be opened. The debugger provides direct interactive access to the interrupted process. - - The debugger permits its interrupted process to be inspected and modified. Source code and variables may be modified interactively, and the process can be stepped through its execution in various ways.'! Item was removed: - ----- Method: SqueakToolsDebuggerHelp class>>pages (in category 'accessing') ----- - pages - ^# (whatIsADebugger openingTheDebugger usingTheDebugger)! Item was removed: - ----- Method: SqueakToolsDebuggerHelp class>>showForm: (in category 'pages') ----- - showForm: aSymbol - | form contents | - form := ScriptingSystem formAtKey: aSymbol. - contents := (String with: Character cr) asText, - (Text string: ' ' - attribute: (TextFontReference toFont: - (FormSetFont new - fromFormArray: (Array with: form) - asciiStart: Character space asInteger - ascent: form height))), - (String with: Character cr) asText. - ^contents! Item was removed: - ----- Method: SqueakToolsDebuggerHelp class>>usingTheDebugger (in category 'pages') ----- - usingTheDebugger - ^HelpTopic - title: 'Debugging Loops.' - contents: 'There are a few ways to get out of a loop. The best way is to just let the loop run. - - To do that select the space on your code (while in the Debugger) you want to jump to, right click and select: ''run to here.'' - - ' asText, - (self showForm: #Debugger1), - ' - - That will take you to the place you clicked on in your code. - - There is another trick, loops usually have an index. This is Smalltalk after all. In the case above we just selected this code and selected ''Debug it'' - - 1 to: 100 do: [:i | Transcript show: i asString]. - Transcript show: ''done'' - - While in the outer content evaluating the loop, select i change the value to 100 hit accept and ''bobs your uncle'' the loop is done. - - Ok so a bit of a hack but this can be used it to skip over some processing, and since you are debugging and know what you are doing it should be fine. - - ' asText, - (self showForm: #Debugger2), - ' - Proceed is just continue and stop debugging. - - Restart will stop debugging at the selected method and restart that method from the beginning. - - Into goes into the execution of the next method and shows you what it does. - - Over executes the next message and moves over it to the next message. - - Through steps you through a block of code, so if you are about to execute a block, this steps you through that block - - Full Stack increases the number of levels you see in the upper panel. That normally shows you a subset of the execution stack. Full stack will show you the rest of the stack that called this method. - - Where is useful if you click around a method during debugging. It will highlight the code at its execution point. You can also just select the stack method again to do the same thing. - - Tally is supposed to tally selected code, but may not be reliable within the debugger. If you want to tally something do it outside a debugger.' asText! Item was removed: - ----- Method: SqueakToolsDebuggerHelp class>>whatIsADebugger (in category 'pages') ----- - whatIsADebugger - ^HelpTopic - title: 'What is a Debugger.' - contents: 'A debugger represents the machine state at the time of an interrupted process. It also represent a query path into the state of the process. - - The debugger is typically viewed through a window that views the stack of suspended contexts, the code for, and execution point in, the currently selected message, and inspectors on both the receiver of the currently selected message, and the variables in the current context.'! Item was removed: - SqueakHelp subclass: #SqueakToolsHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakToolsHelp class>>basicDevelopmentTools (in category 'pages') ----- - basicDevelopmentTools - ^HelpTopic - title: 'Basic Development Tools' - contents: 'Smalltalk environments have some of the best user interfaces for programmers ever devised. Those who have programmed in Lisp under Emacs have some idea, but Smalltalk is even better. - - You should learn these basic tools thoroughly: - - Workspace - - Transcript - - Browser - - Inspector - - File List - - Change Sorter - - Debugger - - Method Finder - '! Item was removed: - ----- Method: SqueakToolsHelp class>>bookName (in category 'accessing') ----- - bookName - ^'Tools'! Item was removed: - ----- Method: SqueakToolsHelp class>>pages (in category 'accessing') ----- - pages - ^#(basicDevelopmentTools)! Item was removed: - SqueakToolsHelp subclass: #SqueakToolsTranscriptHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakToolsTranscriptHelp class>>bookName (in category 'accessing') ----- - bookName - ^'Transcript'! Item was removed: - ----- Method: SqueakToolsTranscriptHelp class>>pages (in category 'accessing') ----- - pages - ^# (transcript)! Item was removed: - ----- Method: SqueakToolsTranscriptHelp class>>transcript (in category 'pages') ----- - transcript - ^HelpTopic - title: 'The Transcript window' - contents: 'The Transcript window is often used for logging or printing results from text only code. - To open the Transcript use TheWorldMenu and choose ''open...''. Then choose ''Transcript''. - You can also type - - Transcript open - - in a Workspace and doIt. - '! Item was removed: - SqueakToolsHelp subclass: #SqueakToolsWorkspaceHelp - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakToolsWorkspaceHelp class>>bookName (in category 'accessing') ----- - bookName - ^'Workspace'! Item was removed: - ----- Method: SqueakToolsWorkspaceHelp class>>openWorkspace (in category 'pages') ----- - openWorkspace - ^HelpTopic - title: 'Open a Workspace' - contents: 'You can open a Workspace window in any of the following ways: - - - Keyboard Shortcut: while pointing at an empty part of the Squeak window, press alt-k (in Windows) or cmd-k (on a Mac) - - World Menu: select "Workspace" - - Tools Flap: click on the Tools Flap. When it comes out, drag the Workspace icon out. - - Doit: select inside the following quote and doit: "Workspace open"'! Item was removed: - ----- Method: SqueakToolsWorkspaceHelp class>>pages (in category 'accessing') ----- - pages - ^#(workspace openWorkspace saveWorkspace)! Item was removed: - ----- Method: SqueakToolsWorkspaceHelp class>>saveWorkspace (in category 'pages') ----- - saveWorkspace - ^HelpTopic - title: 'Saving Workspace to a File' - contents: 'You can save the text content of a Workspace to a file by choosing the workspace menu (from within the workspace), then ''more...'', then ''save contents to file...''.'! Item was removed: - ----- Method: SqueakToolsWorkspaceHelp class>>workspace (in category 'pages') ----- - workspace - ^HelpTopic - title: 'What is a Workspace' - contents: 'A Workspace is a window used as a scratchpad area where fragments of Smalltalk code can be entered, stored, edited, and evaluated.'! Item was removed: - SqueakHelp subclass: #SqueakTutorials - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakTutorials class>>bookName (in category 'accessing') ----- - bookName - ^'Tutorials'! Item was removed: - ----- Method: SqueakTutorials class>>introduction (in category 'pages') ----- - introduction - "This method was automatically generated. Edit it using:" - "SqueakTutorials edit: #introduction" - ^HelpTopic - title: 'Introduction' - contents: - 'Here you will some short tutorials on how to use Squeak for daily tasks. Feel free to add your own.!!' readStream nextChunkText! Item was removed: - ----- Method: SqueakTutorials class>>pages (in category 'accessing') ----- - pages - ^#(introduction)! Item was removed: - SqueakTutorials subclass: #SqueakTutorialsCommandKey - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakTutorialsCommandKey class>>bookName (in category 'as yet unclassified') ----- - bookName - ^'Command Key Mappings'! Item was removed: - ----- Method: SqueakTutorialsCommandKey class>>commandKeyMappings (in category 'as yet unclassified') ----- - commandKeyMappings - "This method was automatically generated. Edit it using:" - "SqueakTutorialsCommandKey edit: #commandKeyMappings" - ^HelpTopic - title: 'Command Key Mappings' - contents: - 'Lower-case command keys - (use with Cmd key on Mac and Alt key on other platforms) - a Select all - b Browse it (selection is a class name or cursor is over a class-list or message-list) - c Copy selection - d Do it (selection is a valid expression) - e Exchange selection with prior selection - f Find - g Find again - h Set selection as search string for find again - i Inspect it (selection is a valid expression, or selection is over an inspect-ilst) - j Again once (do the last text-related operation again) - k Set font - l Cancel - m Implementors of it (selection is a message selector or cursor is over a class-list or message-list) - n Senders of it (selection is a message selector or cursor is over a class-list or message-list) - o Spawn current method - p Print it (selection is a valid expression) - q Query symbol (toggle all possible completion for a given prefix) - r Recognizer - s Save (i.e. accept) - t Finds a Transcript (when cursor is over the desktop) - u Toggle alignment - v Paste - w Delete preceding word (over text); Close-window (over morphic desktop) - x Cut selection - y Swap characters - z Undo - - Note: for Do it, Senders of it, etc., a null selection will be expanded to a word or to the current line in an attempt to do what you want. Also note that Senders/Implementors of it will find the outermost keyword selector in a large selection, as when you have selected a bracketed expression or an entire line. Finally note that the same cmd-m and cmd-n (and cmd-v for versions) work in the message pane of most browsers. - - Upper-case command keys - (use with Shift-Cmd, or Ctrl on Mac - or Shift-Alt on other platforms; sometimes Ctrl works too) - A Advance argument - B Browse it in this same browser (in System browsers only) - C Compare the selected text to the clipboard contents - D Duplicate - E Method strings containing it - F Insert ''ifFalse:'' - G fileIn from it (a file name) - H cursor TopHome: - I Inspect via Object Explorer - J Again many (apply the previous text command repeatedly until the end of the text) - K Set style - L Outdent (move selection one tab-stop left) - M Select current type-in - N References to it (selection is a class name, or cursor is over a class-list or message-list) - O Open single-message browser (in message lists) - P Make project link - R Indent (move selection one tab-stap right) - S Search - T Insert ''ifTrue:'' - U Convert linefeeds to carriage returns in selection - V Paste author''s initials - W Selectors containing it (in text); show-world-menu (when issued with cursor over desktop) - X Force selection to lowercase - Y Force selection to uppercase - Z Capitalize all words in selection - - Other special keys - Backspace Backward delete character - Del Forward delete character - Shift-Bksp Backward delete word - Shift-Del Forward delete word - Esc Pop up the Desktop Menu - \ Send top window to back - - Cursor keys - left, right, - up, down Move cursor left, right, up or down - Ctrl-left Move cursor left one word - Ctrl-right Move cursor right one word - Home Move cursor to begin of line or begin of text - End Move cursor to end of line or end of text - PgUp, Ctrl-up Move cursor up one page - PgDown, Ctrl-Dn Move cursor down one page - - Note all these keys can be used together with Shift to define or enlarge the selection. You cannot however shrink that selection again, as in some other systems. - - Other Cmd-key combinations (not available on all platforms) - Return Insert return followed by as many tabs as the previous line - (with a further adjustment for additional brackets in that line) - Space Select the current word as with double clicking - - Enclose the selection in a kind of bracket. Each is a toggle. - (not available on all platforms) - Ctrl-( Enclose within ( and ), or remove enclosing ( and ) - Ctrl-[ Enclose within [ and ], or remove enclosing [ and ] - Crtl-{ Enclose within { and }, or remove enclosing { and } - Ctrl-< Enclose within < and >, or remove enclosing < and > - Ctrl-'' Enclose within '' and '', or remove enclosing '' and '' - Ctrl-" Enclose within " and ", or remove enclosing " and " - Note also that you can double-click just inside any of the above delimiters, - or at the beginning or end of a line, to select the text enclosed. - - Text Emphasis - (not available on all platforms) - Cmd-1 type the first method argument - Cmd-2 type the second method argument - Cmd-3 type the third method argument - Cmd-4 type the fourth method argument - Cmd-5 for future use - Cmd-6 color, action-on-click, link to class comment, link to method, url - Brings up a menu. To remove these properties, select - more than the active part and then use command-0. - Cmd-7 bold - Cmd-8 italic - Cmd-9 narrow (same as negative kern) - Cmd-0 plain text (resets all emphasis) - Cmd-- underlined (toggles it) - Cmd-= struck out (toggles it) - - Shift-Cmd-- (aka :=) negative kern (letters 1 pixel closer) - Shift-Cmd-+ positive kern (letters 1 pixel larger spread) - - Docking Bar - Ctrl- opens the n-th (where n is between 0 and 7) menu if such exists, otherwise it moves the keyboard focus to the Search Bar. Currently this means: - Ctrl-0 Activates Search Bar - Ctrl-1 Squeak menu - Ctrl-2 Projects menu - Ctrl-3 Tools menu - Ctrl-4 Apps menu - Ctrl-5 Extras menu - Ctrl-6 Windows menu - Ctrl-7 Help menu - !!' readStream nextChunkText! Item was removed: - ----- Method: SqueakTutorialsCommandKey class>>pages (in category 'as yet unclassified') ----- - pages - ^# (commandKeyMappings)! Item was removed: - SqueakTutorials subclass: #SqueakTutorialsOnImage - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakTutorialsOnImage class>>bookName (in category 'as yet unclassified') ----- - bookName - ^'The Squeak Image'! Item was removed: - ----- Method: SqueakTutorialsOnImage class>>pages (in category 'as yet unclassified') ----- - pages - ^# (theImage)! Item was removed: - ----- Method: SqueakTutorialsOnImage class>>theImage (in category 'as yet unclassified') ----- - theImage - ^HelpTopic - title: 'Working with the Squeak Image' - contents: 'Working with the ecosystem of objects in a Smalltalk image. - - The basic tool for this is called an Inspector. Whenever you have an expression, like "3 + 4", you press cmd-i to "inspect it", which opens an inspector on the result. This works in any text area. Try for example inspecting "self" in a class browser, and you will inspect the underlying class object (which the browser shows a high-level view of). - - In the Inspector you see the objects referenced by this object (via instance variables or indexed fields) in the left panel. Select any of them and choose "inspect" from the context menu (or press cmd-i again). This way you can inspect all the objects in the system. - - A more modern tool than the Inspector (which was around 40 years ago already) is the Object Explorer. It presents you a tree view of an object and its "children", which again are the instance variables and indexed fields of the object. Open it with cmd-shift-i (or "explore" in the context menu). - - You can also do the reverse. If you choose "objects pointing to this value" you get an inspector showing all the objects that directly point to this object. Similarly there is a "reverse explorer", which you can open by selecting "explore pointers". - - There are two roots to all the objects in the system: - - Smalltalk specialObjectsArray - - which basically holds everything the Virtual Machine needs to know about, and in turn almost every object in the whole image, and - - thisContext - - which is the current execution context, holding onto temporary objects. When a garbage collection is performed, any object not reachable form either of these two roots is removed from memory. - - An "interesting" global object to explore is - - Project current - - which holds your current workspace, in particular - - Project current world - - , the root of all morphs in the world. And of course - - Smalltalk - - itself is the dictionary that holds all global objects, including all classes (unless they are defined in a non-global environment). - - There is also a low-level way to enumerate all objects in memory. "self someObject" will return the very first object in memory (which happens to be the nil object), and "anObject nextObject" will return the next one: - - | object count | - count := 0. - object := self someObject. - [0 == object] - whileFalse: [count := count + 1. - object := object nextObject]. - count - - Interestingly, this also finds objects that are due to be garbage-collected. For example, if you accidentally closed a text window, there is a good chance its contents will still be in memory, and can be retrieved using an expression like - - ByteString allInstances last: 10 - - This makes use of the someInstance/nextInstance methods, which are similar to someObject/nextObject, but restricted to instances of one class only. - '! Item was removed: - SqueakTutorials subclass: #SqueakTutorialsOnXML - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'Help-Squeak-Project'! Item was removed: - ----- Method: SqueakTutorialsOnXML class>>bookName (in category 'accessing') ----- - bookName - ^'XML'! Item was removed: - ----- Method: SqueakTutorialsOnXML class>>dataRetrieval (in category 'pages') ----- - dataRetrieval - ^HelpTopic - title: 'Retrieving XML data' - contents: - 'Retrieving data from XML documents is simple and easy in Squeak Smalltalk. This tutorial demonstrates the fundamentals with a straightforward approach where code can be tested right away either here or in a Workspace window. The beauty of Squeak Smalltalk resides in the possibility to evaluate, inspect, print and debug code anywhere and this window is no different. - - This tutorial demonstrates how to... - - * retrieve an XML document from the World Wide Web - * instantiate an XML document class - * inspect and understand the content of an XML document - * retrieve and display values from specific XML tags - - Retrieve an XML document from the World Wide Web - - There are many manners to retrieve data from the World Wide Web in Squeak Smalltalk. HTTPClient is among them and allows to download files in all simplicity. Select the following code snippet and inspect it (press alt-i). An Inspect window will open with the document loaded in memory. The result is a MIMEDocument object. - - HTTPClient httpGetDocument: ''http://source.squeak.org/trunk/feed.rss''. - - TIP: Select HTTPClient and browse it (press alt-b) to open a System Browser window on its class. HTTPClient does not have instance methods but it has class methods. Click on class to see class methods. - - Instantiate an XML Document - - An instance of MIMEDocument will not allow to retrieve XML data in a comprehensive manner because it does not understand the nature of XML. For this reason, it is necessary to parse the content of MIMEDocument using XMLDOMParser. XMLDOMParser>>parseDocumentFrom: requires a stream as a parameter and ReadStream will be used for this purpose. The following code snippet instantiates an XMLDocument using the content of the downloaded file. - - | doc | - doc := HTTPClient httpGetDocument: ''http://source.squeak.org/trunk/feed.rss''. - XMLDOMParser parseDocumentFrom: (ReadStream on: (doc content)). - - Inspect and understand the content of an XML document - - XML is a flexible document format and it is necessary to understand how each given XML file is structured in order to properly search, retrieve and manipulate data. Inspecting values is critical in a dynamic programming language and environment, such as Squeak Smalltalk. Select the previous code snippet and inspect it (press alt-i). - - Unfortunately, the Inspect window does not reveal a lot about the XML structure of the downloaded file. Select the previous code snippet once again and explore it (press alt and the capital letter i). An Explorer window will open with a tree outline on the instance of XMLDocument. - - The Inspect and Explorer windows tell a lot about an XMLDocument. The sections are instance variables and their values are displayed aside. In the Explorer window, unfold elementsAndContents. Unfold other sections as deemed necessary to understand the XML format and the data available. - - The gibberish coding is about to become clear. Open a Browser window from the world menu and right click in the first pane, select find class (press alt-f) and type XMLDocument to search for its class, or select the class name and browse it (press alt-b). However, it is suggested to read more about XMLParser and XMLParserTest first. - - Retrieve and display values from specific XML tags - - The downloaded XML file contains a list of items which are denoted by the tag name "item". The Explorer window revealed the content of interest is located at the array index 1 of the elementsAndContents, which can be accessed through XMLDocument>>root. - - TIP: Some XML documents have additional components contained within its file, such as XMLPI (XML Processing Instructions). For this reason, the root may lead to this rather than the data which will be indexed at 2 or more. It is necessary to use XMLNodeWithElements>>elements, e.g. (xml elements at: 2), in order to access subsequent data. - - The following code snippet will display items in a Transcript window. Open a Transcript window using the world menu before selecting and executing the code. Select the code snippet and execute it (press alt-d). - - | doc xml | - doc := HTTPClient httpGetDocument: ''http://source.squeak.org/trunk/feed.rss''. - xml := XMLDOMParser parseDocumentFrom: (ReadStream on: (doc content)). - xml root tagsNamed: #item do: [:e | - Transcript show: (e asString); cr. - ]. - - An XML item looks like this: - - - HelpSystem-Core-tbn.46.mcz - http://source.squeak.org/trunk.html - throw out pharo specific stuff since we are now integrated in squeak (and pharo too where squeak specific stuff was removed) - Sun, 02 May 2010 20:23:49 +0000 - Torsten Bergmann <Torsten.Bergmann@astares.de> - The Trunk - - - - The following code snippet uses information learned, retrieves each comment and displays them in a Transcript window. Notice an author can have a nil value and is handled accordingly. - - | doc xml | - doc := HTTPClient httpGetDocument: ''http://source.squeak.org/trunk/feed.rss''. - xml := XMLDOMParser parseDocumentFrom: (ReadStream on: (doc content)). - xml root tagsNamed: #item do: [:e | - Transcript - show: ''Date: '', ((e firstTagNamed: #pubDate) contentString); cr; - show: ''Title: '', ((e firstTagNamed: #title) contentString); cr; - show: ''Author: '', - (((e firstTagNamed: #author) notNil) - ifTrue: [(e firstTagNamed: #author) contentString] - ifFalse: ['''']); cr; - show: ''Description: '', ((e firstTagNamed: #description) contentString); cr; cr. - ]. - - An item will now look like: - - Date: Sun, 02 May 2010 20:23:49 +0000 - Title: HelpSystem-Core-tbn.46.mcz - Author: Torsten Bergmann - Description: throw out pharo specific stuff since we are now integrated in squeak (and pharo too where squeak specific stuff was removed) - '! Item was removed: - ----- Method: SqueakTutorialsOnXML class>>pages (in category 'accessing') ----- - pages - ^# (dataRetrieval)! Item was removed: - ----- Method: Utilities class>>openCommandKeyHelp (in category '*Help-Squeak-Project-support windows') ----- - openCommandKeyHelp - "Open a window giving command key help." - "Utilities openCommandKeyHelp" - - HelpBrowser openOn: SqueakTutorialsCommandKey! Item was removed: - (PackageInfo named: 'Help-Squeak-Project') postscript: '| aForm aSecondForm | (excessive size, no diff calculated) From Das.Linux at gmx.de Mon Jul 6 16:01:46 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Mon Jul 6 16:02:00 2015 Subject: [squeak-dev] re CM>>#hasBreakpoint In-Reply-To: References: <613E11CE-7CA4-448F-9A28-8ADFC43F9936@gmx.de> <47A6938C-9D64-49FB-822A-8CDC218DE912@gmail.com> Message-ID: On 06.07.2015, at 17:54, Eliot Miranda wrote: > Hi Tobias, > > On Jul 6, 2015, at 8:07 AM, Tobias Pape wrote: > >> Hi Eliot >> On 06.07.2015, at 15:40, Eliot Miranda wrote: >> >>> Hi Tobias, >>> >>> there /are/ configurations. Two if then :-(. >> >> Sorry, it was just a guess because of the stack trace. >> >> So, I investigated. >> >> update-eem.319.mcm: >> (CompiledMethod methodDict includesKay: #hasBreakpoint) "true" >> >> CompiledMethod>>#hasBreakpoint >> ^BreakpointManager methodHasBreakpoint: self >> >> update-eem.320.mcm: >> (CompiledMethod methodDict includesKey: #hasBreakpoint) "true" >> >> CompiledMethod>>#hasBreakpoint >> ^false >> >> update-eem.320.mcm: >> (CompiledMethod methodDict includesKey: #hasBreakpoint) "true" >> >> CompiledMethod>>#hasBreakpoint >> ^false >> >> Kernel-eem.934 >> >> (CompiledMethod methodDict includesKey: #hasBreakpoint) "false" >> >> >> Ahaa. >> System misses to use an actual override and monticello thought the method had gone >> when it was saved for Kernel-eem.934. >> Soo: >> Kernel-topa.935: Reinstall CompiledMethod>>#hasBreakpoint >> System-topa.753: Reinstall CompiledMethod>>#hasBreakpoint as an Override >> Jenkins seems to be happy: >> http://build.squeak.org/job/SqueakTrunk/1549/console >> http://build.squeak.org/job/SqueakTrunk/1549/ >> >> I hope this fits everyones :) >> >> Best regards >> -Tobias >> >> >> PS: Have you looked at WrappedBreakpoint? > > No. I'll try and take a look. What do you think the issue is? No issue, just an alternative way of doing breakpoints > >>> Eliot (phone) >>> >>> On Jul 6, 2015, at 3:03 AM, Tobias Pape wrote: >>> >>>> Hi, >>>> >>>> we might need a configuration for Eliot's recent #hasBreakpoint changes, >>>> the CI (and probably any update process) chokes on this: >>>> >>>> 2015-07-06T11:27:54.732+01:00: Installing Kernel-eem.934 >>>> vvvvvvvvvvvvvvvvvv MessageNotUnderstood: CompiledMethod>>hasBreakpoint vvvvvvvvvvvvvvvvvv >>>> The time is 2015-07-06T11:27:54.848+01:00 >>>> CompiledMethod(Object)>>doesNotUnderstand: #hasBreakpoint >>>> MCMcmUpdater class(ClassDescription)>>logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: >>>> MethodAddition>>writeSourceToLog >>>> MethodAddition>>createCompiledMethod >>>> [] in [] in [] in [] in [] in MCPackageLoader>>basicLoad >>>> [] in [] in OrderedCollection(Collection)>>do:displayingProgress:every: >>>> OrderedCollection>>do: >>>> [] in OrderedCollection(Collection)>>do:displayingProgress:every: >>>> [] in [] in MorphicUIManager>>displayProgress:at:from:to:during: >>>> BlockClosure>>on:do: >>>> [] in MorphicUIManager>>displayProgress:at:from:to:during: >>>> BlockClosure>>ensure: >>>> MorphicUIManager>>displayProgress:at:from:to:during: >>>> ProgressInitiationException>>defaultResumeValue >>>> ProgressInitiationException(Exception)>>resume >>>> [] in [] in UndefinedObject>>DoIt >>>> >>>> Best regards >>>> -Tobias From Das.Linux at gmx.de Mon Jul 6 16:02:03 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Mon Jul 6 16:02:07 2015 Subject: [squeak-dev] The Trunk: Compiler-topa.302.mcz In-Reply-To: <0B972D2C-A7E7-4642-BFA3-47D95FDE70DA@gmail.com> References: <559a9d7c.74668c0a.6aeb.6804SMTPIN_ADDED_MISSING@mx.google.com> <0B972D2C-A7E7-4642-BFA3-47D95FDE70DA@gmail.com> Message-ID: On 06.07.2015, at 17:55, Eliot Miranda wrote: > Hi Tobias, > > I'm curious. What tickles this bug? > The Prolog implementation on SqueakMap > Eliot (phone) > > On Jul 6, 2015, at 8:50 AM, commits@source.squeak.org wrote: > >> Tobias Pape uploaded a new version of Compiler to project The Trunk: >> http://source.squeak.org/trunk/Compiler-topa.302.mcz >> >> ==================== Summary ==================== >> >> Name: Compiler-topa.302 >> Author: topa >> Time: 6 July 2015, 5:23:17.205 pm >> UUID: 503dc5a6-5953-49d7-ba6b-5ca0d7de4e3c >> Ancestors: Compiler-eem.301 >> >> Don't be too strict if BlockNode scope setting is idempotent >> >> =============== Diff against Compiler-eem.301 =============== >> >> Item was changed: >> ----- Method: TempVariableNode>>definingScope: (in category 'code generation (closures)') ----- >> definingScope: scopeBlock "" >> + definingScope = scopeBlock ifTrue: [^ self]. "No need to bail" >> definingScope ifNotNil: >> [self error: 'temp has more than one defining scope. This is probably a parser error']. >> definingScope := scopeBlock! From commits at source.squeak.org Mon Jul 6 16:03:08 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 16:03:16 2015 Subject: [squeak-dev] Squeak 4.6: ReleaseBuilder-cmm.126.mcz Message-ID: Chris Muller uploaded a new version of ReleaseBuilder to project Squeak 4.6: http://source.squeak.org/squeak46/ReleaseBuilder-cmm.126.mcz ==================== Summary ==================== Name: ReleaseBuilder-cmm.126 Author: cmm Time: 6 July 2015, 10:03:15.4 am UUID: 45ba00a2-427c-49f0-8b84-176d23eaaad7 Ancestors: ReleaseBuilder-mt.125 Now that condenseSources is working, make it a regular part of the release process. =============== Diff against ReleaseBuilder-mt.125 =============== Item was added: + SystemOrganization addCategory: #ReleaseBuilder! Item was added: + Object subclass: #ReleaseBuilder + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'ReleaseBuilder'! + + !ReleaseBuilder commentStamp: 'fbs 5/2/2013 22:36' prior: 0! + I'm the script that prepares a trunk image for release. Which version of Squeak I release is stored in ReleaseBuilder class >> squeakVersion.! Item was added: + ----- Method: ReleaseBuilder class>>buildRepository (in category 'private') ----- + buildRepository + ^ MCRepository trunk! Item was added: + ----- Method: ReleaseBuilder class>>checkForDirtyPackages (in category 'scripts') ----- + checkForDirtyPackages + MCWorkingCopy checkModified: true. + (MCWorkingCopy allManagers anySatisfy: + [ : wc | (wc ancestors size = 1) not or: [ wc modified ] ]) ifTrue: [ Warning signal: 'There are dirty and/or unmerged packages.' ]! Item was added: + ----- Method: ReleaseBuilder class>>configureDesktop (in category 'private') ----- + configureDesktop + self deleteAllWindows. + MorphicProject initialize. + Project current resourceManager reset. "Zap eventual resources" + "Replace docking bar instance in case its code has changed." + Project current removeMainDockingBar. + TheWorldMainDockingBar updateInstances! Item was added: + ----- Method: ReleaseBuilder class>>deleteAllWindows (in category 'private') ----- + deleteAllWindows + (SystemWindow + windowsIn: ActiveWorld + satisfying: + [ : window | true ]) do: + [ : window | [ window makeClosable; delete ] + on: ProvideAnswerNotification + do: [ : noti | noti resume: true ] ]! Item was added: + ----- Method: ReleaseBuilder class>>loadWellKnownPackages (in category 'private') ----- + loadWellKnownPackages + "Load into the release image those packages that have been stripped from Trunk, but still deemed necessary for a release artifact." + Installer new merge: #squeakRelease! Item was added: + ----- Method: ReleaseBuilder class>>openWelcomeWorkspaces (in category 'private') ----- + openWelcomeWorkspaces + |offset | offset:= 50@50. + #('License Information' 'The Squeak User Interface' 'Working With Squeak' 'Release Notes') + with: #(#licenseInformation #squeakUserInterface #workingWithSqueak #releaseNotes) + do: [ : eachLabel : eachAccessor | + TheWorldMainDockingBar instance + showWelcomeText: eachAccessor + label: eachLabel + in: (offset extent: 500@300). + offset := offset + (30@30)]! Item was added: + ----- Method: ReleaseBuilder class>>prepareNewBuild (in category 'scripts') ----- + prepareNewBuild + self prepareNewBuild: self buildRepository.! Item was added: + ----- Method: ReleaseBuilder class>>prepareNewBuild: (in category 'scripts') ----- + prepareNewBuild: anMCRepository + "ReleaseBuilderTrunk prepareNewBuild" + "Prepare everything that should be done for a new image build" + MCMcmUpdater updateMissingPackages: true. + MCMcmUpdater enableUpdatesForAllPackages. + TTCFont registerAll. + RealEstateAgent standardSize: 600 @ 400. + SystemVersion newVersion: self versionString. + SMLoaderPlus setDefaultFilters: (OrderedCollection with: #filterSafelyAvailable). + " Preferences outOfTheBox." "<-- uncomment after #defaultValueTableForCurrentRelease is fixed up." + self + setDisplayExtent: 800 @ 600 ; + switchToNewRepository: anMCRepository ; + setPreferences ; "<-- remove this after defaultValueTableForCurrentRelease is fixed up." + checkForDirtyPackages ; + configureDesktop. + Smalltalk cleanUp: true. + "Let's be explicit about clearing passwords for the publicly-consumed build." + "clearPasswords is not very thorough, it should be improved." + MCHttpRepository clearCredentials. + Utilities setAuthorInitials: String empty. + Environment allInstancesDo: [ : env | env purgeUndeclared ]. + Undeclared removeUnreferencedKeys. + Smalltalk garbageCollect. + [ self loadWellKnownPackages "<-- 4.5 is not ready for unloaded / reloaded packages" ]. + Compiler recompileAll. + self + setProjectBackground: Color darkGray ; + openWelcomeWorkspaces! Item was added: + ----- Method: ReleaseBuilder class>>prepareNewRelease (in category 'scripts') ----- + prepareNewRelease + "This method is run at time of release to transfer the top trunk versions into my releaseRepository, and produce a release image." + self + transferCurrentPackagesAsUser: Utilities authorInitials + password: (UIManager default requestPassword: 'Enter password for ' , self projectUrl). + self prepareNewBuild: self releaseRepository. + Smalltalk condenseSources! Item was added: + ----- Method: ReleaseBuilder class>>prepareNextVersionAlpha (in category 'scripts') ----- + prepareNextVersionAlpha + "Prepare the first alpha image for next release." + SystemVersion + newVersion: ((UIManager default request: 'Please specify the name of the\new version of Squeak.' withCRs initialAnswer: SystemVersion current version) + ifEmpty: [^ self inform: 'Aborted.']). + MCFileBasedRepository flushAllCaches. + MCHttpRepository clearCredentials. + Utilities setAuthorInitials: String empty. + self switchToNewRepository: self buildRepository. + Smalltalk condenseSources! Item was added: + ----- Method: ReleaseBuilder class>>projectBackground45 (in category 'resources') ----- + projectBackground45 + + ^ Form fromBinaryStream: 'iVBORw0KGgoAAAANSUhEUgAAAGYAAABXCAYAAAD2+TBqAAAvWUlEQVR4Xl3d19ocRZKA4b7/ + k72BPRqz45YBZkAIhDzyXkLe/0hIyOIlJEFtvdn9NbVzUE+XzYwMnxGR2audB+emR998OT1/ + eWP66uH56fzFvdPFL/dP9786Oz1+cnl69uL69ODrC9PV61+M32s3jozj7Pk905Vrh6cjx/41 + 3b57cjp24qNxfHnl4HTy9CfTmXOfjXd8d+7C59OtOyemC5f2jXtPnl0d7965d2p6/ebhuK+N + l9/dGv0fP/nxdP3m0enS5QOj/2+eXhnf+cZ72nTuOZjv3j893n/6/Np0+uyn04lTu6a3vz6e + btw6Nt758ef7072dM+N6mp5P3/1wZ8D09eNLY5za/uXt1+Mc/N5x/fPrr6Zvv789DrB6H4xg + gAP9Xr4y4+XhpenZ85vTo8dXxvH8xa3p60eXpxs3T0wvv70znb+wfzp1+rNx/9btU9O168em + na8uTO9+fTpdvXZ8evrs1vTrby+m23fOTtdvnJzevH06rQz68tVDAyAEevXLgzEowAPUYCDC + gP06IAAhDRjQAP7hp3vjW4h076dXO+PXtcM3COvdm7ePD2Q49IuIkInQEIg4+oN07foFI4J/ + cfTD8T6EnzqzexAR0hDKN9rWpl/t+S5G8hwB3def7w998f7oz+G+dhHNe34PH/lgnGsPbPD1 + 8NHFwWj6PnFy94zcowPZFy8dnI6f+GTcu37j+HT33tnp4KEPpiNHP5rOnts7I/70eNczBL1w + 8cBM1MvT/Z2L052756Zz5w+MA4FWkIsgqK9jiHvx7c3RucH4JTkOQBnc/oP/OxCxM0ube5/v + +9tW6gzEABHVwCEFYg0OYd68ezQ4DuFIjv78OhAQIRw48/sf7w64tI2wYP1tejo42fvu6d/h + G+/rw7UxQCb4SWTn/Wofco3Z2Pz6Vpv6NDYwuo5BtesaPJ5hxFevv55e//JoKymPv7k6JIUU + 3bt/btz76sHFQSTX3zy5Ns4ffv3l9MOPO9PNWyfHt965c/fMkKj7O+enFWAgCiCQBCgcaOAG + CyjXAPOewUA27j1w6L2h9gDrGQ4yaN8cPPzPcc9z77tGKARyrj0ExP0kVP9Hj/97DFrfuNU7 + 7377ZisJpJg0aA9iIArnG4PvcT3m6D1wRSDnxqNNY/CNdl1ry3lE1iYVi3jgdy9V71v3++bF + y9vTk6fXhyRQZ5ANye5D+Okze8a9X948HhKCID/+9NVWxfnWd1Tb9z/cH4T88vLhaaVDg4Aw + qgdidWiQCIUAOAqXegY4nAnwCOI8AkOKdwGeunMvhOgLByMItZhK8qtPRPMLmdSW9xGJhILF + e6k+7aSeIJAkJwG+1Z8+PAe3AzOkumpnz96/bm0aiU+VOpI47xqfdzCQX31e+vLQdOXqkUEA + v9TZseO7hiQgwr797w0JgPxz5/eNe5BPoqg80oaoh7/417j/86uHg2ArnQLEAAwEgAaXqkAE + SAUYQDN8dLdrxh9HQS7k+Ta16L24MJVloFRA9kP7SRlVhsN96xqBIdm5A4zgdQ/htYEhEM89 + /ZJasCAiVex975GoDHhEqn33MA+4tAcGDgC44cQ7SZ9z8PoGYUgF9YXznSMCVcWe+HUfotmZ + iPfFkX+Pc8QhHYjLBrFTvnd/pQPIgSQIMfhEF2JxfLrYu4DCVQZN7eBsBPKO57gbVxqAd1wj + Yh6S9iEZM7iG4O7pC/IMGCIREmLZJTBqE8LAmienT7DmPaXiwEtF+oXQCBuBMCBGADemQ6gM + f9+7N03PRh+pRn3pWxvsHZvANnz3/b0hDQjx9t2TgVzP2CBqy7Pu8dgQ0TVJSb0hEmnT3grA + AIMMiAgBiILziC1AcBIipGcNMIPoGkK4mJADeO9DoOfuaTfDm53SfoQMKQ5c7/AOO+YZafQM + MiGJpOYkcD4wC0bRvl/IdA/sCGKM2kwFudY+pvLrPc/AhpFSc6Sw77WNONqhKjHGyVOfDvUF + +VQT1YXzSQUXmTTxwrzD9vDGSAWb4pqj4JpKo+5I2SBM6sBgdARAg25+srQvCAdAv75LLRho + Rpi9yZbgWEjPWFMXuNdAEQ8hEZikOJqTaGfMEWYE4VxtuNYOIkCK8wgJDrAmnZANeZgu+6ZN + DNL8rDHlbGgDLAgNtlzk1LbrHCPX8DQckZkI3353d9p/4J8D+aSBywzhDirKNQkhTRBPUqg6 + v5wbfWI4mgF8xrzSGQAyktmC9LxBxNWQBxhS4D4E4KBUzt79fx+cPYzizH3NGSBAewaE4BlX + 5/sO/GMMFsE/+fRP4x3tI1J6Pe8QnK4NArw5Ekk7+HLvfeM9/bI3kI443nUPIc1hfN8k0z3n + YE9t6RNTQZq2wap9v+Bn5HlbpIUEZPSn6eXWbpAYEuIgDe7lxemT5oAPMMIXLbHSgc4BD1BA + NbhsCATgUoNAOFzUNc5M1xtwkzCI0hEExY2Q7j5mgACSRcW57/AOhDdxRDT3SaM+89QQURvN + T/LM3POt++AAd3OpvDb3PNNmDKSvvDTIdu0cfDw2RCN1Dn0gGqIPJ2ImBgRzh83kzVVIAylC + JAd1Rl15F3GoOFKEOMZnDOFZ+9pdxRE8EhySl4IoXvAM8ZoHFBHAuQ7A7mzCOhp1jbDZnr4x + UIOJ6w3W+/olZc4Zds/i3AgAHjA4MvQITAVQScGkP3Ak0UUl3ANj3h04qNFgwxze8evbVGBT + CN/mAKXuaZHhyc7GnFcFyYhCPVFhPDH3HNSYZ0+f3RjzG+quOQu8ciJIJNwZP5ysiA6AAGLQ + BuIFSMBpGWWAp48BnHoKUYiIOyGzSEFc2aBIpf5SmzgTF2fsM876x0nNa0ICoqbj9QNBhYx8 + q32I85z0M/7ew1xNCYxVH+BoVu9bttG34MIgfl2zk95rAr6MNhg7tcUFZvx/+vnBVmIg35wE + AUiPe94jKVQc6eGB6fvsec7Xvhn+2SO7d3JcD4kBQCqiiVaz/aFHN2JmsIAzcA36RYzEEQES + S+cRN98fgryL01OVBlygFLJiCm04RxQwQIjvC5bGQNoFm3ZJV0FOY6EKEYR05kW5/9nnf/l/ + sTBjKAphXNpzUJFgKUaHyYobgkG7EMzG7N33v9Onn/11OACIcPTYx9Oez/8+JMrBFUYQaoxE + IVzOyrUb5pDwZjwXZmY5s57HQBLASE2eQXaCQS1+hkMyisTNd83sSY17TUghHOdRNdqjOryH + GBEn2+N58anUkL69bx5R7M59fVNB2tV3XhS4vI/zU1H6zGPTR6EbR+pW21vuX/Sx9OIKR/Us + b3TgbrYfJIUKY9hJCOmhvpyb37A9ucPmNe4hlv708eJbbdJAp2eh2D+ItGp2v5wJ8wpwLEQz + flSGI48p17TwB2TjpiaaGfBlhMAAER/nea4vA9YPAiIMVzibkEqkSnB9ahP3atN5HBfxU8vF + 41JBvEXvI3bf6pd0ZMNIlz6MmZQgrPe99+v0ZMBY3BBMGHgN+8th0BHDOeSToml6sSWAZ+41 + 30FA0gU+hLl6/fAsoQfmPm/POCHJe6YVpBVugYDEGCEgl7hCsAYysoUkICbVkdsdQRAwdYj7 + nCN+4Rnvl18pzFO+JvUDceDST6Ej50UU3EOovKtUTnG17E6SsPQUSxU0Z4oRSWHpBwQ0tuZT + BUqNyThdL3NAxlb4yrNUYzFGk/XwVf7JuAs1xVwYa1WcqnA3QAFX6MJ1EzEd5335JpEnJTou + 94KAfnUKCdkP1wUcM8DazkZRK+DwTuov9RND6DO1E7yeNe8xWAci9C1Gg5QiHODIPUbI5lik + jORAkva9i6BLt1tfpTIwa2pOP80Hs48OcGgHrM6L45UTyg7qrzFpY1WDzcghmWooxI9IgIPI + DHkRWggI6UVjC20UkfXMOWQXTXYOyNzjvCWE0AYkIaj+cXWBTW012cSJ5Wkg3T2z6OyUc4zl + uqBsMTDSlqueOobomNTYC+9E7IK68AFf2TLvglt/4CuSgSgFR7VvLNSfdzkx2qcS4UBbvtG3 + Z65XkJdXgpJN1gAP+QaXmkAYwLlXnAvHpU6aFWckAevXwCDBt3GGftkyRCNdANUmLkIY7UE+ + j6wJpsFRY/UdM3i3w7dlKyHHWPxqHxH0bazNi9IWzcvAAv5m4eCr7ybQxps3u4wjlp9yv4mq + PuCoEFfpdu2lthyuMyu+WwVsXofz8vsonlezdIUBXxaxuY3fIrjNSXRMPQBG54Vi0rG41DdJ + WSrS/f8MSHofrKmqJpTBWOq6eVLByCaFRR7AUS4o1apvB5XlfgQpgoAQmGM5+0eAvLOICKYm + w01K83oLDJcpTYoar/czDca9ys3UGNHENWUlHQYBoSWJTAgLzRRGB2xOAwDLEEYwHaZ2AKYd + 14ibKil/kl2hwspGNp8Amz48J4FJKXXgHilCNAMtDgaJeV5FxisOyaaVp6m/VBeVggmp2TxW + jFk6Qbuew4FzM3iqCCzOvQd2Y9KXMWlL28sohbaK9zm0sUqUSvuiKu6o8ALCigZDRiEKCNIR + MYUEDefbe7cij8InkA44wCa2f/jTf41JlYP/buZ75hw7NU/EznwyS9t7s/2gEj4a1w7n3vMO + F7NCEsiOifTF7mAiDBWsSW6RdO9ypd1DDAzjnZJuhV6aUpSqyLMqIJsnWPoidZVNLe7me3Cl + ZmmVXbv/OO7lAPlWu1vjny5OHLMFgKoipGQRoJ17D8dk5ByFxrVn0AZWcg3x3PdtDgYffucB + cT43CHT77omZqGzU9THpcl+Ywn0z4sdPvhwTspffsQfXtpPUose4z3iK50Fyqe+mAJBchBoM + nmEYxPF9EQvMBdkQZ44FwRWZxISl17PFudkRKfxqL0nxbXA1v4qRs32rQvsAK7RODKk1jacm + MugVahgEafK8erS4yjkA/Jba1SlEIE7zJO1B8vWbRwbyf3n7cIQkEOPdb4/HZIuEODcrJk1v + 3n09iHPk2IfjW3CWmwd3M3ZwVZMWgfKGmmeAl4NS1Dt161vtaQuMog9V0DjHwFXz+JZHBcnF + 8TBd7rtn+gUL+IqqUG/eyaMDI3wXeF1llPOEqtlqnlGQ0MCKwhbjQpi4q3RwvrzGC5sUujG4 + JpkFIh98fX5WnR+Pg2oSwPvi6AezhL0/I3z3IAaVRnUhINVGpYkvUWmlJJLo4lnNfSC5yZ7+ + SXWSDpkkPBVHuo276IYDMlMxpRbgqwKP3PFwoO8YUVtwUCqFu6wdcBGETIb3w2NJs6HK8rUr + oijf7h6xXQb1NOY3L4S6SocmDaVtdd5ELa5rotV8ouK6ZuIVFDZnylPM+8uVNZhCJqlTz9hB + 72fgc3W1yxaWaU09I2r9F21o3gVG3+z+7M/bejXfFScsolDoCT7AllPimyay2vNObncBVyEv + 91N9TXpXBfF8qEMckrtJBDOMvec8ianKpVl/yHQNMZDQ3KMCDAegCp0XSQjRTbR8XykUqUUs + Ym8w1YlVGtukN3tWGnqZzi58X5EFBgIbQ5u3tkx3hGRjBBPJ870+XOvDN2CKafQBh753Hy4L + loq3lbdaFoPkKMERwhif9lcmRYlzaeEOzwCe57PMMlYcgZsckFOYvioZnSIcBGVM3WtGj1tK + +xYWacKoLV7VMvdiMH4ZYwdpFsLHYc5zLgyw2F/FiY1B37moEI3IFf95VgTckaHWptBJFajF + w5rXaR88xg4GjoL+vOu8uZTxNgfLPiMklVqfZWpXEFdopTlN5bAoWllps+lKkZocVXUJMR2J + McAAjPAGhavo2Yo5tF1evgJzfRsEg1jyDsBlKzPkxeUMrtKl5jDGoZ9SFpXflidKJRmPtnsW + TMvIgLHmZVUKZWxFxqsYSlKrzatGGyxwUo0CRi/SAjef7vmf7eS1sXs2vDKAV5GJy5roFFUG + YPW+y5xIbrKBNonLhlT3W4wJp1fk7RxCcq8z1FU5Gpg2cZ9r/TaoJA4zFMYvZBPCIFD7TXhz + i1NL2Qv9L/MsfrWH85u9Y8i80qYQvimY6j1c3yoC7WIwDK8vKi1nooJHvwi8jHQnuanAVZk7 + DwHE2OXduPYB5ET9osS4C9DlaIoOFCavhqxQeLGoZr4QV66/6vxC9S3dWKpQfcY4lfS6V4wP + LGDGjb2DkMWyckryOhGvVHiwJyFLlet7k0DwxEDFyiJcklLlp3HmKGWrKiosFJQtS/1le3yv + WmglkaMoQD5aJYdqdOU11UF5Jq+tUM07Ej5VpjukSRUZuFeJZ0khSxAkhNRSuadoQamovLfc + uKRSIQzIcJ5z4WgegRMxRRlShM376nlqr8laKweWaezCRanHsVRkzseXfQS7Mbtn3FW/yDqW + DIMD5UhSw36byBZnq6IzaUVEhG+ul5qv6KU4Xhnj8lWrgZw5NQp5UqCAUOEBsDdvvxmdQ7h3 + KvWswkPFx29C9/MvAkG6ch3XUq4yet5FODlvTKDyXTmoe6NCceYW6jIHpLkOKSnehrMhFLIr + QEco0QTSXBSBBHof1+NW6qVoRjaPROYul7PHJFVKIo66YuNwDm54kI2sFEkJLMZd14892wZQ + 2bXsJJj0jwEQzjNIx1hJonFSd5XqIloxtJXOcAtgdKqQQJlnlYQKCtwHmGp1BHGuwgMREVSB + QbW4Ds9xlu8RwveVhiJa7/mmpRdUQ/EmIp7v34R1mctpYHFllThlAAu98Iiqma7itARfAUnM + ZkwKKkhL+XtjQDCEMW5jwKAOBHR/MPAm3a3f5i15aMEZc2A2Ul46goOT05D6LWqyIpKOuAVh + AAFgnbeopgU5nlN3iEm8K98hHaTH8yTm873/GAQxGGrMgN03IFUkJKyZOyQhUC5unlIeYp5j + dioDzFgWSvcNBHiXAa3UtbKmIskFbkkMdYsADhKMQTGa8RkXHOz65M8Dfs+reiHxCApGhC9t + DfYchBZrFT9kd8pgYkKEMiVpFYUD0RBzhUsgLO6HWEimbgBH3ypawzUIUXlni3KogKTO4AzA + e4iEaIiA4J5V5V7drr6r4WIPnBdRwE0GTV3Rud4xiMqW3v/wv7eVl+YYGV5zhdRVKsw31GXz + FoRmo8YsfYYffCQb4505+/n4jaFIDtUFVnB7r5VhnpU+Zq/KlJpoFmbBIMu4GearxLZEmecm + oDlFY+Yf9yKKuic1uDgCITJyuAOwDCGEuwdAyK1O17sI5t6hwx+O5QU4z2Egvsd9VIbDPdIT + B1cLBvnVqhUeoZJajFqoHXdVqV9Kt/LdjK92Kt1NSpYrGzwzHozUYqJ1tcuLQSxMlIQgGOZD + EOMAO81QxnLptusHnBWyfPzJH8a4mmiWws74OzAOorBRYBteGaRCnI5xBa7HMQBzD3K9o7LQ + ewhAonAbwrgPWN8AtgJqjgWiejcPD0ER1rsHDr6/rX3Onc29NAgGtEwpwHFiqqx6gdbMVMzn + HGdCGCnM62tNCw5nA4ouGAuGxJgkBNMYP8bMbmJcOBhFevN918Y+GGxTfF9srTTEsmYtKY8B + wYOQyxXXRVswlWcr4sjroI4gLpUGqa4BiziAAFCAAzRisBUkjRvsHUTBURwEnFYxNSYgobnL + +srlheBqA6gbUrFccYbz0uF5bKV8izhU6tRKguZkBm/AELgusLs53OvBuRsXmSSAyXjhAsyY + zj3MBhfOU9OIhskQvsxvSzuqT0MQsGAW4ygq7b3GY+wttuo9v6uWCkAwaYFw5Z756xDtGSBw + P1HPr0e8VlIhBOBzjz3n4fglMQ3a+5ChD0e6tgK8uLm4XVlGiK6osAEu5w6VKxUQrWagYouW + gFQa1RI+RCAVYCYR4GVXjdH43DNmlZSpa2N0H744HMX1CvuzES2X12eGHxOBuYBlcbXSCUk2 + yV9BJsQ78rIy1s67B8k4HiflXuIkog1YXMQGRdCWUyMG4rZcwQos7/h29LlJMTTzrkqlOrLm + MpXOFuku1FMcrRhfxSWFTNLZuLpoA0Tk2RmHMZIasJL8JtuuMSqbaWGSd1N9DuqsYsbmIPVf + HLF9AYqo96xCfNdFlQtdYbxVi2lwcrbBRBOXkIJff3s2uAp388IglipDHMClztoJokp27dWm + QeLIPJvmCWN2PRMiiWFDMogAx3kkiMdS5SY1AMEVuBtMxrysanVfLVmvisWzgoXlbzCUcWK+ + xty6liIhGM4vxspuwpHzwivVu+mrFd2lKkonYJ7SC5jLt8ZSsLVxGOOqnR10DMGQz8bgetxC + Uog24ADuHECeQ67vHNrAUVSeoza9a/DNoqm1llaPSMA8IMivBgvCEQDSWkC0TEu3gizOqvCh + +J6BZ1ArN0Jw19ot+FoexjiyJ83TwEhdkRzXDtLTO+Y+bKdvEbtS4RKK5YMqpCxaXX0AKWNX + wEFaqlKiDknyWB8D2a0JLC5GIiDNPQhEIICkwqgmhCJpLaUGOGlBDIZRG9pujxWE8T6iO9c+ + VQCgJmNV4xTZxknFx4rWlnpt+bdQR/cKjWRrmtuU9tZ2FZ3NOXiGYCfxfmkEDJQKtsiVc9Nq + 4zZMgCeMWdKwiHgFF8tClsYY4ZZLVcqk5rh0PWJlkNmMvQBkUkJiIJJoI1AA8qwA73tc5Dni + GUg2Rlva9bx+vKP9iIUYLQ+kClo7yVC2qU7rWXCfCSTO9w5urWg8T6wlGFXlI1JVLZ61iZB+ + x6rkmVEwW1X5EI4Zk+iWUjQ9oFWce0bblFiDcPBRwWVyXVe/ZnzVQsQg2ZkiA4gVQ61wCMDa + dAZi29kB4nTe/CRC8VicA7DgHmlq5ZTBttuDb1MVRaPdw5XOly5wyIWwZQF4tQTFy/L1WxpS + XVlpgzKc2RQDrgqzEE85d8h25LSwicZnCkE6MCFNYCwkiLvv3dRcsbllqe4ynbDMbLqfl4gQ + NIAxVTpV3mtMMBn3lqYxarg6dQZQnlU7PADQPe81Actt9NxgtOfcdwxkNkmb2uZ2mpD6BtEN + KqBw93K3imbthfQrtsjTKvFU4XfrYSJGM+1SBBBVDVrr/5urGCMGay1lO124P1TWfJ49dY5B + B842dc9CSHldrXBYepyV7FZ11K5PlQdngypkGTN/1A9ZEA+hOAchWgmFuxGrqAA1hut10pqW + uDqqQw5OMQ/Bve3lUuq4yV7zChxUBJY3UyWo99rnpdQudQYR4AQziSXBxkDSczKaHEIiJBsv + ArTLEcJ4RgOQbM4Pddvs3kFajBWxfOudVF/LyKk89xEVLostahfu4BhMMT4m1kbM2PITzDiM + vxA/RGssO1KU2YdFlzWG+3FKCz5JTquiKtouVV3lCf2Lg1pU2hpOnFHOu+wl++Ge78p9U02t + cNNHXlslpgwzAw5BkJiqAXsq0zVJiLHaBAHCqHLvOvdbILZ4mDFS8cNR2aRHpEL05zoHQfsI + 2oSdDQaLe3CaJLoP58UM22etAnjjGkHMfPURUJw7wn0GYlAIVeyM3UHxQjAClzrM4yEx3D2c + naRUi1bAMO+rUtDKntrRqZUGeTW9X5mTe6m1gpbZtrKQyzQGDsdE1Gszea4899215yTKWMo5 + CWCm2rRb4DLHwDPn2iERvoEf98vh+HYsFV+YBu+GV8/BCIYmpiXRKgYZ7rKPil+RiDarIW51 + BEAcgJMQDAeNmf2mBqsocbmRanuLnlZJEmeYNLaXWJ6KttqZiQS13IMUeaeFTevNd56v19PM + nJvXCEHF5cBrLJgJl0MSrYDDMZuxmdEvQ1EhOMkqEgAfqXNSpR1EIx2IXvQ8wpTxxRSu2zsG + 04MH8UtlV1edZmm6sCrHXYg/I59v7/4y/+8ckGzP2AtyU37UKuEKu0sctRqs1HA5Bwfvq7oy + 122x1SKmKiQjsvMmknlnYAUb5LVdSHMQzFPopOArBJaJhDQIYg98W66pKIXnRd8xZOnx6hr0 + 1bukAfIjbPtj+iat5NukFFxDejaLgqnolnOMeQz9DLiSXRnIElp0pM5Q32CJPOdAiAaBCj62 + qKhcSOvvqbgW6bQMzrsV8CUp6ddWhbVusrRwC2hbENQeliE4FVwCrvR1Qcj2FaM+cgaoNIf3 + GOnqEIzV2LRHIkiIbytEyZjrt33HIBlRi8QnddorxIMBEKQdM7xrvEUvWmY41mCipk4BqoM8 + FQAUsm+3h/I2DufuVeFe6Wnxn4KEVE8BxGq4chnTq6WAK/TOeWh5YDVdVdLw+7XpPsRRIcYA + zgomWsINAdRKISbcivGEVfLCeF0FJhly43ZIjTPUxQS1kRfnW4REEIQuylFaPXxiCJLkNzh9 + hxGGpM3MZUxUdtGAESsbOZHNHKMPU1eJaZuleUfHOQs4qSpHhMltbvl021PFFSZaxZJwB4lo + EubwXfuUUYE8tzblyS1vKV6+P66sqqVKHbawBB/CuK78qsxsM/dKsop8sAHLLXpDcIHXbAv7 + pM/mdhGreFs7/aVai4ZwovTLefDMuKsxo84Kwo58TN4GoHFGgbt2PtWYwVFh3jUonsxwL2ek + te4DwlF/GeYu3FAGrzhRDkETwiofW2uZlLR6TTt5Y6VnxzLCTTIPjGCGLMg2LsRpt1ZSA7EY + 0Xmzes9xL6SlxooAlOxrDoJwCMN4N3HWH0ZNs7iHKO2wlA1LtWkrczE00WZaUDSj81Uh+wx7 + olpOu2CljjTql+9f/RWkaZwhR/3synJ11bJQuw2l2x+spXSkrixjqYCWUPznEozKlnyXuvKr + aKKdjTARz8u4wJnqobY4A+7jXCorA59NyPkpDWLM3i2gyy5rZyTKNlEN53BZMQpC6t85PJZA + 5DS5X8VQtdftrpinumrn02bzeTAGSywNKu5JtIsUj1TrYnWuw3k1yJXWlpWskK81McviiAr2 + eGYt10PgylzbQaIIrfeb+YMboiCVJECAcRhDEfIiFrg41ed93F4RBuSVl3EUimlbq1SasXeu + n1Il+q5uQt8movohsRjBvaLxNNCos1hkN5croleV5iztR+WhOiAdAMYBbfQM+MQeMXAvg2Vu + Eve3rcmy3qvCN+8XjW0OkzrTTtt04aZiTS27RvjlntCQhgsRA1zp9VznotzNzUohG6cxOcq1 + IEbjShKbnxQngxdqTJ/tQZaNzpP1W4C3suGqkDCHPkiqZ20B1r4KxdNWeVwhHMXbWbvIsk5J + Fi+FDfJOKgDSSESeFsq3n1nloG3X2FylUthWmvWtcxyDgxDLuy3UrSypSsrSBAbXbq0Q9tme + vw3EsIHghAzMV0mW+wjDeHNecLM2jL8abgxq/KTMt6XflyW0cAZfnI32Va6qJm2C0HCXJIOv + +ogIjdlawl56fSwnp7ZwhYbKZy8NlOsmX+ldgDTpSpW19wwELtf9I1ohl/LwrfKC3DyvqjGr + AaueGcEAmuvdBgxtu2WQ7REGESGtjCwYqS9EcY2hqJFsirEWP8sBaq9+424iDUdtEa+NagWa + NDb7zxFo1z+S4zyJ1Ka+ttv7bv47oOXrmI8tXWU/ymLmGrtGYWKde8yb8cxgATmq+DfbMxbM + hCwqbRl+yf1tf5jmOUlAHllBy1Z+le2rzjh71M5L498sNmqiIkIIN0fZ/elftpWfSRXYlzXU + FVxArAMujDsJooowZoRb1uDpD4FLO7suyu27zACCIGR/tuC9iD4YflMgWOC2FXErSM91RFGi + S282mDZqBlx6FZfxLAyycAwfXGih1G6ViYjQ9vDtqVygs8Wxhb4LWLaHprRxmco23mlDVe9D + ZEFCkgJR4AMnpoIgE9D+RmRpgHmb/eEB97dCRd9WV1egMy9VH21YXVrd4f2MemYBDp0XX9R2 + FaypR++07J3dxNAt619VBdhqqahHhbTitp2XKilqK8YWqlYoEaILq7RNYQUIJKP5TXVglotf + uXZobL7wyad/3P7LBvsy1jbOYaACrZDRgBypj5JVy40jKh+qCAOTtGC31W3Dc9wUMZZOLqCZ + 9IkElEaH/KLEpA2CI8hSNYKzsNBy5u+bIgxNfCu/JV3DGZjHo/9VyK7SI4AbXDZEUHHpui43 + 02kLwbZhzJa0m9FyE5z+D8a362Xlp8f6/bv3T42dL4pCb6vyLQ7aqKuKJNa2cP82b9KfCLUn + THt16qOlf01sI952S/xN5UuByQKd7Y8MqRDowPEkaxkPK3dV8o1EcSx8W1ShiHxho6LUhbZS + a65LCYxNfogPTq7ADuJbNAuZ4ldtcVW2sZl74eqhWjZ/NdJqY9/j0DbTWW7f3h/58MTshoFA + r375akgTBBb+NhActkw/ANwf4ZAkE0nqoP+DKQPYxg8IQCW2s1HbhLRsm0ou40kCIIgtzYhT + idShezlBpHb5TsRdTiZ5fBU1BnPwt4KgrX4r+cozpk5X5Tfa079KR2qs5dA8B1lECG+HiOq3 + KjLwbttNlRJu/5UWGRVKWS5BuHz14LTvwN/ntu109/mWaKlOwFIxkFcaYs1pv3NZi5eaJ2GA + igXB2xL4loAbmzGNKPbGa0sFVR3j131IgvAykMW+qB7PW0GHeUhLeyuXs9JucTTPTTpTmZ61 + PzM4TE8Kf61IQpO1ljkXj1ouL09KKpRotXEeVVs8dVTC2oKjVjrnvbleb+uxf2z0Y0Of9fa2 + a7XYOpZC8AaLC1Mdz1/c2VaqtB9OW72PUM3MbBisDGGqrEKNCiRSNy1pbMlJhRlDVc42AOez + GxwC0oXDEa2lj6QHAVqFlnpsfpXnt5b2M9saafcqSc6ZGH+6UCSYt1Rxdpu9Fe9K7zcHiTip + C+f9HRW12Ba/hVfaM7mVwi05X/+T0rGxac/Pr3eGE9BfULWJA8QbRN5OZUY//vTw95VqG08w + SU7ywQee5TUGQvjWRCJKQcwWbTVzh3ieGMZw3T7+VfojomekBYy8O8TkUFSAD+mFsBBFOwji + /by/8mCYr7TEqtAJVdP+xVVEts+M30L4Le1ux9dCCEsVYQ1+WzhCFJXSNsEtm674DTFs2MPG + rPcgO7jdPGdUxGz0bnOpCOWf8DKa1Ze1Urk5UNun5J63DrKN7sY/EG6K3KmXYmjNOZIkiPc8 + m9OEEizsT4mzvMeylr51ZEswUUsp3W8xcY5DcyVtrXJrKwKgh4tftUyOYWc0Kzdqk5727sfh + jvYBW2507dy31Vy1HRSboF0qzPZX9iNz3sZsLbnAodzHwuotm7h2/fcUcZuntltr0YP2HGhd + Z0V+qd5Rmb8plCiI2X+FQVJrZlJniLMsECw1whkgJaLOGfmxPfzGdjXXKeGW9CNyRR+VNuUM + rEhB23rkXrZMobUm7TBUuCCbk9tr8C2dbuMD7zQPalVu22w1l1iHW+6PjeO4zK/fPNiujSSp + Iyu6+euPjHPhkctXjm7XdVYJSV213WLeGQajtpIe99onxoSugCXV0wKu5T79VZ2WRCyO2NKU + lgR2RIQm6FXrFDsrYq1dNpPEtqs5wvuOp7nqXy+WG4Eud05d/rFBf7Cz3NsLQhT08djahbyd + M9pZKUcgSdRHKtQEkzfGK+MEFClA7BFV3swvqhTFnWsjenWb6GrJA+lta8X+GKhN5lyDuVhe + u9HygPrXpNIcVFm12PVd4LEJbnMZ33jWIqcyns30ScPyr7AKaeVYUG+lKIrtaXfV5mXVcbUV + bg5B4l+gsj94o5qqqo8D24u/HH7bWLE5ZSO50dWIkazmMH5JznJpuHMz7yruxcAcAPenngUR + 2yEJvFz0lgDqt9XLZVjzIqvmSQohvRl6gdqWlI/Q08ZrqlSqfA6ENgHG7dRU1TUV02dvqvKs + LjxPrTQ+qalmYNWm0FSQc9zd3l+Q099cOcrpk4pWUbXUroljy7tVWDbPKUqQO95Sg/UW9Z/N + avPOsC929WvRaH/aA2gc19YhBrIOg9zcIql8TfudYQywV+SwLQ7c2M2KOsaEeW6jxFh/mpA9 + w/FJDgK1WLiqTN+EyAiR1PiuySVitVCrpZIRkxdYyVOF7FIXq3amoIPbM7ly1vYQK9pbXVfG + tGhoxdNVSraBW4tE2y4X0qo3a08Y2yvaTtFE01aK1OLyf51L/xp0+n2dL18vQRzhmU2hR2W0 + xe0K6/T/Au0c2xRAQLS2K5dtMll5EdXCsBcv0/9yxQJpy42OEKVPiiRnO5IY0lN6ocIQxM79 + d38VR7elR3s5GmwlSQboHBe290nS0jIKbXCVqZE8sXYCb1/JkkDZobVxtkv5pa1X1oRUG+Yg + DGThj6V6uXFzvTkRQ1l51PJ/B4oBtu9yf8rWWFr11UKq1GKlW80zMswt6irk0mSxIsnsX65x + C5uqmy7Hn9vfxkfL8t6WHI55TFsKQhKxJ96tGl7+S8Uy89ifvbWdVos82+EoV7pVvP3/ZVuu + t8GCw86xzWWctyKg2T+OIv5Fa0OKWBk1N1K1m0RTaxmNhR1sR4r+4rG43nID6/a2qRaNWqko + pY1/imNV5NdeB21uBNmlmJd/VtpEtUlkgdHSE74ndam31Cf1tirwhyhtmd7/o4yto35e75M5 + KLuZYTdZKyffyqhpsxMTqcARLcGDiP4jM7VXgmxtw9abhvZPExFmuNWzOkAMiCHmGctmymuV + e3psDwxmbZYthSSOQ6qihbstLR8bA83SUkZTuyGNXTAvKdzSqjPRgFLrrSyrwmgk2Gb8VBze + XqBlJyMM1eg78HFmqiCl6sqMrgzKxtLr/Y7Pr5ehbZJhAPr51aMB7Mtv10mndoz9bZ4DVNXR + bkzrouwLm2XmB8Z9wOi8DeXYE32REvatVb84x95mEDn+pXuzPpE0cHlbQFu983oeZF7EHol4 + r/8Qp2Scds5fODi8t4uXuKCHxn/nOwqEps//syx4WfsADxBZwV5bmFQXVmlvtlZ4yZbF/jUJ + fOZnIhqcnGGbN8UZJB58Ozw4Ns5GF3Obru/P8KwM7N7OyWF8GeJKRg3k7btnM3FuDCTv+uQv + oxij5RUMtc2q0/3yI8eO754N6J65jb3b/6VvodDvC2APD7Vlj2UBTAMnxu0BRkLZleXG28vt + GcEpb2Oncgi4fvPw9PCxrRYvjHFUZvrosWXgJpAPZ/WgIF4VpfIkpao7wwNqblGhRLN/59QX + uNpsIttQerl9d9qZo1psBMEkd+7ZY1Na3Xzs2LgPbu0a37Pntwduf1ULpzSZhjFHm/u4MDsG + q9dv5OsvD2QJKLarhbD642+uDyMrLhWH9d8tQvVPn1/dclX/zVVtloEX5Bt/F7X5d6K3vz4a + O5GTUoFLnN0qZl5RRdXmI+0vs/xvl9barNc+qjt7fzp7YdcgyuMnF7f2DUdijCtXjw0mMZ4v + Lx+Zme6jbU0XSSbpubfmSmNHpc1+BWCHfOctayxx5xlmyp1vJ0E49A99l6/uHwQBF6aRCESc + lkZiZPCQktPzuB0k5/q1L6ZDB9+bVvsP/m2WlF1DtYzw+SbsbEB3761FjnrCMbi5bdjpdAhr + 6VsBPwimJ5sd08X97zGVBECzfSLOExsRgc1S7lEStdldon+9aLVvReUVB64rFo/NCJkdgftH + BxL8R0Bbf2Aq8K/d6itDgqi15aqG8jlt7VV1TPGsZQ1Y+f5lRSrNUl1y8TpaZL2bup2j9sxw + k/RTA18IM/YeGJlK/0I+ExKheWjSGSatM2FuXD/iL31PDe5lbKtsBCRq0s247cjRXVuj2DbA + 663f1wXSVBfA+fpVj1SKU2o3NQZANoYudt7/T0aEdeT4xtbLKRRTzgKDZBPWm+tcm67fsvbz + 4Ghvu57mEbVzZtgUREKgsp5tvdhqgjK1xQy7bidy1+120VodbYx/JtxUphrDOgpibzQphjvj + oI2oNmM2Heh/cspwsik/zlrm1c87sxqbx/rkyvTu7ZzBpOvXRmrzbxibUAEdaHD04KvXj7e5 + hXUM7NI4xrZUY73M86GXdUZttWVVq8NEj588W3tPVKY/SyhwySaIFLRGpiXbVZjg0o93/WlM + yBCKWqGCMIGQy4lTSnE/GGqNBLbj3toGfDYk3ziosrEoaUZuG3f37+nVB/CmOBYh3TstC6lu + oI1QW85ePR7GXG+tf2jAwbacPb97SAs7iJExTvutweUo4p+llQq7f2+2o/fnnM3DOYH28uZ6 + gpmLaR4AIesarQvDI5OQYiwhyWKl9W4Te4eLy3iv1yM+GMAR79a7r8uU9g9AvV/RhYAlQlWH + bNDNxh2tCG7eUuAw+8U7pJKogjEHGQM+vnUqivctt4iEhHIm6/9T2z2cF/Dwlhw8Okwao3Iy + wG+cVK9z4/DMOZU1ahM2RYBjddpYp7+O+e08OD2kmA1EpJu3jwxC6Xv97x/r9Dpi3Ll9YhyI + c9v+NzNj/R/B5L9fXci2wQAAAABJRU5ErkJggg==' base64Decoded asByteArray readStream! Item was added: + ----- Method: ReleaseBuilder class>>projectBackground46 (in category 'resources') ----- (excessive size, no diff calculated) Item was added: + ----- Method: ReleaseBuilder class>>projectBackground46Computed (in category 'resources') ----- + projectBackground46Computed + + | randomPoint col | + col := Color fromString: '#76A5BF'. + randomPoint := World right atRandom @ World bottom atRandom. + ^ ((GradientFillStyle colors: { + col. + col twiceDarker. + col twiceDarker twiceDarker}) + radial: true ; + origin: randomPoint; + direction: randomPoint; + normal: nil ; + yourself) + ! Item was added: + ----- Method: ReleaseBuilder class>>projectUrl (in category 'private') ----- + projectUrl + ^ (self repositoryUrl , '/', (self versionString copyWithout: $.)) asLowercase! Item was added: + ----- Method: ReleaseBuilder class>>releaseRepository (in category 'private') ----- + releaseRepository + ^ MCRepository location: self projectUrl! Item was added: + ----- Method: ReleaseBuilder class>>repositoryUrl (in category 'private') ----- + repositoryUrl + ^ 'http://source.squeak.org'! Item was added: + ----- Method: ReleaseBuilder class>>setDisplayExtent: (in category 'private') ----- + setDisplayExtent: extent + "Uncomment next line when the primitives become available in the Squeak VM." + " DisplayScreen hostWindowSize: extent." + Display extent = extent ifFalse: [ Warning signal: 'Display extent not set to ', extent ]! Item was added: + ----- Method: ReleaseBuilder class>>setPreferences (in category 'private') ----- + setPreferences + + self setPreferences46. ! Item was added: + ----- Method: ReleaseBuilder class>>setPreferences45 (in category 'preferences') ----- + setPreferences45 + + self setProjectBackground: self projectBackground45. + + Workspace shouldStyle: false. + SystemWindow reuseWindows: true. + TextEditor + autoEnclose: true ; + autoIndent: false ; + destructiveBackWord: false ; + blinkingCursor: false ; + dumbbellCursor: false. + BalloonMorph setBalloonColorTo: + (TranslucentColor + r: 0.92 + g: 0.92 + b: 0.706 + alpha: 0.75). + Preferences + installBrightWindowColors ; + insertionPointColor: Color red ; + enable: #scrollBarsWithoutMenuButton ; + enable: #gradientScrollBars ; + enable: #swapMouseButtons ; + enable: #annotationPanes ; + disable: #showSplitterHandles ; + enable: #showBoundsInHalo ; + disable: #alternateHandlesLook ; + disable: #roundedMenuCorners ; + disable: #roundedWindowCorners ; + enable: #traceMessages ; + enable: #diffsWithPrettyPrint ; + disable: #alwaysShowVScrollbar ; + enable: #alternativeBrowseIt. + ProportionalSplitterMorph + smartHorizontalSplitters: false ; + smartVerticalSplitters: false. + PluggableButtonMorph roundedButtonCorners: false. + FillInTheBlankMorph roundedDialogCorners: false. + Workspace shouldStyle: false. + NetNameResolver enableIPv6: false. + Browser listClassesHierarchically: true. + SystemNavigation thoroughSenders: true! Item was added: + ----- Method: ReleaseBuilder class>>setPreferences46 (in category 'preferences') ----- + setPreferences46 + "Preferences class defaultValueTableForCurrentRelease" + + self setProjectBackground: Color darkGray. + + "General User interaction" + Preferences + enable: #swapMouseButtons; + disable: #mouseOverForKeyboardFocus. + Morph indicateKeyboardFocus: true. + + "Text input." + TextEditor + autoEnclose: true ; + autoIndent: true ; + destructiveBackWord: false ; + blinkingCursor: true ; + dumbbellCursor: false. + Preferences + insertionPointColor: Color red. + PluggableTextMorph simpleFrameAdornments: false. + + "Windows" + Preferences installUniformWindowColors. + SystemWindow reuseWindows: false. + Model windowActiveOnFirstClick: false. "Not good for 800x600" + Preferences + disable: #showSplitterHandles; + enable: #fastDragWindowForMorphic. + CornerGripMorph drawCornerResizeHandles: false. + ProportionalSplitterMorph + smartHorizontalSplitters: false ; + smartVerticalSplitters: false. + + "Scroll bars." + Preferences + enable: #scrollBarsNarrow; + enable: #scrollBarsOnRight; + disable: #alwaysHideHScrollbar; + disable: #alwaysShowHScrollbar; + disable: #alwaysShowVScrollbar. + ScrollBar + scrollBarsWithoutArrowButtons: true; + scrollBarsWithoutMenuButton: true. + ScrollPane + useRetractableScrollBars: false. + + "Rounded corners." + Morph preferredCornerRadius: 6. + Preferences disable: #roundedWindowCorners. + PluggableButtonMorph roundedButtonCorners: false. + FillInTheBlankMorph roundedDialogCorners: false. + MenuMorph roundedMenuCorners: false. + ScrollBar roundedScrollBarLook: false. + + "Gradients." + Preferences disable: #gradientScrollBars. + SystemWindow gradientWindow: false. + MenuMorph gradientMenu: false. + PluggableButtonMorph gradientButton: false. + + "Shadows" + Preferences enable: #menuAppearance3d. + MenuMorph + menuBorderWidth: 1; + menuBorderColor: Color lightGray; + menuLineColor: Color lightGray. + Morph useSoftDropShadow: true.. + + "Lists and Trees" + PluggableListMorph + filterableLists: true; + clearFilterAutomatically: false; + highlightHoveredRow: true; + menuRequestUpdatesSelection: true. + PluggableTreeMorph + filterByLabelsOnly: false; + maximumSearchDepth: 1. + LazyListMorph + listSelectionTextColor: Color black; + listSelectionColor: (Color r: 0.72 g: 0.72 b: 0.9). + + "Standard Tools" + BalloonMorph setBalloonColorTo: + (TranslucentColor r: 0.92 g: 0.92 b: 0.706 alpha: 0.75). + Workspace shouldStyle: false. + Browser + listClassesHierarchically: true; + showClassIcons: true; + showMessageIcons: true; + sortMessageCategoriesAlphabetically: true. + Preferences enable: #annotationPanes; + enable: #optionalButtons; + enable: #diffsWithPrettyPrint; + enable: #traceMessages; + enable: #alternativeBrowseIt; + enable: #menuWithIcons; + enable: #visualExplorer. + SystemNavigation thoroughSenders: true. + + "Halo" + Preferences + enable: #showBoundsInHalo ; + disable: #alternateHandlesLook. + + "System" + NetNameResolver enableIPv6: false. + Scanner + allowUnderscoreAsAssignment: true; + prefAllowUnderscoreSelectors: true. + + "that's all, folks"! Item was added: + ----- Method: ReleaseBuilder class>>setPreferences46LowDetails (in category 'preferences') ----- + setPreferences46LowDetails + "Higher performance." + + self setPreferences46. + + self setProjectBackground: (Color gray: 0.6). + + Preferences disable: #roundedWindowCorners. + PluggableButtonMorph roundedButtonCorners: false. + FillInTheBlankMorph roundedDialogCorners: false. + MenuMorph roundedMenuCorners: false. + ScrollBar roundedScrollBarLook: false. + + Preferences disable: #gradientScrollBars. + SystemWindow gradientWindow: false. + MenuMorph gradientMenu: false. + PluggableButtonMorph gradientButton: false. + + Preferences disable: #menuAppearance3d. + + Morph indicateKeyboardFocus: false. + + PluggableListMorph highlightHoveredRow: false. + Browser + listClassesHierarchically: false; + showClassIcons: false; + showMessageIcons: false; + sortMessageCategoriesAlphabetically: false. + Preferences + disable: #menuWithIcons; + disable: #visualExplorer. + + "Non-3D menu." + MenuMorph + menuBorderWidth: 1; + menuBorderColor: Color lightGray; + menuLineColor: Color lightGray.! Item was added: + ----- Method: ReleaseBuilder class>>setPreferences46Retro (in category 'preferences') ----- + setPreferences46Retro + "Higher performance." + + self setPreferences46. + + self setProjectBackground: self projectBackground46Computed. + + "Rounded stuff." + Morph preferredCornerRadius: 8. + Preferences enable: #roundedWindowCorners. + PluggableButtonMorph roundedButtonCorners: true. + FillInTheBlankMorph roundedDialogCorners: true. + MenuMorph roundedMenuCorners: true. + "ScrollBar roundedScrollBarLook: true." + + "Gradients." + Preferences enable: #gradientScrollBars. + SystemWindow gradientWindow: true. + MenuMorph gradientMenu: true. + PluggableButtonMorph gradientButton: true. + + "Scroll bars." + Preferences + disable: #scrollBarsNarrow; + enable: #alwaysShowVScrollbar; + enable: #alwaysHideHScrollbar. + ScrollBar + scrollBarsWithoutArrowButtons: false; + scrollBarsWithoutMenuButton: false.! Item was added: + ----- Method: ReleaseBuilder class>>setProjectBackground: (in category 'private') ----- + setProjectBackground: aFormOrColorOrFillStyle + + MorphicProject defaultFill: (aFormOrColorOrFillStyle isForm + ifTrue: [InfiniteForm with: aFormOrColorOrFillStyle] + ifFalse: [aFormOrColorOrFillStyle isColor + ifTrue: [SolidFillStyle color: aFormOrColorOrFillStyle] + ifFalse: [aFormOrColorOrFillStyle]]). + ActiveWorld fillStyle: MorphicProject defaultFill.! Item was added: + ----- Method: ReleaseBuilder class>>switchToNewRepository: (in category 'private') ----- + switchToNewRepository: anMCRepository + MCMcmUpdater defaultUpdateURL: anMCRepository description. + MCRepositoryGroup reset. + MCRepositoryGroup default addRepository: anMCRepository. + MCWorkingCopy allManagers do: + [ : each | each repositoryGroup: + (MCRepositoryGroup new + addRepository: anMCRepository ; + yourself) ]! Item was added: + ----- Method: ReleaseBuilder class>>transferCurrentPackagesAsUser:password: (in category 'scripts') ----- + transferCurrentPackagesAsUser: username password: password + "Copy the packages currently loaded in the image from the trunk repository to my releaseRepository." + | releaseRep | + releaseRep := self releaseRepository + user: username; + password: password; + yourself. + MCWorkingCopy allManagers do: + [ : eachWorkingCopy | eachWorkingCopy ancestors do: + [ : eachVersionInfo | (releaseRep includesVersionNamed: eachVersionInfo versionName) ifFalse: + [ (MCRepository trunk versionWithInfo: eachVersionInfo) + ifNil: [ Warning signal: eachVersionInfo name , ' not found in trunk.' ] + ifNotNilDo: [ : ver | releaseRep storeVersion: ver ] ] ] ]! Item was added: + ----- Method: ReleaseBuilder class>>versionString (in category 'private') ----- + versionString + ^ 'Squeak4.6'! From commits at source.squeak.org Mon Jul 6 16:03:25 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 16:03:28 2015 Subject: [squeak-dev] Squeak 4.6: ShoutCore-ul.52.mcz Message-ID: Chris Muller uploaded a new version of ShoutCore to project Squeak 4.6: http://source.squeak.org/squeak46/ShoutCore-ul.52.mcz ==================== Summary ==================== Name: ShoutCore-ul.52 Author: ul Time: 3 July 2015, 11:34:54.984 pm UUID: 8d3fd95b-a5a6-4e10-9769-e0b0359fc30a Ancestors: ShoutCore-mt.51 The syntaxHighlightingAsYouTypeAnsiAssignment preference should return the value of SyntaxHighlightingAsYouTypeAnsiAssignment instead of SyntaxHighlightingAsYouTypeLeftArrowAssignment. =============== Diff against ShoutCore-mt.51 =============== Item was changed: ----- Method: SHTextStylerST80 class>>syntaxHighlightingAsYouTypeAnsiAssignment (in category 'preferences') ----- syntaxHighlightingAsYouTypeAnsiAssignment + ^SyntaxHighlightingAsYouTypeAnsiAssignment ifNil: [true]! - ^SyntaxHighlightingAsYouTypeLeftArrowAssignment ifNil: [true]! From commits at source.squeak.org Mon Jul 6 16:03:49 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 16:03:50 2015 Subject: [squeak-dev] Squeak 4.6: MorphicExtras-cmm.164.mcz Message-ID: Chris Muller uploaded a new version of MorphicExtras to project Squeak 4.6: http://source.squeak.org/squeak46/MorphicExtras-cmm.164.mcz ==================== Summary ==================== Name: MorphicExtras-cmm.164 Author: cmm Time: 6 July 2015, 10:00:42.97 am UUID: dfe6214e-4ebc-45a3-ba1c-ee6a19c1d814 Ancestors: MorphicExtras-nice.163 Allow flaps to be dragged again. =============== Diff against MorphicExtras-nice.163 =============== Item was added: + ----- Method: ReferenceMorph>>handlesMouseMove: (in category 'event handling') ----- + handlesMouseMove: anEvent + ^true! From asqueaker at gmail.com Mon Jul 6 16:05:38 2015 From: asqueaker at gmail.com (Chris Muller) Date: Mon Jul 6 16:05:40 2015 Subject: [squeak-dev] re CM>>#hasBreakpoint In-Reply-To: References: <613E11CE-7CA4-448F-9A28-8ADFC43F9936@gmx.de> <47A6938C-9D64-49FB-822A-8CDC218DE912@gmail.com> Message-ID: Could someone teach me about breakpoints? I've only ever done "breakpoints" by inserting a old-school send to #halt, I'm not familiar with these new ways of interrupting execution. How are they done and what is the advantage over halt? On Mon, Jul 6, 2015 at 11:01 AM, Tobias Pape wrote: > > On 06.07.2015, at 17:54, Eliot Miranda wrote: > >> Hi Tobias, >> >> On Jul 6, 2015, at 8:07 AM, Tobias Pape wrote: >> >>> Hi Eliot >>> On 06.07.2015, at 15:40, Eliot Miranda wrote: >>> >>>> Hi Tobias, >>>> >>>> there /are/ configurations. Two if then :-(. >>> >>> Sorry, it was just a guess because of the stack trace. >>> >>> So, I investigated. >>> >>> update-eem.319.mcm: >>> (CompiledMethod methodDict includesKay: #hasBreakpoint) "true" >>> >>> CompiledMethod>>#hasBreakpoint >>> ^BreakpointManager methodHasBreakpoint: self >>> >>> update-eem.320.mcm: >>> (CompiledMethod methodDict includesKey: #hasBreakpoint) "true" >>> >>> CompiledMethod>>#hasBreakpoint >>> ^false >>> >>> update-eem.320.mcm: >>> (CompiledMethod methodDict includesKey: #hasBreakpoint) "true" >>> >>> CompiledMethod>>#hasBreakpoint >>> ^false >>> >>> Kernel-eem.934 >>> >>> (CompiledMethod methodDict includesKey: #hasBreakpoint) "false" >>> >>> >>> Ahaa. >>> System misses to use an actual override and monticello thought the method had gone >>> when it was saved for Kernel-eem.934. >>> Soo: >>> Kernel-topa.935: Reinstall CompiledMethod>>#hasBreakpoint >>> System-topa.753: Reinstall CompiledMethod>>#hasBreakpoint as an Override >>> Jenkins seems to be happy: >>> http://build.squeak.org/job/SqueakTrunk/1549/console >>> http://build.squeak.org/job/SqueakTrunk/1549/ >>> >>> I hope this fits everyones :) >>> >>> Best regards >>> -Tobias >>> >>> >>> PS: Have you looked at WrappedBreakpoint? >> >> No. I'll try and take a look. What do you think the issue is? > > No issue, just an alternative way of doing breakpoints > >> >>>> Eliot (phone) >>>> >>>> On Jul 6, 2015, at 3:03 AM, Tobias Pape wrote: >>>> >>>>> Hi, >>>>> >>>>> we might need a configuration for Eliot's recent #hasBreakpoint changes, >>>>> the CI (and probably any update process) chokes on this: >>>>> >>>>> 2015-07-06T11:27:54.732+01:00: Installing Kernel-eem.934 >>>>> vvvvvvvvvvvvvvvvvv MessageNotUnderstood: CompiledMethod>>hasBreakpoint vvvvvvvvvvvvvvvvvv >>>>> The time is 2015-07-06T11:27:54.848+01:00 >>>>> CompiledMethod(Object)>>doesNotUnderstand: #hasBreakpoint >>>>> MCMcmUpdater class(ClassDescription)>>logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: >>>>> MethodAddition>>writeSourceToLog >>>>> MethodAddition>>createCompiledMethod >>>>> [] in [] in [] in [] in [] in MCPackageLoader>>basicLoad >>>>> [] in [] in OrderedCollection(Collection)>>do:displayingProgress:every: >>>>> OrderedCollection>>do: >>>>> [] in OrderedCollection(Collection)>>do:displayingProgress:every: >>>>> [] in [] in MorphicUIManager>>displayProgress:at:from:to:during: >>>>> BlockClosure>>on:do: >>>>> [] in MorphicUIManager>>displayProgress:at:from:to:during: >>>>> BlockClosure>>ensure: >>>>> MorphicUIManager>>displayProgress:at:from:to:during: >>>>> ProgressInitiationException>>defaultResumeValue >>>>> ProgressInitiationException(Exception)>>resume >>>>> [] in [] in UndefinedObject>>DoIt >>>>> >>>>> Best regards >>>>> -Tobias > > > From eliot.miranda at gmail.com Mon Jul 6 18:11:21 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon Jul 6 18:11:25 2015 Subject: [squeak-dev] re CM>>#hasBreakpoint In-Reply-To: References: <613E11CE-7CA4-448F-9A28-8ADFC43F9936@gmx.de> <47A6938C-9D64-49FB-822A-8CDC218DE912@gmail.com> Message-ID: Hi Chris, On Mon, Jul 6, 2015 at 9:05 AM, Chris Muller wrote: > Could someone teach me about breakpoints? I've only ever done > "breakpoints" by inserting a old-school send to #halt, I'm not > familiar with these new ways of interrupting execution. How are they > done and what is the advantage over halt? > The "toggle breakpoint on entry" takes care of inserting the break and running the compile, or undoing the break, in one menu selection. So it's faster than using halt. Also, it does not disturb the current change set (it is not considered a change), nor does it create a version of the method nor leave source on the changes file. So it's cleaner. Now that it preserves source I prefer it to halt. Previously it used to install a breakpointed method with decompiled source, which was horrible if one wanted to read comments or had trouble with the formatting. WrappedBreakpoint is a step towards a more complete debugging package, but it isn't used yet. As a somewhat relevant aside, Terry Raymond of Crafted Smalltalk implemented the Professional Debug Package for VisualWorks which provides conditional breakpoints along with a comprehensive UI. It's powerful and nice to use. While it's relatively easy to roll your own conditional breakpoints above halt, it's nice not to have to think about it to heavily (it's easy to make a mistake and the effects can be terminal :-) ). Perhaps we'll evolve BreakpointManager in that direction. For example, adding a "toggle one-shot breakpoint"would be easy to add; for example inserting breakonce instead of break could cause the breakpointed method to be uninstalled immediately. > On Mon, Jul 6, 2015 at 11:01 AM, Tobias Pape wrote: > > > > On 06.07.2015, at 17:54, Eliot Miranda wrote: > > > >> Hi Tobias, > >> > >> On Jul 6, 2015, at 8:07 AM, Tobias Pape wrote: > >> > >>> Hi Eliot > >>> On 06.07.2015, at 15:40, Eliot Miranda > wrote: > >>> > >>>> Hi Tobias, > >>>> > >>>> there /are/ configurations. Two if then :-(. > >>> > >>> Sorry, it was just a guess because of the stack trace. > >>> > >>> So, I investigated. > >>> > >>> update-eem.319.mcm: > >>> (CompiledMethod methodDict includesKay: #hasBreakpoint) "true" > >>> > >>> CompiledMethod>>#hasBreakpoint > >>> ^BreakpointManager methodHasBreakpoint: self > >>> > >>> update-eem.320.mcm: > >>> (CompiledMethod methodDict includesKey: #hasBreakpoint) "true" > >>> > >>> CompiledMethod>>#hasBreakpoint > >>> ^false > >>> > >>> update-eem.320.mcm: > >>> (CompiledMethod methodDict includesKey: #hasBreakpoint) "true" > >>> > >>> CompiledMethod>>#hasBreakpoint > >>> ^false > >>> > >>> Kernel-eem.934 > >>> > >>> (CompiledMethod methodDict includesKey: #hasBreakpoint) "false" > >>> > >>> > >>> Ahaa. > >>> System misses to use an actual override and monticello thought the > method had gone > >>> when it was saved for Kernel-eem.934. > >>> Soo: > >>> Kernel-topa.935: Reinstall CompiledMethod>>#hasBreakpoint > >>> System-topa.753: Reinstall CompiledMethod>>#hasBreakpoint as an > Override > >>> Jenkins seems to be happy: > >>> http://build.squeak.org/job/SqueakTrunk/1549/console > >>> http://build.squeak.org/job/SqueakTrunk/1549/ > >>> > >>> I hope this fits everyones :) > >>> > >>> Best regards > >>> -Tobias > >>> > >>> > >>> PS: Have you looked at WrappedBreakpoint? > >> > >> No. I'll try and take a look. What do you think the issue is? > > > > No issue, just an alternative way of doing breakpoints > > > >> > >>>> Eliot (phone) > >>>> > >>>> On Jul 6, 2015, at 3:03 AM, Tobias Pape wrote: > >>>> > >>>>> Hi, > >>>>> > >>>>> we might need a configuration for Eliot's recent #hasBreakpoint > changes, > >>>>> the CI (and probably any update process) chokes on this: > >>>>> > >>>>> 2015-07-06T11:27:54.732+01:00: Installing Kernel-eem.934 > >>>>> vvvvvvvvvvvvvvvvvv MessageNotUnderstood: > CompiledMethod>>hasBreakpoint vvvvvvvvvvvvvvvvvv > >>>>> The time is 2015-07-06T11:27:54.848+01:00 > >>>>> CompiledMethod(Object)>>doesNotUnderstand: #hasBreakpoint > >>>>> MCMcmUpdater > class(ClassDescription)>>logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: > >>>>> MethodAddition>>writeSourceToLog > >>>>> MethodAddition>>createCompiledMethod > >>>>> [] in [] in [] in [] in [] in MCPackageLoader>>basicLoad > >>>>> [] in [] in > OrderedCollection(Collection)>>do:displayingProgress:every: > >>>>> OrderedCollection>>do: > >>>>> [] in OrderedCollection(Collection)>>do:displayingProgress:every: > >>>>> [] in [] in MorphicUIManager>>displayProgress:at:from:to:during: > >>>>> BlockClosure>>on:do: > >>>>> [] in MorphicUIManager>>displayProgress:at:from:to:during: > >>>>> BlockClosure>>ensure: > >>>>> MorphicUIManager>>displayProgress:at:from:to:during: > >>>>> ProgressInitiationException>>defaultResumeValue > >>>>> ProgressInitiationException(Exception)>>resume > >>>>> [] in [] in UndefinedObject>>DoIt > >>>>> > >>>>> Best regards > >>>>> -Tobias > > > > > > > > -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150706/2f93638c/attachment.htm From tim at rowledge.org Mon Jul 6 19:58:08 2015 From: tim at rowledge.org (tim Rowledge) Date: Mon Jul 6 19:58:19 2015 Subject: [squeak-dev] Unable to load older my.prefs file Message-ID: In a latest trunk image, fully updated, I tried to 'load from disk? my older preferences. It fails because in DiskProxy>comeFullyUpOnReload: the code does globalObj := Smalltalk at: symbol ifAbsent: [ preSelector == nil & (constructorSelector = #yourself) ifTrue: [ Transcript cr; show: symbol, ' is undeclared.'. (Undeclared includesKey: symbol) ifTrue: [^ Undeclared at: symbol]. Undeclared at: symbol put: nil. ^ nil]. ^ self error: 'Global "', symbol, '" not found']. The symbol is #Context Saving a new preferences file and reloading seems to work. I?ve no idea where the #Context comes from and pretty much any attempt to look through the stack starts firing off annoying notifiers because the ?aDataStream? parameter in the IdentityDictionary>readDataFrom:size: is nil by this point. Is this crucially important? Probably not but it will annoy anyone with a preferences file. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Science is imagination equipped with grappling hooks. From tim at rowledge.org Mon Jul 6 20:33:07 2015 From: tim at rowledge.org (tim Rowledge) Date: Mon Jul 6 20:33:10 2015 Subject: [squeak-dev] 4.6 Notifiers broken Message-ID: <2BF070DE-7171-4605-A067-61ED90565754@rowledge.org> Looks like some recent changes I saw float past relating to Warnings vs Errors vs whatever have broken the notifiers we get for problems. Instead of an actual useful window with a fragment of the stack and the ability to open a debugger by clicking on one of the contexts, we now get an almost useless window. It isn?t making my day any happier. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Esc key to reboot Universe, or any other key to continue... From tim at rowledge.org Mon Jul 6 20:49:19 2015 From: tim at rowledge.org (tim Rowledge) Date: Mon Jul 6 20:49:25 2015 Subject: [squeak-dev] 4.6 Notifiers broken In-Reply-To: <2BF070DE-7171-4605-A067-61ED90565754@rowledge.org> References: <2BF070DE-7171-4605-A067-61ED90565754@rowledge.org> Message-ID: <964000A3-FB98-4AD8-A9EF-115A4A40C0AD@rowledge.org> Well there?s some extra confusion now; I had been trying to run the SocketTest tests from a doit in order to make a nice example of a bug we are having in Raspbian. I was trying SocketTest allTestSelectors do: [:sel| SocketTest run: sel] which looked like it should work (whereas I really think something like SocketTest run ought to suffice) but that kept raising the new notifiers I am complaining about. Note that it opens *2* notifiers instead of stopping at the first one; that sound familiar from earlier discussions aboutWarning/Error/etc? It turns out that running the SocketTest from the TestRunner does the same thing in an image at update 15079 but not 15039. So I suspect something got a bit borked in there. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Strange OpCodes: BNE: Buy Non-IBM Equipment From asqueaker at gmail.com Mon Jul 6 21:44:37 2015 From: asqueaker at gmail.com (Chris Muller) Date: Mon Jul 6 21:44:40 2015 Subject: [squeak-dev] Unable to load older my.prefs file In-Reply-To: References: Message-ID: I have no problem loading my preferences. If you're able to resave a new prefs file and load that, maybe your prefs file was just old..? On Mon, Jul 6, 2015 at 2:58 PM, tim Rowledge wrote: > In a latest trunk image, fully updated, I tried to 'load from disk? my older preferences. It fails because in DiskProxy>comeFullyUpOnReload: the code does > > globalObj := Smalltalk at: symbol ifAbsent: [ > preSelector == nil & (constructorSelector = #yourself) ifTrue: [ > Transcript cr; show: symbol, ' is undeclared.'. > (Undeclared includesKey: symbol) ifTrue: [^ Undeclared at: symbol]. > Undeclared at: symbol put: nil. > ^ nil]. > ^ self error: 'Global "', symbol, '" not found']. > The symbol is #Context > > Saving a new preferences file and reloading seems to work. I?ve no idea where the #Context comes from and pretty much any attempt to look through the stack starts firing off annoying notifiers because the ?aDataStream? parameter in the IdentityDictionary>readDataFrom:size: is nil by this point. > Is this crucially important? Probably not but it will annoy anyone with a preferences file. > > tim > -- > tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim > Science is imagination equipped with grappling hooks. > > From tim at rowledge.org Mon Jul 6 21:49:13 2015 From: tim at rowledge.org (tim Rowledge) Date: Mon Jul 6 21:49:23 2015 Subject: [squeak-dev] Unable to load older my.prefs file In-Reply-To: References: Message-ID: <0DE51F26-04E9-444A-B1A5-1FF4F82D917E@rowledge.org> On 06-07-2015, at 2:44 PM, Chris Muller wrote: > I have no problem loading my preferences. If you're able to resave a > new prefs file and load that, maybe your prefs file was just old..? It?s possible, though the file in question is dated mid-april this year. I don?t actually interact much with the preferences since I?m either doing vm hacking and an image gets run for a short while to crash or not, or doing Scratch work and the prefs get set once and then left alone. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Fractured Idiom:- FUI GENERIS - What's mine is mine From commits at source.squeak.org Mon Jul 6 21:55:03 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 6 21:55:04 2015 Subject: [squeak-dev] Daily Commit Log Message-ID: <20150706215503.3705.qmail@box4.squeakfoundation.org> Changes to Trunk (http://source.squeak.org/trunk.html) in the last 24 hours: http://lists.squeakfoundation.org/pipermail/packages/2015-July/008800.html Name: Kernel-topa.935 Ancestors: Kernel-eem.934 Reinstall CompiledMethod>>#hasBreakpoint ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008801.html Name: System-topa.753 Ancestors: System-eem.752 Reinstall CompiledMethod>>#hasBreakpoint as an Override ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008802.html Name: Help-Squeak-Project-cmm.28 Ancestors: Help-Squeak-Project-dtl.27 Don't deliver the release image with duplicate instance of big String literals. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008803.html Name: MorphicExtras-cmm.164 Ancestors: MorphicExtras-nice.163 Allow flaps to be dragged again. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008804.html Name: ReleaseBuilder-cmm.126 Ancestors: ReleaseBuilder-mt.125 Now that condenseSources is working, make it a regular part of the release process. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008805.html Name: Compiler-topa.302 Ancestors: Compiler-eem.301 Don't be too strict if BlockNode scope setting is idempotent ============================================= From asqueaker at gmail.com Mon Jul 6 22:08:27 2015 From: asqueaker at gmail.com (Chris Muller) Date: Mon Jul 6 22:08:30 2015 Subject: [squeak-dev] 4.6 Notifiers broken In-Reply-To: <2BF070DE-7171-4605-A067-61ED90565754@rowledge.org> References: <2BF070DE-7171-4605-A067-61ED90565754@rowledge.org> Message-ID: Warnings were not working (see the thread, "Is this a bug with Step Over?") and that was a showstopper for release, now its fixed, but the current fix only gives us one chance to present application-formatted messages to the user-audience of applications. We'll be able to bring back the mini-stack for developers next release but it will require a slight retooling of the debugger's API, so that those cases where you want to see a mini-stack (developer) instead of the formatted message (user), but we're out of time to do that for this release. On Mon, Jul 6, 2015 at 3:33 PM, tim Rowledge wrote: > Looks like some recent changes I saw float past relating to Warnings vs Errors vs whatever have broken the notifiers we get for problems. Instead of an actual useful window with a fragment of the stack and the ability to open a debugger by clicking on one of the contexts, we now get an almost useless window. It isn?t making my day any happier. > > tim > -- > tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim > Esc key to reboot Universe, or any other key to continue... > > > From tim at rowledge.org Mon Jul 6 22:38:36 2015 From: tim at rowledge.org (tim Rowledge) Date: Mon Jul 6 22:38:44 2015 Subject: [squeak-dev] 4.6 Notifiers broken In-Reply-To: References: <2BF070DE-7171-4605-A067-61ED90565754@rowledge.org> Message-ID: On 06-07-2015, at 3:08 PM, Chris Muller wrote: > Warnings were not working (see the thread, "Is this a bug with Step > Over?") and that was a showstopper for release, now its fixed, but the > current fix only gives us one chance to present application-formatted > messages to the user-audience of applications. Ah, rats. I didn?t notice the ?can?t fix it now? part go by. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Strange OpCodes: SDP: Search and Destroy Pointer From ma.chris.m at gmail.com Mon Jul 6 22:57:01 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Mon Jul 6 22:57:03 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate Message-ID: Squeak4.6-15093 is now available at http://ftp.squeak.org/4.6/. It addresses the issues we found with RC1. The sources file was rebuilt again, which means the prior SqueakV46.sources file should not be trusted. For that reason, I actually decided to remove the RC1 files. Eliot said he wants to build the Cog VM one more time. Then I'll try to assemble the All-In-One. From eliot.miranda at gmail.com Mon Jul 6 23:25:48 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon Jul 6 23:25:53 2015 Subject: [squeak-dev] New Cog VMs available Message-ID: ... at http://www.mirandabanda.org/files/Cog/VM/VM.r3397 These are new release candidates. The Travis CI Newspeak bootstrap job caught a serious bug with become and process switch in the Spur VMs. CogVM binaries as per VMMaker.oscog-eem.1405/r3397 Spur: Make sure the post become action unforwards the Process in the activeProcess inst var. Add some more asserts to check. Also follow the specialObjectsArray after a pin become. Generically use storePointerUnchecked: when storing nils into the process lists. -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150706/247a20bd/attachment-0001.htm From eliot.miranda at gmail.com Mon Jul 6 23:26:29 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon Jul 6 23:26:32 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: References: Message-ID: Hi Chris, On Mon, Jul 6, 2015 at 3:57 PM, Chris Muller wrote: > Squeak4.6-15093 is now available at http://ftp.squeak.org/4.6/. It > addresses the issues we found with RC1. > > The sources file was rebuilt again, which means the prior > SqueakV46.sources file should not be trusted. For that reason, I > actually decided to remove the RC1 files. > > Eliot said he wants to build the Cog VM one more time. Then I'll try > to assemble the All-In-One. > The 3397 VMs are good to go. -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150706/80fc1df8/attachment.htm From lewis at mail.msen.com Mon Jul 6 23:31:03 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Mon Jul 6 23:31:07 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: References: Message-ID: <20150706233103.GA60024@shell.msen.com> On Mon, Jul 06, 2015 at 05:57:01PM -0500, Chris Muller wrote: > Squeak4.6-15093 is now available at http://ftp.squeak.org/4.6/. It > addresses the issues we found with RC1. > > The sources file was rebuilt again, which means the prior > SqueakV46.sources file should not be trusted. For that reason, I > actually decided to remove the RC1 files. > > Eliot said he wants to build the Cog VM one more time. Then I'll try > to assemble the All-In-One. Thanks Chris! The RC2 image has the same "crash the interpreter" issue as RC1. Based on your earlier note, I tried this today: - Start with Squeak4.5-13680.image from ftp.squeak.org - Using Cog, updated the image to latest current trunk, producing "Squeak4.5 of 6 July 2015 update 15093" - Save image and restart under interpreter VM. - Open SqueakMap, update it, and load TwosComplement ==> no problem - Quit image, no save. - Restart image on interpreter VM - Evaluate ReleaseBuilder prepareNewRelease (enter password) Notes: Warning: Tools-topa.520 not found in trunk. Warning: Kernel-topa.845 not found in trunk. Warning: Display extent not set to 800@600 Error: Missing snapshot: Sound-nice.38 ==> fail, errors related to sound package - Try again under Cog, same errors. Maybe needs to run on Mac? So at this point I can confirm that a trunk image fully updated from Squeak 4.5 works fine, with the update done on a Cog VM. However I am not able to run the prepareNewRelease to see its effect. The errors I am getting in #prepareNewRelease seem to be related to the sound package, so maybe it is some problem with my local system. Any advice? I am assuming that you are doing the build on your own system, so maybe you could give me a copy of the image that you produce immediately prior to running #prepareNewRelease? That should be equivalent to the image that I just updated (which works without problems), so that might give us an indication of whether the problem is introduced in #prepareNewRelease or somewhere else. Thanks (and thanks for your patience in working through these issues), Dave From asqueaker at gmail.com Tue Jul 7 01:32:07 2015 From: asqueaker at gmail.com (Chris Muller) Date: Tue Jul 7 01:32:11 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: <20150706233103.GA60024@shell.msen.com> References: <20150706233103.GA60024@shell.msen.com> Message-ID: Hi Dave, >> Squeak4.6-15093 is now available at http://ftp.squeak.org/4.6/. It >> addresses the issues we found with RC1. >> >> The sources file was rebuilt again, which means the prior >> SqueakV46.sources file should not be trusted. For that reason, I >> actually decided to remove the RC1 files. >> >> Eliot said he wants to build the Cog VM one more time. Then I'll try >> to assemble the All-In-One. > > Thanks Chris! > > The RC2 image has the same "crash the interpreter" issue as RC1. Based > on your earlier note, I tried this today: > > - Start with Squeak4.5-13680.image from ftp.squeak.org > > - Using Cog, updated the image to latest current trunk, producing "Squeak4.5 of 6 July 2015 update 15093" > > - Save image and restart under interpreter VM. > > - Open SqueakMap, update it, and load TwosComplement > ==> no problem Ok, so the problem must be something in the #prepareRelease process. > - Quit image, no save. > > - Restart image on interpreter VM > > - Evaluate ReleaseBuilder prepareNewRelease (enter password) #prepareNewRelease is not meant to be run from a release image (although that is not a bad idea to support). Dave, for debugging this, you don't need to be doing the part of prepareNewRelease which copies the mcz's because most likely that has nothing to do with the VM crash. You just need to look into all the things prepareNewRelease does to make a educated guess about which is causing the problem. > Notes: > Warning: Tools-topa.520 not found in trunk. > Warning: Kernel-topa.845 not found in trunk. > Warning: Display extent not set to 800@600 > Error: Missing snapshot: Sound-nice.38 > ==> fail, errors related to sound package These are probably 4.5-specific packages, backported fixes. Again, #prepareNewRelease is not meant to be run in a release image.. > - Try again under Cog, same errors. Maybe needs to run on Mac? > > So at this point I can confirm that a trunk image fully updated > from Squeak 4.5 works fine, with the update done on a Cog VM. However > I am not able to run the prepareNewRelease to see its effect. > > The errors I am getting in #prepareNewRelease seem to be related to > the sound package, so maybe it is some problem with my local system. > > Any advice? I am assuming that you are doing the build on your own > system, so maybe you could give me a copy of the image that you produce > immediately prior to running #prepareNewRelease? That should be equivalent > to the image that I just updated Yep. (which works without problems), so > that might give us an indication of whether the problem is introduced > in #prepareNewRelease or somewhere else. Please look into what prepareNewRelease does, it calls prepareNewBuild, which is nothing magical or stripping or unloading or anything. Its just a bunch of minor cleanups followed by condenseSources. I would start with everything up to the condenseSources first, see if that doesn't blow up.. Certainly, we want and need to still run on the classic interpreter VM. Please let me know soonish if you find the problem so we can correct it for the release. > > Thanks (and thanks for your patience in working through these issues), > > Dave > > From asqueaker at gmail.com Tue Jul 7 02:46:09 2015 From: asqueaker at gmail.com (Chris Muller) Date: Tue Jul 7 02:46:13 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: <20150706233103.GA60024@shell.msen.com> References: <20150706233103.GA60024@shell.msen.com> Message-ID: Probably the Compiler recompileAll..? On Mon, Jul 6, 2015 at 6:31 PM, David T. Lewis wrote: > On Mon, Jul 06, 2015 at 05:57:01PM -0500, Chris Muller wrote: >> Squeak4.6-15093 is now available at http://ftp.squeak.org/4.6/. It >> addresses the issues we found with RC1. >> >> The sources file was rebuilt again, which means the prior >> SqueakV46.sources file should not be trusted. For that reason, I >> actually decided to remove the RC1 files. >> >> Eliot said he wants to build the Cog VM one more time. Then I'll try >> to assemble the All-In-One. > > Thanks Chris! > > The RC2 image has the same "crash the interpreter" issue as RC1. Based > on your earlier note, I tried this today: > > - Start with Squeak4.5-13680.image from ftp.squeak.org > > - Using Cog, updated the image to latest current trunk, producing "Squeak4.5 of 6 July 2015 update 15093" > > - Save image and restart under interpreter VM. > > - Open SqueakMap, update it, and load TwosComplement > ==> no problem > > - Quit image, no save. > > - Restart image on interpreter VM > > - Evaluate ReleaseBuilder prepareNewRelease (enter password) > > Notes: > Warning: Tools-topa.520 not found in trunk. > Warning: Kernel-topa.845 not found in trunk. > Warning: Display extent not set to 800@600 > Error: Missing snapshot: Sound-nice.38 > ==> fail, errors related to sound package > > - Try again under Cog, same errors. Maybe needs to run on Mac? > > So at this point I can confirm that a trunk image fully updated > from Squeak 4.5 works fine, with the update done on a Cog VM. However > I am not able to run the prepareNewRelease to see its effect. > > The errors I am getting in #prepareNewRelease seem to be related to > the sound package, so maybe it is some problem with my local system. > > Any advice? I am assuming that you are doing the build on your own > system, so maybe you could give me a copy of the image that you produce > immediately prior to running #prepareNewRelease? That should be equivalent > to the image that I just updated (which works without problems), so > that might give us an indication of whether the problem is introduced > in #prepareNewRelease or somewhere else. > > Thanks (and thanks for your patience in working through these issues), > > Dave > > From eliot.miranda at gmail.com Tue Jul 7 03:10:28 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue Jul 7 03:10:31 2015 Subject: [squeak-dev] Unable to load older my.prefs file In-Reply-To: References: Message-ID: Hi Tim, On Mon, Jul 6, 2015 at 12:58 PM, tim Rowledge wrote: > In a latest trunk image, fully updated, I tried to 'load from disk? my > older preferences. It fails because in DiskProxy>comeFullyUpOnReload: the > code does > > globalObj := Smalltalk at: symbol ifAbsent: [ > preSelector == nil & (constructorSelector = #yourself) > ifTrue: [ > Transcript cr; show: symbol, ' is undeclared.'. > (Undeclared includesKey: symbol) ifTrue: [^ > Undeclared at: symbol]. > Undeclared at: symbol put: nil. > ^ nil]. > ^ self error: 'Global "', symbol, '" not found']. > The symbol is #Context > Is there any way a Pharo preferences file could have muddied the waters? Pharo refactored ContextPart and MethodContext to Context recently. But Squeak is still using the ContextPart/MethodContext names, and while BlockCOntext remains, it isn't used. > Saving a new preferences file and reloading seems to work. I?ve no idea > where the #Context comes from and pretty much any attempt to look through > the stack starts firing off annoying notifiers because the ?aDataStream? > parameter in the IdentityDictionary>readDataFrom:size: is nil by this point. > Is this crucially important? Probably not but it will annoy anyone with a > preferences file. > > tim > -- > tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim > Science is imagination equipped with grappling hooks. > > > -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150706/179b7ecd/attachment.htm From tim at rowledge.org Tue Jul 7 03:19:34 2015 From: tim at rowledge.org (tim Rowledge) Date: Tue Jul 7 03:19:41 2015 Subject: [squeak-dev] Unable to load older my.prefs file In-Reply-To: References: Message-ID: <2C7049DC-DC89-4BDF-A0BD-887E31551A99@rowledge.org> On 06-07-2015, at 8:10 PM, Eliot Miranda wrote: > Is there any way a Pharo preferences file could have muddied the waters? Pharo refactored ContextPart and MethodContext to Context recently. But Squeak is still using the ContextPart/MethodContext names, and while BlockCOntext remains, it isn't used. It?s not completely impossible, but somewhat unlikely. But the explanation makes sense, so... tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Hardware: The parts of a computer system that can be kicked. From lewis at mail.msen.com Tue Jul 7 12:33:41 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Tue Jul 7 12:33:47 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: References: <20150706233103.GA60024@shell.msen.com> Message-ID: <20150707123341.GA79970@shell.msen.com> On Mon, Jul 06, 2015 at 09:46:09PM -0500, Chris Muller wrote: > Probably the Compiler recompileAll..? Confirmed. Compiler recompileAll results in an image that crashes the interpreter VM. A fully updated trunk image works fine, but recompiling it breaks the image. Dave > > On Mon, Jul 6, 2015 at 6:31 PM, David T. Lewis wrote: > > On Mon, Jul 06, 2015 at 05:57:01PM -0500, Chris Muller wrote: > >> Squeak4.6-15093 is now available at http://ftp.squeak.org/4.6/. It > >> addresses the issues we found with RC1. > >> > >> The sources file was rebuilt again, which means the prior > >> SqueakV46.sources file should not be trusted. For that reason, I > >> actually decided to remove the RC1 files. > >> > >> Eliot said he wants to build the Cog VM one more time. Then I'll try > >> to assemble the All-In-One. > > > > Thanks Chris! > > > > The RC2 image has the same "crash the interpreter" issue as RC1. Based > > on your earlier note, I tried this today: > > > > - Start with Squeak4.5-13680.image from ftp.squeak.org > > > > - Using Cog, updated the image to latest current trunk, producing "Squeak4.5 of 6 July 2015 update 15093" > > > > - Save image and restart under interpreter VM. > > > > - Open SqueakMap, update it, and load TwosComplement > > ==> no problem > > > > - Quit image, no save. > > > > - Restart image on interpreter VM > > > > - Evaluate ReleaseBuilder prepareNewRelease (enter password) > > > > Notes: > > Warning: Tools-topa.520 not found in trunk. > > Warning: Kernel-topa.845 not found in trunk. > > Warning: Display extent not set to 800@600 > > Error: Missing snapshot: Sound-nice.38 > > ==> fail, errors related to sound package > > > > - Try again under Cog, same errors. Maybe needs to run on Mac? > > > > So at this point I can confirm that a trunk image fully updated > > from Squeak 4.5 works fine, with the update done on a Cog VM. However > > I am not able to run the prepareNewRelease to see its effect. > > > > The errors I am getting in #prepareNewRelease seem to be related to > > the sound package, so maybe it is some problem with my local system. > > > > Any advice? I am assuming that you are doing the build on your own > > system, so maybe you could give me a copy of the image that you produce > > immediately prior to running #prepareNewRelease? That should be equivalent > > to the image that I just updated (which works without problems), so > > that might give us an indication of whether the problem is introduced > > in #prepareNewRelease or somewhere else. > > > > Thanks (and thanks for your patience in working through these issues), > > > > Dave > > > > From Das.Linux at gmx.de Tue Jul 7 13:09:29 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Tue Jul 7 13:09:37 2015 Subject: [squeak-dev] name puzzle: how to name a message Message-ID: Hi all I've got a small naming puzzle: So we have x to: y that makes Intervall (x, x+1, x+2, ... , y) And we can do x to: x + z to get Intervall (x, x+1, x+2, ..., x+z) But we have x twice in there. What would you name the message x ???? z that gives Intervall (x, x+1, x+2, ..., x+z) I'm curious for your answers :) Best regards -Tobias PS: #by: is already taken for #to:by: PPS: A workaround is (0 to: z) + x From lecteur at zogotounga.net Tue Jul 7 13:14:53 2015 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Tue Jul 7 13:14:51 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: References: Message-ID: <559BD0CD.9070808@zogotounga.net> x extra: z ? Stef From jakob.reschke at student.hpi.de Tue Jul 7 13:39:13 2015 From: jakob.reschke at student.hpi.de (Jakob Reschke) Date: Tue Jul 7 13:39:41 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: References: Message-ID: x withSuccessors: z Jakob 2015-07-07 15:14 GMT+02:00 St?phane Rollandin : > x extra: z > > ? > > Stef > From Das.Linux at gmx.de Tue Jul 7 13:40:49 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Tue Jul 7 13:40:53 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: References: Message-ID: but what if z is negative? On 07.07.2015, at 15:39, Jakob Reschke wrote: > x withSuccessors: z > > Jakob > > 2015-07-07 15:14 GMT+02:00 St?phane Rollandin : >> x extra: z >> >> ? >> >> Stef From jakob.reschke at student.hpi.de Tue Jul 7 13:44:43 2015 From: jakob.reschke at student.hpi.de (Jakob Reschke) Date: Tue Jul 7 13:45:06 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: References: Message-ID: Then maybe x toOffset: z? 2015-07-07 15:40 GMT+02:00 Tobias Pape : > but what if z is negative? > > On 07.07.2015, at 15:39, Jakob Reschke wrote: > >> x withSuccessors: z >> >> Jakob >> >> 2015-07-07 15:14 GMT+02:00 St?phane Rollandin : >>> x extra: z >>> >>> ? >>> >>> Stef > > > From lecteur at zogotounga.net Tue Jul 7 13:50:38 2015 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Tue Jul 7 13:50:37 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: References: Message-ID: <559BD92E.8020605@zogotounga.net> x walking: z ? From nicolaihess at web.de Tue Jul 7 14:06:13 2015 From: nicolaihess at web.de (Nicolai Hess) Date: Tue Jul 7 14:06:17 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: References: Message-ID: 2015-07-07 15:09 GMT+02:00 Tobias Pape : > Hi all > > I've got a small naming puzzle: > > So we have > x to: y > that makes > Intervall (x, x+1, x+2, ... , y) > > And we can do > x to: x + z > to get > Intervall (x, x+1, x+2, ..., x+z) > > > But we have x twice in there. > > What would you name the message > x ???? z > that gives > Intervall (x, x+1, x+2, ..., x+z) > > I'm curious for your answers :) > > Best regards > -Tobias > > PS: #by: is already taken for #to:by: > PPS: A workaround is > (0 to: z) + x > > How about doing it the otherway around, and find a good name for (0 to: z) for example #asRange z asRange + x or z asRangeOffsetBy:x maybe, asRange is not a good name. nicolai -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150707/020f5b44/attachment.htm From cunningham.cb at gmail.com Tue Jul 7 14:22:50 2015 From: cunningham.cb at gmail.com (Chris Cunningham) Date: Tue Jul 7 14:22:52 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: References: Message-ID: x andNext: z x length: z ? On Tue, Jul 7, 2015 at 7:06 AM, Nicolai Hess wrote: > > > 2015-07-07 15:09 GMT+02:00 Tobias Pape : > >> Hi all >> >> I've got a small naming puzzle: >> >> So we have >> x to: y >> that makes >> Intervall (x, x+1, x+2, ... , y) >> >> And we can do >> x to: x + z >> to get >> Intervall (x, x+1, x+2, ..., x+z) >> >> >> But we have x twice in there. >> >> What would you name the message >> x ???? z >> that gives >> Intervall (x, x+1, x+2, ..., x+z) >> >> I'm curious for your answers :) >> >> Best regards >> -Tobias >> >> PS: #by: is already taken for #to:by: >> PPS: A workaround is >> (0 to: z) + x >> >> > How about doing it the otherway around, and find a good name for (0 to: z) > for example #asRange > > z asRange + x > or > z asRangeOffsetBy:x > > maybe, asRange is not a good name. > > nicolai > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150707/00ee4d0b/attachment.htm From lecteur at zogotounga.net Tue Jul 7 15:07:18 2015 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Tue Jul 7 15:07:17 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: References: Message-ID: <559BEB26.7000007@zogotounga.net> > x andNext: z +1 Stef From ma.chris.m at gmail.com Tue Jul 7 15:11:15 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Tue Jul 7 15:11:20 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: <20150707123341.GA79970@shell.msen.com> References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> Message-ID: On Tue, Jul 7, 2015 at 7:33 AM, David T. Lewis wrote: > On Mon, Jul 06, 2015 at 09:46:09PM -0500, Chris Muller wrote: >> Probably the Compiler recompileAll..? > > Confirmed. > > Compiler recompileAll results in an image that crashes the interpreter VM. > A fully updated trunk image works fine, but recompiling it breaks the image. Interpreter VM will not be able to run Spur images going forward. So this is the last possible release to support the Interpreter VM anyway is that right? Maybe it is time to abandon Interpreter VMj? Or release 4.6 without the recompileAll and release 5.0 with it? Please let me know how you would like to proceed. From Das.Linux at gmx.de Tue Jul 7 15:17:59 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Tue Jul 7 15:18:03 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> Message-ID: <86423F6C-BB97-478D-A776-53675576BBC0@gmx.de> On 07.07.2015, at 17:11, Chris Muller wrote: > On Tue, Jul 7, 2015 at 7:33 AM, David T. Lewis wrote: >> On Mon, Jul 06, 2015 at 09:46:09PM -0500, Chris Muller wrote: >>> Probably the Compiler recompileAll..? >> >> Confirmed. >> >> Compiler recompileAll results in an image that crashes the interpreter VM. >> A fully updated trunk image works fine, but recompiling it breaks the image. > > Interpreter VM will not be able to run Spur images going forward. Pardon? > So > this is the last possible release to support the Interpreter VM anyway > is that right? > > Maybe it is time to abandon Interpreter VMj? Or release 4.6 without > the recompileAll and release 5.0 with it? > > Please let me know how you would like to proceed. From asqueaker at gmail.com Tue Jul 7 15:26:54 2015 From: asqueaker at gmail.com (Chris Muller) Date: Tue Jul 7 15:26:57 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: <86423F6C-BB97-478D-A776-53675576BBC0@gmx.de> References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <86423F6C-BB97-478D-A776-53675576BBC0@gmx.de> Message-ID: >> Interpreter VM will not be able to run Spur images going forward. > > Pardon? Download latest Spur image and changes: http://www.mirandabanda.org/files/Cog/VM/SpurImages/trunk46-spur.image http://www.mirandabanda.org/files/Cog/VM/SpurImages/trunk46-spur.changes and latest interpreter VM. Then try: squeak trunk46-spur.image Results: This interpreter (vers. 0) cannot read image file (vers. 6521). Press CR to quit... From Das.Linux at gmx.de Tue Jul 7 15:31:38 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Tue Jul 7 15:31:42 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <86423F6C-BB97-478D-A776-53675576BBC0@gmx.de> Message-ID: <1F2C660D-934B-487C-9391-C96A55E524A9@gmx.de> On 07.07.2015, at 17:26, Chris Muller wrote: >>> Interpreter VM will not be able to run Spur images going forward. >> >> Pardon? > > Download latest Spur image and changes: > > http://www.mirandabanda.org/files/Cog/VM/SpurImages/trunk46-spur.image > > http://www.mirandabanda.org/files/Cog/VM/SpurImages/trunk46-spur.changes > > and latest interpreter VM. Then try: > > squeak trunk46-spur.image > > Results: > > This interpreter (vers. 0) cannot read image file (vers. 6521). > Press CR to quit... Well, your sentence sounded as if there's no intention of making the interpreter VM SPUR-aware whatsoever. Surely I got that wrong, didn't I? Best regards -Tobias From brasspen at gmail.com Tue Jul 7 16:18:51 2015 From: brasspen at gmail.com (Chris Cunnington) Date: Tue Jul 7 16:18:55 2015 Subject: [squeak-dev] Crashing Interpreter Message-ID: I said before that I found with an interpreter vm I could reproduce the crash David described using this in a Workspace: MCMcmUpdater updateFromRepository: ' http://www.squeaksource.com/TwosComplement' baseName: 'update' I find with RC2 it still crashes quite reliably. Linux vm version 4.13.12-3323. I decided to lay in self halts to look for the point before it crashed. This brought me to MCConfiguration>>depsSatisfying:versionDo:displayingProgress:. That's salient, because the last thing you see before the crash is a progress bar. The stepping point for the crash is just after MCReorganizationPreloader preloadMovesBetween: selectedVersions. If I place a self halt before that I get a debug window. If I place it after that I get a crash. So I stepped into that and explored #preloadMovesBetween: which looks like this: preloadMovesBetween: versions | loader | loader := self new. self halt. "location #1" versions do: [ :version | loader addVersion: version]. self halt. "location #2" ^ loader preload If I run with the self halt at location #1 I get a debug window. If I remove self halt location #1 and set it to self location #2 I get the crash. I don't know why it's crashing, but I posit that it may not be about Monticello and instead may be about nested blocks. #depsSatisfying:versionDo:displayingProgress: has a block within a block. And here's another block. Perhaps something is going wrong with this nesting? As I say, I don't really know, but it was interesting to try and find the point where it crashed. Two last things. Everything I just said applies also when employing the Squeak-4.10.2.2614-linux_i386 vm from squeakvm.org. David's first email displayed error output ending with: >* 23038864 WorldState>doOneCycleFor: *>* 23038772 PasteUpMorph>doOneCycle *>* 5017264 MorphicProject>? *>* 5017136 BlockClosure>?* You will see the crash point ends with a question about blocks. The previous listing cites MorphicProject. Hmm, don't we have a known problem with Projects these days? Something about Projects not being able to load? All this may of no account, but it was interesting to try and isolate the problem. FWIW, Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150707/c74440fb/attachment.htm From eliot.miranda at gmail.com Tue Jul 7 17:05:45 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue Jul 7 17:05:52 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: References: Message-ID: <60A375C8-B899-49BA-BF01-9992D35CBD4D@gmail.com> Hi Tobias, On Jul 7, 2015, at 6:09 AM, Tobias Pape wrote: > Hi all > > I've got a small naming puzzle: > > So we have > x to: y > that makes > Intervall (x, x+1, x+2, ... , y) > > And we can do > x to: x + z > to get > Intervall (x, x+1, x+2, ..., x+z) > > > But we have x twice in there. > > What would you name the message > x ???? z > that gives > Intervall (x, x+1, x+2, ..., x+z) > > I'm curious for your answers :) I'm in two mins about this. I really think that considering the reader is important. Is a variable to hold x so bad? Adding yet another API call puts cognitive load in us and forces the new reader to go to the browser to learn what this tiny piece of syntactic sugar adds. Is it really worth it? But since extreme brevity and lots of brief syntactic sugar is the de jure style I guess I'll have to deal with this so let me say andNext: doesn't have any correlates that I know of but throughNext: throughSum: have correlates in stream methods, and toSum: correlates with to: and implies toProduct: if ever someone really wanted it ;-) > > Best regards > -Tobias > > PS: #by: is already taken for #to:by: > PPS: A workaround is > (0 to: z) + x Eliot (phone) From lewis at mail.msen.com Tue Jul 7 18:31:42 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Tue Jul 7 18:31:46 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> Message-ID: <13878.136.2.1.105.1436293902.squirrel@webmail.msen.com> I am away and cannot follow up on this for a while. My guess would be that there is something wrong in the compiler, and that it needs to be fixed (but I cannot check now to find out). I don't know if this affects SqueakJS or other VMs. Dave > On Tue, Jul 7, 2015 at 7:33 AM, David T. Lewis > wrote: >> On Mon, Jul 06, 2015 at 09:46:09PM -0500, Chris Muller wrote: >>> Probably the Compiler recompileAll..? >> >> Confirmed. >> >> Compiler recompileAll results in an image that crashes the interpreter >> VM. >> A fully updated trunk image works fine, but recompiling it breaks the >> image. > > Interpreter VM will not be able to run Spur images going forward. So > this is the last possible release to support the Interpreter VM anyway > is that right? > > Maybe it is time to abandon Interpreter VMj? Or release 4.6 without > the recompileAll and release 5.0 with it? > > Please let me know how you would like to proceed. > From karlramberg at gmail.com Tue Jul 7 19:12:56 2015 From: karlramberg at gmail.com (karl ramberg) Date: Tue Jul 7 19:12:59 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: <13878.136.2.1.105.1436293902.squirrel@webmail.msen.com> References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <13878.136.2.1.105.1436293902.squirrel@webmail.msen.com> Message-ID: This error kind of sound like the error that we had in Spur and Cog a while back. I'm not sure it is related. Karl On Tue, Jul 7, 2015 at 8:31 PM, David T. Lewis wrote: > I am away and cannot follow up on this for a while. > > My guess would be that there is something wrong in the compiler, and that > it needs to be fixed (but I cannot check now to find out). I don't know if > this affects SqueakJS or other VMs. > > Dave > > > On Tue, Jul 7, 2015 at 7:33 AM, David T. Lewis > > wrote: > >> On Mon, Jul 06, 2015 at 09:46:09PM -0500, Chris Muller wrote: > >>> Probably the Compiler recompileAll..? > >> > >> Confirmed. > >> > >> Compiler recompileAll results in an image that crashes the interpreter > >> VM. > >> A fully updated trunk image works fine, but recompiling it breaks the > >> image. > > > > Interpreter VM will not be able to run Spur images going forward. So > > this is the last possible release to support the Interpreter VM anyway > > is that right? > > > > Maybe it is time to abandon Interpreter VMj? Or release 4.6 without > > the recompileAll and release 5.0 with it? > > > > Please let me know how you would like to proceed. > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150707/396ee8c7/attachment-0001.htm From ma.chris.m at gmail.com Tue Jul 7 19:34:48 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Tue Jul 7 19:34:49 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: <13878.136.2.1.105.1436293902.squirrel@webmail.msen.com> References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <13878.136.2.1.105.1436293902.squirrel@webmail.msen.com> Message-ID: Maybe the problem is in the image, the interpreter VM or the TwosComplement package, we don't know. Since it does not appear likely anyone will be able to investigate it soon, and the nature of both releases is about all-new VM(s) anyway, we probably should not hold up the release over this. In fact, I could make another RC without the recompileAll. Is it really necessary? I don't know any better about its purpose than why it would be a problem. I guess anyone could do it on their own if they wanted.. On Tue, Jul 7, 2015 at 1:31 PM, David T. Lewis wrote: > I am away and cannot follow up on this for a while. > > My guess would be that there is something wrong in the compiler, and that > it needs to be fixed (but I cannot check now to find out). I don't know if > this affects SqueakJS or other VMs. > > Dave > >> On Tue, Jul 7, 2015 at 7:33 AM, David T. Lewis >> wrote: >>> On Mon, Jul 06, 2015 at 09:46:09PM -0500, Chris Muller wrote: >>>> Probably the Compiler recompileAll..? >>> >>> Confirmed. >>> >>> Compiler recompileAll results in an image that crashes the interpreter >>> VM. >>> A fully updated trunk image works fine, but recompiling it breaks the >>> image. >> >> Interpreter VM will not be able to run Spur images going forward. So >> this is the last possible release to support the Interpreter VM anyway >> is that right? >> >> Maybe it is time to abandon Interpreter VMj? Or release 4.6 without >> the recompileAll and release 5.0 with it? >> >> Please let me know how you would like to proceed. >> > > From bert at freudenbergs.de Tue Jul 7 20:06:09 2015 From: bert at freudenbergs.de (Bert Freudenberg) Date: Tue Jul 7 20:06:16 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: References: Message-ID: <8DECD321-65C8-4CF0-B734-3492664D188B@freudenbergs.de> On 07.07.2015, at 06:09, Tobias Pape wrote: > > Hi all > > I've got a small naming puzzle: > > So we have > x to: y > that makes > Intervall (x, x+1, x+2, ... , y) > > And we can do > x to: x + z > to get > Intervall (x, x+1, x+2, ..., x+z) > > > But we have x twice in there. > > What would you name the message > x ???? z > that gives > Intervall (x, x+1, x+2, ..., x+z) > > I'm curious for your answers :) > > Best regards > -Tobias x steps: z x steps: z by: b x withNext: z x withNext: z by: b - Bert - -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 4115 bytes Desc: not available Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150707/2263d4f2/smime.bin From commits at source.squeak.org Tue Jul 7 20:56:26 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Tue Jul 7 20:56:28 2015 Subject: [squeak-dev] The Trunk: Compiler.spur-topa.302.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler.spur-topa.302.mcz ==================== Summary ==================== Name: Compiler.spur-topa.302 Author: eem Time: 7 July 2015, 1:55:40.728 pm UUID: 9d9f641a-b168-4bbf-9ee3-21d896b55797 Ancestors: Compiler-topa.302, Compiler.spur-eem.301 Compiler-topa.302 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Don't be too strict if BlockNode scope setting is idempotent =============== Diff against Compiler-topa.302 =============== Item was changed: ----- Method: BytecodeEncoder>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method generation') ----- computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex + numArgs > 15 ifTrue: + [^self error: 'Cannot compile -- too many arguments']. + numTemps > 63 ifTrue: + [^self error: 'Cannot compile -- too many temporary variables']. + numLits > 65535 ifTrue: + [^self error: 'Cannot compile -- too many literals']. + ^(CompiledMethod headerFlagForEncoder: self) + + (numArgs bitShift: 24) + + (numTemps bitShift: 18) + "+ (largeBit bitShift: 17)" "largeBit gets filled in later" + + (primitiveIndex > 0 ifTrue: [1 bitShift: 16] ifFalse: [0]) + + numLits! - "Compute the compiled method header that encodes the arguments - in the receiver's header format (see CompiledMehtod's class comment)." - self subclassResponsibility! Item was removed: - ----- Method: EncoderForV3>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method generation') ----- - computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex - | primBits | - numTemps > 63 ifTrue: - [^self error: 'Cannot compile -- too many temporary variables']. - numLits > 255 ifTrue: - [^self error: 'Cannot compile -- too many literals']. - primBits := primitiveIndex <= 16r1FF - ifTrue: [primitiveIndex] - ifFalse: "For now the high bit of primitive no. is in the 29th bit of header" - [primitiveIndex > 16r3FF ifTrue: [self error: 'prim num too large']. - (primitiveIndex bitAnd: 16r1FF) + ((primitiveIndex bitAnd: 16r200) bitShift: 19)]. - ^(numArgs bitShift: 24) - + (numTemps bitShift: 18) - "+ (largeBit bitShift: 17)" "largeBit gets filled in later" - + (numLits bitShift: 9) - + primBits! Item was changed: ----- Method: EncoderForV3PlusClosures class>>bytecodeSize: (in category 'instruction stream support') ----- bytecodeSize: bytecode "Answer the number of bytes in the bytecode." bytecode <= 125 ifTrue: [^1]. bytecode >= 176 ifTrue: [^1]. bytecode >= 160 ifTrue: "long jumps" [^2]. bytecode >= 144 ifTrue: "short jumps" [^1]. "extensions" bytecode >= 128 ifTrue: + [^#(2 2 2 2 3 2 2 1 1 1 2 3 3 3 3 4) at: bytecode - 127]. - [^#(2 2 2 2 3 2 2 1 1 1 2 nil 3 3 3 4) at: bytecode - 127]. ^nil! Item was added: + ----- Method: EncoderForV3PlusClosures class>>callPrimitiveCode (in category 'bytecode decoding') ----- + callPrimitiveCode + "139 11101111 iiiiiiii jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)" + ^139! Item was added: + ----- Method: EncoderForV3PlusClosures>>genCallPrimitive: (in category 'bytecode generation') ----- + genCallPrimitive: primitiveIndex + "139 11101111 iiiiiiii jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)" + (primitiveIndex < 1 or: [primitiveIndex > 65535]) ifTrue: + [self outOfRangeError: 'primitive index' index: primitiveIndex range: 1 to: 65535]. + stream + nextPut: 139; + nextPut: (primitiveIndex bitAnd: 255); + nextPut: (primitiveIndex bitShift: -8)! Item was changed: ----- Method: MethodNode>>generate:using: (in category 'code generation') ----- generate: trailer using: aCompiledMethodClass "The receiver is the root of a parse tree. Answer an instance of aCompiledMethodClass. The argument, trailer, is arbitrary but is typically either the reference to the source code that is stored with every CompiledMethod, or an encoding of the method's temporary names." + | primErrNode blkSize nLits locals literals stack header method | - | primErrNode blkSize nLits literals stack method | self generate: trailer using: aCompiledMethodClass ifQuick: [:m | encoder noteBlockExtent: (0 to: 2) hasLocals: arguments. m literalAt: 2 put: encoder associationForClass; properties: properties. ^m]. primErrNode := self primitiveErrorVariableName ifNotNil: [encoder fixTemp: self primitiveErrorVariableName]. + self ensureClosureAnalysisDone. + encoder rootNode: self. "this is for BlockNode>>sizeCodeForClosureValue:" - encoder supportsClosureOpcodes ifTrue: - [self ensureClosureAnalysisDone. - encoder rootNode: self. "this is for BlockNode>>sizeCodeForClosureValue:"]. blkSize := (block sizeCodeForEvaluatedValue: encoder) + + (primitive > 0 + ifTrue: [encoder sizeCallPrimitive: primitive] + ifFalse: [0]) + (primErrNode ifNil: [0] ifNotNil: [primErrNode index: arguments size + temporaries size; sizeCodeForStore: encoder "The VM relies on storeIntoTemp: (129)"]). + locals := arguments, temporaries, (primErrNode ifNil: [#()] ifNotNil: [{primErrNode}]). + encoder noteBlockExtent: block blockExtent hasLocals: locals. + header := encoder computeMethodHeaderForNumArgs: arguments size + numTemps: locals size + numLits: (nLits := (literals := encoder allLiterals) size) + primitive: primitive. + method := trailer + createMethod: blkSize + class: aCompiledMethodClass + header: header. - method := aCompiledMethodClass - newBytes: blkSize - trailerBytes: trailer - nArgs: arguments size - nTemps: (encoder supportsClosureOpcodes - ifTrue: [| locals | - locals := arguments, - temporaries, - (primErrNode - ifNil: [#()] - ifNotNil: [{primErrNode}]). - encoder - noteBlockExtent: block blockExtent - hasLocals: locals. - locals size] - ifFalse: [encoder maxTemp]) - nStack: 0 - nLits: (nLits := (literals := encoder allLiterals) size) - primitive: primitive. - nLits > 255 ifTrue: - [^self error: 'Too many literals referenced']. 1 to: nLits do: [:lit | method literalAt: lit put: (literals at: lit)]. encoder streamToMethod: method. stack := ParseStack new init. + primitive > 0 ifTrue: + [encoder genCallPrimitive: primitive. + primErrNode ifNotNil: + [primErrNode emitCodeForStore: stack encoder: encoder]]. - primErrNode ifNotNil: [primErrNode emitCodeForStore: stack encoder: encoder]. stack position: method numTemps. [block emitCodeForEvaluatedValue: stack encoder: encoder] on: Error "If an attempt is made to write too much code the method will be asked" do: [:ex| "to grow, and the grow attempt will fail in CompiledMethod class>>#new:" ex signalerContext sender method = (CompiledMethod class>>#new:) ifTrue: [^self error: 'Compiler code size discrepancy'] ifFalse: [ex pass]]. stack position ~= (method numTemps + 1) ifTrue: [^self error: 'Compiler stack discrepancy']. encoder methodStreamPosition ~= (method size - trailer size) ifTrue: [^self error: 'Compiler code size discrepancy']. method needsFrameSize: stack size - method numTemps. method properties: properties. ^method! From commits at source.squeak.org Tue Jul 7 20:58:54 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Tue Jul 7 20:59:01 2015 Subject: [squeak-dev] The Trunk: System.spur-cmm.751.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System.spur-cmm.751.mcz ==================== Summary ==================== Name: System.spur-cmm.751 Author: eem Time: 7 July 2015, 1:55:50.036 pm UUID: 6bfeaf18-bf47-43b4-a6f3-67b57f341fa7 Ancestors: System-cmm.751, System.spur-eem.750 System-cmm.751 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Restore classic Warning window because it supports application-formatted messages which can wrap and scroll as needed. =============== Diff against System-cmm.751 =============== Item was removed: - Object subclass: #ObjectHistory - instanceVariableNames: 'marks markProcess' - classVariableNames: 'Current ObjectHistoryEnabled' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! - ObjectHistory holds ObjectHistoryMark objects which are placed in the object memory at regular intervals by its markProcess in the background. Adjacent marks (with no remaining objects inbetween) are coalesced so over time the collection does not grow unnecessarily large. - - Using these markers it is possible to determine the age of objects in memory from the time the ObjectHistory was initialized. Try e.g.: - self oopTimestamp. - self oopAge. - ObjectHistory current oopClassesByDate. - - Instance Variables - marks: SortedCollection of ObjectHistoryMark objects - markProcess: a Process running our markLoop - ! Item was removed: - ----- Method: ObjectHistory class>>current (in category 'accessing') ----- - current - ^ Current ifNil: [Current := self new]! Item was removed: - ----- Method: ObjectHistory class>>initialize (in category 'class initialization') ----- - initialize - self current. - ! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category 'preferences') ----- - keepTrackOfObjectHistory - - ^ ObjectHistoryEnabled ifNil: [ - Current - ifNil: [false] - ifNotNil: [:objectHistory | objectHistory isRunning]]! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in category 'preferences') ----- - keepTrackOfObjectHistory: aBoolean - " Reflect the desired state by starting/stopping the process if necessary " - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. - ObjectHistoryEnabled := aBoolean. - - Current - ifNil: [aBoolean ifTrue: [self current]] - ifNotNil: [:objectHistory | - (objectHistory isRunning xor: aBoolean) "state switch needed" - ifTrue: [objectHistory toggleRunning]].! Item was removed: - ----- Method: ObjectHistory class>>obsolete (in category 'class initialization') ----- - obsolete - "Kill the mark process before removing the class." - Current ifNotNil: - [:objectHistory| - objectHistory terminate]. - super obsolete! Item was removed: - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- - ageOf: anObject - "Age of anObject in seconds" - | timestamp | - timestamp := self timestampOf: anObject. - timestamp ifNil: [^0]. - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! Item was removed: - ----- Method: ObjectHistory>>initialize (in category 'initializing') ----- - initialize - self restartMarkProcess. - - ! Item was removed: - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- - isRunning - ^ markProcess - ifNil: [false] - ifNotNil: [:process | - process isSuspended not and: [ - process isTerminated not]]! Item was removed: - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- - markLoop - [true] whileTrue: [ - self markUpdate. - (Delay forSeconds: self markRate) wait]! Item was removed: - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- - markRate - "rate of creating ObjectHistoryMarks" - ^60! Item was removed: - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- - markUpdate - "Add a new mark and compact the marks collection" - | mark prev | - "lazy init so this happens in the background process" - marks ifNil: [self reinitMarks]. - "add new mark to object memory" - mark := self newMark. - mark timestamp <= marks last timestamp ifTrue: [^self "could happen if clock is wrong"]. - marks addLast: mark. - "compact the table by removing adjacent marks" - prev := marks first. - marks removeAllSuchThat: [:each | | doDelete | - doDelete := prev objectAfter == each. - prev := each. - doDelete]. - "The loop above is O(n) in number of marks, but that number should never become so large to be an issue. Even if the number was large, this is running at system background priority so should not interfere with any user process, not even user background processes. The symptom should only be that the system is less idle. - - If we ever get to a point where the number of marks is an issue then the compacting here could be made partial: since old marks rarely get coalesced it would make sense to only check the newer ones often, and the old ones perhaps only at the system startup."! Item was removed: - ----- Method: ObjectHistory>>newMark (in category 'private') ----- - newMark - ^ ObjectHistoryMark new! Item was removed: - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- - oopClassesByAge - "Answer collection of (oopAge in seconds -> sorted counts of object classes) sorted from lowest age" - "ObjectHistory current oopClassesByAge" - - | stats prev endOfMemory now bag age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - bag := Bag new. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> bag sortedCounts]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') ----- - oopClassesByDate - "Answer collection of (Date -> sorted counts of object classes) sorted from newest date" - "ObjectHistory current oopClassesByDate" - - | stats prev endOfMemory bag date obj thisDate | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - thisDate := nil. - bag := Bag new. - marks do: [:mark | - prev ifNotNil: [ - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - date := mark timestamp asDate. - thisDate = date ifFalse: [ - stats addFirst: date -> bag sortedCounts. - bag := Bag new. - thisDate := date]]. - prev := mark]. - thisDate = date ifFalse: [ - stats addLast: date -> bag sortedCounts]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- - oopCountsByAge - "Answer collection of (oopAge in seconds -> number of objects) sorted from lowest age" - "ObjectHistory current oopCountsByAge" - - | stats prev endOfMemory now n age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - n := 0. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - n := n + 1. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> n]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- - reinitMarks - marks := ObjectHistoryMark allInstances asOrderedCollection. - marks - ifEmpty: [marks add: self newMark] - ifNotEmpty: [ | prev | - prev := nil. - marks removeAllSuchThat: [:obj | - prev notNil and: [prev timestamp >= obj timestamp]]]. - ! Item was removed: - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') ----- - restartMarkProcess - markProcess ifNotNil: [markProcess terminate]. - markProcess := [self markLoop] - forkAt: Processor systemBackgroundPriority - named: 'ObjectHistory''s markProcess'. - ! Item was removed: - ----- Method: ObjectHistory>>terminate (in category 'private') ----- - terminate - markProcess ifNotNil: - [markProcess terminate]! Item was removed: - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- - timestampOf: anObject - "Timestamp of anObject, or nil if too new" - | endOfMemory mark | - anObject class == SmallInteger ifTrue: [^nil]. - mark := anObject. - endOfMemory := Object new. - [mark class == ObjectHistoryMark] whileFalse: [ - mark := mark nextObject. - mark == endOfMemory ifTrue: [^nil]]. - ^mark timestamp! Item was removed: - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- - toggleRunning - self isRunning - ifTrue: [self terminate] - ifFalse: [self restartMarkProcess]! Item was removed: - Object subclass: #ObjectHistoryMark - instanceVariableNames: 'timestamp' - classVariableNames: '' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! - An ObjectHistoryMark is a permanent mark in the object memory. It holds a timestamp. - - While the timestamp could be used directly as mark by ObjectHistory, it's conceivable that its format might change in the future, and we do not want the mark's relative position in memory to change (which would be the case if it was migrated to a new format). So we use a distinct object instead (and we protect it against accidental become-ing by overriding those methods).! Item was removed: - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- - become: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') ----- - becomeForward: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>initialize (in category 'initialization') ----- - initialize - timestamp := DateAndTime now floor. - ! Item was removed: - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') ----- - objectAfter - "Answer the next object in memory after me and my timestamp" - | successor | - successor := self nextObject. - successor == timestamp - ifTrue: [successor := successor nextObject]. - ^ successor! Item was removed: - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- - printOn: aStream - aStream - nextPutAll: self class name; - nextPut: $(; - print: timestamp; - nextPut: $)! Item was removed: - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') ----- - timestamp - ^timestamp - ! Item was changed: ----- Method: SmalltalkImage>>compactClassesArray (in category 'special objects') ----- compactClassesArray "Smalltalk compactClassesArray" + "Backward-compatibility support. Spur does not have compact classes." + ^{}! - "Return the array of 31 classes whose instances may be - represented compactly" - ^ self specialObjectsArray at: 29! Item was added: + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Essential. Fail if no memory is available." + + (numBytes isInteger and: [numBytes > 0]) ifTrue: + [OutOfMemory signal]. + ^self primitiveFailed! Item was added: + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was changed: ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') ----- primBytesLeft + "Primitive. Answer the number of free bytes available in old space. + Not accurate unless preceded by - "Primitive. Answer the number of bytes available for new object data. - Not accurate unless preceded by Smalltalk garbageCollectMost (for reasonable accuracy), or Smalltalk garbageCollect (for real accuracy). + See Object documentation whatIsAPrimitive." - See Object documentation whatIsAPrimitive." + ^0! - ^ 0! Item was changed: ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category 'memory space') ----- primitiveGarbageCollect + "Primitive. Reclaims all garbage and answers the size of the largest free chunk in old space.." - "Primitive. Reclaims all garbage and answers the number of bytes of available space." + ^self primitiveFailed! - ^ self primBytesLeft! Item was changed: ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category 'special objects') ----- recreateSpecialObjectsArray "Smalltalk recreateSpecialObjectsArray" "To external package developers: **** DO NOT OVERRIDE THIS METHOD. ***** If you are writing a plugin and need additional special object(s) for your own use, use addGCRoot() function and use own, separate special objects registry " "The Special Objects Array is an array of objects used by the Squeak virtual machine. Its contents are critical and accesses to it by the VM are unchecked, so don't even think of playing here unless you know what you are doing." | newArray | + newArray := Array new: 60. - newArray := Array new: 58. "Nil false and true get used throughout the interpreter" newArray at: 1 put: nil. newArray at: 2 put: false. newArray at: 3 put: true. "This association holds the active process (a ProcessScheduler)" newArray at: 4 put: (self specialObjectsArray at: 4) "(self bindingOf: #Processor) but it answers an Alias". "Numerous classes below used for type checking and instantiation" newArray at: 5 put: Bitmap. newArray at: 6 put: SmallInteger. newArray at: 7 put: ByteString. newArray at: 8 put: Array. newArray at: 9 put: Smalltalk. + newArray at: 10 put: BoxedFloat64. + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: [self globals at: #Context]). + newArray at: 12 put: nil. "was BlockContext." - newArray at: 10 put: Float. - newArray at: 11 put: MethodContext. - newArray at: 12 put: BlockContext. newArray at: 13 put: Point. newArray at: 14 put: LargePositiveInteger. newArray at: 15 put: Display. newArray at: 16 put: Message. newArray at: 17 put: CompiledMethod. + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: [Semaphore new]). "low space Semaphore" - newArray at: 18 put: (self specialObjectsArray at: 18). - "(low space Semaphore)" newArray at: 19 put: Semaphore. newArray at: 20 put: Character. newArray at: 21 put: #doesNotUnderstand:. newArray at: 22 put: #cannotReturn:. newArray at: 23 put: nil. "This is the process signalling low space." "An array of the 32 selectors that are compiled as special bytecodes, paired alternately with the number of arguments each takes." newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 #* 1 #/ 1 #\\ 1 #@ 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 #at: 1 #at:put: 2 #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 #blockCopy: 1 #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). "An array of the 255 Characters in ascii order. + Cog inlines table into machine code at: prim so do not regenerate it. + This is nil in Spur, which has immediate Characters." - Cog inlines table into machine code at: prim so do not regenerate it." newArray at: 25 put: (self specialObjectsArray at: 25). newArray at: 26 put: #mustBeBoolean. newArray at: 27 put: ByteArray. newArray at: 28 put: Process. + "An array of up to 31 classes whose instances will have compact headers; an empty array in Spur" - "An array of up to 31 classes whose instances will have compact headers" newArray at: 29 put: self compactClassesArray. + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: [Semaphore new]). "delay Semaphore" + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: [Semaphore new]). "user interrupt Semaphore" - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay Semaphore)" - newArray at: 31 put: (self specialObjectsArray at: 31). "(user interrupt Semaphore)" "Entries 32 - 34 unreferenced. Previously these contained prototype instances to be copied for fast initialization" + newArray at: 32 put: nil. "was the prototype Float" + newArray at: 33 put: nil. "was the prototype 4-byte LargePositiveInteger" + newArray at: 34 put: nil. "was the prototype Point" - newArray at: 32 put: nil. "was (Float new: 2)" - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" - newArray at: 34 put: nil. "was Point new" newArray at: 35 put: #cannotInterpret:. + newArray at: 36 put: nil. "was the prototype MethodContext" - "Note: This must be fixed once we start using context prototypes (yeah, right)" - "(MethodContext new: CompiledMethod fullFrameSize)." - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the prototype MethodContext (unused by the VM)" newArray at: 37 put: BlockClosure. + newArray at: 38 put: nil. "was the prototype BlockContext" - "(BlockContext new: CompiledMethod fullFrameSize)." - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the prototype BlockContext (unused by the VM)" "array of objects referred to by external code" + newArray at: 39 put: (self specialObjectsArray at: 39). "external semaphores" - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve external semaphores" newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls in CogMT" + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). "finalization Semaphore" - newArray at: 41 put: nil. "Reserved for a LinkedList instance for overlapped calls in CogMT" - "finalization Semaphore" - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). newArray at: 43 put: LargeNegativeInteger. "External objects for callout. Note: Written so that one can actually completely remove the FFI." newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). newArray at: 46 put: (self at: #ExternalData ifAbsent: []). newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). newArray at: 49 put: #aboutToReturn:through:. newArray at: 50 put: #run:with:in:. "51 reserved for immutability message" + newArray at: 51 put: #attemptToAssign:withIndex:. - "newArray at: 51 put: #attemptToAssign:withIndex:." - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: []). newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' #'bad argument' #'bad index' #'bad number of arguments' #'inappropriate operation' #'unsupported operation' #'no modification' #'insufficient object memory' #'insufficient C memory' #'not found' #'bad method' #'internal error in named primitive machinery' #'object may move' #'resource limit exceeded' + #'object is pinned' #'primitive write beyond end of object'). - #'object is pinned'). "53 to 55 are for Alien" newArray at: 53 put: (self at: #Alien ifAbsent: []). + newArray at: 54 put: #invokeCallbackContext:. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." - newArray at: 54 put: #invokeCallbackContext::. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). + "Used to be WeakFinalizationList for WeakFinalizationList hasNewFinalization, obsoleted by ephemeron support." + newArray at: 56 put: nil. - "Weak reference finalization" - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: []). "reserved for foreign callback process" newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: []). newArray at: 58 put: #unusedBytecode. + "59 reserved for Sista counter tripped message" + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. + "60 reserved for Sista class trap message" + newArray at: 60 put: #classTrapFor:. "Now replace the interpreter's reference in one atomic operation" + self specialObjectsArray becomeForward: newArray! - self specialObjectsArray becomeForward: newArray - ! Item was changed: ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and quit') ----- setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" - "Adjust the VM's default GC parameters to avoid premature tenuring." + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! - self vmParameterAt: 5 put: 4000. "do an incremental GC after this many allocations" - self vmParameterAt: 6 put: 2000. "tenure when more than this many objects survive the GC" - ! Item was changed: ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance size') ----- spaceForInstancesOf: aClass + "Answer a pair of the number of bytes consumed by all instances of the + given class, including their object headers, and the number of instances." - "Answer the number of bytes consumed by all instances of the given class, including their object headers and the number of instances." + | instances total | + instances := aClass allInstances. + instances isEmpty ifTrue: [^#(0 0)]. - | smallHeaderSize instVarBytes isVariable bytesPerElement total lastInstance instance instanceCount | - instance := aClass someInstance ifNil: [ ^#(0 0) ]. - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. - instVarBytes := aClass instSize * 4. - isVariable := aClass isVariable. - bytesPerElement := isVariable - ifFalse: [ 0 ] - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. total := 0. + aClass isVariable + ifTrue: + [instances do: + [:i| total := total + (aClass byteSizeOfInstanceOfSize: i basicSize)]] + ifFalse: + [total := instances size * aClass byteSizeOfInstance]. + ^{ total. instances size }! - instanceCount := 0. - "A modified version of #allInstancesDo: is inlined here. It avoids an infinite loop when another process is creating new instances of aClass." - self flag: #allInstancesDo:. - lastInstance := - aClass == CompiledMethod "CompiledMethod has special format, see its class comment" - ifTrue: [aClass new] - ifFalse: [aClass basicNew]. - [ instance == lastInstance ] whileFalse: [ - | contentBytes headerBytes | - contentBytes := instVarBytes + (isVariable - ifFalse: [ 0 ] - ifTrue: [ instance basicSize * bytesPerElement ]). - headerBytes := contentBytes > 255 - ifTrue: [ 12 ] - ifFalse: [ smallHeaderSize ]. - total := total + headerBytes + (contentBytes roundUpTo: 4). - instanceCount := instanceCount + 1. - instance := instance nextInstance ]. - ^{ total. instanceCount }! Item was added: + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Fail if no memory is available. Essential." + + ^(numBytes isInteger and: [numBytes > 0]) + ifTrue: [OutOfMemory signal] + ifFalse: [self primitiveFailed]! Item was added: + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was added: + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot and quit') ----- + setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" + + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! Item was added: + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- + allObjects + "Answer an Array of all objects in the system. Fail if + there isn't enough memory to instantiate the result." + + ^self primitiveFailed! Item was changed: ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- allObjectsDo: aBlock + "Evaluate the argument, aBlock, for each object in the system, excluding immediates + such as SmallInteger and Character." + self allObjectsOrNil + ifNotNil: [:allObjects| allObjects do: aBlock] + ifNil: + ["Fall back on the old single object primitive code. With closures, this needs + to use an end marker (lastObject) since activation of the block will create + new contexts and cause an infinite loop. The lastObject must be created + before calling someObject, so that the VM can settle the enumeration (e.g. + by flushing new space) as a side effect of someObject" + | object lastObject | + lastObject := Object new. + object := self someObject. + [lastObject == object or: [0 == object]] whileFalse: + [aBlock value: object. + object := object nextObject]]! - "Evaluate the argument, aBlock, for each object in the system - excluding SmallIntegers. With closures, this needs to use an end - marker (lastObject) since activation of the block will create new - contexts and cause an infinite loop." - | object lastObject | - object := self someObject. - lastObject := Object new. - [lastObject == object or: [0 == object]] - whileFalse: [aBlock value: object. - object := object nextObject]! Item was added: + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') ----- + allObjectsOrNil + "Answer an Array of all objects in the system. Fail if there isn't + enough memory to instantiate the result and answer nil." + + ^nil! From commits at source.squeak.org Tue Jul 7 20:59:41 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Tue Jul 7 20:59:44 2015 Subject: [squeak-dev] The Trunk: System.spur-eem.752.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System.spur-eem.752.mcz ==================== Summary ==================== Name: System.spur-eem.752 Author: eem Time: 7 July 2015, 1:55:58.024 pm UUID: 3b0b09f8-7dc8-4a23-b7f6-9f8d281aa3b0 Ancestors: System-eem.752, System.spur-cmm.751 System-eem.752 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Provide support for uninstaling breakpoints in ClassDescription>>#logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: =============== Diff against System-eem.752 =============== Item was removed: - Object subclass: #ObjectHistory - instanceVariableNames: 'marks markProcess' - classVariableNames: 'Current ObjectHistoryEnabled' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! - ObjectHistory holds ObjectHistoryMark objects which are placed in the object memory at regular intervals by its markProcess in the background. Adjacent marks (with no remaining objects inbetween) are coalesced so over time the collection does not grow unnecessarily large. - - Using these markers it is possible to determine the age of objects in memory from the time the ObjectHistory was initialized. Try e.g.: - self oopTimestamp. - self oopAge. - ObjectHistory current oopClassesByDate. - - Instance Variables - marks: SortedCollection of ObjectHistoryMark objects - markProcess: a Process running our markLoop - ! Item was removed: - ----- Method: ObjectHistory class>>current (in category 'accessing') ----- - current - ^ Current ifNil: [Current := self new]! Item was removed: - ----- Method: ObjectHistory class>>initialize (in category 'class initialization') ----- - initialize - self current. - ! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category 'preferences') ----- - keepTrackOfObjectHistory - - ^ ObjectHistoryEnabled ifNil: [ - Current - ifNil: [false] - ifNotNil: [:objectHistory | objectHistory isRunning]]! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in category 'preferences') ----- - keepTrackOfObjectHistory: aBoolean - " Reflect the desired state by starting/stopping the process if necessary " - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. - ObjectHistoryEnabled := aBoolean. - - Current - ifNil: [aBoolean ifTrue: [self current]] - ifNotNil: [:objectHistory | - (objectHistory isRunning xor: aBoolean) "state switch needed" - ifTrue: [objectHistory toggleRunning]].! Item was removed: - ----- Method: ObjectHistory class>>obsolete (in category 'class initialization') ----- - obsolete - "Kill the mark process before removing the class." - Current ifNotNil: - [:objectHistory| - objectHistory terminate]. - super obsolete! Item was removed: - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- - ageOf: anObject - "Age of anObject in seconds" - | timestamp | - timestamp := self timestampOf: anObject. - timestamp ifNil: [^0]. - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! Item was removed: - ----- Method: ObjectHistory>>initialize (in category 'initializing') ----- - initialize - self restartMarkProcess. - - ! Item was removed: - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- - isRunning - ^ markProcess - ifNil: [false] - ifNotNil: [:process | - process isSuspended not and: [ - process isTerminated not]]! Item was removed: - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- - markLoop - [true] whileTrue: [ - self markUpdate. - (Delay forSeconds: self markRate) wait]! Item was removed: - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- - markRate - "rate of creating ObjectHistoryMarks" - ^60! Item was removed: - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- - markUpdate - "Add a new mark and compact the marks collection" - | mark prev | - "lazy init so this happens in the background process" - marks ifNil: [self reinitMarks]. - "add new mark to object memory" - mark := self newMark. - mark timestamp <= marks last timestamp ifTrue: [^self "could happen if clock is wrong"]. - marks addLast: mark. - "compact the table by removing adjacent marks" - prev := marks first. - marks removeAllSuchThat: [:each | | doDelete | - doDelete := prev objectAfter == each. - prev := each. - doDelete]. - "The loop above is O(n) in number of marks, but that number should never become so large to be an issue. Even if the number was large, this is running at system background priority so should not interfere with any user process, not even user background processes. The symptom should only be that the system is less idle. - - If we ever get to a point where the number of marks is an issue then the compacting here could be made partial: since old marks rarely get coalesced it would make sense to only check the newer ones often, and the old ones perhaps only at the system startup."! Item was removed: - ----- Method: ObjectHistory>>newMark (in category 'private') ----- - newMark - ^ ObjectHistoryMark new! Item was removed: - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- - oopClassesByAge - "Answer collection of (oopAge in seconds -> sorted counts of object classes) sorted from lowest age" - "ObjectHistory current oopClassesByAge" - - | stats prev endOfMemory now bag age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - bag := Bag new. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> bag sortedCounts]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') ----- - oopClassesByDate - "Answer collection of (Date -> sorted counts of object classes) sorted from newest date" - "ObjectHistory current oopClassesByDate" - - | stats prev endOfMemory bag date obj thisDate | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - thisDate := nil. - bag := Bag new. - marks do: [:mark | - prev ifNotNil: [ - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - date := mark timestamp asDate. - thisDate = date ifFalse: [ - stats addFirst: date -> bag sortedCounts. - bag := Bag new. - thisDate := date]]. - prev := mark]. - thisDate = date ifFalse: [ - stats addLast: date -> bag sortedCounts]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- - oopCountsByAge - "Answer collection of (oopAge in seconds -> number of objects) sorted from lowest age" - "ObjectHistory current oopCountsByAge" - - | stats prev endOfMemory now n age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - n := 0. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - n := n + 1. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> n]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- - reinitMarks - marks := ObjectHistoryMark allInstances asOrderedCollection. - marks - ifEmpty: [marks add: self newMark] - ifNotEmpty: [ | prev | - prev := nil. - marks removeAllSuchThat: [:obj | - prev notNil and: [prev timestamp >= obj timestamp]]]. - ! Item was removed: - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') ----- - restartMarkProcess - markProcess ifNotNil: [markProcess terminate]. - markProcess := [self markLoop] - forkAt: Processor systemBackgroundPriority - named: 'ObjectHistory''s markProcess'. - ! Item was removed: - ----- Method: ObjectHistory>>terminate (in category 'private') ----- - terminate - markProcess ifNotNil: - [markProcess terminate]! Item was removed: - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- - timestampOf: anObject - "Timestamp of anObject, or nil if too new" - | endOfMemory mark | - anObject class == SmallInteger ifTrue: [^nil]. - mark := anObject. - endOfMemory := Object new. - [mark class == ObjectHistoryMark] whileFalse: [ - mark := mark nextObject. - mark == endOfMemory ifTrue: [^nil]]. - ^mark timestamp! Item was removed: - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- - toggleRunning - self isRunning - ifTrue: [self terminate] - ifFalse: [self restartMarkProcess]! Item was removed: - Object subclass: #ObjectHistoryMark - instanceVariableNames: 'timestamp' - classVariableNames: '' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! - An ObjectHistoryMark is a permanent mark in the object memory. It holds a timestamp. - - While the timestamp could be used directly as mark by ObjectHistory, it's conceivable that its format might change in the future, and we do not want the mark's relative position in memory to change (which would be the case if it was migrated to a new format). So we use a distinct object instead (and we protect it against accidental become-ing by overriding those methods).! Item was removed: - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- - become: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') ----- - becomeForward: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>initialize (in category 'initialization') ----- - initialize - timestamp := DateAndTime now floor. - ! Item was removed: - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') ----- - objectAfter - "Answer the next object in memory after me and my timestamp" - | successor | - successor := self nextObject. - successor == timestamp - ifTrue: [successor := successor nextObject]. - ^ successor! Item was removed: - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- - printOn: aStream - aStream - nextPutAll: self class name; - nextPut: $(; - print: timestamp; - nextPut: $)! Item was removed: - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') ----- - timestamp - ^timestamp - ! Item was changed: ----- Method: SmalltalkImage>>compactClassesArray (in category 'special objects') ----- compactClassesArray "Smalltalk compactClassesArray" + "Backward-compatibility support. Spur does not have compact classes." + ^{}! - "Return the array of 31 classes whose instances may be - represented compactly" - ^ self specialObjectsArray at: 29! Item was added: + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Essential. Fail if no memory is available." + + (numBytes isInteger and: [numBytes > 0]) ifTrue: + [OutOfMemory signal]. + ^self primitiveFailed! Item was added: + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was changed: ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') ----- primBytesLeft + "Primitive. Answer the number of free bytes available in old space. + Not accurate unless preceded by - "Primitive. Answer the number of bytes available for new object data. - Not accurate unless preceded by Smalltalk garbageCollectMost (for reasonable accuracy), or Smalltalk garbageCollect (for real accuracy). + See Object documentation whatIsAPrimitive." - See Object documentation whatIsAPrimitive." + ^0! - ^ 0! Item was changed: ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category 'memory space') ----- primitiveGarbageCollect + "Primitive. Reclaims all garbage and answers the size of the largest free chunk in old space.." - "Primitive. Reclaims all garbage and answers the number of bytes of available space." + ^self primitiveFailed! - ^ self primBytesLeft! Item was changed: ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category 'special objects') ----- recreateSpecialObjectsArray "Smalltalk recreateSpecialObjectsArray" "To external package developers: **** DO NOT OVERRIDE THIS METHOD. ***** If you are writing a plugin and need additional special object(s) for your own use, use addGCRoot() function and use own, separate special objects registry " "The Special Objects Array is an array of objects used by the Squeak virtual machine. Its contents are critical and accesses to it by the VM are unchecked, so don't even think of playing here unless you know what you are doing." | newArray | + newArray := Array new: 60. - newArray := Array new: 58. "Nil false and true get used throughout the interpreter" newArray at: 1 put: nil. newArray at: 2 put: false. newArray at: 3 put: true. "This association holds the active process (a ProcessScheduler)" newArray at: 4 put: (self specialObjectsArray at: 4) "(self bindingOf: #Processor) but it answers an Alias". "Numerous classes below used for type checking and instantiation" newArray at: 5 put: Bitmap. newArray at: 6 put: SmallInteger. newArray at: 7 put: ByteString. newArray at: 8 put: Array. newArray at: 9 put: Smalltalk. + newArray at: 10 put: BoxedFloat64. + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: [self globals at: #Context]). + newArray at: 12 put: nil. "was BlockContext." - newArray at: 10 put: Float. - newArray at: 11 put: MethodContext. - newArray at: 12 put: BlockContext. newArray at: 13 put: Point. newArray at: 14 put: LargePositiveInteger. newArray at: 15 put: Display. newArray at: 16 put: Message. newArray at: 17 put: CompiledMethod. + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: [Semaphore new]). "low space Semaphore" - newArray at: 18 put: (self specialObjectsArray at: 18). - "(low space Semaphore)" newArray at: 19 put: Semaphore. newArray at: 20 put: Character. newArray at: 21 put: #doesNotUnderstand:. newArray at: 22 put: #cannotReturn:. newArray at: 23 put: nil. "This is the process signalling low space." "An array of the 32 selectors that are compiled as special bytecodes, paired alternately with the number of arguments each takes." newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 #* 1 #/ 1 #\\ 1 #@ 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 #at: 1 #at:put: 2 #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 #blockCopy: 1 #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). "An array of the 255 Characters in ascii order. + Cog inlines table into machine code at: prim so do not regenerate it. + This is nil in Spur, which has immediate Characters." - Cog inlines table into machine code at: prim so do not regenerate it." newArray at: 25 put: (self specialObjectsArray at: 25). newArray at: 26 put: #mustBeBoolean. newArray at: 27 put: ByteArray. newArray at: 28 put: Process. + "An array of up to 31 classes whose instances will have compact headers; an empty array in Spur" - "An array of up to 31 classes whose instances will have compact headers" newArray at: 29 put: self compactClassesArray. + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: [Semaphore new]). "delay Semaphore" + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: [Semaphore new]). "user interrupt Semaphore" - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay Semaphore)" - newArray at: 31 put: (self specialObjectsArray at: 31). "(user interrupt Semaphore)" "Entries 32 - 34 unreferenced. Previously these contained prototype instances to be copied for fast initialization" + newArray at: 32 put: nil. "was the prototype Float" + newArray at: 33 put: nil. "was the prototype 4-byte LargePositiveInteger" + newArray at: 34 put: nil. "was the prototype Point" - newArray at: 32 put: nil. "was (Float new: 2)" - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" - newArray at: 34 put: nil. "was Point new" newArray at: 35 put: #cannotInterpret:. + newArray at: 36 put: nil. "was the prototype MethodContext" - "Note: This must be fixed once we start using context prototypes (yeah, right)" - "(MethodContext new: CompiledMethod fullFrameSize)." - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the prototype MethodContext (unused by the VM)" newArray at: 37 put: BlockClosure. + newArray at: 38 put: nil. "was the prototype BlockContext" - "(BlockContext new: CompiledMethod fullFrameSize)." - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the prototype BlockContext (unused by the VM)" "array of objects referred to by external code" + newArray at: 39 put: (self specialObjectsArray at: 39). "external semaphores" - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve external semaphores" newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls in CogMT" + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). "finalization Semaphore" - newArray at: 41 put: nil. "Reserved for a LinkedList instance for overlapped calls in CogMT" - "finalization Semaphore" - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). newArray at: 43 put: LargeNegativeInteger. "External objects for callout. Note: Written so that one can actually completely remove the FFI." newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). newArray at: 46 put: (self at: #ExternalData ifAbsent: []). newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). newArray at: 49 put: #aboutToReturn:through:. newArray at: 50 put: #run:with:in:. "51 reserved for immutability message" + newArray at: 51 put: #attemptToAssign:withIndex:. - "newArray at: 51 put: #attemptToAssign:withIndex:." - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: []). newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' #'bad argument' #'bad index' #'bad number of arguments' #'inappropriate operation' #'unsupported operation' #'no modification' #'insufficient object memory' #'insufficient C memory' #'not found' #'bad method' #'internal error in named primitive machinery' #'object may move' #'resource limit exceeded' + #'object is pinned' #'primitive write beyond end of object'). - #'object is pinned'). "53 to 55 are for Alien" newArray at: 53 put: (self at: #Alien ifAbsent: []). + newArray at: 54 put: #invokeCallbackContext:. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." - newArray at: 54 put: #invokeCallbackContext::. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). + "Used to be WeakFinalizationList for WeakFinalizationList hasNewFinalization, obsoleted by ephemeron support." + newArray at: 56 put: nil. - "Weak reference finalization" - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: []). "reserved for foreign callback process" newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: []). newArray at: 58 put: #unusedBytecode. + "59 reserved for Sista counter tripped message" + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. + "60 reserved for Sista class trap message" + newArray at: 60 put: #classTrapFor:. "Now replace the interpreter's reference in one atomic operation" + self specialObjectsArray becomeForward: newArray! - self specialObjectsArray becomeForward: newArray - ! Item was changed: ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and quit') ----- setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" - "Adjust the VM's default GC parameters to avoid premature tenuring." + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! - self vmParameterAt: 5 put: 4000. "do an incremental GC after this many allocations" - self vmParameterAt: 6 put: 2000. "tenure when more than this many objects survive the GC" - ! Item was changed: ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance size') ----- spaceForInstancesOf: aClass + "Answer a pair of the number of bytes consumed by all instances of the + given class, including their object headers, and the number of instances." - "Answer the number of bytes consumed by all instances of the given class, including their object headers and the number of instances." + | instances total | + instances := aClass allInstances. + instances isEmpty ifTrue: [^#(0 0)]. - | smallHeaderSize instVarBytes isVariable bytesPerElement total lastInstance instance instanceCount | - instance := aClass someInstance ifNil: [ ^#(0 0) ]. - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. - instVarBytes := aClass instSize * 4. - isVariable := aClass isVariable. - bytesPerElement := isVariable - ifFalse: [ 0 ] - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. total := 0. + aClass isVariable + ifTrue: + [instances do: + [:i| total := total + (aClass byteSizeOfInstanceOfSize: i basicSize)]] + ifFalse: + [total := instances size * aClass byteSizeOfInstance]. + ^{ total. instances size }! - instanceCount := 0. - "A modified version of #allInstancesDo: is inlined here. It avoids an infinite loop when another process is creating new instances of aClass." - self flag: #allInstancesDo:. - lastInstance := - aClass == CompiledMethod "CompiledMethod has special format, see its class comment" - ifTrue: [aClass new] - ifFalse: [aClass basicNew]. - [ instance == lastInstance ] whileFalse: [ - | contentBytes headerBytes | - contentBytes := instVarBytes + (isVariable - ifFalse: [ 0 ] - ifTrue: [ instance basicSize * bytesPerElement ]). - headerBytes := contentBytes > 255 - ifTrue: [ 12 ] - ifFalse: [ smallHeaderSize ]. - total := total + headerBytes + (contentBytes roundUpTo: 4). - instanceCount := instanceCount + 1. - instance := instance nextInstance ]. - ^{ total. instanceCount }! Item was added: + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Fail if no memory is available. Essential." + + ^(numBytes isInteger and: [numBytes > 0]) + ifTrue: [OutOfMemory signal] + ifFalse: [self primitiveFailed]! Item was added: + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was added: + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot and quit') ----- + setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" + + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! Item was added: + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- + allObjects + "Answer an Array of all objects in the system. Fail if + there isn't enough memory to instantiate the result." + + ^self primitiveFailed! Item was changed: ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- allObjectsDo: aBlock + "Evaluate the argument, aBlock, for each object in the system, excluding immediates + such as SmallInteger and Character." + self allObjectsOrNil + ifNotNil: [:allObjects| allObjects do: aBlock] + ifNil: + ["Fall back on the old single object primitive code. With closures, this needs + to use an end marker (lastObject) since activation of the block will create + new contexts and cause an infinite loop. The lastObject must be created + before calling someObject, so that the VM can settle the enumeration (e.g. + by flushing new space) as a side effect of someObject" + | object lastObject | + lastObject := Object new. + object := self someObject. + [lastObject == object or: [0 == object]] whileFalse: + [aBlock value: object. + object := object nextObject]]! - "Evaluate the argument, aBlock, for each object in the system - excluding SmallIntegers. With closures, this needs to use an end - marker (lastObject) since activation of the block will create new - contexts and cause an infinite loop." - | object lastObject | - object := self someObject. - lastObject := Object new. - [lastObject == object or: [0 == object]] - whileFalse: [aBlock value: object. - object := object nextObject]! Item was added: + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') ----- + allObjectsOrNil + "Answer an Array of all objects in the system. Fail if there isn't + enough memory to instantiate the result and answer nil." + + ^nil! From commits at source.squeak.org Tue Jul 7 20:59:49 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Tue Jul 7 20:59:51 2015 Subject: [squeak-dev] The Trunk: System.spur-topa.753.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System.spur-topa.753.mcz ==================== Summary ==================== Name: System.spur-topa.753 Author: eem Time: 7 July 2015, 1:56:05.341 pm UUID: 06b6dd59-7c15-4aa4-8be0-08694164ea0a Ancestors: System-topa.753, System.spur-eem.752 System-topa.753 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Reinstall CompiledMethod>>#hasBreakpoint as an Override =============== Diff against System-topa.753 =============== Item was removed: - Object subclass: #ObjectHistory - instanceVariableNames: 'marks markProcess' - classVariableNames: 'Current ObjectHistoryEnabled' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! - ObjectHistory holds ObjectHistoryMark objects which are placed in the object memory at regular intervals by its markProcess in the background. Adjacent marks (with no remaining objects inbetween) are coalesced so over time the collection does not grow unnecessarily large. - - Using these markers it is possible to determine the age of objects in memory from the time the ObjectHistory was initialized. Try e.g.: - self oopTimestamp. - self oopAge. - ObjectHistory current oopClassesByDate. - - Instance Variables - marks: SortedCollection of ObjectHistoryMark objects - markProcess: a Process running our markLoop - ! Item was removed: - ----- Method: ObjectHistory class>>current (in category 'accessing') ----- - current - ^ Current ifNil: [Current := self new]! Item was removed: - ----- Method: ObjectHistory class>>initialize (in category 'class initialization') ----- - initialize - self current. - ! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category 'preferences') ----- - keepTrackOfObjectHistory - - ^ ObjectHistoryEnabled ifNil: [ - Current - ifNil: [false] - ifNotNil: [:objectHistory | objectHistory isRunning]]! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in category 'preferences') ----- - keepTrackOfObjectHistory: aBoolean - " Reflect the desired state by starting/stopping the process if necessary " - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. - ObjectHistoryEnabled := aBoolean. - - Current - ifNil: [aBoolean ifTrue: [self current]] - ifNotNil: [:objectHistory | - (objectHistory isRunning xor: aBoolean) "state switch needed" - ifTrue: [objectHistory toggleRunning]].! Item was removed: - ----- Method: ObjectHistory class>>obsolete (in category 'class initialization') ----- - obsolete - "Kill the mark process before removing the class." - Current ifNotNil: - [:objectHistory| - objectHistory terminate]. - super obsolete! Item was removed: - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- - ageOf: anObject - "Age of anObject in seconds" - | timestamp | - timestamp := self timestampOf: anObject. - timestamp ifNil: [^0]. - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! Item was removed: - ----- Method: ObjectHistory>>initialize (in category 'initializing') ----- - initialize - self restartMarkProcess. - - ! Item was removed: - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- - isRunning - ^ markProcess - ifNil: [false] - ifNotNil: [:process | - process isSuspended not and: [ - process isTerminated not]]! Item was removed: - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- - markLoop - [true] whileTrue: [ - self markUpdate. - (Delay forSeconds: self markRate) wait]! Item was removed: - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- - markRate - "rate of creating ObjectHistoryMarks" - ^60! Item was removed: - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- - markUpdate - "Add a new mark and compact the marks collection" - | mark prev | - "lazy init so this happens in the background process" - marks ifNil: [self reinitMarks]. - "add new mark to object memory" - mark := self newMark. - mark timestamp <= marks last timestamp ifTrue: [^self "could happen if clock is wrong"]. - marks addLast: mark. - "compact the table by removing adjacent marks" - prev := marks first. - marks removeAllSuchThat: [:each | | doDelete | - doDelete := prev objectAfter == each. - prev := each. - doDelete]. - "The loop above is O(n) in number of marks, but that number should never become so large to be an issue. Even if the number was large, this is running at system background priority so should not interfere with any user process, not even user background processes. The symptom should only be that the system is less idle. - - If we ever get to a point where the number of marks is an issue then the compacting here could be made partial: since old marks rarely get coalesced it would make sense to only check the newer ones often, and the old ones perhaps only at the system startup."! Item was removed: - ----- Method: ObjectHistory>>newMark (in category 'private') ----- - newMark - ^ ObjectHistoryMark new! Item was removed: - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- - oopClassesByAge - "Answer collection of (oopAge in seconds -> sorted counts of object classes) sorted from lowest age" - "ObjectHistory current oopClassesByAge" - - | stats prev endOfMemory now bag age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - bag := Bag new. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> bag sortedCounts]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') ----- - oopClassesByDate - "Answer collection of (Date -> sorted counts of object classes) sorted from newest date" - "ObjectHistory current oopClassesByDate" - - | stats prev endOfMemory bag date obj thisDate | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - thisDate := nil. - bag := Bag new. - marks do: [:mark | - prev ifNotNil: [ - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - date := mark timestamp asDate. - thisDate = date ifFalse: [ - stats addFirst: date -> bag sortedCounts. - bag := Bag new. - thisDate := date]]. - prev := mark]. - thisDate = date ifFalse: [ - stats addLast: date -> bag sortedCounts]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- - oopCountsByAge - "Answer collection of (oopAge in seconds -> number of objects) sorted from lowest age" - "ObjectHistory current oopCountsByAge" - - | stats prev endOfMemory now n age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - n := 0. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - n := n + 1. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> n]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- - reinitMarks - marks := ObjectHistoryMark allInstances asOrderedCollection. - marks - ifEmpty: [marks add: self newMark] - ifNotEmpty: [ | prev | - prev := nil. - marks removeAllSuchThat: [:obj | - prev notNil and: [prev timestamp >= obj timestamp]]]. - ! Item was removed: - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') ----- - restartMarkProcess - markProcess ifNotNil: [markProcess terminate]. - markProcess := [self markLoop] - forkAt: Processor systemBackgroundPriority - named: 'ObjectHistory''s markProcess'. - ! Item was removed: - ----- Method: ObjectHistory>>terminate (in category 'private') ----- - terminate - markProcess ifNotNil: - [markProcess terminate]! Item was removed: - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- - timestampOf: anObject - "Timestamp of anObject, or nil if too new" - | endOfMemory mark | - anObject class == SmallInteger ifTrue: [^nil]. - mark := anObject. - endOfMemory := Object new. - [mark class == ObjectHistoryMark] whileFalse: [ - mark := mark nextObject. - mark == endOfMemory ifTrue: [^nil]]. - ^mark timestamp! Item was removed: - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- - toggleRunning - self isRunning - ifTrue: [self terminate] - ifFalse: [self restartMarkProcess]! Item was removed: - Object subclass: #ObjectHistoryMark - instanceVariableNames: 'timestamp' - classVariableNames: '' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! - An ObjectHistoryMark is a permanent mark in the object memory. It holds a timestamp. - - While the timestamp could be used directly as mark by ObjectHistory, it's conceivable that its format might change in the future, and we do not want the mark's relative position in memory to change (which would be the case if it was migrated to a new format). So we use a distinct object instead (and we protect it against accidental become-ing by overriding those methods).! Item was removed: - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- - become: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') ----- - becomeForward: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>initialize (in category 'initialization') ----- - initialize - timestamp := DateAndTime now floor. - ! Item was removed: - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') ----- - objectAfter - "Answer the next object in memory after me and my timestamp" - | successor | - successor := self nextObject. - successor == timestamp - ifTrue: [successor := successor nextObject]. - ^ successor! Item was removed: - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- - printOn: aStream - aStream - nextPutAll: self class name; - nextPut: $(; - print: timestamp; - nextPut: $)! Item was removed: - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') ----- - timestamp - ^timestamp - ! Item was changed: ----- Method: SmalltalkImage>>compactClassesArray (in category 'special objects') ----- compactClassesArray "Smalltalk compactClassesArray" + "Backward-compatibility support. Spur does not have compact classes." + ^{}! - "Return the array of 31 classes whose instances may be - represented compactly" - ^ self specialObjectsArray at: 29! Item was added: + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Essential. Fail if no memory is available." + + (numBytes isInteger and: [numBytes > 0]) ifTrue: + [OutOfMemory signal]. + ^self primitiveFailed! Item was added: + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was changed: ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') ----- primBytesLeft + "Primitive. Answer the number of free bytes available in old space. + Not accurate unless preceded by - "Primitive. Answer the number of bytes available for new object data. - Not accurate unless preceded by Smalltalk garbageCollectMost (for reasonable accuracy), or Smalltalk garbageCollect (for real accuracy). + See Object documentation whatIsAPrimitive." - See Object documentation whatIsAPrimitive." + ^0! - ^ 0! Item was changed: ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category 'memory space') ----- primitiveGarbageCollect + "Primitive. Reclaims all garbage and answers the size of the largest free chunk in old space.." - "Primitive. Reclaims all garbage and answers the number of bytes of available space." + ^self primitiveFailed! - ^ self primBytesLeft! Item was changed: ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category 'special objects') ----- recreateSpecialObjectsArray "Smalltalk recreateSpecialObjectsArray" "To external package developers: **** DO NOT OVERRIDE THIS METHOD. ***** If you are writing a plugin and need additional special object(s) for your own use, use addGCRoot() function and use own, separate special objects registry " "The Special Objects Array is an array of objects used by the Squeak virtual machine. Its contents are critical and accesses to it by the VM are unchecked, so don't even think of playing here unless you know what you are doing." | newArray | + newArray := Array new: 60. - newArray := Array new: 58. "Nil false and true get used throughout the interpreter" newArray at: 1 put: nil. newArray at: 2 put: false. newArray at: 3 put: true. "This association holds the active process (a ProcessScheduler)" newArray at: 4 put: (self specialObjectsArray at: 4) "(self bindingOf: #Processor) but it answers an Alias". "Numerous classes below used for type checking and instantiation" newArray at: 5 put: Bitmap. newArray at: 6 put: SmallInteger. newArray at: 7 put: ByteString. newArray at: 8 put: Array. newArray at: 9 put: Smalltalk. + newArray at: 10 put: BoxedFloat64. + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: [self globals at: #Context]). + newArray at: 12 put: nil. "was BlockContext." - newArray at: 10 put: Float. - newArray at: 11 put: MethodContext. - newArray at: 12 put: BlockContext. newArray at: 13 put: Point. newArray at: 14 put: LargePositiveInteger. newArray at: 15 put: Display. newArray at: 16 put: Message. newArray at: 17 put: CompiledMethod. + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: [Semaphore new]). "low space Semaphore" - newArray at: 18 put: (self specialObjectsArray at: 18). - "(low space Semaphore)" newArray at: 19 put: Semaphore. newArray at: 20 put: Character. newArray at: 21 put: #doesNotUnderstand:. newArray at: 22 put: #cannotReturn:. newArray at: 23 put: nil. "This is the process signalling low space." "An array of the 32 selectors that are compiled as special bytecodes, paired alternately with the number of arguments each takes." newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 #* 1 #/ 1 #\\ 1 #@ 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 #at: 1 #at:put: 2 #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 #blockCopy: 1 #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). "An array of the 255 Characters in ascii order. + Cog inlines table into machine code at: prim so do not regenerate it. + This is nil in Spur, which has immediate Characters." - Cog inlines table into machine code at: prim so do not regenerate it." newArray at: 25 put: (self specialObjectsArray at: 25). newArray at: 26 put: #mustBeBoolean. newArray at: 27 put: ByteArray. newArray at: 28 put: Process. + "An array of up to 31 classes whose instances will have compact headers; an empty array in Spur" - "An array of up to 31 classes whose instances will have compact headers" newArray at: 29 put: self compactClassesArray. + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: [Semaphore new]). "delay Semaphore" + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: [Semaphore new]). "user interrupt Semaphore" - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay Semaphore)" - newArray at: 31 put: (self specialObjectsArray at: 31). "(user interrupt Semaphore)" "Entries 32 - 34 unreferenced. Previously these contained prototype instances to be copied for fast initialization" + newArray at: 32 put: nil. "was the prototype Float" + newArray at: 33 put: nil. "was the prototype 4-byte LargePositiveInteger" + newArray at: 34 put: nil. "was the prototype Point" - newArray at: 32 put: nil. "was (Float new: 2)" - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" - newArray at: 34 put: nil. "was Point new" newArray at: 35 put: #cannotInterpret:. + newArray at: 36 put: nil. "was the prototype MethodContext" - "Note: This must be fixed once we start using context prototypes (yeah, right)" - "(MethodContext new: CompiledMethod fullFrameSize)." - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the prototype MethodContext (unused by the VM)" newArray at: 37 put: BlockClosure. + newArray at: 38 put: nil. "was the prototype BlockContext" - "(BlockContext new: CompiledMethod fullFrameSize)." - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the prototype BlockContext (unused by the VM)" "array of objects referred to by external code" + newArray at: 39 put: (self specialObjectsArray at: 39). "external semaphores" - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve external semaphores" newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls in CogMT" + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). "finalization Semaphore" - newArray at: 41 put: nil. "Reserved for a LinkedList instance for overlapped calls in CogMT" - "finalization Semaphore" - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). newArray at: 43 put: LargeNegativeInteger. "External objects for callout. Note: Written so that one can actually completely remove the FFI." newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). newArray at: 46 put: (self at: #ExternalData ifAbsent: []). newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). newArray at: 49 put: #aboutToReturn:through:. newArray at: 50 put: #run:with:in:. "51 reserved for immutability message" + newArray at: 51 put: #attemptToAssign:withIndex:. - "newArray at: 51 put: #attemptToAssign:withIndex:." - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: []). newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' #'bad argument' #'bad index' #'bad number of arguments' #'inappropriate operation' #'unsupported operation' #'no modification' #'insufficient object memory' #'insufficient C memory' #'not found' #'bad method' #'internal error in named primitive machinery' #'object may move' #'resource limit exceeded' + #'object is pinned' #'primitive write beyond end of object'). - #'object is pinned'). "53 to 55 are for Alien" newArray at: 53 put: (self at: #Alien ifAbsent: []). + newArray at: 54 put: #invokeCallbackContext:. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." - newArray at: 54 put: #invokeCallbackContext::. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). + "Used to be WeakFinalizationList for WeakFinalizationList hasNewFinalization, obsoleted by ephemeron support." + newArray at: 56 put: nil. - "Weak reference finalization" - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: []). "reserved for foreign callback process" newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: []). newArray at: 58 put: #unusedBytecode. + "59 reserved for Sista counter tripped message" + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. + "60 reserved for Sista class trap message" + newArray at: 60 put: #classTrapFor:. "Now replace the interpreter's reference in one atomic operation" + self specialObjectsArray becomeForward: newArray! - self specialObjectsArray becomeForward: newArray - ! Item was changed: ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and quit') ----- setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" - "Adjust the VM's default GC parameters to avoid premature tenuring." + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! - self vmParameterAt: 5 put: 4000. "do an incremental GC after this many allocations" - self vmParameterAt: 6 put: 2000. "tenure when more than this many objects survive the GC" - ! Item was changed: ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance size') ----- spaceForInstancesOf: aClass + "Answer a pair of the number of bytes consumed by all instances of the + given class, including their object headers, and the number of instances." - "Answer the number of bytes consumed by all instances of the given class, including their object headers and the number of instances." + | instances total | + instances := aClass allInstances. + instances isEmpty ifTrue: [^#(0 0)]. - | smallHeaderSize instVarBytes isVariable bytesPerElement total lastInstance instance instanceCount | - instance := aClass someInstance ifNil: [ ^#(0 0) ]. - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. - instVarBytes := aClass instSize * 4. - isVariable := aClass isVariable. - bytesPerElement := isVariable - ifFalse: [ 0 ] - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. total := 0. + aClass isVariable + ifTrue: + [instances do: + [:i| total := total + (aClass byteSizeOfInstanceOfSize: i basicSize)]] + ifFalse: + [total := instances size * aClass byteSizeOfInstance]. + ^{ total. instances size }! - instanceCount := 0. - "A modified version of #allInstancesDo: is inlined here. It avoids an infinite loop when another process is creating new instances of aClass." - self flag: #allInstancesDo:. - lastInstance := - aClass == CompiledMethod "CompiledMethod has special format, see its class comment" - ifTrue: [aClass new] - ifFalse: [aClass basicNew]. - [ instance == lastInstance ] whileFalse: [ - | contentBytes headerBytes | - contentBytes := instVarBytes + (isVariable - ifFalse: [ 0 ] - ifTrue: [ instance basicSize * bytesPerElement ]). - headerBytes := contentBytes > 255 - ifTrue: [ 12 ] - ifFalse: [ smallHeaderSize ]. - total := total + headerBytes + (contentBytes roundUpTo: 4). - instanceCount := instanceCount + 1. - instance := instance nextInstance ]. - ^{ total. instanceCount }! Item was added: + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Fail if no memory is available. Essential." + + ^(numBytes isInteger and: [numBytes > 0]) + ifTrue: [OutOfMemory signal] + ifFalse: [self primitiveFailed]! Item was added: + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was added: + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot and quit') ----- + setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" + + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! Item was added: + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- + allObjects + "Answer an Array of all objects in the system. Fail if + there isn't enough memory to instantiate the result." + + ^self primitiveFailed! Item was changed: ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- allObjectsDo: aBlock + "Evaluate the argument, aBlock, for each object in the system, excluding immediates + such as SmallInteger and Character." + self allObjectsOrNil + ifNotNil: [:allObjects| allObjects do: aBlock] + ifNil: + ["Fall back on the old single object primitive code. With closures, this needs + to use an end marker (lastObject) since activation of the block will create + new contexts and cause an infinite loop. The lastObject must be created + before calling someObject, so that the VM can settle the enumeration (e.g. + by flushing new space) as a side effect of someObject" + | object lastObject | + lastObject := Object new. + object := self someObject. + [lastObject == object or: [0 == object]] whileFalse: + [aBlock value: object. + object := object nextObject]]! - "Evaluate the argument, aBlock, for each object in the system - excluding SmallIntegers. With closures, this needs to use an end - marker (lastObject) since activation of the block will create new - contexts and cause an infinite loop." - | object lastObject | - object := self someObject. - lastObject := Object new. - [lastObject == object or: [0 == object]] - whileFalse: [aBlock value: object. - object := object nextObject]! Item was added: + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') ----- + allObjectsOrNil + "Answer an Array of all objects in the system. Fail if there isn't + enough memory to instantiate the result and answer nil." + + ^nil! From lewis at mail.msen.com Tue Jul 7 20:59:46 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Tue Jul 7 20:59:54 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <13878.136.2.1.105.1436293902.squirrel@webmail.msen.com> Message-ID: <33000.136.2.1.105.1436302786.squirrel@webmail.msen.com> It's definitely not related to the TwosComplement package. I just offered that up as an easily repeatable test case. If you run the image for a while, you will get all kinds of seeminging unrelated crashes, and it just looks like random failures with no obvious relation to whatever you were doing at the time. An image that can't be recompiled is bad, but an image that crashes the system is worse. Hopefully we can locate the underlying cause and make a decision based on that. Without knowing the actual root cause, I can't say much more. Dave > Maybe the problem is in the image, the interpreter VM or the > TwosComplement package, we don't know. Since it does not appear > likely anyone will be able to investigate it soon, and the nature of > both releases is about all-new VM(s) anyway, we probably should not > hold up the release over this. > > In fact, I could make another RC without the recompileAll. Is it > really necessary? I don't know any better about its purpose than why > it would be a problem. I guess anyone could do it on their own if > they wanted.. > > > On Tue, Jul 7, 2015 at 1:31 PM, David T. Lewis > wrote: >> I am away and cannot follow up on this for a while. >> >> My guess would be that there is something wrong in the compiler, and >> that >> it needs to be fixed (but I cannot check now to find out). I don't know >> if >> this affects SqueakJS or other VMs. >> >> Dave >> >>> On Tue, Jul 7, 2015 at 7:33 AM, David T. Lewis >>> wrote: >>>> On Mon, Jul 06, 2015 at 09:46:09PM -0500, Chris Muller wrote: >>>>> Probably the Compiler recompileAll..? >>>> >>>> Confirmed. >>>> >>>> Compiler recompileAll results in an image that crashes the interpreter >>>> VM. >>>> A fully updated trunk image works fine, but recompiling it breaks the >>>> image. >>> >>> Interpreter VM will not be able to run Spur images going forward. So >>> this is the last possible release to support the Interpreter VM anyway >>> is that right? >>> >>> Maybe it is time to abandon Interpreter VMj? Or release 4.6 without >>> the recompileAll and release 5.0 with it? >>> >>> Please let me know how you would like to proceed. >>> >> >> > From lewis at mail.msen.com Tue Jul 7 21:01:53 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Tue Jul 7 21:01:56 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <13878.136.2.1.105.1436293902.squirrel@webmail.msen.com> Message-ID: <47141.136.2.1.105.1436302913.squirrel@webmail.msen.com> Thanks Karl, I don't recall the discussion on this, was it something that we covered in the vm-dev list? Dave > This error kind of sound like the error that we had in Spur and Cog a > while > back. I'm not sure it is related. > > > Karl > > On Tue, Jul 7, 2015 at 8:31 PM, David T. Lewis > wrote: > >> I am away and cannot follow up on this for a while. >> >> My guess would be that there is something wrong in the compiler, and >> that >> it needs to be fixed (but I cannot check now to find out). I don't know >> if >> this affects SqueakJS or other VMs. >> >> Dave >> >> > On Tue, Jul 7, 2015 at 7:33 AM, David T. Lewis >> > wrote: >> >> On Mon, Jul 06, 2015 at 09:46:09PM -0500, Chris Muller wrote: >> >>> Probably the Compiler recompileAll..? >> >> >> >> Confirmed. >> >> >> >> Compiler recompileAll results in an image that crashes the >> interpreter >> >> VM. >> >> A fully updated trunk image works fine, but recompiling it breaks the >> >> image. >> > >> > Interpreter VM will not be able to run Spur images going forward. So >> > this is the last possible release to support the Interpreter VM anyway >> > is that right? >> > >> > Maybe it is time to abandon Interpreter VMj? Or release 4.6 without >> > the recompileAll and release 5.0 with it? >> > >> > Please let me know how you would like to proceed. >> > >> >> >> >> > > From eliot.miranda at gmail.com Tue Jul 7 21:07:53 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue Jul 7 21:07:57 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: <1F2C660D-934B-487C-9391-C96A55E524A9@gmx.de> References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <86423F6C-BB97-478D-A776-53675576BBC0@gmx.de> <1F2C660D-934B-487C-9391-C96A55E524A9@gmx.de> Message-ID: Hi Tobias, On Tue, Jul 7, 2015 at 8:31 AM, Tobias Pape wrote: > > On 07.07.2015, at 17:26, Chris Muller wrote: > > >>> Interpreter VM will not be able to run Spur images going forward. > >> > >> Pardon? > > > > Download latest Spur image and changes: > > > > > http://www.mirandabanda.org/files/Cog/VM/SpurImages/trunk46-spur.image > > > > > http://www.mirandabanda.org/files/Cog/VM/SpurImages/trunk46-spur.changes > > > > and latest interpreter VM. Then try: > > > > squeak trunk46-spur.image > > > > Results: > > > > This interpreter (vers. 0) cannot read image file (vers. 6521). > > Press CR to quit... > > > Well, your sentence sounded as if there's no intention of making the > interpreter > VM SPUR-aware whatsoever. Surely I got that wrong, didn't I? > I certainly hope so! I ant the Interpreter VM to be able to use the Spur memory manager. But that will realy force a merge of VMMaker and VMMaker.oscog and right now I don't see we have a lot of resource. Volunteers are /very/ welcome! > > Best regards > -Tobias > > > -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150707/e825b4d1/attachment.htm From cunningham.cb at gmail.com Tue Jul 7 21:27:10 2015 From: cunningham.cb at gmail.com (Chris Cunningham) Date: Tue Jul 7 21:27:14 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: <8DECD321-65C8-4CF0-B734-3492664D188B@freudenbergs.de> References: <8DECD321-65C8-4CF0-B734-3492664D188B@freudenbergs.de> Message-ID: #steps: reminds me of mophic - step interval, right? #withNext: reminds me of #withIndexDo:. I'd expect it to provide two arguments to the block (until I learned otherwise). #next: is stream, and definitely not what we want. I like Eliot's questioning of adding a new method at all, although I'm guilty of doing that a lot. What about a new constructor on Interval? Interval startAt: x next: z Interval startAt: x next: z by: b ? On Tue, Jul 7, 2015 at 1:06 PM, Bert Freudenberg wrote: > On 07.07.2015, at 06:09, Tobias Pape wrote: > > > > Hi all > > > > I've got a small naming puzzle: > > > > So we have > > x to: y > > that makes > > Intervall (x, x+1, x+2, ... , y) > > > > And we can do > > x to: x + z > > to get > > Intervall (x, x+1, x+2, ..., x+z) > > > > > > But we have x twice in there. > > > > What would you name the message > > x ???? z > > that gives > > Intervall (x, x+1, x+2, ..., x+z) > > > > I'm curious for your answers :) > > > > Best regards > > -Tobias > > > x steps: z > x steps: z by: b > > x withNext: z > x withNext: z by: b > > - Bert - > > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150707/42b1944c/attachment.htm From commits at source.squeak.org Tue Jul 7 21:55:02 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Tue Jul 7 21:55:05 2015 Subject: [squeak-dev] Daily Commit Log Message-ID: <20150707215502.28833.qmail@box4.squeakfoundation.org> Changes to Trunk (http://source.squeak.org/trunk.html) in the last 24 hours: http://lists.squeakfoundation.org/pipermail/packages/2015-July/008806.html Name: Compiler.spur-topa.302 Ancestors: Compiler-topa.302, Compiler.spur-eem.301 Compiler-topa.302 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Don't be too strict if BlockNode scope setting is idempotent ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008807.html Name: Kernel.spur-eem.933 Ancestors: Kernel-eem.933, Kernel.spur-eem.932 Kernel-eem.933 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Version of Kernel providing base version if CompiledMethod>>hasBreakpoint which System will override. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008808.html Name: Kernel.spur-eem.934 Ancestors: Kernel-eem.934, Kernel.spur-eem.933 Kernel-eem.934 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Make sure that any breakpointed version of a method has been removed from BreakpointManager and that the original unbreakpointed methid is in hand when method source is logged, hence preserving method history even if the programmer mistakenly redefines a breakpointed method (something which this poor author is susceptible to). ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008809.html Name: Kernel.spur-topa.935 Ancestors: Kernel-topa.935, Kernel.spur-eem.934 Kernel-topa.935 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Reinstall CompiledMethod>>#hasBreakpoint ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008810.html Name: System.spur-cmm.751 Ancestors: System-cmm.751, System.spur-eem.750 System-cmm.751 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Restore classic Warning window because it supports application-formatted messages which can wrap and scroll as needed. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008811.html Name: System.spur-eem.752 Ancestors: System-eem.752, System.spur-cmm.751 System-eem.752 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Provide support for uninstaling breakpoints in ClassDescription>>#logMethodSource:forMethodWithNode:inCategory:withStamp:notifying: ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008812.html Name: System.spur-topa.753 Ancestors: System-topa.753, System.spur-eem.752 System-topa.753 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Reinstall CompiledMethod>>#hasBreakpoint as an Override ============================================= From commits at source.squeak.org Tue Jul 7 23:27:27 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Tue Jul 7 23:27:28 2015 Subject: [squeak-dev] The Inbox: Compiler-dtl.303.mcz Message-ID: David T. Lewis uploaded a new version of Compiler to project The Inbox: http://source.squeak.org/inbox/Compiler-dtl.303.mcz ==================== Summary ==================== Name: Compiler-dtl.303 Author: dtl Time: 7 July 2015, 7:27:15.092 pm UUID: 762ba9fa-1e47-4c91-af95-d673d8c6706d Ancestors: Compiler-topa.302 Revert two methods from Compiler-eem.300 because they work on a stack interpreter but not on a context interpreter (VM crash). =============== Diff against Compiler-topa.302 =============== Item was changed: ----- Method: BlockNode>>emitCodeForEvaluatedClosureValue:encoder: (in category 'code generation (closures)') ----- emitCodeForEvaluatedClosureValue: stack encoder: encoder | position | position := stack position. stack position: arguments size + copiedValues size. + temporaries size timesRepeat: + [NodeNil emitCodeForValue: stack encoder: encoder]. - encoder genPushNClosureTemps: temporaries size. self reindexingLocalsDo: [self emitCodeForEvaluatedValue: stack encoder: encoder] encoder: encoder. self returns ifFalse: [encoder genReturnTopToCaller. pc := encoder methodStreamPosition]. stack position: position! Item was changed: ----- Method: BlockNode>>sizeCodeForEvaluatedClosureValue: (in category 'code generation (closures)') ----- sizeCodeForEvaluatedClosureValue: encoder "The closure value primitives push the arguments and the copied values. The compiler guarantees that any copied values come before all local temps. So on closure activation we only need to push nils for the remaining temporaries." + ^temporaries size * (NodeNil sizeCodeForValue: encoder) - ^(encoder sizePushNClosureTemps: temporaries size) + (self reindexingLocalsDo: [self sizeCodeForEvaluatedValue: encoder] encoder: nil "don't store temps yet") + (self returns ifTrue: [0] ifFalse: [encoder sizeReturnTopToCaller])! From lewis at mail.msen.com Tue Jul 7 23:33:43 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Tue Jul 7 23:33:46 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <13878.136.2.1.105.1436293902.squirrel@webmail.msen.com> Message-ID: <20150707233343.GA81061@shell.msen.com> On Tue, Jul 07, 2015 at 02:34:48PM -0500, Chris Muller wrote: > > On Tue, Jul 7, 2015 at 1:31 PM, David T. Lewis wrote: > > I am away and cannot follow up on this for a while. > > > > My guess would be that there is something wrong in the compiler, and that > > it needs to be fixed (but I cannot check now to find out). I don't know if > > this affects SqueakJS or other VMs. > > > > Dave > > Maybe the problem is in the image, the interpreter VM or the > TwosComplement package, we don't know. Since it does not appear > likely anyone will be able to investigate it soon, and the nature of > both releases is about all-new VM(s) anyway, we probably should not > hold up the release over this. > > In fact, I could make another RC without the recompileAll. Is it > really necessary? I don't know any better about its purpose than why > it would be a problem. I guess anyone could do it on their own if > they wanted.. > OK, I'm back now. The problem was introduced in Compiler-eem.300, which does this: Use the size/emitPushNClosureTemps: api in block generation. There are two affected methods: BlockNode>>sizeCodeForEvaluatedClosureValue: BlockNode>>emitCodeForEvaluatedClosureValue:encoder: Reverting these two methods fixes the problem. I don't know the background on this change but my guess would be that it is something that works on a stack interpreter but not on a context interpreter, so maybe the methods need to be tweaked to account for the difference. I would suggest rolling back these two methods until after the 4.6 release, see Compiler-dtl.303 in the inbox. Eliot, does that sound right? Thanks, Dave From eliot.miranda at gmail.com Wed Jul 8 00:20:52 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed Jul 8 00:20:54 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: <20150707233343.GA81061@shell.msen.com> References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <13878.136.2.1.105.1436293902.squirrel@webmail.msen.com> <20150707233343.GA81061@shell.msen.com> Message-ID: Hi David, On Tue, Jul 7, 2015 at 4:33 PM, David T. Lewis wrote: > On Tue, Jul 07, 2015 at 02:34:48PM -0500, Chris Muller wrote: > > > > On Tue, Jul 7, 2015 at 1:31 PM, David T. Lewis > wrote: > > > I am away and cannot follow up on this for a while. > > > > > > My guess would be that there is something wrong in the compiler, and > that > > > it needs to be fixed (but I cannot check now to find out). I don't > know if > > > this affects SqueakJS or other VMs. > > > > > > Dave > > > > Maybe the problem is in the image, the interpreter VM or the > > TwosComplement package, we don't know. Since it does not appear > > likely anyone will be able to investigate it soon, and the nature of > > both releases is about all-new VM(s) anyway, we probably should not > > hold up the release over this. > > > > In fact, I could make another RC without the recompileAll. Is it > > really necessary? I don't know any better about its purpose than why > > it would be a problem. I guess anyone could do it on their own if > > they wanted.. > > > > OK, I'm back now. > > The problem was introduced in Compiler-eem.300, which does this: > > Use the size/emitPushNClosureTemps: api in block generation. > > There are two affected methods: > > BlockNode>>sizeCodeForEvaluatedClosureValue: > BlockNode>>emitCodeForEvaluatedClosureValue:encoder: > > Reverting these two methods fixes the problem. > > I don't know the background on this change but my guess would be that > it is something that works on a stack interpreter but not on a context > interpreter, so maybe the methods need to be tweaked to account for the > difference. > It should make no difference to the code produced. It adds a new way of saying "push N nils" that allows the Sista bytecode set to use its "pushNClosureNils" bytecode to push several nils in one bytecode. But with the standard encoder EncoderForV3PlusClosures exactly the same code as the previous version should be produced. How do the changes in the compiler cause the crash? > > I would suggest rolling back these two methods until after the 4.6 > release, see Compiler-dtl.303 in the inbox. > > Eliot, does that sound right? > No. I don't see how the changes cause the crash. The changes have no effect in the Encoder in effect in the release image. I'd like to understand how the crash occurs before rolling back. > > Thanks, > Dave > > > -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150707/0ae3bed4/attachment.htm From lewis at mail.msen.com Wed Jul 8 00:25:07 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Wed Jul 8 00:25:10 2015 Subject: VM terminology (was: [squeak-dev] Squeak 4.6 -- 2nd release candidate) In-Reply-To: <1F2C660D-934B-487C-9391-C96A55E524A9@gmx.de> References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <86423F6C-BB97-478D-A776-53675576BBC0@gmx.de> <1F2C660D-934B-487C-9391-C96A55E524A9@gmx.de> Message-ID: <20150708002507.GA84437@shell.msen.com> On Tue, Jul 07, 2015 at 05:31:38PM +0200, Tobias Pape wrote: > > On 07.07.2015, at 17:26, Chris Muller wrote: > > >>> Interpreter VM will not be able to run Spur images going forward. > >> > >> Pardon? > > > > Download latest Spur image and changes: > > > > http://www.mirandabanda.org/files/Cog/VM/SpurImages/trunk46-spur.image > > > > http://www.mirandabanda.org/files/Cog/VM/SpurImages/trunk46-spur.changes > > > > and latest interpreter VM. Then try: > > > > squeak trunk46-spur.image > > > > Results: > > > > This interpreter (vers. 0) cannot read image file (vers. 6521). > > Press CR to quit... > > > Well, your sentence sounded as if there's no intention of making the interpreter > VM SPUR-aware whatsoever. Surely I got that wrong, didn't I? > We are probably tripping over some terminology issues here. We used to refer to the "standard VM" as distinct from the "experimental" Cog VMs. That terminology is no longer appropriate, because most people now use Cog (and Spur), and IMHO the terms "standard" and "experimentalt" are no longer helpful. When Eliot and Andreas began the work that led to Cog (and now Spur), the first step (see Eliot's blog) was development of the stack-oriented interpreter, which was an improvement over the original context-based interpreter of the standard Squeak VM. The idea was (and still is) that the standard interpreter VMs would migrate to the stack interpreter model. If you look at the VMMaker package (as opposed to VMMaker.oscog) you will find additional refactoring of the interpreter and object memory classes to support that original design intent. The VMs that we now call "interpreter VM" are generated from that code base, currently building from the context interpreter classes rather than the stack interpreter classes. There is some work remaining to be done in order to be able to generate an "interpreter VM" from the stack interpreter classes in the VMMaker package. Once that is accomplished, the context interpreter will become a historical artifact, and the "interpreter VM" builds will in fact deliver the stack based interpreter VM as developed by Eliot and maintained in the VMMaker.oscog branch. Beyond that, my powers of prediction are less clear. There is significant code merge work remaining to be done, but regardless of how (or when or by whom) that gets done, there is no reason that the new Spur object model should not be adopted, and no reason why an "interpreter VM" should not be able to support it. Dave From lewis at mail.msen.com Wed Jul 8 00:50:39 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Wed Jul 8 00:50:41 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <13878.136.2.1.105.1436293902.squirrel@webmail.msen.com> <20150707233343.GA81061@shell.msen.com> Message-ID: <20150708005039.GB84437@shell.msen.com> On Tue, Jul 07, 2015 at 05:20:52PM -0700, Eliot Miranda wrote: > Hi David, > > On Tue, Jul 7, 2015 at 4:33 PM, David T. Lewis wrote: > > > > The problem was introduced in Compiler-eem.300, which does this: > > > > Use the size/emitPushNClosureTemps: api in block generation. > > > > There are two affected methods: > > > > BlockNode>>sizeCodeForEvaluatedClosureValue: > > BlockNode>>emitCodeForEvaluatedClosureValue:encoder: > > > > Reverting these two methods fixes the problem. > > > > I don't know the background on this change but my guess would be that > > it is something that works on a stack interpreter but not on a context > > interpreter, so maybe the methods need to be tweaked to account for the > > difference. > > > > It should make no difference to the code produced. It adds a new way of > saying "push N nils" that allows the Sista bytecode set to use its > "pushNClosureNils" bytecode to push several nils in one bytecode. But with > the standard encoder EncoderForV3PlusClosures exactly the same code as the > previous version should be produced. > > How do the changes in the compiler cause the crash? > I don't know. I'm doing brute-force debugging, just rolling the versions back until the problem goes away. All I can say with confidence is that those two methods changes, followed by a system recompile, result in an image that crashes a context interpreter VM. Reverting these two methods and recompiling brings the image back to a sane condition. It might turn out to be a trivial problem, but I am suggesting that we should temporarily revert and work it out after the 4.6 release. Dave From commits at source.squeak.org Wed Jul 8 07:16:08 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 07:16:10 2015 Subject: [squeak-dev] The Trunk: Help-Squeak-Project-mt.29.mcz Message-ID: Marcel Taeumel uploaded a new version of Help-Squeak-Project to project The Trunk: http://source.squeak.org/trunk/Help-Squeak-Project-mt.29.mcz ==================== Summary ==================== Name: Help-Squeak-Project-mt.29 Author: mt Time: 8 July 2015, 9:15:58.348 am UUID: b3f20627-988d-0f46-a6a7-faa6f2eb390b Ancestors: Help-Squeak-Project-cmm.28 License year updated. =============== Diff against Help-Squeak-Project-cmm.28 =============== Item was changed: ----- Method: SqueakLicenseHelp class>>officialLicense (in category 'pages') ----- officialLicense + "This method was automatically generated. Edit it using:" + "a HelpBrowser edit: #officialLicense" + ^HelpTopic + title: 'Official License' + contents: + 'Copyright (c) The individual, corporate, and institutional contributors who have collectively contributed elements to this software ("The Squeak Community"), 1996-2015 All rights reserved. - ^HelpTopic - title: 'Official License - 4.0' - contents: 'Copyright (c) The individual, corporate, and institutional contributors who have collectively contributed elements to this software ("The Squeak Community"), 1996-2011 All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Portions of Squeak are covered by the following license Copyright (c) Xerox Corp. 1981, 1982 All rights reserved. Copyright (c) Apple Computer, Inc. 1985-1996 All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.!!' readStream nextChunkText! - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.'! From Das.Linux at gmx.de Wed Jul 8 13:19:07 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Wed Jul 8 13:19:13 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: References: <8DECD321-65C8-4CF0-B734-3492664D188B@freudenbergs.de> Message-ID: Hi all thanks for your feedback, and to calm Chris C. and Eliot, I don't intend to add yet another convenience message? just because. If there had been immediate consensus, probably. I just found it stunning that quite a few people at my lab had to think hard to a) explain the problem and b) suggest a name :). Best regards -Tobias On 07.07.2015, at 23:27, Chris Cunningham wrote: > #steps: reminds me of mophic - step interval, right? > > #withNext: reminds me of #withIndexDo:. I'd expect it to provide two arguments to the block (until I learned otherwise). > > #next: is stream, and definitely not what we want. > > I like Eliot's questioning of adding a new method at all, although I'm guilty of doing that a lot. > > What about a new constructor on Interval? > > Interval startAt: x next: z > Interval startAt: x next: z by: b > ? > > On Tue, Jul 7, 2015 at 1:06 PM, Bert Freudenberg wrote: > On 07.07.2015, at 06:09, Tobias Pape wrote: > > > > Hi all > > > > I've got a small naming puzzle: > > > > So we have > > x to: y > > that makes > > Intervall (x, x+1, x+2, ... , y) > > > > And we can do > > x to: x + z > > to get > > Intervall (x, x+1, x+2, ..., x+z) > > > > > > But we have x twice in there. > > > > What would you name the message > > x ???? z > > that gives > > Intervall (x, x+1, x+2, ..., x+z) > > > > I'm curious for your answers :) > > > > Best regards > > -Tobias > > > x steps: z > x steps: z by: b > > x withNext: z > x withNext: z by: b > > - Bert - From Das.Linux at gmx.de Wed Jul 8 13:20:17 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Wed Jul 8 13:20:22 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <86423F6C-BB97-478D-A776-53675576BBC0@gmx.de> <1F2C660D-934B-487C-9391-C96A55E524A9@gmx.de> Message-ID: Hi Eliot On 07.07.2015, at 23:07, Eliot Miranda wrote: > Hi Tobias, > > On Tue, Jul 7, 2015 at 8:31 AM, Tobias Pape wrote: > > On 07.07.2015, at 17:26, Chris Muller wrote: > > >>> Interpreter VM will not be able to run Spur images going forward. > >> > >> Pardon? > > > > Download latest Spur image and changes: > > > > http://www.mirandabanda.org/files/Cog/VM/SpurImages/trunk46-spur.image > > > > http://www.mirandabanda.org/files/Cog/VM/SpurImages/trunk46-spur.changes > > > > and latest interpreter VM. Then try: > > > > squeak trunk46-spur.image > > > > Results: > > > > This interpreter (vers. 0) cannot read image file (vers. 6521). > > Press CR to quit... > > > Well, your sentence sounded as if there's no intention of making the interpreter > VM SPUR-aware whatsoever. Surely I got that wrong, didn't I? > > I certainly hope so! I ant the Interpreter VM to be able to use the Spur memory manager. But that will realy force a merge of VMMaker and VMMaker.oscog and right now I don't see we have a lot of resource. Volunteers are /very/ welcome! > Thanks for pointing that out :) I was a bit confused and I'm glad we have a nice plan :) Best regards -Tobias From Das.Linux at gmx.de Wed Jul 8 13:23:28 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Wed Jul 8 13:23:34 2015 Subject: VM terminology (was: [squeak-dev] Squeak 4.6 -- 2nd release candidate) In-Reply-To: <20150708002507.GA84437@shell.msen.com> References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <86423F6C-BB97-478D-A776-53675576BBC0@gmx.de> <1F2C660D-934B-487C-9391-C96A55E524A9@gmx.de> <20150708002507.GA84437@shell.msen.com> Message-ID: <25088CC7-06A3-491F-A268-AC478C62F24E@gmx.de> Hi Dave On 08.07.2015, at 02:25, David T. Lewis wrote: > On Tue, Jul 07, 2015 at 05:31:38PM +0200, Tobias Pape wrote: >> >> On 07.07.2015, at 17:26, Chris Muller wrote: >> >>>>> Interpreter VM will not be able to run Spur images going forward. >>>> >>>> Pardon? >>> >>> Download latest Spur image and changes: >>> >>> http://www.mirandabanda.org/files/Cog/VM/SpurImages/trunk46-spur.image >>> >>> http://www.mirandabanda.org/files/Cog/VM/SpurImages/trunk46-spur.changes >>> >>> and latest interpreter VM. Then try: >>> >>> squeak trunk46-spur.image >>> >>> Results: >>> >>> This interpreter (vers. 0) cannot read image file (vers. 6521). >>> Press CR to quit... >> >> >> Well, your sentence sounded as if there's no intention of making the interpreter >> VM SPUR-aware whatsoever. Surely I got that wrong, didn't I? >> > > We are probably tripping over some terminology issues here. > > We used to refer to the "standard VM" as distinct from the "experimental" > Cog VMs. That terminology is no longer appropriate, because most people > now use Cog (and Spur), and IMHO the terms "standard" and "experimentalt" > are no longer helpful. > > When Eliot and Andreas began the work that led to Cog (and now Spur), the > first step (see Eliot's blog) was development of the stack-oriented interpreter, > which was an improvement over the original context-based interpreter of the > standard Squeak VM. The idea was (and still is) that the standard interpreter > VMs would migrate to the stack interpreter model. > > If you look at the VMMaker package (as opposed to VMMaker.oscog) you will > find additional refactoring of the interpreter and object memory classes to > support that original design intent. The VMs that we now call "interpreter > VM" are generated from that code base, currently building from the context > interpreter classes rather than the stack interpreter classes. > > There is some work remaining to be done in order to be able to generate > an "interpreter VM" from the stack interpreter classes in the VMMaker > package. Once that is accomplished, the context interpreter will become > a historical artifact, and the "interpreter VM" builds will in fact deliver > the stack based interpreter VM as developed by Eliot and maintained in > the VMMaker.oscog branch. > > Beyond that, my powers of prediction are less clear. There is significant > code merge work remaining to be done, but regardless of how (or when or > by whom) that gets done, there is no reason that the new Spur object model > should not be adopted, and no reason why an "interpreter VM" should not > be able to support it. Thanks for the quite enlightening explanation. :) Together with Eliot's reply this makes going on a lot more predictable for me. Thanks! Best regards -Tobias From commits at source.squeak.org Wed Jul 8 13:43:42 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 13:43:44 2015 Subject: [squeak-dev] The Trunk: CollectionsTests-topa.244.mcz Message-ID: Tobias Pape uploaded a new version of CollectionsTests to project The Trunk: http://source.squeak.org/trunk/CollectionsTests-topa.244.mcz ==================== Summary ==================== Name: CollectionsTests-topa.244 Author: topa Time: 8 July 2015, 3:43:29.531 pm UUID: 71277a1a-3f59-462a-b2f7-14b612c17a84 Ancestors: CollectionsTests-mt.243 Do the primitive/non-primitive test in a way that works without directly modifying a compiled method header word. =============== Diff against CollectionsTests-mt.243 =============== Item was changed: ----- Method: StringTest>>testFindSubstringInStartingAtMatchTable (in category 'tests - finding') ----- testFindSubstringInStartingAtMatchTable | str tbl cm | str := 'hello '. tbl := String classPool at: #CaseSensitiveOrder. self assert: (str findSubstring: ' ' in: str startingAt: 1 matchTable: tbl) = 6. self assert: (str findSubstring: 'q' in: str startingAt: 1 matchTable: tbl) = 0. self assert: (str findSubstring: 'q' in: str startingAt: -1 matchTable: tbl) = 0. self assert: (str findSubstring: ' ' in: str startingAt: -1 matchTable: tbl) = 6. + "The next test ensures that the fallback code works just as well" + cm := (ByteString >> #findSubstring:in:startingAt:matchTable:) in: [:origMethod | + "Adapted from CompiledMethod>>#newFrom: " + | inst header| + header := origMethod header bitAnd: 16r1FF bitInvert. + "CompiledMethod newFrom: CompiledMethod class >> #newFrom:" + inst := CompiledMethod + newMethod: origMethod basicSize - origMethod initialPC + 1 + header: header. + 1 to: origMethod numLiterals do: [:index| inst literalAt: index put: (origMethod literalAt: index)]. + origMethod initialPC to: origMethod size do: [:index | inst at: index put: (origMethod at: index)]. + inst postCopy]. - cm := (CompiledMethod newFrom: (ByteString >> #findSubstring:in:startingAt:matchTable:)). - cm objectAt: 1 put: (cm header bitAnd: 16r1FF bitInvert). self assert: (cm valueWithReceiver: str arguments: {' '. str. 1. tbl}) = 6. self assert: (cm valueWithReceiver: str arguments: {'q'. str. 1. tbl}) = 0. self assert: (cm valueWithReceiver: str arguments: {'q'. str. -1. tbl}) = 0. self assert: (cm valueWithReceiver: str arguments: {' '. str. -1. tbl}) = 6. ! From commits at source.squeak.org Wed Jul 8 13:48:27 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 13:48:29 2015 Subject: [squeak-dev] The Trunk: CollectionsTests-topa.245.mcz Message-ID: Tobias Pape uploaded a new version of CollectionsTests to project The Trunk: http://source.squeak.org/trunk/CollectionsTests-topa.245.mcz ==================== Summary ==================== Name: CollectionsTests-topa.245 Author: topa Time: 8 July 2015, 3:48:12.815 pm UUID: d0cc9aa1-75e5-4177-ae0c-54e927b8b505 Ancestors: CollectionsTests-topa.244 Let's say PluggableTextAttribute are not serializable. =============== Diff against CollectionsTests-topa.244 =============== Item was changed: ----- Method: TextAttributesScanningTest>>testPluggableTextAttribute (in category 'testing') ----- testPluggableTextAttribute | att strm | att := PluggableTextAttribute evalBlock: [ #foo ]. strm := WriteStream on: ''. self assert: (att respondsTo: #writeScanOn:). + self + should: [att writeScanOn: strm] + raise: Error + description: 'PluggableTextAttribute are not intended to be serialized'. - att writeScanOn: strm. - "FIXME: PluggableTextAttribute used by SqueakMap. Currently it cannot - be filed out, so this probably needs fixing. See RunArray class>>scanFrom:" ! From commits at source.squeak.org Wed Jul 8 14:17:50 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 14:17:53 2015 Subject: [squeak-dev] The Trunk: Collections-topa.638.mcz Message-ID: Tobias Pape uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections-topa.638.mcz ==================== Summary ==================== Name: Collections-topa.638 Author: topa Time: 8 July 2015, 4:17:26.216 pm UUID: aa218acf-c29b-4df1-ab0a-285f1f71c6a7 Ancestors: Collections-topa.637 Let's say PluggableTextAttributes are not serializable. =============== Diff against Collections-topa.637 =============== Item was added: + ----- Method: PluggableTextAttribute>>writeScanOn: (in category 'as yet unclassified') ----- + writeScanOn: aStream + "Impossible for this kind of attribute" + ^ self shouldNotImplement + ! From commits at source.squeak.org Wed Jul 8 15:36:47 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 15:36:49 2015 Subject: [squeak-dev] The Trunk: ToolBuilder-Kernel-topa.90.mcz Message-ID: Tobias Pape uploaded a new version of ToolBuilder-Kernel to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Kernel-topa.90.mcz ==================== Summary ==================== Name: ToolBuilder-Kernel-topa.90 Author: topa Time: 8 July 2015, 5:36:38.882 pm UUID: 90e425d8-969f-4f8f-9edf-a5d30366a298 Ancestors: ToolBuilder-Kernel-mt.89 Remain Grpahics[Color] agnostic. =============== Diff against ToolBuilder-Kernel-mt.89 =============== Item was removed: - ----- Method: PluggableSpacerSpec>>color (in category 'accessing') ----- - color - - ^ super color ifNil: [Color transparent]! From commits at source.squeak.org Wed Jul 8 15:37:27 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 15:37:29 2015 Subject: [squeak-dev] The Trunk: ToolBuilder-MVC-topa.43.mcz Message-ID: Tobias Pape uploaded a new version of ToolBuilder-MVC to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-MVC-topa.43.mcz ==================== Summary ==================== Name: ToolBuilder-MVC-topa.43 Author: topa Time: 8 July 2015, 5:37:19.575 pm UUID: 9a12e4ba-acbe-4854-8db9-93c3efe1d7a5 Ancestors: ToolBuilder-MVC-mt.42 Cope for ToolBuilder-Kernel-topa.90 =============== Diff against ToolBuilder-MVC-mt.42 =============== Item was changed: ----- Method: MVCToolBuilder>>buildPluggableSpacer: (in category 'widgets required') ----- buildPluggableSpacer: aSpec | widget | widget := View new. self register: widget id: aSpec name. widget borderWidth: 0. + widget backgroundColor: (aSpec color ifNil: [Color transparent]). - widget backgroundColor: aSpec color. widget window: (widget window topLeft extent: aSpec extent). self setFrame: aSpec frame in: widget. parent ifNotNil:[parent addSubView: widget]. ^widget! From commits at source.squeak.org Wed Jul 8 15:38:01 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 15:38:03 2015 Subject: [squeak-dev] The Trunk: ToolBuilder-Morphic-topa.148.mcz Message-ID: Tobias Pape uploaded a new version of ToolBuilder-Morphic to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Morphic-topa.148.mcz ==================== Summary ==================== Name: ToolBuilder-Morphic-topa.148 Author: topa Time: 8 July 2015, 5:37:50.515 pm UUID: 2cf8d051-bfc7-4fa0-9a3b-b3a01a7638ba Ancestors: ToolBuilder-Morphic-mt.147 Cope for ToolBuilder-Kernel-topa.90 =============== Diff against ToolBuilder-Morphic-mt.147 =============== Item was changed: ----- Method: MorphicToolBuilder>>buildPluggableSpacer: (in category 'widgets required') ----- buildPluggableSpacer: spec | widget | widget := self spacerClass new. self register: widget id: spec name. widget borderWidth: 0. + widget color: (spec color ifNil: [Color transparent]). - widget color: spec color. widget extent: spec extent. self buildHelpFor: widget spec: spec. self setFrame: spec frame in: widget. self setLayoutHintsFor: widget spec: spec. parent ifNotNil:[self add: widget to: parent]. ^widget! From Marcel.Taeumel at hpi.de Wed Jul 8 15:42:19 2015 From: Marcel.Taeumel at hpi.de (marcel.taeumel) Date: Wed Jul 8 16:05:29 2015 Subject: [squeak-dev] Re: The Trunk: ToolBuilder-Kernel-topa.90.mcz In-Reply-To: References: Message-ID: <1436370139296-4836589.post@n4.nabble.com> Can you please elaborate on that change? Best, Marcel -- View this message in context: http://forum.world.st/The-Trunk-ToolBuilder-Kernel-topa-90-mcz-tp4836580p4836589.html Sent from the Squeak - Dev mailing list archive at Nabble.com. From Marcel.Taeumel at hpi.de Wed Jul 8 15:44:59 2015 From: Marcel.Taeumel at hpi.de (marcel.taeumel) Date: Wed Jul 8 16:08:09 2015 Subject: [squeak-dev] Re: The Trunk: ToolBuilder-Kernel-topa.90.mcz In-Reply-To: <1436370139296-4836589.post@n4.nabble.com> References: <1436370139296-4836589.post@n4.nabble.com> Message-ID: <1436370299317-4836590.post@n4.nabble.com> Ahh, don't mind. It removed a dependency. :-) Thanks! Marcel -- View this message in context: http://forum.world.st/The-Trunk-ToolBuilder-Kernel-topa-90-mcz-tp4836580p4836590.html Sent from the Squeak - Dev mailing list archive at Nabble.com. From ma.chris.m at gmail.com Wed Jul 8 19:17:14 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Wed Jul 8 19:17:17 2015 Subject: [squeak-dev] accessing file permissions within the image Message-ID: Is it possible to determine the Linux file permissions of a file or directory from within the image running on Linux? From commits at source.squeak.org Wed Jul 8 20:53:28 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 20:53:31 2015 Subject: [squeak-dev] The Trunk: Compiler-dtl.303.mcz Message-ID: Chris Muller uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-dtl.303.mcz ==================== Summary ==================== Name: Compiler-dtl.303 Author: dtl Time: 7 July 2015, 7:27:15.092 pm UUID: 762ba9fa-1e47-4c91-af95-d673d8c6706d Ancestors: Compiler-topa.302 Revert two methods from Compiler-eem.300 because they work on a stack interpreter but not on a context interpreter (VM crash). =============== Diff against Compiler-topa.302 =============== Item was changed: ----- Method: BlockNode>>emitCodeForEvaluatedClosureValue:encoder: (in category 'code generation (closures)') ----- emitCodeForEvaluatedClosureValue: stack encoder: encoder | position | position := stack position. stack position: arguments size + copiedValues size. + temporaries size timesRepeat: + [NodeNil emitCodeForValue: stack encoder: encoder]. - encoder genPushNClosureTemps: temporaries size. self reindexingLocalsDo: [self emitCodeForEvaluatedValue: stack encoder: encoder] encoder: encoder. self returns ifFalse: [encoder genReturnTopToCaller. pc := encoder methodStreamPosition]. stack position: position! Item was changed: ----- Method: BlockNode>>sizeCodeForEvaluatedClosureValue: (in category 'code generation (closures)') ----- sizeCodeForEvaluatedClosureValue: encoder "The closure value primitives push the arguments and the copied values. The compiler guarantees that any copied values come before all local temps. So on closure activation we only need to push nils for the remaining temporaries." + ^temporaries size * (NodeNil sizeCodeForValue: encoder) - ^(encoder sizePushNClosureTemps: temporaries size) + (self reindexingLocalsDo: [self sizeCodeForEvaluatedValue: encoder] encoder: nil "don't store temps yet") + (self returns ifTrue: [0] ifFalse: [encoder sizeReturnTopToCaller])! From asqueaker at gmail.com Wed Jul 8 21:00:12 2015 From: asqueaker at gmail.com (Chris Muller) Date: Wed Jul 8 21:00:20 2015 Subject: [squeak-dev] The Trunk: Compiler-dtl.303.mcz In-Reply-To: <559d8dce.23208c0a.0207.57baSMTPIN_ADDED_MISSING@mx.google.com> References: <559d8dce.23208c0a.0207.57baSMTPIN_ADDED_MISSING@mx.google.com> Message-ID: Dave and Eliot decided to roll this back for the 4.6 release and keep the recompileAll for the release. That will be nice for the two release images to have truly "identical" contents. Eliot said he would eventually like to find out why this caused a problem, but not a priority right now. On Wed, Jul 8, 2015 at 3:53 PM, wrote: > Chris Muller uploaded a new version of Compiler to project The Trunk: > http://source.squeak.org/trunk/Compiler-dtl.303.mcz > > ==================== Summary ==================== > > Name: Compiler-dtl.303 > Author: dtl > Time: 7 July 2015, 7:27:15.092 pm > UUID: 762ba9fa-1e47-4c91-af95-d673d8c6706d > Ancestors: Compiler-topa.302 > > Revert two methods from Compiler-eem.300 because they work on a stack interpreter but not on a context interpreter (VM crash). > > =============== Diff against Compiler-topa.302 =============== > > Item was changed: > ----- Method: BlockNode>>emitCodeForEvaluatedClosureValue:encoder: (in category 'code generation (closures)') ----- > emitCodeForEvaluatedClosureValue: stack encoder: encoder > | position | > position := stack position. > stack position: arguments size + copiedValues size. > + temporaries size timesRepeat: > + [NodeNil emitCodeForValue: stack encoder: encoder]. > - encoder genPushNClosureTemps: temporaries size. > self > reindexingLocalsDo: [self emitCodeForEvaluatedValue: stack encoder: encoder] > encoder: encoder. > self returns ifFalse: > [encoder genReturnTopToCaller. > pc := encoder methodStreamPosition]. > stack position: position! > > Item was changed: > ----- Method: BlockNode>>sizeCodeForEvaluatedClosureValue: (in category 'code generation (closures)') ----- > sizeCodeForEvaluatedClosureValue: encoder > "The closure value primitives push the arguments and the copied values. > The compiler guarantees that any copied values come before all local temps. > So on closure activation we only need to push nils for the remaining temporaries." > + ^temporaries size * (NodeNil sizeCodeForValue: encoder) > - ^(encoder sizePushNClosureTemps: temporaries size) > + (self > reindexingLocalsDo: [self sizeCodeForEvaluatedValue: encoder] > encoder: nil "don't store temps yet") > + (self returns ifTrue: [0] ifFalse: [encoder sizeReturnTopToCaller])! > > From commits at source.squeak.org Wed Jul 8 21:25:50 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 21:25:55 2015 Subject: [squeak-dev] Squeak 4.6: ToolBuilder-Kernel-topa.90.mcz Message-ID: Chris Muller uploaded a new version of ToolBuilder-Kernel to project Squeak 4.6: http://source.squeak.org/squeak46/ToolBuilder-Kernel-topa.90.mcz ==================== Summary ==================== Name: ToolBuilder-Kernel-topa.90 Author: topa Time: 8 July 2015, 5:36:38.882 pm UUID: 90e425d8-969f-4f8f-9edf-a5d30366a298 Ancestors: ToolBuilder-Kernel-mt.89 Remain Grpahics[Color] agnostic. =============== Diff against ToolBuilder-Kernel-mt.89 =============== Item was removed: - SystemOrganization addCategory: #'ToolBuilder-Kernel'! Item was removed: - ----- Method: Object>>confirm: (in category '*ToolBuilder-Kernel-error handling') ----- - confirm: queryString - "Put up a yes/no menu with caption queryString. Answer true if the - response is yes, false if no. This is a modal question--the user must - respond yes or no." - - "nil confirm: 'Are you hungry?'" - - ^ UIManager default confirm: queryString! Item was removed: - ----- Method: Object>>confirm:orCancel: (in category '*ToolBuilder-Kernel-error handling') ----- - confirm: aString orCancel: cancelBlock - "Put up a yes/no/cancel menu with caption aString. Answer true if - the response is yes, false if no. If cancel is chosen, evaluate - cancelBlock. This is a modal question--the user must respond yes or no." - - ^ UIManager default confirm: aString orCancel: cancelBlock! Item was removed: - ----- Method: Object>>inform: (in category '*ToolBuilder-Kernel-user interface') ----- - inform: aString - "Display a message for the user to read and then dismiss. 6/9/96 sw" - - aString isEmptyOrNil ifFalse: [UIManager default inform: aString]! Item was removed: - PluggableButtonSpec subclass: #PluggableActionButtonSpec - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableActionButtonSpec commentStamp: 'dtl 9/19/2011 07:51' prior: 0! - PluggableActionButtonSpec is intended as a HINT for the builder that this widget will be used as push (action) button. Unless explicitly supported it will be automatically substituted by PluggableButton.! Item was removed: - ----- Method: PluggableActionButtonSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableActionButton: self! Item was removed: - PluggableMultiSelectionListSpec subclass: #PluggableAlternateMultiSelectionListSpec - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! Item was removed: - ----- Method: PluggableAlternateMultiSelectionListSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^ builder buildPluggableAlternateMultiSelectionList: self! Item was removed: - PluggableWidgetSpec subclass: #PluggableButtonSpec - instanceVariableNames: 'action label state enabled style changeLabelWhen' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableButtonSpec commentStamp: 'ar 2/11/2005 21:57' prior: 0! - A button, both for firing as well as used in radio-button style (e.g., carrying a selection). - - Instance variables: - action The action to perform when the button is fired. - label The selector for retrieving the button's label or label directly. - state The selector for retrieving the button's selection state. - enabled The selector for retrieving the button's enabled state. - color The selector for retrieving the button color. - help The balloon help for the button.! Item was removed: - ----- Method: PluggableButtonSpec>>action (in category 'accessing') ----- - action - "Answer the action to be performed by the receiver" - ^action! Item was removed: - ----- Method: PluggableButtonSpec>>action: (in category 'accessing') ----- - action: aSymbol - "Indicate the action to be performed by the receiver" - action := aSymbol! Item was removed: - ----- Method: PluggableButtonSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableButton: self! Item was removed: - ----- Method: PluggableButtonSpec>>changeLabelWhen (in category 'accessing') ----- - changeLabelWhen - "When handled in in an update: handler, treat this symbol as notification - that the button label should be updated." - ^changeLabelWhen! Item was removed: - ----- Method: PluggableButtonSpec>>changeLabelWhen: (in category 'accessing') ----- - changeLabelWhen: aSymbol - "When the button handles aSymbol in its update: handler, treat it - as notification that the button label should be updated." - changeLabelWhen := aSymbol! Item was removed: - ----- Method: PluggableButtonSpec>>enabled (in category 'accessing') ----- - enabled - "Answer the selector for retrieving the button's enablement" - ^enabled ifNil:[true]! Item was removed: - ----- Method: PluggableButtonSpec>>enabled: (in category 'accessing') ----- - enabled: aSymbol - "Indicate the selector for retrieving the button's enablement" - enabled := aSymbol! Item was removed: - ----- Method: PluggableButtonSpec>>label (in category 'accessing') ----- - label - "Answer the label (or the selector for retrieving the label)" - ^label! Item was removed: - ----- Method: PluggableButtonSpec>>label: (in category 'accessing') ----- - label: aSymbol - "Indicate the selector for retrieving the label" - label := aSymbol.! Item was removed: - ----- Method: PluggableButtonSpec>>state (in category 'accessing') ----- - state - "Answer the selector for retrieving the button's state" - ^state! Item was removed: - ----- Method: PluggableButtonSpec>>state: (in category 'accessing') ----- - state: aSymbol - "Indicate the selector for retrieving the button's state" - state := aSymbol.! Item was removed: - ----- Method: PluggableButtonSpec>>style (in category 'accessing') ----- - style - "Treat aSymbol as a hint to modify the button appearance." - ^style - - ! Item was removed: - ----- Method: PluggableButtonSpec>>style: (in category 'accessing') ----- - style: aSymbol - "Use aSymbol as a hint to modify the button appearance." - style := aSymbol - ! Item was removed: - PluggableButtonSpec subclass: #PluggableCheckBoxSpec - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableCheckBoxSpec commentStamp: 'ar 2/12/2005 23:13' prior: 0! - PluggableCheckBox is intended as a HINT for the builder that this widget will be used as check box. Unless explicitly supported it will be automatically substituted by PluggableButton.! Item was removed: - ----- Method: PluggableCheckBoxSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableCheckBox: self! Item was removed: - PluggableTextSpec subclass: #PluggableCodePaneSpec - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableCodePaneSpec commentStamp: 'ar 8/18/2009 00:02' prior: 0! - A PluggableTextSpec specifically intended to edit code. Uses Syntax-Highlighting.! Item was removed: - ----- Method: PluggableCodePaneSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableCodePane: self! Item was removed: - ----- Method: PluggableCodePaneSpec>>font (in category 'accessing') ----- - font - ^ font ifNil: [Preferences standardCodeFont]! Item was removed: - ----- Method: PluggableCodePaneSpec>>stylerClass (in category 'accessing') ----- - stylerClass - - ^ super stylerClass ifNil: [Smalltalk classNamed: 'SHTextStylerST80']! Item was removed: - PluggableWidgetSpec subclass: #PluggableCompositeSpec - instanceVariableNames: 'children layout wantsResizeHandles spacing' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableCompositeSpec commentStamp: 'ar 2/11/2005 21:58' prior: 0! - A composite user interface element. - - Instance variables: - children Symbol to retrieve children or children directly - layout The layout for this composite. - ! Item was removed: - ----- Method: PluggableCompositeSpec>>children (in category 'accessing') ----- - children - "Answer the selector to retrieve this panel's children" - ^children! Item was removed: - ----- Method: PluggableCompositeSpec>>children: (in category 'accessing') ----- - children: aSymbol - "Indicate the selector to retrieve this panel's children" - children := aSymbol! Item was removed: - ----- Method: PluggableCompositeSpec>>layout (in category 'accessing') ----- - layout - "Answer the symbol indicating the layout of the composite: - #proportional (default): Use frames as appropriate. - #horizontal: Arrange the elements horizontally - #vertical: Arrange the elements vertically. - " - ^layout ifNil:[#proportional]! Item was removed: - ----- Method: PluggableCompositeSpec>>layout: (in category 'accessing') ----- - layout: aSymbol - "Answer the symbol indicating the layout of the composite: - #proportional (default): Use frames as appropriate. - #horizontal: Arrange the elements horizontally - #vertical: Arrange the elements vertically. - " - layout := aSymbol! Item was removed: - ----- Method: PluggableCompositeSpec>>spacing (in category 'layout hints') ----- - spacing - "...between components of this widget." - - ^ spacing! Item was removed: - ----- Method: PluggableCompositeSpec>>spacing: (in category 'layout hints') ----- - spacing: numberOrPoint - - spacing := numberOrPoint.! Item was removed: - ----- Method: PluggableCompositeSpec>>wantsResizeHandles (in category 'accessing') ----- - wantsResizeHandles - - ^ wantsResizeHandles! Item was removed: - ----- Method: PluggableCompositeSpec>>wantsResizeHandles: (in category 'accessing') ----- - wantsResizeHandles: aBoolean - - wantsResizeHandles := aBoolean.! Item was removed: - PluggableWidgetSpec subclass: #PluggableDropDownListSpec - instanceVariableNames: 'listSelector selectionSelector selectionSetter' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! Item was removed: - ----- Method: PluggableDropDownListSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableDropDownList: self! Item was removed: - ----- Method: PluggableDropDownListSpec>>listSelector (in category 'accessing') ----- - listSelector - "Answer the value of listSelector" - - ^ listSelector! Item was removed: - ----- Method: PluggableDropDownListSpec>>listSelector: (in category 'accessing') ----- - listSelector: anObject - "Set the value of listSelector" - - listSelector := anObject! Item was removed: - ----- Method: PluggableDropDownListSpec>>selectionSelector (in category 'accessing') ----- - selectionSelector - "Answer the value of selectionSelector" - - ^ selectionSelector! Item was removed: - ----- Method: PluggableDropDownListSpec>>selectionSelector: (in category 'accessing') ----- - selectionSelector: anObject - "Set the value of selectionSelector" - - selectionSelector := anObject! Item was removed: - ----- Method: PluggableDropDownListSpec>>selectionSetter (in category 'accessing') ----- - selectionSetter - "Answer the value of selectionSetter" - - ^ selectionSetter! Item was removed: - ----- Method: PluggableDropDownListSpec>>selectionSetter: (in category 'accessing') ----- - selectionSetter: anObject - "Set the value of selectionSetter" - - selectionSetter := anObject! Item was removed: - PluggableTextSpec subclass: #PluggableInputFieldSpec - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableInputFieldSpec commentStamp: 'ar 2/12/2005 23:13' prior: 0! - PluggableInputField is intended as a HINT for the builder that this widget will be used as a single line input field. Unless explicitly supported it will be automatically substituted by PluggableText.! Item was removed: - ----- Method: PluggableInputFieldSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableInputField: self! Item was removed: - ----- Method: PluggableInputFieldSpec>>hardLineWrap (in category 'accessing') ----- - hardLineWrap - - ^ false! Item was removed: - ----- Method: PluggableInputFieldSpec>>softLineWrap (in category 'accessing') ----- - softLineWrap - - ^ super softLineWrap ifNil: [false]! Item was removed: - PluggableWidgetSpec subclass: #PluggableListSpec - instanceVariableNames: 'list getIndex setIndex getSelected setSelected menu keyPress autoDeselect dragItem dropItem dropAccept doubleClick listSize listItem keystrokePreview icon vScrollBarPolicy hScrollBarPolicy' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableListSpec commentStamp: 'ar 7/15/2005 11:54' prior: 0! - A single selection list element. - - Instance variables: - list The selector to retrieve the list elements. - getIndex The selector to retrieve the list selection index. - setIndex The selector to set the list selection index. - getSelected The selector to retrieve the list selection. - setSelected The selector to set the list selection. - menu The selector to offer (to retrieve?) the context menu. - keyPress The selector to invoke for handling keyboard shortcuts. - autoDeselect Whether the list should allow automatic deselection or not. - dragItem Selector to initiate a drag action on an item - dropItem Selector to initiate a drop action of an item - dropAccept Selector to determine whether a drop would be accepted! Item was removed: - ----- Method: PluggableListSpec>>autoDeselect (in category 'accessing') ----- - autoDeselect - "Answer whether this tree can be automatically deselected" - ^autoDeselect ifNil:[true]! Item was removed: - ----- Method: PluggableListSpec>>autoDeselect: (in category 'accessing') ----- - autoDeselect: aBool - "Indicate whether this tree can be automatically deselected" - autoDeselect := aBool! Item was removed: - ----- Method: PluggableListSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableList: self! Item was removed: - ----- Method: PluggableListSpec>>doubleClick (in category 'accessing') ----- - doubleClick - "Answer the selector to perform when a double-click occurs" - ^doubleClick! Item was removed: - ----- Method: PluggableListSpec>>doubleClick: (in category 'accessing') ----- - doubleClick: aSymbol - "Set the selector to perform when a double-click occurs" - doubleClick := aSymbol.! Item was removed: - ----- Method: PluggableListSpec>>dragItem (in category 'accessing') ----- - dragItem - "Answer the selector for dragging an item" - ^dragItem! Item was removed: - ----- Method: PluggableListSpec>>dragItem: (in category 'accessing') ----- - dragItem: aSymbol - "Set the selector for dragging an item" - dragItem := aSymbol! Item was removed: - ----- Method: PluggableListSpec>>dropAccept (in category 'accessing') ----- - dropAccept - "Answer the selector to determine whether a drop would be accepted" - ^dropAccept! Item was removed: - ----- Method: PluggableListSpec>>dropAccept: (in category 'accessing') ----- - dropAccept: aSymbol - "Answer the selector to determine whether a drop would be accepted" - dropAccept := aSymbol.! Item was removed: - ----- Method: PluggableListSpec>>dropItem (in category 'accessing') ----- - dropItem - "Answer the selector for dropping an item" - ^dropItem! Item was removed: - ----- Method: PluggableListSpec>>dropItem: (in category 'accessing') ----- - dropItem: aSymbol - "Set the selector for dropping an item" - dropItem := aSymbol! Item was removed: - ----- Method: PluggableListSpec>>getIndex (in category 'accessing') ----- - getIndex - "Answer the selector for retrieving the list's selection index" - ^getIndex! Item was removed: - ----- Method: PluggableListSpec>>getIndex: (in category 'accessing') ----- - getIndex: aSymbol - "Indicate the selector for retrieving the list's selection index" - getIndex := aSymbol! Item was removed: - ----- Method: PluggableListSpec>>getSelected (in category 'accessing') ----- - getSelected - "Answer the selector for retrieving the list selection" - ^getSelected! Item was removed: - ----- Method: PluggableListSpec>>getSelected: (in category 'accessing') ----- - getSelected: aSymbol - "Indicate the selector for retrieving the list selection" - getSelected := aSymbol! Item was removed: - ----- Method: PluggableListSpec>>hScrollBarPolicy (in category 'accessing') ----- - hScrollBarPolicy - - ^ hScrollBarPolicy! Item was removed: - ----- Method: PluggableListSpec>>hScrollBarPolicy: (in category 'accessing') ----- - hScrollBarPolicy: aSymbol - "#always, #never, #whenNeeded" - - hScrollBarPolicy := aSymbol.! Item was removed: - ----- Method: PluggableListSpec>>icon (in category 'accessing') ----- - icon - ^ icon! Item was removed: - ----- Method: PluggableListSpec>>icon: (in category 'accessing') ----- - icon: aSelector - icon := aSelector! Item was removed: - ----- Method: PluggableListSpec>>keyPress (in category 'accessing') ----- - keyPress - "Answer the selector for invoking the list's keyPress handler" - ^keyPress! Item was removed: - ----- Method: PluggableListSpec>>keyPress: (in category 'accessing') ----- - keyPress: aSymbol - "Indicate the selector for invoking the list's keyPress handler" - keyPress := aSymbol! Item was removed: - ----- Method: PluggableListSpec>>keystrokePreview (in category 'accessing') ----- - keystrokePreview - "Answer the selector to determine whether to allow the model a preview of keystrokes" - ^ keystrokePreview! Item was removed: - ----- Method: PluggableListSpec>>keystrokePreview: (in category 'accessing') ----- - keystrokePreview: aSymbol - "The selector to determine whether to allow the model a preview of keystrokes" - keystrokePreview := aSymbol.! Item was removed: - ----- Method: PluggableListSpec>>list (in category 'accessing') ----- - list - "Answer the selector for retrieving the list contents" - ^list! Item was removed: - ----- Method: PluggableListSpec>>list: (in category 'accessing') ----- - list: aSymbol - "Indicate the selector for retrieving the list contents" - list := aSymbol.! Item was removed: - ----- Method: PluggableListSpec>>listItem (in category 'accessing') ----- - listItem - "Answer the selector for retrieving the list element" - ^listItem! Item was removed: - ----- Method: PluggableListSpec>>listItem: (in category 'accessing') ----- - listItem: aSymbol - "Indicate the selector for retrieving the list element" - listItem := aSymbol.! Item was removed: - ----- Method: PluggableListSpec>>listSize (in category 'accessing') ----- - listSize - "Answer the selector for retrieving the list size" - ^listSize! Item was removed: - ----- Method: PluggableListSpec>>listSize: (in category 'accessing') ----- - listSize: aSymbol - "Indicate the selector for retrieving the list size" - listSize := aSymbol.! Item was removed: - ----- Method: PluggableListSpec>>menu (in category 'accessing') ----- - menu - "Answer the selector for retrieving the list's menu" - ^menu! Item was removed: - ----- Method: PluggableListSpec>>menu: (in category 'accessing') ----- - menu: aSymbol - "Indicate the selector for retrieving the list's menu" - menu := aSymbol! Item was removed: - ----- Method: PluggableListSpec>>setIndex (in category 'accessing') ----- - setIndex - "Answer the selector for setting the list's selection index" - ^setIndex! Item was removed: - ----- Method: PluggableListSpec>>setIndex: (in category 'accessing') ----- - setIndex: aSymbol - "Answer the selector for setting the list's selection index" - setIndex := aSymbol! Item was removed: - ----- Method: PluggableListSpec>>setSelected (in category 'accessing') ----- - setSelected - "Answer the selector for setting the list selection" - ^setSelected! Item was removed: - ----- Method: PluggableListSpec>>setSelected: (in category 'accessing') ----- - setSelected: aSymbol - "Indicate the selector for setting the list selection" - setSelected := aSymbol! Item was removed: - ----- Method: PluggableListSpec>>vScrollBarPolicy (in category 'accessing') ----- - vScrollBarPolicy - - ^ vScrollBarPolicy! Item was removed: - ----- Method: PluggableListSpec>>vScrollBarPolicy: (in category 'accessing') ----- - vScrollBarPolicy: aSymbol - "#always, #never, #whenNeeded" - - vScrollBarPolicy := aSymbol.! Item was removed: - ToolBuilderSpec subclass: #PluggableMenuItemSpec - instanceVariableNames: 'label action checked enabled separator subMenu checkable' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! Item was removed: - ----- Method: PluggableMenuItemSpec>>action (in category 'accessing') ----- - action - "Answer the action associated with the receiver" - ^action! Item was removed: - ----- Method: PluggableMenuItemSpec>>action: (in category 'accessing') ----- - action: aMessageSend - "Answer the action associated with the receiver" - action := aMessageSend! Item was removed: - ----- Method: PluggableMenuItemSpec>>analyzeLabel (in category 'initialize') ----- - analyzeLabel - "For Morphic compatiblity. Some labels include markup such as , etc. - Analyze the label for these annotations and take appropriate action." - | marker | - marker := label copyFrom: 1 to: (label indexOf: $>). - (marker = '' or:[marker = '']) ifTrue:[ - checkable := true. - checked := true. - label := label copyFrom: marker size+1 to: label size. - ]. - (marker = '' or:[marker = '']) ifTrue:[ - checkable := true. - checked := false. - label := label copyFrom: marker size+1 to: label size. - ]. - ! Item was removed: - ----- Method: PluggableMenuItemSpec>>beCheckable (in category 'accessing') ----- - beCheckable - checkable := true.! Item was removed: - ----- Method: PluggableMenuItemSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^ builder buildPluggableMenuItem: self! Item was removed: - ----- Method: PluggableMenuItemSpec>>checked (in category 'accessing') ----- - checked - "Answer whether the receiver is checked" - ^checked ifNil:[false]! Item was removed: - ----- Method: PluggableMenuItemSpec>>checked: (in category 'accessing') ----- - checked: aBool - "Indicate whether the receiver is checked" - checked := aBool.! Item was removed: - ----- Method: PluggableMenuItemSpec>>enabled (in category 'accessing') ----- - enabled - "Answer whether the receiver is enabled" - ^enabled ifNil:[true]! Item was removed: - ----- Method: PluggableMenuItemSpec>>enabled: (in category 'accessing') ----- - enabled: aBool - "Indicate whether the receiver is enabled" - enabled := aBool! Item was removed: - ----- Method: PluggableMenuItemSpec>>initialize (in category 'initialize') ----- - initialize - checkable := false.! Item was removed: - ----- Method: PluggableMenuItemSpec>>isCheckable (in category 'accessing') ----- - isCheckable - ^ checkable! Item was removed: - ----- Method: PluggableMenuItemSpec>>label (in category 'accessing') ----- - label - "Answer the receiver's label" - ^label! Item was removed: - ----- Method: PluggableMenuItemSpec>>label: (in category 'accessing') ----- - label: aString - "Set the receiver's label" - label := aString! Item was removed: - ----- Method: PluggableMenuItemSpec>>separator (in category 'accessing') ----- - separator - "Answer whether the receiver should be followed by a separator" - ^separator ifNil:[false]! Item was removed: - ----- Method: PluggableMenuItemSpec>>separator: (in category 'accessing') ----- - separator: aBool - "Indicate whether the receiver should be followed by a separator" - separator := aBool.! Item was removed: - ----- Method: PluggableMenuItemSpec>>subMenu (in category 'accessing') ----- - subMenu - "Answer the receiver's subMenu" - ^subMenu! Item was removed: - ----- Method: PluggableMenuItemSpec>>subMenu: (in category 'accessing') ----- - subMenu: aMenuSpec - "Answer the receiver's subMenu" - subMenu := aMenuSpec! Item was removed: - ToolBuilderSpec subclass: #PluggableMenuSpec - instanceVariableNames: 'label model items' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! Item was removed: - ----- Method: PluggableMenuSpec class>>withModel: (in category 'as yet unclassified') ----- - withModel: aModel - ^ self new model: aModel! Item was removed: - ----- Method: PluggableMenuSpec>>add:action: (in category 'construction') ----- - add: aString action: aMessageSend - | item | - item := self addMenuItem. - item label: aString. - item action: aMessageSend. - ^item! Item was removed: - ----- Method: PluggableMenuSpec>>add:target:selector:argumentList: (in category 'construction') ----- - add: aString target: anObject selector: aSelector argumentList: anArray - ^self add: aString action: (MessageSend - receiver: anObject - selector: aSelector - arguments: anArray).! Item was removed: - ----- Method: PluggableMenuSpec>>addList: (in category 'construction') ----- - addList: aList - "Add the given items to this menu, where each item is a pair ( ).. If an element of the list is simply the symobl $-, add a line to the receiver. The optional third element of each entry, if present, provides balloon help." - - aList do: [:tuple | - (tuple == #-) - ifTrue: [self addSeparator] - ifFalse:[ | item | - item := self add: tuple first target: model selector: tuple second argumentList: #(). - tuple size > 2 ifTrue:[item help: tuple third]]]! Item was removed: - ----- Method: PluggableMenuSpec>>addMenuItem (in category 'construction') ----- - addMenuItem - | item | - item := self newMenuItem. - self items add: item. - ^item! Item was removed: - ----- Method: PluggableMenuSpec>>addSeparator (in category 'construction') ----- - addSeparator - self items isEmpty ifTrue:[^nil]. - self items last separator: true.! Item was removed: - ----- Method: PluggableMenuSpec>>analyzeItemLabels (in category 'construction') ----- - analyzeItemLabels - "Analyze the item labels" - items do:[:item| item analyzeLabel]. - ! Item was removed: - ----- Method: PluggableMenuSpec>>buildWith: (in category 'construction') ----- - buildWith: builder - self analyzeItemLabels. - ^ builder buildPluggableMenu: self! Item was removed: - ----- Method: PluggableMenuSpec>>items (in category 'accessing') ----- - items - ^ items ifNil: [items := OrderedCollection new]! Item was removed: - ----- Method: PluggableMenuSpec>>label (in category 'accessing') ----- - label - ^label! Item was removed: - ----- Method: PluggableMenuSpec>>label: (in category 'accessing') ----- - label: aString - label := aString.! Item was removed: - ----- Method: PluggableMenuSpec>>model (in category 'accessing') ----- - model - ^ model! Item was removed: - ----- Method: PluggableMenuSpec>>model: (in category 'accessing') ----- - model: anObject - model := anObject! Item was removed: - ----- Method: PluggableMenuSpec>>newMenuItem (in category 'construction') ----- - newMenuItem - ^PluggableMenuItemSpec new! Item was removed: - PluggableListSpec subclass: #PluggableMultiSelectionListSpec - instanceVariableNames: 'getSelectionList setSelectionList' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableMultiSelectionListSpec commentStamp: 'ar 2/12/2005 13:31' prior: 0! - PluggableMultiSelectionListSpec specifies a list with multiple selection behavior. - - Instance variables: - getSelectionList The message to retrieve the multiple selections. - setSelectionList The message to indicate multiple selections.! Item was removed: - ----- Method: PluggableMultiSelectionListSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableMultiSelectionList: self! Item was removed: - ----- Method: PluggableMultiSelectionListSpec>>getSelectionList (in category 'accessing') ----- - getSelectionList - "Answer the message to retrieve the multiple selections" - ^getSelectionList! Item was removed: - ----- Method: PluggableMultiSelectionListSpec>>getSelectionList: (in category 'accessing') ----- - getSelectionList: aSymbol - "Indicate the message to retrieve the multiple selections" - getSelectionList := aSymbol! Item was removed: - ----- Method: PluggableMultiSelectionListSpec>>setSelectionList (in category 'accessing') ----- - setSelectionList - "Answer the message to indicate multiple selections" - ^setSelectionList! Item was removed: - ----- Method: PluggableMultiSelectionListSpec>>setSelectionList: (in category 'accessing') ----- - setSelectionList: aSymbol - "Indicate the message to indicate multiple selections" - setSelectionList := aSymbol! Item was removed: - PluggableCompositeSpec subclass: #PluggablePanelSpec - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggablePanelSpec commentStamp: 'ar 2/11/2005 15:01' prior: 0! - A panel with a (possibly changing) set of child elements. Expects to see change/update notifications when the childrens change.! Item was removed: - ----- Method: PluggablePanelSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggablePanel: self.! Item was removed: - PluggableButtonSpec subclass: #PluggableRadioButtonSpec - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableRadioButtonSpec commentStamp: 'ar 2/12/2005 23:14' prior: 0! - PluggableRadioButton is intended as a HINT for the builder that this widget will be used as radio button. Unless explicitly supported it will be automatically substituted by PluggableButton.! Item was removed: - ----- Method: PluggableRadioButtonSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableRadioButton: self! Item was removed: - PluggableCompositeSpec subclass: #PluggableScrollPaneSpec - instanceVariableNames: 'morph morphClass borderWidth vScrollBarPolicy hScrollBarPolicy' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! Item was removed: - ----- Method: PluggableScrollPaneSpec>>borderWidth (in category 'accessing') ----- - borderWidth - - ^ borderWidth ifNil: [1]! Item was removed: - ----- Method: PluggableScrollPaneSpec>>borderWidth: (in category 'accessing') ----- - borderWidth: anObject - - borderWidth := anObject! Item was removed: - ----- Method: PluggableScrollPaneSpec>>buildWith: (in category 'building') ----- - buildWith: builder - - ^ builder buildPluggableScrollPane: self! Item was removed: - ----- Method: PluggableScrollPaneSpec>>hScrollBarPolicy (in category 'accessing') ----- - hScrollBarPolicy - - ^ hScrollBarPolicy ifNil: [#always]! Item was removed: - ----- Method: PluggableScrollPaneSpec>>hScrollBarPolicy: (in category 'accessing') ----- - hScrollBarPolicy: anObject - "#always, #never, #whenNeeded" - - hScrollBarPolicy := anObject! Item was removed: - ----- Method: PluggableScrollPaneSpec>>morph (in category 'accessing') ----- - morph - - ^ morph! Item was removed: - ----- Method: PluggableScrollPaneSpec>>morph: (in category 'accessing') ----- - morph: anObject - - morph := anObject! Item was removed: - ----- Method: PluggableScrollPaneSpec>>morphClass (in category 'accessing') ----- - morphClass - - ^ morphClass! Item was removed: - ----- Method: PluggableScrollPaneSpec>>morphClass: (in category 'accessing') ----- - morphClass: anObject - - morphClass := anObject! Item was removed: - ----- Method: PluggableScrollPaneSpec>>vScrollBarPolicy (in category 'accessing') ----- - vScrollBarPolicy - - ^ vScrollBarPolicy ifNil: [#always]! Item was removed: - ----- Method: PluggableScrollPaneSpec>>vScrollBarPolicy: (in category 'accessing') ----- - vScrollBarPolicy: anObject - "#always, #never, #whenNeeded" - - vScrollBarPolicy := anObject! Item was removed: - PluggableWidgetSpec subclass: #PluggableSpacerSpec - instanceVariableNames: 'extent' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! Item was removed: - ----- Method: PluggableSpacerSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableSpacer: self! Item was removed: - ----- Method: PluggableSpacerSpec>>color (in category 'accessing') ----- - color - - ^ super color ifNil: [Color transparent]! Item was removed: - ----- Method: PluggableSpacerSpec>>extent (in category 'layout hints') ----- - extent - - ^ extent ifNil: [5@5]! Item was removed: - ----- Method: PluggableSpacerSpec>>extent: (in category 'layout hints') ----- - extent: aPoint - - extent := aPoint.! Item was removed: - ----- Method: PluggableSpacerSpec>>fillSpaceHorizontally (in category 'convenience') ----- - fillSpaceHorizontally - - self horizontalResizing: #spaceFill.! Item was removed: - ----- Method: PluggableSpacerSpec>>fillSpaceVertically (in category 'convenience') ----- - fillSpaceVertically - - self verticalResizing: #spaceFill.! Item was removed: - ----- Method: PluggableSpacerSpec>>horizontalResizing (in category 'accessing') ----- - horizontalResizing - - ^ super horizontalResizing ifNil: [#rigid]! Item was removed: - ----- Method: PluggableSpacerSpec>>verticalResizing (in category 'accessing') ----- - verticalResizing - - ^ super verticalResizing ifNil: [#rigid]! Item was removed: - PluggableWidgetSpec subclass: #PluggableTextSpec - instanceVariableNames: 'getText setText selection menu askBeforeDiscardingEdits editText indicateUnacceptedChanges stylerClass font readOnly softLineWrap hardLineWrap' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableTextSpec commentStamp: 'ar 2/11/2005 21:58' prior: 0! - A text editor. - - Instance variables: - getText The selector to retrieve the text. - setText The selector to set the text. - selection The selector to retrieve the text selection. - menu The selector to offer (to retrieve?) the context menu. - color The selector to retrieve the background color. - - ! Item was removed: - ----- Method: PluggableTextSpec>>askBeforeDiscardingEdits (in category 'accessing') ----- - askBeforeDiscardingEdits - ^askBeforeDiscardingEdits ifNil:[true]! Item was removed: - ----- Method: PluggableTextSpec>>askBeforeDiscardingEdits: (in category 'accessing') ----- - askBeforeDiscardingEdits: aBool - askBeforeDiscardingEdits := aBool! Item was removed: - ----- Method: PluggableTextSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableText: self! Item was removed: - ----- Method: PluggableTextSpec>>editText (in category 'accessing') ----- - editText - ^ editText! Item was removed: - ----- Method: PluggableTextSpec>>editText: (in category 'accessing') ----- - editText: aSymbol - "Answer the selector for getting informed about any modifications of the text." - editText := aSymbol! Item was removed: - ----- Method: PluggableTextSpec>>font (in category 'accessing') ----- - font - ^ font ifNil: [Preferences standardDefaultTextFont]! Item was removed: - ----- Method: PluggableTextSpec>>font: (in category 'accessing') ----- - font: aFont - font := aFont.! Item was removed: - ----- Method: PluggableTextSpec>>getText (in category 'accessing') ----- - getText - "Answer the selector for retrieving the text" - ^getText! Item was removed: - ----- Method: PluggableTextSpec>>getText: (in category 'accessing') ----- - getText: aSymbol - "Answer the selector for retrieving the text" - getText := aSymbol! Item was removed: - ----- Method: PluggableTextSpec>>hardLineWrap (in category 'accessing') ----- - hardLineWrap - - ^ hardLineWrap! Item was removed: - ----- Method: PluggableTextSpec>>hardLineWrap: (in category 'accessing') ----- - hardLineWrap: aBoolean - - hardLineWrap := aBoolean.! Item was removed: - ----- Method: PluggableTextSpec>>indicateUnacceptedChanges (in category 'accessing') ----- - indicateUnacceptedChanges - ^ indicateUnacceptedChanges ifNil: [true]! Item was removed: - ----- Method: PluggableTextSpec>>indicateUnacceptedChanges: (in category 'accessing') ----- - indicateUnacceptedChanges: aBoolean - indicateUnacceptedChanges := aBoolean.! Item was removed: - ----- Method: PluggableTextSpec>>menu (in category 'accessing') ----- - menu - "Answer the selector for retrieving the text's menu" - ^menu! Item was removed: - ----- Method: PluggableTextSpec>>menu: (in category 'accessing') ----- - menu: aSymbol - "Indicate the selector for retrieving the text's menu" - menu := aSymbol! Item was removed: - ----- Method: PluggableTextSpec>>readOnly (in category 'accessing') ----- - readOnly - - ^ readOnly ifNil: [false]! Item was removed: - ----- Method: PluggableTextSpec>>readOnly: (in category 'accessing') ----- - readOnly: aBoolean - - readOnly := aBoolean.! Item was removed: - ----- Method: PluggableTextSpec>>selection (in category 'accessing') ----- - selection - "Answer the selector for retrieving the text selection" - ^selection! Item was removed: - ----- Method: PluggableTextSpec>>selection: (in category 'accessing') ----- - selection: aSymbol - "Indicate the selector for retrieving the text selection" - selection := aSymbol! Item was removed: - ----- Method: PluggableTextSpec>>setText (in category 'accessing') ----- - setText - "Answer the selector for setting the text" - ^setText! Item was removed: - ----- Method: PluggableTextSpec>>setText: (in category 'accessing') ----- - setText: aSymbol - "Answer the selector for setting the text" - setText := aSymbol! Item was removed: - ----- Method: PluggableTextSpec>>softLineWrap (in category 'accessing') ----- - softLineWrap - - ^ softLineWrap! Item was removed: - ----- Method: PluggableTextSpec>>softLineWrap: (in category 'accessing') ----- - softLineWrap: aBoolean - - softLineWrap := aBoolean.! Item was removed: - ----- Method: PluggableTextSpec>>stylerClass (in category 'accessing') ----- - stylerClass - ^ stylerClass! Item was removed: - ----- Method: PluggableTextSpec>>stylerClass: (in category 'accessing') ----- - stylerClass: aStylerClass - stylerClass := aStylerClass.! Item was removed: - PluggableWidgetSpec subclass: #PluggableTreeSpec - instanceVariableNames: 'roots getSelectedPath setSelected getSelected setSelectedParent getChildren hasChildren label icon unusedVar menu keyPress wantsDrop dropItem dropAccept autoDeselect dragItem nodeClass columns' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableTreeSpec commentStamp: 'mvdg 3/21/2008 20:59' prior: 0! - A pluggable tree widget. PluggableTrees are slightly different from lists in such that they ALWAYS store the actual objects and use the label selector to query for the label of the item. PluggableTrees also behave somewhat differently in such that they do not have a "getSelected" message but only a getSelectedPath message. The difference is that getSelectedPath is used to indicate by the model that the tree should select the appropriate path. This allows disambiguation of items. Because of this, implementations of PluggableTrees must always set their internal selection directly, e.g., rather than sending the model a setSelected message and wait for an update of the #getSelected the implementation must set the selection before sending the #setSelected message. If a client doesn't want this, it can always just signal a change of getSelectedPath to revert to whatever is needed. - - Instance variables: - roots The message to retrieve the roots of the tree. - getSelectedPath The message to retrieve the selected path in the tree. - setSelected The message to set the selected item in the tree. - getChildren The message to retrieve the children of an item - hasChildren The message to query for children of an item - label The message to query for the label of an item. - icon The message to query for the icon of an item. - help The message to query for the help of an item. - menu The message to query for the tree's menu - keyPress The message to process a keystroke. - wantsDrop The message to query whether a drop might be accepted. - dropItem The message to drop an item. - enableDrag Enable dragging from this tree. - autoDeselect Whether the tree should allow automatic deselection or not. - unusedVar (unused) This variable is a placeholder to fix problems with loading packages in 3.10.! Item was removed: - ----- Method: PluggableTreeSpec>>autoDeselect (in category 'accessing') ----- - autoDeselect - "Answer whether this tree can be automatically deselected" - ^autoDeselect ifNil:[true]! Item was removed: - ----- Method: PluggableTreeSpec>>autoDeselect: (in category 'accessing') ----- - autoDeselect: aBool - "Indicate whether this tree can be automatically deselected" - autoDeselect := aBool.! Item was removed: - ----- Method: PluggableTreeSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableTree: self! Item was removed: - ----- Method: PluggableTreeSpec>>columns (in category 'accessing') ----- - columns - ^ columns! Item was removed: - ----- Method: PluggableTreeSpec>>columns: (in category 'accessing') ----- - columns: columnSpecs - columns := columnSpecs.! Item was removed: - ----- Method: PluggableTreeSpec>>dragItem (in category 'accessing') ----- - dragItem - ^ dragItem.! Item was removed: - ----- Method: PluggableTreeSpec>>dragItem: (in category 'accessing') ----- - dragItem: aSymbol - "Set the selector for dragging an item" - dragItem := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>dropAccept (in category 'accessing') ----- - dropAccept - "Answer the selector for querying the receiver about accepting drops" - ^dropAccept! Item was removed: - ----- Method: PluggableTreeSpec>>dropAccept: (in category 'accessing') ----- - dropAccept: aSymbol - "Set the selector for querying the receiver about accepting drops" - dropAccept := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>dropItem (in category 'accessing') ----- - dropItem - "Answer the selector for invoking the tree's dragDrop handler" - ^dropItem! Item was removed: - ----- Method: PluggableTreeSpec>>dropItem: (in category 'accessing') ----- - dropItem: aSymbol - "Indicate the selector for invoking the tree's dragDrop handler" - dropItem := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>getChildren (in category 'accessing') ----- - getChildren - "Answer the message to get the children of this tree" - ^getChildren! Item was removed: - ----- Method: PluggableTreeSpec>>getChildren: (in category 'accessing') ----- - getChildren: aSymbol - "Indicate the message to retrieve the children of this tree" - getChildren := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>getSelected (in category 'accessing') ----- - getSelected - ^ getSelected! Item was removed: - ----- Method: PluggableTreeSpec>>getSelected: (in category 'accessing') ----- - getSelected: aSymbol - "Indicate a single node in the tree. Only works if that node is visible, too. Use #getSelectedPath otherwise." - - getSelected := aSymbol.! Item was removed: - ----- Method: PluggableTreeSpec>>getSelectedPath (in category 'accessing') ----- - getSelectedPath - "Answer the message to retrieve the selection of this tree" - ^getSelectedPath! Item was removed: - ----- Method: PluggableTreeSpec>>getSelectedPath: (in category 'accessing') ----- - getSelectedPath: aSymbol - "Indicate the message to retrieve the selection of this tree" - getSelectedPath := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>hasChildren (in category 'accessing') ----- - hasChildren - "Answer the message to get the existence of children in this tree" - ^hasChildren! Item was removed: - ----- Method: PluggableTreeSpec>>hasChildren: (in category 'accessing') ----- - hasChildren: aSymbol - "Indicate the message to retrieve the existence children in this tree" - hasChildren := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>icon (in category 'accessing') ----- - icon - "Answer the message to get the icons of this tree" - ^icon! Item was removed: - ----- Method: PluggableTreeSpec>>icon: (in category 'accessing') ----- - icon: aSymbol - "Indicate the message to retrieve the icon of this tree" - icon := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>keyPress (in category 'accessing') ----- - keyPress - "Answer the selector for invoking the tree's keyPress handler" - ^keyPress! Item was removed: - ----- Method: PluggableTreeSpec>>keyPress: (in category 'accessing') ----- - keyPress: aSymbol - "Indicate the selector for invoking the tree's keyPress handler" - keyPress := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>label (in category 'accessing') ----- - label - "Answer the message to get the labels of this tree" - ^label! Item was removed: - ----- Method: PluggableTreeSpec>>label: (in category 'accessing') ----- - label: aSymbol - "Indicate the message to retrieve the labels of this tree" - label := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>menu (in category 'accessing') ----- - menu - "Answer the message to get the menus of this tree" - ^menu! Item was removed: - ----- Method: PluggableTreeSpec>>menu: (in category 'accessing') ----- - menu: aSymbol - "Indicate the message to retrieve the menus of this tree" - menu := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>nodeClass (in category 'accessing') ----- - nodeClass - ^ nodeClass! Item was removed: - ----- Method: PluggableTreeSpec>>nodeClass: (in category 'accessing') ----- - nodeClass: aListWrapperClass - nodeClass := aListWrapperClass.! Item was removed: - ----- Method: PluggableTreeSpec>>roots (in category 'accessing') ----- - roots - "Answer the message to retrieve the roots of this tree" - ^roots! Item was removed: - ----- Method: PluggableTreeSpec>>roots: (in category 'accessing') ----- - roots: aSymbol - "Indicate the message to retrieve the roots of this tree" - roots := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>setSelected (in category 'accessing') ----- - setSelected - "Answer the message to set the selection of this tree" - ^setSelected! Item was removed: - ----- Method: PluggableTreeSpec>>setSelected: (in category 'accessing') ----- - setSelected: aSymbol - "Indicate the message to set the selection of this tree" - setSelected := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>setSelectedParent (in category 'accessing') ----- - setSelectedParent - ^ setSelectedParent! Item was removed: - ----- Method: PluggableTreeSpec>>setSelectedParent: (in category 'accessing') ----- - setSelectedParent: aSymbol - setSelectedParent := aSymbol! Item was removed: - ----- Method: PluggableTreeSpec>>wantsDrop (in category 'accessing') ----- - wantsDrop - "Answer the selector for invoking the tree's wantsDrop handler" - ^wantsDrop! Item was removed: - ----- Method: PluggableTreeSpec>>wantsDrop: (in category 'accessing') ----- - wantsDrop: aSymbol - "Indicate the selector for invoking the tree's wantsDrop handler" - wantsDrop := aSymbol! Item was removed: - ToolBuilderSpec subclass: #PluggableWidgetSpec - instanceVariableNames: 'model frame color minimumExtent margin padding horizontalResizing verticalResizing' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableWidgetSpec commentStamp: 'ar 2/9/2005 18:40' prior: 0! - The abstract superclass for all widgets. - - Instance variables: - model The object the various requests should be directed to. - frame The associated layout frame for this object (if any). - ! Item was removed: - ----- Method: PluggableWidgetSpec>>color (in category 'accessing') ----- - color - "Answer the selector for retrieving the button's color" - ^color! Item was removed: - ----- Method: PluggableWidgetSpec>>color: (in category 'accessing') ----- - color: aSymbol - "Indicate the selector for retrieving the button's color" - color := aSymbol! Item was removed: - ----- Method: PluggableWidgetSpec>>frame (in category 'accessing') ----- - frame - "Answer the receiver's layout frame" - ^frame! Item was removed: - ----- Method: PluggableWidgetSpec>>frame: (in category 'accessing') ----- - frame: aRectangle - "Indicate the receiver's layout frame" - frame := aRectangle! Item was removed: - ----- Method: PluggableWidgetSpec>>horizontalResizing (in category 'layout hints') ----- - horizontalResizing - - ^ horizontalResizing! Item was removed: - ----- Method: PluggableWidgetSpec>>horizontalResizing: (in category 'layout hints') ----- - horizontalResizing: aSymbol - "#rigid, #spaceFill, #shrinkWrap" - - horizontalResizing := aSymbol.! Item was removed: - ----- Method: PluggableWidgetSpec>>margin (in category 'layout hints') ----- - margin - "Space outside the widgets border. - See: http://www.w3.org/wiki/The_CSS_layout_model_-_boxes_borders_margins_padding" - - ^ margin! Item was removed: - ----- Method: PluggableWidgetSpec>>margin: (in category 'layout hints') ----- - margin: numberOrPointOrRectangle - - margin := numberOrPointOrRectangle.! Item was removed: - ----- Method: PluggableWidgetSpec>>minimumExtent (in category 'layout hints') ----- - minimumExtent - - ^ minimumExtent ifNil: [-1 @ -1]! Item was removed: - ----- Method: PluggableWidgetSpec>>minimumExtent: (in category 'layout hints') ----- - minimumExtent: aPoint - - minimumExtent := aPoint.! Item was removed: - ----- Method: PluggableWidgetSpec>>minimumHeight (in category 'layout hints') ----- - minimumHeight - - ^ self minimumExtent y! Item was removed: - ----- Method: PluggableWidgetSpec>>minimumHeight: (in category 'layout hints') ----- - minimumHeight: aNumber - - self minimumExtent: self minimumExtent x @ aNumber.! Item was removed: - ----- Method: PluggableWidgetSpec>>minimumWidth (in category 'layout hints') ----- - minimumWidth - - ^ self minimumExtent x! Item was removed: - ----- Method: PluggableWidgetSpec>>minimumWidth: (in category 'layout hints') ----- - minimumWidth: aNumber - - self minimumExtent: aNumber @ self minimumExtent y.! Item was removed: - ----- Method: PluggableWidgetSpec>>model (in category 'accessing') ----- - model - "Answer the model for which this widget should be built" - ^model! Item was removed: - ----- Method: PluggableWidgetSpec>>model: (in category 'accessing') ----- - model: aModel - "Indicate the model for which this widget should be built" - model := aModel.! Item was removed: - ----- Method: PluggableWidgetSpec>>padding (in category 'layout hints') ----- - padding - "Space inside the widget's border. - See: http://www.w3.org/wiki/The_CSS_layout_model_-_boxes_borders_margins_padding" - - ^ padding! Item was removed: - ----- Method: PluggableWidgetSpec>>padding: (in category 'layout hints') ----- - padding: numberOrPointOrRectangle - - padding := numberOrPointOrRectangle.! Item was removed: - ----- Method: PluggableWidgetSpec>>verticalResizing (in category 'layout hints') ----- - verticalResizing - - ^ verticalResizing! Item was removed: - ----- Method: PluggableWidgetSpec>>verticalResizing: (in category 'layout hints') ----- - verticalResizing: aSymbol - "#rigid, #spaceFill, #shrinkWrap" - - verticalResizing := aSymbol.! Item was removed: - PluggableCompositeSpec subclass: #PluggableWindowSpec - instanceVariableNames: 'label extent closeAction isDialog multiWindowStyle' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !PluggableWindowSpec commentStamp: '' prior: 0! - A common window. Expects to see change/update notifications when the label should change. - - Instance variables: - label The selector under which to retrieve the label or the label directly - extent The (initial) extent of the window. - closeAction The action to perform when the window is closed.! Item was removed: - ----- Method: PluggableWindowSpec>>buildWith: (in category 'building') ----- - buildWith: builder - ^builder buildPluggableWindow: self.! Item was removed: - ----- Method: PluggableWindowSpec>>closeAction (in category 'accessing') ----- - closeAction - "Answer the receiver's closeAction" - ^closeAction! Item was removed: - ----- Method: PluggableWindowSpec>>closeAction: (in category 'accessing') ----- - closeAction: aSymbol - "Answer the receiver's closeAction" - closeAction := aSymbol.! Item was removed: - ----- Method: PluggableWindowSpec>>extent (in category 'accessing') ----- - extent - "Answer the window's (initial) extent" - ^extent! Item was removed: - ----- Method: PluggableWindowSpec>>extent: (in category 'accessing') ----- - extent: aPoint - "Indicate the window's (initial) extent" - extent := aPoint! Item was removed: - ----- Method: PluggableWindowSpec>>isDialog (in category 'accessing') ----- - isDialog - - ^isDialog ifNil: [false] - ! Item was removed: - ----- Method: PluggableWindowSpec>>isDialog: (in category 'accessing') ----- - isDialog: val - - isDialog := val - - ! Item was removed: - ----- Method: PluggableWindowSpec>>label (in category 'accessing') ----- - label - "Answer the selector for retrieving the window's label" - ^label! Item was removed: - ----- Method: PluggableWindowSpec>>label: (in category 'accessing') ----- - label: aString - "Indicate the selector for retrieving the window's label" - label := aString! Item was removed: - ----- Method: PluggableWindowSpec>>multiWindowStyle (in category 'accessing') ----- - multiWindowStyle - "Answer the value of multiWindowStyle, a Symbol or nil" - ^multiWindowStyle! Item was removed: - ----- Method: PluggableWindowSpec>>multiWindowStyle: (in category 'accessing') ----- - multiWindowStyle: aSymbol - "Set the value of multiWindowStyle, one of #labelButton or #tabbed" - - multiWindowStyle := aSymbol! Item was removed: - Notification subclass: #ProgressInitiationException - instanceVariableNames: 'workBlock maxVal minVal aPoint progressTitle' - classVariableNames: 'PreferredProgressBarPosition' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !ProgressInitiationException commentStamp: '' prior: 0! - I provide a way to alter the behavior of the old-style progress notifier in String. See examples in: - - ProgressInitiationException testWithout. - ProgressInitiationException testWith. - ! Item was removed: - ----- Method: ProgressInitiationException class>>display:at:from:to:during: (in category 'signalling') ----- - display: aString at: aPoint from: minVal to: maxVal during: workBlock - ^ self new - display: aString - at: (aPoint ifNil: [ self preferredProgressBarPoint ]) - from: minVal - to: maxVal - during: workBlock! Item was removed: - ----- Method: ProgressInitiationException class>>display:from:to:during: (in category 'signalling') ----- - display: aString from: minVal to: maxVal during: workBlock - ^ self - display: aString - at: nil - from: minVal - to: maxVal - during: workBlock! Item was removed: - ----- Method: ProgressInitiationException class>>preferredProgressBarPoint (in category 'accessing') ----- - preferredProgressBarPoint - ^ self preferredProgressBarPosition = #cursorPoint - ifTrue: [ Sensor cursorPoint ] - ifFalse: [ UIManager default screenBounds perform: self preferredProgressBarPosition ]! Item was removed: - ----- Method: ProgressInitiationException class>>preferredProgressBarPosition (in category 'accessing') ----- - preferredProgressBarPosition - ^ PreferredProgressBarPosition ifNil: [ #center ]! Item was removed: - ----- Method: ProgressInitiationException class>>preferredProgressBarPosition: (in category 'accessing') ----- - preferredProgressBarPosition: aSymbol - "Specify any of: #center, #topCenter, #bottomCenter, #leftCenter, #rightCenter, #topLeft, #topRight, #bottomLeft or #bottomRight or #cursorPoint." - ^ PreferredProgressBarPosition! Item was removed: - ----- Method: ProgressInitiationException class>>testInnermost (in category 'examples and tests') ----- - testInnermost - - "test the progress code WITHOUT special handling" - - ^'Now here''s some Real Progress' - displayProgressFrom: 0 - to: 10 - during: [ :bar | - 1 to: 10 do: [ :x | - bar value: x. (Delay forMilliseconds: 500) wait. - x = 5 ifTrue: [1/0]. "just to make life interesting" - ]. - 'done' - ]. - - ! Item was removed: - ----- Method: ProgressInitiationException class>>testWith (in category 'examples and tests') ----- - testWith - - "test progress code WITH special handling of progress notifications" - - ^[ self testWithAdditionalInfo ] - on: ProgressInitiationException - do: [ :ex | - ex sendNotificationsTo: [ :min :max :curr | - Transcript show: min printString,' ',max printString,' ',curr printString; cr - ]. - ]. - ! Item was removed: - ----- Method: ProgressInitiationException class>>testWithAdditionalInfo (in category 'examples and tests') ----- - testWithAdditionalInfo - - ^{'starting'. self testWithout. 'really!!'}! Item was removed: - ----- Method: ProgressInitiationException class>>testWithout (in category 'examples and tests') ----- - testWithout - - "test the progress code WITHOUT special handling" - - ^[self testInnermost] - on: ZeroDivide - do: [ :ex | ex resume] - - ! Item was removed: - ----- Method: ProgressInitiationException>>defaultAction (in category 'handling') ----- - defaultAction - self resume! Item was removed: - ----- Method: ProgressInitiationException>>defaultResumeValue (in category 'handling') ----- - defaultResumeValue - ^ UIManager default - displayProgress: progressTitle - at: aPoint - from: minVal - to: maxVal - during: workBlock! Item was removed: - ----- Method: ProgressInitiationException>>display:at:from:to:during: (in category 'initialize-release') ----- - display: argString at: argPoint from: argMinVal to: argMaxVal during: argWorkBlock - - progressTitle := argString. - aPoint := argPoint. - minVal := argMinVal. - maxVal := argMaxVal. - workBlock := argWorkBlock. - ^self signal! Item was removed: - ----- Method: ProgressInitiationException>>sendNotificationsTo: (in category 'initialize-release') ----- - sendNotificationsTo: aNewBlock - - self resume: ( - workBlock value: [ :barVal | - aNewBlock value: minVal value: maxVal value: barVal - ] - ) - ! Item was removed: - ----- Method: String>>displayProgressAt:from:to:during: (in category '*toolbuilder-kernel') ----- - displayProgressAt: aPoint from: minVal to: maxVal during: workBlock - "Display this string as a caption over a progress bar while workBlock is evaluated. - - EXAMPLE (Select next 6 lines and Do It) - 'Now here''s some Real Progress' - displayProgressAt: Sensor cursorPoint - from: 0 to: 10 - during: [:bar | - 1 to: 10 do: [:x | bar value: x. - (Delay forMilliseconds: 500) wait]]. - - HOW IT WORKS (Try this in any other language :-) - Since your code (the last 2 lines in the above example) is in a block, - this method gets control to display its heading before, and clean up - the screen after, its execution. - The key, though, is that the block is supplied with an argument, - named 'bar' in the example, which will update the bar image every - it is sent the message value: x, where x is in the from:to: range. - " - ^ProgressInitiationException - display: self - at: aPoint - from: minVal - to: maxVal - during: workBlock! Item was removed: - ----- Method: String>>displayProgressFrom:to:during: (in category '*toolbuilder-kernel') ----- - displayProgressFrom: minVal to: maxVal during: workBlock - "Display this string as a caption over a progress bar while workBlock is evaluated. - - EXAMPLE (Select next 6 lines and Do It) - 'Now here''s some Real Progress' - displayProgressFrom: 0 to: 10 - during: [:bar | - 1 to: 10 do: [:x | bar value: x. - (Delay forMilliseconds: 500) wait]]." - ^ self - displayProgressAt: nil - from: minVal - to: maxVal - during: workBlock! Item was removed: - Object subclass: #ToolBuilder - instanceVariableNames: 'parent' - classVariableNames: 'OpenToolsAttachedToMouseCursor' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !ToolBuilder commentStamp: '' prior: 0! - I am a tool builder, that is an object which knows how to create concrete widgets from abstract specifications. Those specifications are used by tools which want to be able to function in diverse user interface paradigms, such as MVC, Morphic, Tweak, wxWidgets etc. - - The following five specs must be supported by all implementations: - * PluggableButton - * PluggableList - * PluggableText - * PluggablePanel - * PluggableWindow - - The following specs are optional: - * PluggableTree: If not supported, the tool builder must answer nil when asked for a pluggableTreeSpec. Substitution will require client support so clients must be aware that some tool builders may not support trees (MVC for example, or Seaside). See examples in FileListPlus or TestRunnerPlus. - * PluggableMultiSelectionList: If multi-selection lists are not supported, tool builder will silently support regular single selection lists. - * PluggableInputField: Intended as a HINT for the builder that this widget will be used as a single line input field. Unless explicitly supported it will be automatically substituted by PluggableText. - * PluggableActionButton: Intended as a HINT for the builder that this widget will be used as push (action) button. Unless explicitly supported it will be automatically substituted by PluggableButton. - * PluggableRadioButton: Intended as a HINT for the builder that this widget will be used as radio button. Unless explicitly supported it will be automatically substituted by PluggableButton. - * PluggableCheckBox: Intended as a HINT for the builder that this widget will be used as check box. Unless explicitly supported it will be automatically substituted by PluggableButton. - ! Item was removed: - ----- Method: ToolBuilder class>>build: (in category 'instance creation') ----- - build: aClass - ^self default build: aClass! Item was removed: - ----- Method: ToolBuilder class>>default (in category 'accessing') ----- - default - "Answer the default tool builder" - ^ Project current uiManager toolBuilder - ! Item was removed: - ----- Method: ToolBuilder class>>findDefault (in category 'accessing') ----- - findDefault - "Answer a default tool builder" - | builderClass | - "Note: The way the following is phrased ensures that you can always make 'more specific' builders merely by subclassing a tool builder and implementing a more specific way of reacting to #isActiveBuilder. For example, a BobsUIToolBuilder can subclass MorphicToolBuilder and (if enabled, say Preferences useBobsUITools) will be considered before the parent (generic MorphicToolBuilder)." - builderClass := self allSubclasses - detect:[:any| any isActiveBuilder and:[ - any subclasses noneSatisfy:[:sub| sub isActiveBuilder]]] ifNone:[nil]. - builderClass ifNotNil: [^builderClass ]. - ^self error: 'ToolBuilder not found'! Item was removed: - ----- Method: ToolBuilder class>>isActiveBuilder (in category 'accessing') ----- - isActiveBuilder - "Answer whether I am the currently active builder" - ^false! Item was removed: - ----- Method: ToolBuilder class>>open: (in category 'instance creation') ----- - open: aClass - ^self default open: aClass! Item was removed: - ----- Method: ToolBuilder class>>open:label: (in category 'instance creation') ----- - open: aClass label: aString - ^self default open: aClass label: aString! Item was removed: - ----- Method: ToolBuilder class>>openToolsAttachedToMouseCursor (in category 'preferences') ----- - openToolsAttachedToMouseCursor - - - ^ OpenToolsAttachedToMouseCursor ifNil: [false]! Item was removed: - ----- Method: ToolBuilder class>>openToolsAttachedToMouseCursor: (in category 'preferences') ----- - openToolsAttachedToMouseCursor: aBoolean - - OpenToolsAttachedToMouseCursor := aBoolean.! Item was removed: - ----- Method: ToolBuilder>>build: (in category 'building') ----- - build: anObject - "Build the given object using this tool builder" - ^anObject buildWith: self! Item was removed: - ----- Method: ToolBuilder>>buildAll:in: (in category 'building') ----- - buildAll: aList in: newParent - "Build the given set of widgets in the new parent" - | prior | - aList ifNil:[^self]. - prior := parent. - parent := newParent. - aList do:[:each| each buildWith: self]. - parent := prior. - ! Item was removed: - ----- Method: ToolBuilder>>buildPluggableActionButton: (in category 'widgets optional') ----- - buildPluggableActionButton: spec - ^self buildPluggableButton: spec! Item was removed: - ----- Method: ToolBuilder>>buildPluggableAlternateMultiSelectionList: (in category 'widgets optional') ----- - buildPluggableAlternateMultiSelectionList: aSpec - - ^ self buildPluggableList: aSpec! Item was removed: - ----- Method: ToolBuilder>>buildPluggableButton: (in category 'widgets required') ----- - buildPluggableButton: aSpec - ^self subclassResponsibility! Item was removed: - ----- Method: ToolBuilder>>buildPluggableCheckBox: (in category 'widgets optional') ----- - buildPluggableCheckBox: spec - ^self buildPluggableButton: spec! Item was removed: - ----- Method: ToolBuilder>>buildPluggableCodePane: (in category 'widgets optional') ----- - buildPluggableCodePane: aSpec - ^self buildPluggableText: aSpec! Item was removed: - ----- Method: ToolBuilder>>buildPluggableDropDownList: (in category 'widgets optional') ----- - buildPluggableDropDownList: spec - ^self buildPluggableList: spec! Item was removed: - ----- Method: ToolBuilder>>buildPluggableInputField: (in category 'widgets optional') ----- - buildPluggableInputField: aSpec - ^self buildPluggableText: aSpec! Item was removed: - ----- Method: ToolBuilder>>buildPluggableList: (in category 'widgets required') ----- - buildPluggableList: aSpec - ^self subclassResponsibility! Item was removed: - ----- Method: ToolBuilder>>buildPluggableMenu: (in category 'widgets required') ----- - buildPluggableMenu: menuSpec - - self subclassResponsibility.! Item was removed: - ----- Method: ToolBuilder>>buildPluggableMenuItem: (in category 'widgets required') ----- - buildPluggableMenuItem: menuSpec - - self subclassResponsibility.! Item was removed: - ----- Method: ToolBuilder>>buildPluggableMultiSelectionList: (in category 'widgets optional') ----- - buildPluggableMultiSelectionList: aSpec - ^self buildPluggableList: aSpec! Item was removed: - ----- Method: ToolBuilder>>buildPluggablePanel: (in category 'widgets required') ----- - buildPluggablePanel: aSpec - ^self subclassResponsibility! Item was removed: - ----- Method: ToolBuilder>>buildPluggableRadioButton: (in category 'widgets optional') ----- - buildPluggableRadioButton: spec - ^self buildPluggableButton: spec! Item was removed: - ----- Method: ToolBuilder>>buildPluggableScrollPane: (in category 'widgets optional') ----- - buildPluggableScrollPane: spec - - ^ spec children - ifNotNil: [self buildPluggablePanel: spec] - ifNil: [spec morph ifNil: [spec morphClass new]]! Item was removed: - ----- Method: ToolBuilder>>buildPluggableSpacer: (in category 'widgets required') ----- - buildPluggableSpacer: aSpec - - ^ self subclassResponsibility! Item was removed: - ----- Method: ToolBuilder>>buildPluggableText: (in category 'widgets required') ----- - buildPluggableText: aSpec - ^self subclassResponsibility! Item was removed: - ----- Method: ToolBuilder>>buildPluggableTree: (in category 'widgets required') ----- - buildPluggableTree: aSpec - ^self subclassResponsibility! Item was removed: - ----- Method: ToolBuilder>>buildPluggableWindow: (in category 'widgets required') ----- - buildPluggableWindow: aSpec - ^self subclassResponsibility! Item was removed: - ----- Method: ToolBuilder>>close: (in category 'opening') ----- - close: aWidget - "Close a previously opened widget" - ^self subclassResponsibility! Item was removed: - ----- Method: ToolBuilder>>initialize (in category 'initialize') ----- - initialize - ! Item was removed: - ----- Method: ToolBuilder>>open: (in category 'opening') ----- - open: anObject - "Build and open the object. Answer the widget opened." - ^self subclassResponsibility! Item was removed: - ----- Method: ToolBuilder>>open:label: (in category 'opening') ----- - open: anObject label: aString - "Build an open the object, labeling it appropriately. Answer the widget opened." - ^self subclassResponsibility! Item was removed: - ----- Method: ToolBuilder>>openDebugger: (in category 'opening') ----- - openDebugger: aSpec - "Build and open a debugger from the given spec. - Answer the widget opened. Subclasses can override this - method if opening a debugger has specific requirements - different from opening other widgets." - - self open: aSpec - ! Item was removed: - ----- Method: ToolBuilder>>openDebugger:label: (in category 'opening') ----- - openDebugger: aSpec label: aString - "Build and open a debugger from the given spec, labeling it appropriately. - Answer the widget opened. Subclasses can override this - method if opening a debugger has specific requirements - different from opening other widgets." - - ^self open: aSpec label: aString - ! Item was removed: - ----- Method: ToolBuilder>>openDebugger:label:closing: (in category 'opening') ----- - openDebugger: aSpec label: aString closing: topView - "Build and open a debugger from the given spec, labeling it appropriately. - Answer the widget opened. Subclasses can override this - method if opening a debugger has specific requirements - different from opening other widgets." - - self close: topView. - self open: aSpec label: aString - ! Item was removed: - ----- Method: ToolBuilder>>parent (in category 'accessing') ----- - parent - ^parent! Item was removed: - ----- Method: ToolBuilder>>parent: (in category 'accessing') ----- - parent: aWidget - parent := aWidget! Item was removed: - ----- Method: ToolBuilder>>pluggableActionButtonSpec (in category 'defaults') ----- - pluggableActionButtonSpec - ^PluggableActionButtonSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableAlternateMultiSelectionListSpec (in category 'defaults') ----- - pluggableAlternateMultiSelectionListSpec - ^ PluggableAlternateMultiSelectionListSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableButtonSpec (in category 'defaults') ----- - pluggableButtonSpec - ^PluggableButtonSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableCheckBoxSpec (in category 'defaults') ----- - pluggableCheckBoxSpec - ^PluggableCheckBoxSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableCodePaneSpec (in category 'defaults') ----- - pluggableCodePaneSpec - ^PluggableCodePaneSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableDropDownListSpec (in category 'defaults') ----- - pluggableDropDownListSpec - ^PluggableDropDownListSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableInputFieldSpec (in category 'defaults') ----- - pluggableInputFieldSpec - ^PluggableInputFieldSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableListSpec (in category 'defaults') ----- - pluggableListSpec - ^PluggableListSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableMenuSpec (in category 'defaults') ----- - pluggableMenuSpec - ^ PluggableMenuSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableMultiSelectionListSpec (in category 'defaults') ----- - pluggableMultiSelectionListSpec - ^PluggableMultiSelectionListSpec! Item was removed: - ----- Method: ToolBuilder>>pluggablePanelSpec (in category 'defaults') ----- - pluggablePanelSpec - ^PluggablePanelSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableRadioButtonSpec (in category 'defaults') ----- - pluggableRadioButtonSpec - ^PluggableRadioButtonSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableScrollPaneSpec (in category 'defaults') ----- - pluggableScrollPaneSpec - ^ PluggableScrollPaneSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableSpacerSpec (in category 'defaults') ----- - pluggableSpacerSpec - ^ PluggableSpacerSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableTextSpec (in category 'defaults') ----- - pluggableTextSpec - ^PluggableTextSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableTreeSpec (in category 'defaults') ----- - pluggableTreeSpec - ^PluggableTreeSpec! Item was removed: - ----- Method: ToolBuilder>>pluggableWindowSpec (in category 'defaults') ----- - pluggableWindowSpec - ^PluggableWindowSpec! Item was removed: - ----- Method: ToolBuilder>>runModal: (in category 'opening') ----- - runModal: aWidget - "Run the (previously opened) widget modally, e.g., - do not return control to the sender before the user has responded." - ^self subclassResponsibility! Item was removed: - ----- Method: ToolBuilder>>widgetAt: (in category 'accessing') ----- - widgetAt: widgetID - "Answer the widget with the given ID" - ^self widgetAt: widgetID ifAbsent:[nil]! Item was removed: - ----- Method: ToolBuilder>>widgetAt:ifAbsent: (in category 'accessing') ----- - widgetAt: widgetID ifAbsent: aBlock - "Answer the widget with the given ID" - ^aBlock value! Item was removed: - Object subclass: #ToolBuilderSpec - instanceVariableNames: 'name help' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !ToolBuilderSpec commentStamp: 'ar 2/11/2005 14:59' prior: 0! - I am an abstract widget specification. I can be rendered using many different UI frameworks.! Item was removed: - ----- Method: ToolBuilderSpec>>buildWith: (in category 'building') ----- - buildWith: aBuilder - ^self subclassResponsibility! Item was removed: - ----- Method: ToolBuilderSpec>>help (in category 'accessing') ----- - help - "Answer the message to get the help texts of this element." - ^ help! Item was removed: - ----- Method: ToolBuilderSpec>>help: (in category 'accessing') ----- - help: aSymbol - "Indicate the message to retrieve the help texts of this element." - help := aSymbol! Item was removed: - ----- Method: ToolBuilderSpec>>name (in category 'accessing') ----- - name - ^ name! Item was removed: - ----- Method: ToolBuilderSpec>>name: (in category 'accessing') ----- - name: anObject - name := anObject! Item was removed: - Object subclass: #UIManager - instanceVariableNames: 'builderClass' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-Kernel'! - - !UIManager commentStamp: 'dtl 5/2/2010 16:06' prior: 0! - UIManager is a dispatcher for various user interface requests, such as menu and dialog interactions. An instance of UIManager is associated with each Project to implement the appropriate functions for Morphic, MVC or other user interfaces.! Item was removed: - ----- Method: UIManager class>>default (in category 'class initialization') ----- - default - ^ Project current uiManager! Item was removed: - ----- Method: UIManager class>>getDefault (in category 'class initialization') ----- - getDefault - "Ensure that a more specific manager can always be made by subclassing - a tool builder and implementing a more specific way of reacting to - #isActiveManager. For example, a BobsUIManager can subclass - MorphicUIManager and (if enabled, say Preferences useBobsUI) will - be considered before the parent (generic MorphicUIManager)." - - ^ (self allSubclasses - detect: [:any | any isActiveManager - and: [any subclasses - noneSatisfy: [:sub | sub isActiveManager]]] - ifNone: []) - ifNotNilDo: [:mgrClass | mgrClass new]! Item was removed: - ----- Method: UIManager class>>isActiveManager (in category 'class initialization') ----- - isActiveManager - "Answer whether I should act as the active ui manager" - ^false! Item was removed: - ----- Method: UIManager>>builderClass (in category 'builder') ----- - builderClass - "Answer the kind of tool builder to use, possibly influenced by project preferences" - ^ builderClass ifNil: [ builderClass := ToolBuilder findDefault ]! Item was removed: - ----- Method: UIManager>>builderClass: (in category 'accessing') ----- - builderClass: aClass - builderClass := aClass! Item was removed: - ----- Method: UIManager>>chooseClassOrTrait (in category 'ui requests') ----- - chooseClassOrTrait - "Let the user choose a Class or Trait" - - ^self chooseClassOrTrait: 'Class name or fragment?'! Item was removed: - ----- Method: UIManager>>chooseClassOrTrait: (in category 'ui requests') ----- - chooseClassOrTrait: label - "Let the user choose a Class or Trait" - - ^self chooseClassOrTrait: label from: Smalltalk environment! Item was removed: - ----- Method: UIManager>>chooseClassOrTrait:from: (in category 'ui requests') ----- - chooseClassOrTrait: label from: environment - "Let the user choose a Class or Trait." - - | pattern | - pattern := self request: label. - ^ self classOrTraitFrom: environment pattern: pattern label: label - ! Item was removed: - ----- Method: UIManager>>chooseDirectory (in category 'ui requests') ----- - chooseDirectory - "Let the user choose a directory" - ^self chooseDirectoryFrom: FileDirectory default! Item was removed: - ----- Method: UIManager>>chooseDirectory: (in category 'ui requests') ----- - chooseDirectory: label - "Let the user choose a directory" - ^self chooseDirectory: label from: FileDirectory default! Item was removed: - ----- Method: UIManager>>chooseDirectory:from: (in category 'ui requests') ----- - chooseDirectory: label from: dir - "Let the user choose a directory" - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>chooseDirectoryFrom: (in category 'ui requests') ----- - chooseDirectoryFrom: dir - "Let the user choose a directory" - ^self chooseDirectory: nil from: dir! Item was removed: - ----- Method: UIManager>>chooseFileMatching: (in category 'ui requests') ----- - chooseFileMatching: patterns - "Let the user choose a file matching the given patterns" - ^self chooseFileMatching: patterns label: nil! Item was removed: - ----- Method: UIManager>>chooseFileMatching:label: (in category 'ui requests') ----- - chooseFileMatching: patterns label: labelString - "Let the user choose a file matching the given patterns" - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>chooseFont:for:setSelector:getSelector: (in category 'ui requests') ----- - chooseFont: titleString for: aModel setSelector: setSelector getSelector: getSelector - "Open a font-chooser for the given model"! Item was removed: - ----- Method: UIManager>>chooseFrom: (in category 'ui requests') ----- - chooseFrom: aList - "Choose an item from the given list. Answer the index of the selected item." - ^self chooseFrom: aList lines: #()! Item was removed: - ----- Method: UIManager>>chooseFrom:lines: (in category 'ui requests') ----- - chooseFrom: aList lines: linesArray - "Choose an item from the given list. Answer the index of the selected item." - ^self chooseFrom: aList lines: linesArray title: ''! Item was removed: - ----- Method: UIManager>>chooseFrom:lines:title: (in category 'ui requests') ----- - chooseFrom: aList lines: linesArray title: aString - "Choose an item from the given list. Answer the index of the selected item." - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>chooseFrom:title: (in category 'ui requests') ----- - chooseFrom: aList title: aString - "Choose an item from the given list. Answer the index of the selected item." - ^self chooseFrom: aList lines: #() title: aString! Item was removed: - ----- Method: UIManager>>chooseFrom:values: (in category 'ui requests') ----- - chooseFrom: labelList values: valueList - "Choose an item from the given list. Answer the selected item." - ^self chooseFrom: labelList values: valueList lines: #()! Item was removed: - ----- Method: UIManager>>chooseFrom:values:lines: (in category 'ui requests') ----- - chooseFrom: labelList values: valueList lines: linesArray - "Choose an item from the given list. Answer the selected item." - ^self chooseFrom: labelList values: valueList lines: linesArray title: ''! Item was removed: - ----- Method: UIManager>>chooseFrom:values:lines:title: (in category 'ui requests') ----- - chooseFrom: labelList values: valueList lines: linesArray title: aString - "Choose an item from the given list. Answer the selected item." - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>chooseFrom:values:title: (in category 'ui requests') ----- - chooseFrom: labelList values: valueList title: aString - "Choose an item from the given list. Answer the selected item." - ^self chooseFrom: labelList values: valueList lines: #() title: aString! Item was removed: - ----- Method: UIManager>>chooseMultipleFrom: (in category 'ui requests') ----- - chooseMultipleFrom: aList - "Choose one or more items from the given list. Answer the indices of the selected items." - - ^ self chooseMultipleFrom: aList lines: #()! Item was removed: - ----- Method: UIManager>>chooseMultipleFrom:lines: (in category 'ui requests') ----- - chooseMultipleFrom: aList lines: linesArray - "Choose one or more items from the given list. Answer the indices of the selected items." - - ^ self chooseMultipleFrom: aList lines: linesArray title: ''! Item was removed: - ----- Method: UIManager>>chooseMultipleFrom:lines:title: (in category 'ui requests') ----- - chooseMultipleFrom: aList lines: linesArray title: aString - "Choose one or more items from the given list. Answer the indices of the selected items." - - ^ (self chooseFrom: aList lines: linesArray title: aString) in: [:result | - result = 0 ifTrue: [#()] ifFalse: [{result}]]! Item was removed: - ----- Method: UIManager>>chooseMultipleFrom:title: (in category 'ui requests') ----- - chooseMultipleFrom: aList title: aString - "Choose one or more items from the given list. Answer the indices of the selected items." - - ^self chooseMultipleFrom: aList lines: #() title: aString! Item was removed: - ----- Method: UIManager>>chooseMultipleFrom:values: (in category 'ui requests') ----- - chooseMultipleFrom: labelList values: valueList - "Choose one or more items from the given list. Answer the selected items." - - ^ self chooseMultipleFrom: labelList values: valueList lines: #()! Item was removed: - ----- Method: UIManager>>chooseMultipleFrom:values:lines: (in category 'ui requests') ----- - chooseMultipleFrom: labelList values: valueList lines: linesArray - "Choose one or more items from the given list. Answer the selected items." - - ^ self chooseMultipleFrom: labelList values: valueList lines: linesArray title: ''! Item was removed: - ----- Method: UIManager>>chooseMultipleFrom:values:lines:title: (in category 'ui requests') ----- - chooseMultipleFrom: labelList values: valueList lines: linesArray title: aString - "Choose one or more items from the given list. Answer the selected items." - - ^ (self chooseFrom: labelList values: valueList lines: linesArray title: aString) - ifNil: [#()] - ifNotNil: [:resultValue | {resultValue}]! Item was removed: - ----- Method: UIManager>>chooseMultipleFrom:values:title: (in category 'ui requests') ----- - chooseMultipleFrom: labelList values: valueList title: aString - "Choose one or more items from the given list. Answer the selected items." - - ^ self chooseMultipleFrom: labelList values: valueList lines: #() title: aString! Item was removed: - ----- Method: UIManager>>classFromPattern:withCaption: (in category 'system introspecting') ----- - classFromPattern: pattern withCaption: aCaption - "If there is a class or trait whose name exactly given by pattern, return it. - If there is only one class or trait in the system whose name matches pattern, return it. - Otherwise, put up a menu offering the names of all classes that match pattern, and return the class chosen, else nil if nothing chosen. - This method ignores separator characters in the pattern" - - ^self classOrTraitFrom: Smalltalk environment pattern: pattern label: aCaption - " - self classFromPattern: 'CharRecog' withCaption: '' - self classFromPattern: 'rRecog' withCaption: '' - self classFromPattern: 'znak' withCaption: '' - self classFromPattern: 'orph' withCaption: '' - self classFromPattern: 'TCompil' withCaption: '' - " - ! Item was removed: - ----- Method: UIManager>>classOrTraitFrom:pattern:label: (in category 'system introspecting') ----- - classOrTraitFrom: environment pattern: pattern label: label - "If there is a class or trait whose name exactly given by pattern, return it. - If there is only one class or trait in the given environment whose name matches pattern, return it. - Otherwise, put up a menu offering the names of all classes that match pattern, and return the class chosen, else nil if nothing chosen. - This method ignores separator characters in the pattern" - - | toMatch potentialNames names exactMatch lines reducedIdentifiers selectedIndex | - toMatch := pattern copyWithoutAll: Character separators. - toMatch ifEmpty: [ ^nil ]. - "If there's a class or trait named as pattern, then return it." - Symbol hasInterned: pattern ifTrue: [ :symbol | - environment at: symbol ifPresent: [ :maybeClassOrTrait | - ((maybeClassOrTrait isKindOf: Class) or: [ - maybeClassOrTrait isTrait ]) - ifTrue: [ ^maybeClassOrTrait ] ] ]. - "No exact match, look for potential matches." - toMatch := pattern asLowercase copyWithout: $.. - potentialNames := (environment classAndTraitNames) asOrderedCollection. - names := pattern last = $. "This is some old hack, using String>>#match: may be better." - ifTrue: [ potentialNames select: [ :each | each asLowercase = toMatch ] ] - ifFalse: [ - potentialNames select: [ :each | - each includesSubstring: toMatch caseSensitive: false ] ]. - exactMatch := names detect: [ :each | each asLowercase = toMatch ] ifNone: [ nil ]. - lines := OrderedCollection new. - exactMatch ifNotNil: [ lines add: 1 ]. - "Also try some fuzzy matching." - reducedIdentifiers := pattern suggestedTypeNames select: [ :each | - potentialNames includes: each ]. - reducedIdentifiers ifNotEmpty: [ - names addAll: reducedIdentifiers. - lines add: 1 + names size + reducedIdentifiers size ]. - "Let the user select if there's more than one possible match. This may give surprising results." - selectedIndex := names size = 1 - ifTrue: [ 1 ] - ifFalse: [ - exactMatch ifNotNil: [ names addFirst: exactMatch ]. - self chooseFrom: names lines: lines title: label ]. - selectedIndex = 0 ifTrue: [ ^nil ]. - ^environment at: (names at: selectedIndex) asSymbol! Item was removed: - ----- Method: UIManager>>confirm: (in category 'ui requests') ----- - confirm: queryString - "Put up a yes/no menu with caption queryString. Answer true if the - response is yes, false if no. This is a modal question--the user must - respond yes or no." - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>confirm:orCancel: (in category 'ui requests') ----- - confirm: aString orCancel: cancelBlock - "Put up a yes/no/cancel menu with caption aString. Answer true if - the response is yes, false if no. If cancel is chosen, evaluate - cancelBlock. This is a modal question--the user must respond yes or no." - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>confirm:orCancel:title: (in category 'ui requests') ----- - confirm: aString orCancel: cancelBlock title: titleString - "Put up a yes/no/cancel menu with caption aString, and titleString to label the dialog. - Answer true if the response is yes, false if no. If cancel is chosen, evaluate cancelBlock. - This is a modal question--the user must respond yes or no." - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>confirm:title: (in category 'ui requests') ----- - confirm: queryString title: titleString - "Put up a yes/no menu with caption queryString, and titleString to label the dialog. - Answer true if the response is yes, false if no. This is a modal question--the user - must respond yes or no." - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>confirm:title:trueChoice:falseChoice: (in category 'ui requests') ----- - confirm: queryString title: titleString trueChoice: trueChoice falseChoice: falseChoice - "Put up a yes/no menu with caption queryString, and titleString to label the dialog. - The actual wording for the two choices will be as provided in the trueChoice and - falseChoice parameters. Answer true if the response is the true-choice, false if it - is the false-choice. This is a modal question -- the user must respond one way or - the other." - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>confirm:trueChoice:falseChoice: (in category 'ui requests') ----- - confirm: queryString trueChoice: trueChoice falseChoice: falseChoice - "Put up a yes/no menu with caption queryString. The actual wording for the two choices will be as provided in the trueChoice and falseChoice parameters. Answer true if the response is the true-choice, false if it's the false-choice. - This is a modal question -- the user must respond one way or the other." - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>displayProgress:at:from:to:during: (in category 'ui requests') ----- - displayProgress: titleString at: aPoint from: minVal to: maxVal during: workBlock - "Display titleString as a caption over a progress bar while workBlock is evaluated." - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>edit: (in category 'ui requests') ----- - edit: aText - "Open an editor on the given string/text" - ^self edit: aText label: nil! Item was removed: - ----- Method: UIManager>>edit:label: (in category 'ui requests') ----- - edit: aText label: labelString - "Open an editor on the given string/text" - ^self edit: aText label: labelString accept: nil! Item was removed: - ----- Method: UIManager>>edit:label:accept: (in category 'ui requests') ----- - edit: aText label: labelString accept: anAction - "Open an editor on the given string/text" - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>inform: (in category 'ui requests') ----- - inform: aString - "Display a message for the user to read and then dismiss" - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>informUser:during: (in category 'ui requests') ----- - informUser: aString during: aBlock - "Display a message above (or below if insufficient room) the cursor - during execution of the given block. - UIManager default informUser: 'Just a sec!!' during: [(Delay forSeconds: 1) wait]. - " - ^self informUserDuring:[:bar| bar value: aString. aBlock value].! Item was removed: - ----- Method: UIManager>>informUserDuring: (in category 'ui requests') ----- - informUserDuring: aBlock - "Display a message above (or below if insufficient room) the cursor - during execution of the given block. - UIManager default informUserDuring:[:bar| - #(one two three) do:[:info| - bar value: info. - (Delay forSeconds: 1) wait]]" - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>multiLineRequest:centerAt:initialAnswer:answerHeight: (in category 'ui requests') ----- - multiLineRequest: queryString centerAt: aPoint initialAnswer: defaultAnswer answerHeight: answerHeight - "Create a multi-line instance of me whose question is queryString with - the given initial answer. Invoke it centered at the given point, and - answer the string the user accepts. Answer nil if the user cancels. An - empty string returned means that the ussr cleared the editing area and - then hit 'accept'. Because multiple lines are invited, we ask that the user - use the ENTER key, or (in morphic anyway) hit the 'accept' button, to - submit; that way, the return key can be typed to move to the next line." - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>newDisplayDepthNoRestore: (in category 'display') ----- - newDisplayDepthNoRestore: pixelSize - self subclassResponsibility.! Item was removed: - ----- Method: UIManager>>request: (in category 'ui requests') ----- - request: queryString - "Create an instance of me whose question is queryString. Invoke it - centered at the cursor, and answer the string the user accepts. Answer - the empty string if the user cancels." - ^self request: queryString initialAnswer: ''! Item was removed: - ----- Method: UIManager>>request:initialAnswer: (in category 'ui requests') ----- - request: queryString initialAnswer: defaultAnswer - "Create an instance of me whose question is queryString with the given - initial answer. Invoke it centered at the given point, and answer the - string the user accepts. Answer the empty string if the user cancels." - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>request:initialAnswer:centerAt: (in category 'ui requests') ----- - request: queryString initialAnswer: defaultAnswer centerAt: aPoint - "Create an instance of me whose question is queryString with the given - initial answer. Invoke it centered at the given point, and answer the - string the user accepts. Answer the empty string if the user cancels." - - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>requestPassword: (in category 'ui requests') ----- - requestPassword: queryString - "Create an instance of me whose question is queryString. Invoke it centered - at the cursor, and answer the string the user accepts. Answer the empty - string if the user cancels." - ^self subclassResponsibility! Item was removed: - ----- Method: UIManager>>restoreDisplay (in category 'display') ----- - restoreDisplay - self subclassResponsibility.! Item was removed: - ----- Method: UIManager>>restoreDisplayAfter: (in category 'display') ----- - restoreDisplayAfter: aBlock - self subclassResponsibility.! Item was removed: - ----- Method: UIManager>>screenBounds (in category 'accessing') ----- - screenBounds - ^ Display boundingBox! Item was removed: - ----- Method: UIManager>>toolBuilder (in category 'builder') ----- - toolBuilder - ^ self builderClass new! From commits at source.squeak.org Wed Jul 8 21:26:19 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 21:26:20 2015 Subject: [squeak-dev] Squeak 4.6: Help-Squeak-Project-mt.29.mcz Message-ID: Chris Muller uploaded a new version of Help-Squeak-Project to project Squeak 4.6: http://source.squeak.org/squeak46/Help-Squeak-Project-mt.29.mcz ==================== Summary ==================== Name: Help-Squeak-Project-mt.29 Author: mt Time: 8 July 2015, 9:15:58.348 am UUID: b3f20627-988d-0f46-a6a7-faa6f2eb390b Ancestors: Help-Squeak-Project-cmm.28 License year updated. =============== Diff against Help-Squeak-Project-cmm.28 =============== From commits at source.squeak.org Wed Jul 8 21:26:40 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 21:26:44 2015 Subject: [squeak-dev] Squeak 4.6: Compiler-dtl.303.mcz Message-ID: Chris Muller uploaded a new version of Compiler to project Squeak 4.6: http://source.squeak.org/squeak46/Compiler-dtl.303.mcz ==================== Summary ==================== Name: Compiler-dtl.303 Author: dtl Time: 7 July 2015, 7:27:15.092 pm UUID: 762ba9fa-1e47-4c91-af95-d673d8c6706d Ancestors: Compiler-topa.302 Revert two methods from Compiler-eem.300 because they work on a stack interpreter but not on a context interpreter (VM crash). =============== Diff against Compiler-topa.302 =============== From commits at source.squeak.org Wed Jul 8 21:26:44 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 21:26:52 2015 Subject: [squeak-dev] Squeak 4.6: ToolBuilder-MVC-topa.43.mcz Message-ID: Chris Muller uploaded a new version of ToolBuilder-MVC to project Squeak 4.6: http://source.squeak.org/squeak46/ToolBuilder-MVC-topa.43.mcz ==================== Summary ==================== Name: ToolBuilder-MVC-topa.43 Author: topa Time: 8 July 2015, 5:37:19.575 pm UUID: 9a12e4ba-acbe-4854-8db9-93c3efe1d7a5 Ancestors: ToolBuilder-MVC-mt.42 Cope for ToolBuilder-Kernel-topa.90 =============== Diff against ToolBuilder-MVC-mt.42 =============== Item was removed: - SystemOrganization addCategory: #'ToolBuilder-MVC'! Item was removed: - ToolBuilder subclass: #MVCToolBuilder - instanceVariableNames: 'panes topSize widgets parentMenu' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-MVC'! - - !MVCToolBuilder commentStamp: 'ar 2/11/2005 15:02' prior: 0! - The MVC tool builder.! Item was removed: - ----- Method: MVCToolBuilder class>>isActiveBuilder (in category 'accessing') ----- - isActiveBuilder - "Answer whether I am the currently active builder" - "This is really a way of answering whether 'Smalltalk isMVC'" - ScheduledControllers ifNil:[^false]. - ^(ScheduledControllers activeControllerProcess ifNil:[^false]) isTerminated not! Item was removed: - ----- Method: MVCToolBuilder>>asWindow: (in category 'private') ----- - asWindow: aRectangle - - | outer | - outer := parent window ifNil: [topSize]. - ^(aRectangle origin * outer extent) truncated - corner: (aRectangle corner * outer extent) truncated! Item was removed: - ----- Method: MVCToolBuilder>>buildPluggableAlternateMultiSelectionList: (in category 'widgets optional') ----- - buildPluggableAlternateMultiSelectionList: aSpec - - "Trim selector to one argument to match list expectations." - aSpec setIndex: (aSpec setIndex first: (aSpec setIndex findString: ':')) asSymbol. - ^ self buildPluggableList: aSpec.! Item was removed: - ----- Method: MVCToolBuilder>>buildPluggableButton: (in category 'widgets required') ----- - buildPluggableButton: aSpec - | widget label state | - label := aSpec label. - state := aSpec state. - widget := PluggableButtonView on: aSpec model - getState: (state isSymbol ifTrue:[state]) - action: aSpec action - label: (label isSymbol ifTrue:[label]). - self register: widget id: aSpec name. - label ifNotNil: [label isSymbol - ifTrue: [widget label: (aSpec model perform: label)] - ifFalse: [widget label: label]]. - self setFrame: aSpec frame in: widget. - parent ifNotNil: [parent addSubView: widget]. - ^widget! Item was removed: - ----- Method: MVCToolBuilder>>buildPluggableList: (in category 'widgets required') ----- - buildPluggableList: aSpec - | widget listClass getIndex setIndex | - aSpec getSelected ifNil:[ - listClass := PluggableListView. - getIndex := aSpec getIndex. - setIndex := aSpec setIndex. - ] ifNotNil:[ - listClass := PluggableListViewByItem. - getIndex := aSpec getSelected. - setIndex := aSpec setSelected. - ]. - widget := listClass on: aSpec model - list: aSpec list - selected: getIndex - changeSelected: setIndex - menu: aSpec menu - keystroke: aSpec keyPress. - self register: widget id: aSpec name. - self setFrame: aSpec frame in: widget. - parent ifNotNil:[parent addSubView: widget]. - panes ifNotNil:[ - aSpec list ifNotNil:[panes add: aSpec list]. - ]. - ^widget! Item was removed: - ----- Method: MVCToolBuilder>>buildPluggableMenu: (in category 'widgets required') ----- - buildPluggableMenu: menuSpec - "Just a very simple mapping to selection menu. It assumes that all item specs have the same receiver." - - | menu | - menu := CustomMenu new. - menuSpec items do: [:ea | - menu - add: ea label - target: ea action receiver - selector: ea action selector - argumentList: ea action arguments. - ea separator ifTrue: [menu addLine]]. - ^ menu! Item was removed: - ----- Method: MVCToolBuilder>>buildPluggableMenuItem: (in category 'widgets required') ----- - buildPluggableMenuItem: itemSpec - - ^ itemSpec label! Item was removed: - ----- Method: MVCToolBuilder>>buildPluggablePanel: (in category 'widgets required') ----- - buildPluggablePanel: aSpec - | widget children | - widget := View new model: aSpec model. - widget borderWidth: 1. - self register: widget id: aSpec name. - children := aSpec children. - children isSymbol ifTrue:[ - "@@@@ FIXME: PluggablePanes need to remember their getChildrenSelector" - "widget getChildrenSelector: children. - widget update: children." - children := #(). - ]. - self setFrame: aSpec frame in: widget. - self buildAll: children in: widget. - parent ifNotNil:[parent addSubView: widget]. - self setLayout: aSpec layout in: widget. - ^widget! Item was removed: - ----- Method: MVCToolBuilder>>buildPluggableSpacer: (in category 'widgets required') ----- - buildPluggableSpacer: aSpec - - | widget | - widget := View new. - self register: widget id: aSpec name. - - widget borderWidth: 0. - widget backgroundColor: aSpec color. - widget window: (widget window topLeft extent: aSpec extent). - - self setFrame: aSpec frame in: widget. - - parent ifNotNil:[parent addSubView: widget]. - ^widget! Item was removed: - ----- Method: MVCToolBuilder>>buildPluggableText: (in category 'widgets required') ----- - buildPluggableText: aSpec - | widget | - widget := PluggableTextView on: aSpec model - text: aSpec getText - accept: aSpec setText - readSelection: aSpec selection - menu: aSpec menu. - self register: widget id: aSpec name. - self setFrame: aSpec frame in: widget. - parent ifNotNil:[parent addSubView: widget]. - panes ifNotNil:[ - aSpec getText ifNotNil:[panes add: aSpec getText]. - ]. - ^widget! Item was removed: - ----- Method: MVCToolBuilder>>buildPluggableTree: (in category 'widgets required') ----- - buildPluggableTree: aSpec - - self shouldBeImplemented.! Item was removed: - ----- Method: MVCToolBuilder>>buildPluggableWindow: (in category 'widgets required') ----- - buildPluggableWindow: aSpec - | widget children label | - topSize := 0@0 corner: 640@480. - aSpec layout == #proportional ifFalse:[ - "This needs to be implemented - probably by adding a single pane and then the rest" - ^self error: 'Not implemented'. - ]. - widget := StandardSystemView new. - self register: widget id: aSpec name. - widget model: aSpec model. - label := aSpec label. - label isSymbol ifTrue: [label := aSpec model perform: label]. - label isNil ifFalse: [widget setLabel: label]. - children := aSpec children. - children isSymbol ifTrue:[ - "This isn't implemented by StandardSystemView, so we fake it" - children := widget model perform: children. - ]. - aSpec extent ifNotNil:[topSize := 0@0 extent: aSpec extent]. - widget window: topSize. - panes := OrderedCollection new. - self buildAll: children in: widget. - widget setUpdatablePanesFrom: panes. - ^widget! Item was removed: - ----- Method: MVCToolBuilder>>close: (in category 'opening') ----- - close: aWidget - "Close a previously opened widget" - aWidget controller closeAndUnschedule.! Item was removed: - ----- Method: MVCToolBuilder>>open: (in category 'opening') ----- - open: anObject - "Build and open the object. Answer the widget opened." - | window | - window := (anObject isKindOf: View) - ifTrue: [anObject] - ifFalse: [self build: anObject]. - (window isKindOf: PopUpMenu) - ifTrue: [window invokeOn: nil]. - (window isKindOf: View) - ifTrue: [window controller open]. - ^window! Item was removed: - ----- Method: MVCToolBuilder>>open:label: (in category 'opening') ----- - open: anObject label: aString - "Build an open the object, labeling it appropriately. Answer the widget opened." - | window | - window := self build: anObject. - window label: aString. - window controller open. - ^window! Item was removed: - ----- Method: MVCToolBuilder>>openDebugger: (in category 'opening') ----- - openDebugger: anObject - "Build and open the object. Answer the widget opened." - | window | - window := self build: anObject. - window controller openNoTerminate. - ^window! Item was removed: - ----- Method: MVCToolBuilder>>openDebugger:label: (in category 'opening') ----- - openDebugger: anObject label: aString - "Build an open the object, labeling it appropriately. Answer the widget opened." - | window | - window := self build: anObject. - window label: aString. - window controller openNoTerminate. - ^window! Item was removed: - ----- Method: MVCToolBuilder>>openDebugger:label:closing: (in category 'opening') ----- - openDebugger: anObject label: aString closing: topView - "Build an open the object, labeling it appropriately. Answer the widget opened." - | window | - topView controller controlTerminate. - topView deEmphasize; erase. - - "a few hacks to get the scroll selection artifacts out when we got here by clicking in the list" - " topView subViewWantingControl ifNotNil: [ - topView subViewWantingControl controller controlTerminate - ]." - topView controller status: #closed. - window := self build: anObject. - window label: aString. - window controller openNoTerminate. - topView controller closeAndUnscheduleNoErase. - Processor terminateActive. - ^window! Item was removed: - ----- Method: MVCToolBuilder>>positionSubviewsWithin: (in category 'private') ----- - positionSubviewsWithin: widget - "Translate subviews to position the viewport of each subView relative to - the widget window origin. If subviews are repositioned, as in a row of button - views arranged within a view, then the transformations will later be rescaled - to fit the subviews within the widget window." - - widget subViews ifNotNilDo: [:subViews | - subViews isEmpty ifFalse: [ | translation | - translation := widget window origin - subViews first window origin. - subViews do: [:v | - v setTransformation: (v transformation translateBy: translation)]]]. - ! Item was removed: - ----- Method: MVCToolBuilder>>register:id: (in category 'private') ----- - register: widget id: id - id ifNil:[^self]. - widgets ifNil:[widgets := Dictionary new]. - widgets at: id put: widget.! Item was removed: - ----- Method: MVCToolBuilder>>runModal: (in category 'opening') ----- - runModal: aWidget - "Run the (previously opened) widget modally, e.g., - do not return control to the sender before the user has responded." - - ! Item was removed: - ----- Method: MVCToolBuilder>>setFrame:in: (in category 'private') ----- - setFrame: fractionsRectangleOrLayoutFrame in: widget - | win | - fractionsRectangleOrLayoutFrame ifNil: [^nil]. - win := fractionsRectangleOrLayoutFrame isRectangle - ifTrue: [self asWindow: fractionsRectangleOrLayoutFrame] - ifFalse: [fractionsRectangleOrLayoutFrame layout: nil in: topSize]. "assume LayoutFrame" - widget window: win.! Item was removed: - ----- Method: MVCToolBuilder>>setLayout:in: (in category 'private') ----- - setLayout: layout in: widget - "Arrange subview horizontally or vertically according to layout directive. - If the subview dimensions were specified with layout frames rather than explicit - rectangle sizes, then their window horizontal or vertical dimensions will be resized - as needed to fit within the widget extent." - - self positionSubviewsWithin: widget. - layout == #proportional ifTrue:[^self]. - layout == #horizontal ifTrue:[ - | prev subViewWidth widgetWidth xScale | - subViewWidth := (widget subViews collect: [:e | e window extent x]) sum. - widgetWidth := widget window extent x. - xScale := widgetWidth / subViewWidth. "to adjust corner of prev prior to align:" - prev := nil. - widget subViews do:[:next| | newWindowWidth newCorner | - prev ifNotNil:[ "resize prev window prior to aligning next" - xScale < 1 ifTrue: [ "proportional placement spec requires resizing" - newWindowWidth := (prev window extent x * xScale) truncated. - newCorner := (prev window origin x + newWindowWidth)@(prev window corner y). - prev setWindow: (prev window origin corner: newCorner)]. - next align: next viewport topLeft with: prev viewport topRight. - ]. - prev := next. - ]. - ^self]. - layout == #vertical ifTrue:[ - | prev subViewHeight widgetHeight yScale | - subViewHeight := (widget subViews collect: [:e | e window extent y]) sum. - widgetHeight := widget window extent y. - yScale := widgetHeight / subViewHeight. "to adjust corner of prev prior to align:" - prev := nil. - widget subViews do:[:next| | newWindowHeight newCorner | - prev ifNotNil:[ "resize prev window prior to aligning next" - yScale < 1 ifTrue: [ "proportional placement spec requires resizing" - newWindowHeight := (prev window extent y * yScale) truncated. - newCorner := (prev window corner x)@(prev window origin y + newWindowHeight). - prev setWindow: (prev window origin corner: newCorner)]. - next align: next viewport topLeft with: prev viewport bottomLeft. - ]. - prev := next. - ]. - ^self]. - ^self error: 'Unknown layout: ', layout.! Item was removed: - ----- Method: MVCToolBuilder>>widgetAt:ifAbsent: (in category 'private') ----- - widgetAt: id ifAbsent: aBlock - widgets ifNil:[^aBlock value]. - ^widgets at: id ifAbsent: aBlock! Item was removed: - UIManager subclass: #MVCUIManager - instanceVariableNames: '' - classVariableNames: '' - poolDictionaries: '' - category: 'ToolBuilder-MVC'! - - !MVCUIManager commentStamp: 'dtl 5/2/2010 16:06' prior: 0! - MVCUIManager is a UIManager that implements user interface requests for an MVC user interface.! Item was removed: - ----- Method: MVCUIManager class>>isActiveManager (in category 'accessing') ----- - isActiveManager - "Answer whether I should act as the active ui manager" - "This is really a way of answering whether 'Smalltalk isMVC'" - ScheduledControllers ifNil:[^false]. - ^ScheduledControllers activeControllerProcess == Processor activeProcess! Item was removed: - ----- Method: MVCUIManager>>chooseDirectory:from: (in category 'ui requests') ----- - chooseDirectory: label from: dir - "Let the user choose a directory" - ^self notYetImplemented! Item was removed: - ----- Method: MVCUIManager>>chooseFileMatching:label: (in category 'ui requests') ----- - chooseFileMatching: patterns label: labelString - "Let the user choose a file matching the given patterns" - ^self notYetImplemented! Item was removed: - ----- Method: MVCUIManager>>chooseFont:for:setSelector:getSelector: (in category 'ui requests') ----- - chooseFont: aPrompt for: aTarget setSelector: setSelector getSelector: getSelector - "MVC Only!! prompt for a font and if one is provided, send it to aTarget using a message with selector aSelector." - | aMenu aChoice aStyle namesAndSizes aFont | - aMenu := CustomMenu new. - TextStyle actualTextStyles keysSortedSafely do: - [:styleName | - aMenu add: styleName action: styleName]. - aChoice := aMenu startUpWithCaption: aPrompt. - aChoice ifNil: [^ self]. - aMenu := CustomMenu new. - aStyle := TextStyle named: aChoice. - (namesAndSizes := aStyle fontNamesWithPointSizes) do: - [:aString | aMenu add: aString action: aString]. - aChoice := aMenu startUpWithCaption: nil. - aChoice ifNil: [^ self]. - aFont := aStyle fontAt: (namesAndSizes indexOf: aChoice). - aTarget perform: setSelector with: aFont! Item was removed: - ----- Method: MVCUIManager>>chooseFrom:lines:title: (in category 'ui requests') ----- - chooseFrom: aList lines: linesArray title: aString - "Choose an item from the given list. Answer the index of the selected item." - | menu | - menu := PopUpMenu labelArray: aList lines: linesArray. - ^aString isEmpty ifTrue:[menu startUp] ifFalse:[menu startUpWithCaption: aString]! Item was removed: - ----- Method: MVCUIManager>>chooseFrom:values:lines:title: (in category 'ui requests') ----- - chooseFrom: labelList values: valueList lines: linesArray title: aString - "Choose an item from the given list. Answer the selected item." - | menu | - menu := SelectionMenu labels: labelList lines: linesArray selections: valueList. - ^aString isEmpty ifTrue:[menu startUp] ifFalse:[menu startUpWithCaption: aString]! Item was removed: - ----- Method: MVCUIManager>>confirm: (in category 'ui requests') ----- - confirm: queryString - "Put up a yes/no menu with caption queryString. Answer true if the - response is yes, false if no. This is a modal question--the user must - respond yes or no." - ^PopUpMenu confirm: queryString! Item was removed: - ----- Method: MVCUIManager>>confirm:orCancel: (in category 'ui requests') ----- - confirm: aString orCancel: cancelBlock - "Put up a yes/no/cancel menu with caption aString. Answer true if - the response is yes, false if no. If cancel is chosen, evaluate - cancelBlock. This is a modal question--the user must respond yes or no." - ^PopUpMenu confirm: aString orCancel: cancelBlock! Item was removed: - ----- Method: MVCUIManager>>confirm:orCancel:title: (in category 'ui requests') ----- - confirm: aString orCancel: cancelBlock title: titleString - "Put up a yes/no/cancel menu with caption aString, and titleString to label the dialog. - Answer true if the response is yes, false if no. If cancel is chosen, evaluate cancelBlock. - This is a modal question--the user must respond yes or no." - ^ PopUpMenu - confirm: (self dialogStringFromQuery: aString withTitle: titleString) - orCancel: cancelBlock! Item was removed: - ----- Method: MVCUIManager>>confirm:title: (in category 'ui requests') ----- - confirm: queryString title: titleString - "Put up a yes/no menu with caption queryString, and titleString to label the dialog. - Answer true if the response is yes, false if no. This is a modal question--the user - must respond yes or no." - ^PopUpMenu confirm: (self dialogStringFromQuery: queryString withTitle: titleString) - ! Item was removed: - ----- Method: MVCUIManager>>confirm:title:trueChoice:falseChoice: (in category 'ui requests') ----- - confirm: queryString title: titleString trueChoice: trueChoice falseChoice: falseChoice - "Put up a yes/no menu with caption queryString, and titleString to label the dialog. - The actual wording for the two choices will be as provided in the trueChoice and - falseChoice parameters. Answer true if the response is the true-choice, false if it - is the false-choice. This is a modal question -- the user must respond one way or - the other." - ^ PopUpMenu - confirm: (self dialogStringFromQuery: queryString withTitle: titleString) - trueChoice: trueChoice - falseChoice: falseChoice! Item was removed: - ----- Method: MVCUIManager>>confirm:trueChoice:falseChoice: (in category 'ui requests') ----- - confirm: queryString trueChoice: trueChoice falseChoice: falseChoice - "Put up a yes/no menu with caption queryString. The actual wording for the two choices will be as provided in the trueChoice and falseChoice parameters. Answer true if the response is the true-choice, false if it's the false-choice. - This is a modal question -- the user must respond one way or the other." - ^PopUpMenu confirm: queryString trueChoice: trueChoice falseChoice: falseChoice! Item was removed: - ----- Method: MVCUIManager>>dialogStringFromQuery:withTitle: (in category 'private') ----- - dialogStringFromQuery: queryString withTitle: titleString - "In Morphic, it is common to display a simple dialog that has a title bar. In MVC, simple - dialogs are simple. If the UIManager requests a dialog with title, add the title as a simply - decorated line at the top of the dialog text." - ^String streamContents: [ :strm | - strm nextPutAll: '- '; - nextPutAll: titleString; - nextPutAll: ' -'; - nextPut: Character cr; - nextPutAll: queryString ] - ! Item was removed: - ----- Method: MVCUIManager>>displayProgress:at:from:to:during: (in category 'ui requests') ----- - displayProgress: titleString at: aPoint from: minVal to: maxVal during: workBlock - "Display titleString as a caption over a progress bar while workBlock is evaluated." - | delta savedArea captionText textFrame barFrame outerFrame result range lastW | - barFrame := aPoint - (75@10) corner: aPoint + (75@10). - captionText := DisplayText text: titleString asText allBold. - captionText - foregroundColor: Color black - backgroundColor: Color white. - textFrame := captionText boundingBox insetBy: -4. - textFrame := textFrame align: textFrame bottomCenter - with: barFrame topCenter + (0@2). - outerFrame := barFrame merge: textFrame. - delta := outerFrame amountToTranslateWithin: Display boundingBox. - barFrame := barFrame translateBy: delta. - textFrame := textFrame translateBy: delta. - outerFrame := outerFrame translateBy: delta. - savedArea := Form fromDisplay: outerFrame. - Display fillBlack: barFrame; fillWhite: (barFrame insetBy: 2). - Display fillBlack: textFrame; fillWhite: (textFrame insetBy: 2). - captionText displayOn: Display at: textFrame topLeft + (4@4). - range := maxVal = minVal ifTrue: [1] ifFalse: [maxVal - minVal]. "Avoid div by 0" - lastW := 0. - [result := workBlock value: "Supply the bar-update block for evaluation in the work block" - [:barVal | - | w | - w := ((barFrame width-4) asFloat * ((barVal-minVal) asFloat / range min: 1.0)) asInteger. - w ~= lastW ifTrue: [ - Display fillGray: (barFrame topLeft + (2@2) extent: w@16). - lastW := w]]] - ensure: [savedArea displayOn: Display at: outerFrame topLeft]. - ^result! Item was removed: - ----- Method: MVCUIManager>>edit:label:accept: (in category 'ui requests') ----- - edit: aText label: labelString accept: anAction - "Open an editor on the given string/text" - - Workspace new - acceptContents: aText; - acceptAction: anAction; - openLabel: labelString - ! Item was removed: - ----- Method: MVCUIManager>>inform: (in category 'ui requests') ----- - inform: aString - "Display a message for the user to read and then dismiss" - ^PopUpMenu inform: aString! Item was removed: - ----- Method: MVCUIManager>>informUser:during: (in category 'ui requests') ----- - informUser: aString during: aBlock - "Display a message above (or below if insufficient room) the cursor - during execution of the given block. - UIManager default informUser: 'Just a sec!!' during: [(Delay forSeconds: 1) wait]. - " - (SelectionMenu labels: '') - displayAt: Sensor cursorPoint - withCaption: aString - during: aBlock! Item was removed: - ----- Method: MVCUIManager>>informUserDuring: (in category 'ui requests') ----- - informUserDuring: aBlock - "Display a message above (or below if insufficient room) the cursor - during execution of the given block. - UIManager default informUserDuring:[:bar| - #(one two three) do:[:info| - bar value: info. - (Delay forSeconds: 1) wait]]" - aBlock value:[:string| Transcript cr; show: string].! Item was removed: - ----- Method: MVCUIManager>>multiLineRequest:centerAt:initialAnswer:answerHeight: (in category 'ui requests') ----- - multiLineRequest: queryString centerAt: aPoint initialAnswer: defaultAnswer answerHeight: answerHeight - "Create a multi-line instance of me whose question is queryString with - the given initial answer. Invoke it centered at the given point, and - answer the string the user accepts. Answer nil if the user cancels. An - empty string returned means that the ussr cleared the editing area and - then hit 'accept'. Because multiple lines are invited, we ask that the user - use the ENTER key, or (in morphic anyway) hit the 'accept' button, to - submit; that way, the return key can be typed to move to the next line." - ^FillInTheBlank multiLineRequest: queryString centerAt: aPoint initialAnswer: defaultAnswer answerHeight: answerHeight! Item was removed: - ----- Method: MVCUIManager>>newDisplayDepthNoRestore: (in category 'display') ----- - newDisplayDepthNoRestore: pixelSize - "Change depths. Check if there is enough space!! , di" - | area need | - pixelSize = Display depth ifTrue: [^ self "no change"]. - pixelSize abs < Display depth ifFalse: - ["Make sure there is enough space" - area := Display boundingBox area. "pixels" - ScheduledControllers scheduledWindowControllers do: - [:aController | "This should be refined..." - aController view cacheBitsAsTwoTone ifFalse: - [area := area + aController view windowBox area]]. - need := (area * (pixelSize abs - Display depth) // 8) "new bytes needed" - + Smalltalk lowSpaceThreshold. - (Smalltalk garbageCollectMost <= need - and: [Smalltalk garbageCollect <= need]) - ifTrue: [self error: 'Insufficient free space']]. - Display setExtent: Display extent depth: pixelSize. - ScheduledControllers updateGray. - DisplayScreen startUp! Item was removed: - ----- Method: MVCUIManager>>request:initialAnswer: (in category 'ui requests') ----- - request: queryString initialAnswer: defaultAnswer - "Create an instance of me whose question is queryString with the given - initial answer. Invoke it centered at the given point, and answer the - string the user accepts. Answer the empty string if the user cancels." - ^FillInTheBlank request: queryString initialAnswer: defaultAnswer ! Item was removed: - ----- Method: MVCUIManager>>request:initialAnswer:centerAt: (in category 'ui requests') ----- - request: queryString initialAnswer: defaultAnswer centerAt: aPoint - "Create an instance of me whose question is queryString with the given - initial answer. Invoke it centered at the given point, and answer the - string the user accepts. Answer the empty string if the user cancels." - ^ FillInTheBlank request: queryString initialAnswer: defaultAnswer centerAt: aPoint ! Item was removed: - ----- Method: MVCUIManager>>requestPassword: (in category 'ui requests') ----- - requestPassword: queryString - "Create an instance of me whose question is queryString. Invoke it centered - at the cursor, and answer the string the user accepts. Answer the empty - string if the user cancels." - ^FillInTheBlank requestPassword: queryString! Item was removed: - ----- Method: MVCUIManager>>restoreDisplay (in category 'display') ----- - restoreDisplay - "Restore the bits on Display" - Project current ifNotNil:[:p| p invalidate; restore].! Item was removed: - ----- Method: MVCUIManager>>restoreDisplayAfter: (in category 'display') ----- - restoreDisplayAfter: aBlock - "Evaluate the block, wait for a mouse click, and then restore the screen." - - aBlock value. - Sensor waitButton. - self restoreDisplay! From leves at elte.hu Wed Jul 8 21:43:50 2015 From: leves at elte.hu (Levente Uzonyi) Date: Wed Jul 8 21:43:54 2015 Subject: [squeak-dev] accessing file permissions within the image In-Reply-To: References: Message-ID: IIRC the Pharo guys have added that feature to their version of FilePlugin. Levente On Wed, 8 Jul 2015, Chris Muller wrote: > Is it possible to determine the Linux file permissions of a file or > directory from within the image running on Linux? > > From asqueaker at gmail.com Wed Jul 8 21:49:22 2015 From: asqueaker at gmail.com (Chris Muller) Date: Wed Jul 8 21:49:25 2015 Subject: [squeak-dev] Squeak 4.6 -- 3rd Release Candidate Message-ID: This is most likely going to be the one. http://ftp.squeak.org/4.6/Squeak4.6-15101.zip Another new sources file, as before, is required, be sure not to use any old SqueakV46.sources files. http://ftp.squeak.org/4.6/SqueakV46.sources.zip I'll try the All-In-One tomorrow but will probably need Mac help again. From commits at source.squeak.org Wed Jul 8 21:55:03 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Wed Jul 8 21:55:04 2015 Subject: [squeak-dev] Daily Commit Log Message-ID: <20150708215503.12533.qmail@box4.squeakfoundation.org> Changes to Trunk (http://source.squeak.org/trunk.html) in the last 24 hours: http://lists.squeakfoundation.org/pipermail/packages/2015-July/008813.html Name: Help-Squeak-Project-mt.29 Ancestors: Help-Squeak-Project-cmm.28 License year updated. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008814.html Name: CollectionsTests-topa.244 Ancestors: CollectionsTests-mt.243 Do the primitive/non-primitive test in a way that works without directly modifying a compiled method header word. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008815.html Name: CollectionsTests-topa.245 Ancestors: CollectionsTests-topa.244 Let's say PluggableTextAttribute are not serializable. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008816.html Name: Collections-topa.638 Ancestors: Collections-topa.637 Let's say PluggableTextAttributes are not serializable. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008817.html Name: ToolBuilder-Kernel-topa.90 Ancestors: ToolBuilder-Kernel-mt.89 Remain Grpahics[Color] agnostic. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008818.html Name: ToolBuilder-MVC-topa.43 Ancestors: ToolBuilder-MVC-mt.42 Cope for ToolBuilder-Kernel-topa.90 ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008819.html Name: ToolBuilder-Morphic-topa.148 Ancestors: ToolBuilder-Morphic-mt.147 Cope for ToolBuilder-Kernel-topa.90 ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008820.html Name: Compiler-dtl.303 Ancestors: Compiler-topa.302 Revert two methods from Compiler-eem.300 because they work on a stack interpreter but not on a context interpreter (VM crash). ============================================= From asqueaker at gmail.com Wed Jul 8 22:05:21 2015 From: asqueaker at gmail.com (Chris Muller) Date: Wed Jul 8 22:05:25 2015 Subject: [squeak-dev] please do not commit to trunk Message-ID: Please refrain from committing anything until Eliot can run his Spur bootstrap one last time and I can build the 5.0 image. That way they'll be at exactly the same commit number, 15101. Thanks for your patience, alllllllllmost done...... :) From leves at elte.hu Wed Jul 8 22:29:56 2015 From: leves at elte.hu (Levente Uzonyi) Date: Wed Jul 8 22:29:59 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: <20150708005039.GB84437@shell.msen.com> References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <13878.136.2.1.105.1436293902.squirrel@webmail.msen.com> <20150707233343.GA81061@shell.msen.com> <20150708005039.GB84437@shell.msen.com> Message-ID: There's one difference between the two versions. Using Compiler-eem.300, the following methods are compiled with small frame instead of large frame: BitBltDisplayScanner>>#displayLines:in:clippedBy: GradientFillStyle>>#computePixelRampOfSize: InterpolatedGradientFillStyle>>#computePixelRampOfSize: NewParagraph>>#clickAt:for:controller: PackageInfo>>#changeRecordsForMethod:do: PaintBoxMorph>>#addBrushesOffImage: PaintBoxMorph>>#addShapeButtonsOffImage:onImage: PaintBoxMorph>>#addToolsOffImage:onImage: Paragraph>>#clickAt:for:controller: PianoRollScoreMorph>>#addNotes PolygonMorph>>#lineSegmentsDo: PostscriptCharacterScanner>>#displayLine:offset:leftInRun: SmalltalkImage>>#appendChangesTo: StrikeFontSet>>#characters:in:displayAt:clippedBy:rule:fillColor:kernDelta:on: SuperSwikiServer>>#fastParseEntriesFrom: TTFontReader>>#processGlyphDataTable:offsets: TextStyle class>>#fontMenuForStyle:target:selector:highlight: Unicode class>>#parseCompositionMappingFrom: Levente On Tue, 7 Jul 2015, David T. Lewis wrote: > On Tue, Jul 07, 2015 at 05:20:52PM -0700, Eliot Miranda wrote: >> Hi David, >> >> On Tue, Jul 7, 2015 at 4:33 PM, David T. Lewis wrote: >>> >>> The problem was introduced in Compiler-eem.300, which does this: >>> >>> Use the size/emitPushNClosureTemps: api in block generation. >>> >>> There are two affected methods: >>> >>> BlockNode>>sizeCodeForEvaluatedClosureValue: >>> BlockNode>>emitCodeForEvaluatedClosureValue:encoder: >>> >>> Reverting these two methods fixes the problem. >>> >>> I don't know the background on this change but my guess would be that >>> it is something that works on a stack interpreter but not on a context >>> interpreter, so maybe the methods need to be tweaked to account for the >>> difference. >>> >> >> It should make no difference to the code produced. It adds a new way of >> saying "push N nils" that allows the Sista bytecode set to use its >> "pushNClosureNils" bytecode to push several nils in one bytecode. But with >> the standard encoder EncoderForV3PlusClosures exactly the same code as the >> previous version should be produced. >> >> How do the changes in the compiler cause the crash? >> > > I don't know. > > I'm doing brute-force debugging, just rolling the versions back until the > problem goes away. > > All I can say with confidence is that those two methods changes, followed by > a system recompile, result in an image that crashes a context interpreter VM. > Reverting these two methods and recompiling brings the image back to a sane > condition. > > It might turn out to be a trivial problem, but I am suggesting that we should > temporarily revert and work it out after the 4.6 release. > > Dave > > > From eliot.miranda at gmail.com Wed Jul 8 23:21:50 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed Jul 8 23:21:56 2015 Subject: [squeak-dev] Squeak 4.6 -- 2nd release candidate In-Reply-To: References: <20150706233103.GA60024@shell.msen.com> <20150707123341.GA79970@shell.msen.com> <13878.136.2.1.105.1436293902.squirrel@webmail.msen.com> <20150707233343.GA81061@shell.msen.com> <20150708005039.GB84437@shell.msen.com> Message-ID: On Wed, Jul 8, 2015 at 3:29 PM, Levente Uzonyi wrote: > There's one difference between the two versions. Using Compiler-eem.300, > the following methods are compiled with small frame instead of large frame: > Thanks Levente; that'll be it. > > BitBltDisplayScanner>>#displayLines:in:clippedBy: > GradientFillStyle>>#computePixelRampOfSize: > InterpolatedGradientFillStyle>>#computePixelRampOfSize: > NewParagraph>>#clickAt:for:controller: > PackageInfo>>#changeRecordsForMethod:do: > PaintBoxMorph>>#addBrushesOffImage: > PaintBoxMorph>>#addShapeButtonsOffImage:onImage: > PaintBoxMorph>>#addToolsOffImage:onImage: > Paragraph>>#clickAt:for:controller: > PianoRollScoreMorph>>#addNotes > PolygonMorph>>#lineSegmentsDo: > PostscriptCharacterScanner>>#displayLine:offset:leftInRun: > SmalltalkImage>>#appendChangesTo: > > StrikeFontSet>>#characters:in:displayAt:clippedBy:rule:fillColor:kernDelta:on: > SuperSwikiServer>>#fastParseEntriesFrom: > TTFontReader>>#processGlyphDataTable:offsets: > TextStyle class>>#fontMenuForStyle:target:selector:highlight: > Unicode class>>#parseCompositionMappingFrom: > > Levente > > > On Tue, 7 Jul 2015, David T. Lewis wrote: > > On Tue, Jul 07, 2015 at 05:20:52PM -0700, Eliot Miranda wrote: >> >>> Hi David, >>> >>> On Tue, Jul 7, 2015 at 4:33 PM, David T. Lewis >>> wrote: >>> >>>> >>>> The problem was introduced in Compiler-eem.300, which does this: >>>> >>>> Use the size/emitPushNClosureTemps: api in block generation. >>>> >>>> There are two affected methods: >>>> >>>> BlockNode>>sizeCodeForEvaluatedClosureValue: >>>> BlockNode>>emitCodeForEvaluatedClosureValue:encoder: >>>> >>>> Reverting these two methods fixes the problem. >>>> >>>> I don't know the background on this change but my guess would be that >>>> it is something that works on a stack interpreter but not on a context >>>> interpreter, so maybe the methods need to be tweaked to account for the >>>> difference. >>>> >>>> >>> It should make no difference to the code produced. It adds a new way of >>> saying "push N nils" that allows the Sista bytecode set to use its >>> "pushNClosureNils" bytecode to push several nils in one bytecode. But >>> with >>> the standard encoder EncoderForV3PlusClosures exactly the same code as >>> the >>> previous version should be produced. >>> >>> How do the changes in the compiler cause the crash? >>> >>> >> I don't know. >> >> I'm doing brute-force debugging, just rolling the versions back until the >> problem goes away. >> >> All I can say with confidence is that those two methods changes, followed >> by >> a system recompile, result in an image that crashes a context interpreter >> VM. >> Reverting these two methods and recompiling brings the image back to a >> sane >> condition. >> >> It might turn out to be a trivial problem, but I am suggesting that we >> should >> temporarily revert and work it out after the 4.6 release. >> >> Dave >> >> >> >> > -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150708/0b15326d/attachment.htm From commits at source.squeak.org Thu Jul 9 00:08:55 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 9 00:08:57 2015 Subject: [squeak-dev] The Trunk: Compiler-eem.303.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-eem.303.mcz ==================== Summary ==================== Name: Compiler-eem.303 Author: eem Time: 8 July 2015, 5:08:38.204 pm UUID: c8986a34-4fba-403c-9e6f-68135f7f317e Ancestors: Compiler-topa.302 Fix stack depth regression from Compiler-eem.300. =============== Diff against Compiler-topa.302 =============== Item was changed: ----- Method: BlockNode>>emitCodeForEvaluatedClosureValue:encoder: (in category 'code generation (closures)') ----- emitCodeForEvaluatedClosureValue: stack encoder: encoder | position | position := stack position. + stack position: arguments size + temporaries size + copiedValues size. - stack position: arguments size + copiedValues size. encoder genPushNClosureTemps: temporaries size. self reindexingLocalsDo: [self emitCodeForEvaluatedValue: stack encoder: encoder] encoder: encoder. self returns ifFalse: [encoder genReturnTopToCaller. pc := encoder methodStreamPosition]. stack position: position! From commits at source.squeak.org Thu Jul 9 00:15:27 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 9 00:15:29 2015 Subject: [squeak-dev] The Trunk: Compiler-eem.304.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-eem.304.mcz ==================== Summary ==================== Name: Compiler-eem.304 Author: eem Time: 8 July 2015, 5:15:09.812 pm UUID: 3b07ef9d-69d2-424d-845c-affde45643b8 Ancestors: Compiler-topa.302 Fix stack depth regression from Compiler-eem.300; this time with the correct version number for the MC package. =============== Diff against Compiler-topa.302 =============== Item was changed: ----- Method: BlockNode>>emitCodeForEvaluatedClosureValue:encoder: (in category 'code generation (closures)') ----- emitCodeForEvaluatedClosureValue: stack encoder: encoder | position | position := stack position. + stack position: arguments size + temporaries size + copiedValues size. - stack position: arguments size + copiedValues size. encoder genPushNClosureTemps: temporaries size. self reindexingLocalsDo: [self emitCodeForEvaluatedValue: stack encoder: encoder] encoder: encoder. self returns ifFalse: [encoder genReturnTopToCaller. pc := encoder methodStreamPosition]. stack position: position! From commits at source.squeak.org Thu Jul 9 00:20:55 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 9 00:20:58 2015 Subject: [squeak-dev] The Trunk: Compiler.spur-eem.303.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler.spur-eem.303.mcz ==================== Summary ==================== Name: Compiler.spur-eem.303 Author: eem Time: 8 July 2015, 5:19:55.229 pm UUID: caa8e32d-c41b-4051-9c1b-8a0ae288f3fa Ancestors: Compiler-eem.303, Compiler.spur-topa.302 Compiler-eem.303 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Fix stack depth regression from Compiler-eem.300. =============== Diff against Compiler-eem.303 =============== Item was changed: ----- Method: BytecodeEncoder>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method generation') ----- computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex + numArgs > 15 ifTrue: + [^self error: 'Cannot compile -- too many arguments']. + numTemps > 63 ifTrue: + [^self error: 'Cannot compile -- too many temporary variables']. + numLits > 65535 ifTrue: + [^self error: 'Cannot compile -- too many literals']. + ^(CompiledMethod headerFlagForEncoder: self) + + (numArgs bitShift: 24) + + (numTemps bitShift: 18) + "+ (largeBit bitShift: 17)" "largeBit gets filled in later" + + (primitiveIndex > 0 ifTrue: [1 bitShift: 16] ifFalse: [0]) + + numLits! - "Compute the compiled method header that encodes the arguments - in the receiver's header format (see CompiledMehtod's class comment)." - self subclassResponsibility! Item was removed: - ----- Method: EncoderForV3>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method generation') ----- - computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex - | primBits | - numTemps > 63 ifTrue: - [^self error: 'Cannot compile -- too many temporary variables']. - numLits > 255 ifTrue: - [^self error: 'Cannot compile -- too many literals']. - primBits := primitiveIndex <= 16r1FF - ifTrue: [primitiveIndex] - ifFalse: "For now the high bit of primitive no. is in the 29th bit of header" - [primitiveIndex > 16r3FF ifTrue: [self error: 'prim num too large']. - (primitiveIndex bitAnd: 16r1FF) + ((primitiveIndex bitAnd: 16r200) bitShift: 19)]. - ^(numArgs bitShift: 24) - + (numTemps bitShift: 18) - "+ (largeBit bitShift: 17)" "largeBit gets filled in later" - + (numLits bitShift: 9) - + primBits! Item was changed: ----- Method: EncoderForV3PlusClosures class>>bytecodeSize: (in category 'instruction stream support') ----- bytecodeSize: bytecode "Answer the number of bytes in the bytecode." bytecode <= 125 ifTrue: [^1]. bytecode >= 176 ifTrue: [^1]. bytecode >= 160 ifTrue: "long jumps" [^2]. bytecode >= 144 ifTrue: "short jumps" [^1]. "extensions" bytecode >= 128 ifTrue: + [^#(2 2 2 2 3 2 2 1 1 1 2 3 3 3 3 4) at: bytecode - 127]. - [^#(2 2 2 2 3 2 2 1 1 1 2 nil 3 3 3 4) at: bytecode - 127]. ^nil! Item was added: + ----- Method: EncoderForV3PlusClosures class>>callPrimitiveCode (in category 'bytecode decoding') ----- + callPrimitiveCode + "139 11101111 iiiiiiii jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)" + ^139! Item was added: + ----- Method: EncoderForV3PlusClosures>>genCallPrimitive: (in category 'bytecode generation') ----- + genCallPrimitive: primitiveIndex + "139 11101111 iiiiiiii jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)" + (primitiveIndex < 1 or: [primitiveIndex > 65535]) ifTrue: + [self outOfRangeError: 'primitive index' index: primitiveIndex range: 1 to: 65535]. + stream + nextPut: 139; + nextPut: (primitiveIndex bitAnd: 255); + nextPut: (primitiveIndex bitShift: -8)! Item was changed: ----- Method: MethodNode>>generate:using: (in category 'code generation') ----- generate: trailer using: aCompiledMethodClass "The receiver is the root of a parse tree. Answer an instance of aCompiledMethodClass. The argument, trailer, is arbitrary but is typically either the reference to the source code that is stored with every CompiledMethod, or an encoding of the method's temporary names." + | primErrNode blkSize nLits locals literals stack header method | - | primErrNode blkSize nLits literals stack method | self generate: trailer using: aCompiledMethodClass ifQuick: [:m | encoder noteBlockExtent: (0 to: 2) hasLocals: arguments. m literalAt: 2 put: encoder associationForClass; properties: properties. ^m]. primErrNode := self primitiveErrorVariableName ifNotNil: [encoder fixTemp: self primitiveErrorVariableName]. + self ensureClosureAnalysisDone. + encoder rootNode: self. "this is for BlockNode>>sizeCodeForClosureValue:" - encoder supportsClosureOpcodes ifTrue: - [self ensureClosureAnalysisDone. - encoder rootNode: self. "this is for BlockNode>>sizeCodeForClosureValue:"]. blkSize := (block sizeCodeForEvaluatedValue: encoder) + + (primitive > 0 + ifTrue: [encoder sizeCallPrimitive: primitive] + ifFalse: [0]) + (primErrNode ifNil: [0] ifNotNil: [primErrNode index: arguments size + temporaries size; sizeCodeForStore: encoder "The VM relies on storeIntoTemp: (129)"]). + locals := arguments, temporaries, (primErrNode ifNil: [#()] ifNotNil: [{primErrNode}]). + encoder noteBlockExtent: block blockExtent hasLocals: locals. + header := encoder computeMethodHeaderForNumArgs: arguments size + numTemps: locals size + numLits: (nLits := (literals := encoder allLiterals) size) + primitive: primitive. + method := trailer + createMethod: blkSize + class: aCompiledMethodClass + header: header. - method := aCompiledMethodClass - newBytes: blkSize - trailerBytes: trailer - nArgs: arguments size - nTemps: (encoder supportsClosureOpcodes - ifTrue: [| locals | - locals := arguments, - temporaries, - (primErrNode - ifNil: [#()] - ifNotNil: [{primErrNode}]). - encoder - noteBlockExtent: block blockExtent - hasLocals: locals. - locals size] - ifFalse: [encoder maxTemp]) - nStack: 0 - nLits: (nLits := (literals := encoder allLiterals) size) - primitive: primitive. - nLits > 255 ifTrue: - [^self error: 'Too many literals referenced']. 1 to: nLits do: [:lit | method literalAt: lit put: (literals at: lit)]. encoder streamToMethod: method. stack := ParseStack new init. + primitive > 0 ifTrue: + [encoder genCallPrimitive: primitive. + primErrNode ifNotNil: + [primErrNode emitCodeForStore: stack encoder: encoder]]. - primErrNode ifNotNil: [primErrNode emitCodeForStore: stack encoder: encoder]. stack position: method numTemps. [block emitCodeForEvaluatedValue: stack encoder: encoder] on: Error "If an attempt is made to write too much code the method will be asked" do: [:ex| "to grow, and the grow attempt will fail in CompiledMethod class>>#new:" ex signalerContext sender method = (CompiledMethod class>>#new:) ifTrue: [^self error: 'Compiler code size discrepancy'] ifFalse: [ex pass]]. stack position ~= (method numTemps + 1) ifTrue: [^self error: 'Compiler stack discrepancy']. encoder methodStreamPosition ~= (method size - trailer size) ifTrue: [^self error: 'Compiler code size discrepancy']. method needsFrameSize: stack size - method numTemps. method properties: properties. ^method! From commits at source.squeak.org Thu Jul 9 00:20:55 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 9 00:21:01 2015 Subject: [squeak-dev] The Trunk: Collections.spur-topa.638.mcz Message-ID: Eliot Miranda uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections.spur-topa.638.mcz ==================== Summary ==================== Name: Collections.spur-topa.638 Author: eem Time: 8 July 2015, 5:19:46.214 pm UUID: 74b2d4fa-c030-48a7-ae6c-c6809bd0318a Ancestors: Collections-topa.638, Collections.spur-topa.637 Collections-topa.638 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Let's say PluggableTextAttributes are not serializable. =============== Diff against Collections-topa.638 =============== Item was changed: ----- Method: Array>>elementsExchangeIdentityWith: (in category 'converting') ----- elementsExchangeIdentityWith: otherArray + "This primitive performs a bulk mutation, causing all pointers to the elements of the + receiver to be replaced by pointers to the corresponding elements of otherArray. + At the same time, all pointers to the elements of otherArray are replaced by + pointers to the corresponding elements of this array. The identityHashes remain + with the pointers rather than with the objects so that objects in hashed structures + should still be properly indexed after the mutation." - "This primitive performs a bulk mutation, causing all pointers to the elements of this array to be replaced by pointers to the corresponding elements of otherArray. At the same time, all pointers to the elements of otherArray are replaced by pointers to the corresponding elements of this array. The identityHashes remain with the pointers rather than with the objects so that objects in hashed structures should still be properly indexed after the mutation." + + ec == #'bad receiver' ifTrue: + [^self error: 'receiver must be of class Array']. + ec == #'bad argument' ifTrue: + [^self error: (otherArray class == Array + ifTrue: ['arg must be of class Array'] + ifFalse: ['receiver and argument must have the same size'])]. + ec == #'inappropriate operation' ifTrue: + [^self error: 'can''t become immediates such as SmallIntegers or Characters']. + ec == #'no modification' ifTrue: + [^self error: 'can''t become immutable objects']. + ec == #'object is pinned' ifTrue: + [^self error: 'can''t become pinned objects']. + ec == #'insufficient object memory' ifTrue: + [Smalltalk garbageCollect < 1048576 ifTrue: + [Smalltalk growMemoryByAtLeast: 1048576]. + ^self elementsExchangeIdentityWith: otherArray]. + self primitiveFailed! - - otherArray class == Array ifFalse: [^ self error: 'arg must be array']. - self size = otherArray size ifFalse: [^ self error: 'arrays must be same size']. - (self anySatisfy: [:obj | obj class == SmallInteger]) ifTrue: [^ self error: 'can''t become SmallIntegers']. - (otherArray anySatisfy: [:obj | obj class == SmallInteger]) ifTrue: [^ self error: 'can''t become SmallIntegers']. - self with: otherArray do:[:a :b| a == b ifTrue:[^self error:'can''t become yourself']]. - - "Must have failed because not enough space in forwarding table (see ObjectMemory-prepareForwardingTableForBecoming:with:twoWay:). Do GC and try again only once" - (Smalltalk bytesLeft: true) = Smalltalk primitiveGarbageCollect - ifTrue: [^ self primitiveFailed]. - ^ self elementsExchangeIdentityWith: otherArray! Item was changed: ----- Method: Array>>elementsForwardIdentityTo: (in category 'converting') ----- elementsForwardIdentityTo: otherArray + "This primitive performs a bulk mutation, causing all pointers to the elements of the + receiver to be replaced by pointers to the corresponding elements of otherArray. + The identityHashes remain with the pointers rather than with the objects so that + the objects in this array should still be properly indexed in any existing hashed + structures after the mutation." + - "This primitive performs a bulk mutation, causing all pointers to the elements of this array to be replaced by pointers to the corresponding elements of otherArray. The identityHashes remain with the pointers rather than with the objects so that the objects in this array should still be properly indexed in any existing hashed structures after the mutation." - self primitiveFailed! Item was changed: ----- Method: Array>>elementsForwardIdentityTo:copyHash: (in category 'converting') ----- elementsForwardIdentityTo: otherArray copyHash: copyHash + "This primitive performs a bulk mutation, causing all pointers to the elements of the + receiver to be replaced by pointers to the corresponding elements of otherArray. + If copyHash is true, the identityHashes remain with the pointers rather than with the + objects so that the objects in the receiver should still be properly indexed in any + existing hashed structures after the mutation. If copyHash is false, then the hashes + of the objects in otherArray remain unchanged. If you know what you're doing this + may indeed be what you want." + - "This primitive performs a bulk mutation, causing all pointers to the elements of this array to be replaced by pointers to the corresponding elements of otherArray. The identityHashes remain with the pointers rather than with the objects so that the objects in this array should still be properly indexed in any existing hashed structures after the mutation." - self primitiveFailed! Item was changed: ==== ERROR === Error: Unrecognized class type 9 July 2015 12:20:49.041 am VM: unix - a SmalltalkImage Image: Squeak3.11alpha [latest update: #8824] SecurityManager state: Restricted: false FileAccess: true SocketAccess: true Working Dir /home/squeaksource Trusted Dir /home/squeaksource/secure Untrusted Dir /home/squeaksource/My Squeak MCClassDefinition(Object)>>error: Receiver: a MCClassDefinition(Character) Arguments and temporary variables: aString: 'Unrecognized class type' Receiver's instance variables: name: #Character superclassName: #Magnitude variables: an OrderedCollection(a MCClassVariableDefinition(AlphaNumericMask) a...etc... category: #'Collections-Strings' type: #immediate comment: 'I represent a character by storing its associated Unicode as an unsig...etc... commentStamp: 'eem 8/12/2014 14:53' traitComposition: nil classTraitComposition: nil MCClassDefinition>>kindOfSubclass Receiver: a MCClassDefinition(Character) Arguments and temporary variables: Receiver's instance variables: name: #Character superclassName: #Magnitude variables: an OrderedCollection(a MCClassVariableDefinition(AlphaNumericMask) a...etc... category: #'Collections-Strings' type: #immediate comment: 'I represent a character by storing its associated Unicode as an unsig...etc... commentStamp: 'eem 8/12/2014 14:53' traitComposition: nil classTraitComposition: nil MCClassDefinition>>printDefinitionOn: Receiver: a MCClassDefinition(Character) Arguments and temporary variables: stream: a WriteStream Receiver's instance variables: name: #Character superclassName: #Magnitude variables: an OrderedCollection(a MCClassVariableDefinition(AlphaNumericMask) a...etc... category: #'Collections-Strings' type: #immediate comment: 'I represent a character by storing its associated Unicode as an unsig...etc... commentStamp: 'eem 8/12/2014 14:53' traitComposition: nil classTraitComposition: nil [] in MCDiffyTextWriter(MCStWriter)>>writeClassDefinition: Receiver: a MCDiffyTextWriter Arguments and temporary variables: definition: a WriteStream s: a MCClassDefinition(Character) Receiver's instance variables: stream: a WriteStream initStream: nil --- The full stack --- MCClassDefinition(Object)>>error: MCClassDefinition>>kindOfSubclass MCClassDefinition>>printDefinitionOn: [] in MCDiffyTextWriter(MCStWriter)>>writeClassDefinition: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - String class(SequenceableCollection class)>>new:streamContents: String class(SequenceableCollection class)>>streamContents: MCDiffyTextWriter(MCTextWriter)>>chunkContents: MCDiffyTextWriter(MCStWriter)>>writeClassDefinition: MCDiffyTextWriter(MCStWriter)>>visitClassDefinition: MCClassDefinition>>accept: [] in MCDiffyTextWriter(MCTextWriter)>>visitInFork: String class(SequenceableCollection class)>>new:streamContents: String class(SequenceableCollection class)>>streamContents: MCDiffyTextWriter(MCTextWriter)>>visitInFork: MCDiffyTextWriter>>writePatchFrom:to: MCDiffyTextWriter>>writeModification: [] in MCDiffyTextWriter>>writePatch: SortedCollection(OrderedCollection)>>do: MCDiffyTextWriter>>writePatch: SSDiffyTextWriter>>writePatch: [] in SSDiffyTextWriter>>writeVersion:for: BlockClosure>>on:do: SSDiffyTextWriter>>writeVersion:for: [] in SSEMailSubscription>>versionAdded:to: BlockClosure>>on:do: SSEMailSubscription>>versionAdded:to: [] in [] in SSProject>>versionAdded: [] in BlockClosure>>newProcess From commits at source.squeak.org Thu Jul 9 00:20:55 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 9 00:21:07 2015 Subject: [squeak-dev] The Trunk: Compiler.spur-dtl.303.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler.spur-dtl.303.mcz ==================== Summary ==================== Name: Compiler.spur-dtl.303 Author: eem Time: 8 July 2015, 5:19:52.697 pm UUID: b2395e1a-4529-4045-a6f1-be10f209dc9c Ancestors: Compiler-dtl.303, Compiler.spur-topa.302 Compiler-dtl.303 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Revert two methods from Compiler-eem.300 because they work on a stack interpreter but not on a context interpreter (VM crash). =============== Diff against Compiler-dtl.303 =============== Item was changed: ----- Method: BytecodeEncoder>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method generation') ----- computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex + numArgs > 15 ifTrue: + [^self error: 'Cannot compile -- too many arguments']. + numTemps > 63 ifTrue: + [^self error: 'Cannot compile -- too many temporary variables']. + numLits > 65535 ifTrue: + [^self error: 'Cannot compile -- too many literals']. + ^(CompiledMethod headerFlagForEncoder: self) + + (numArgs bitShift: 24) + + (numTemps bitShift: 18) + "+ (largeBit bitShift: 17)" "largeBit gets filled in later" + + (primitiveIndex > 0 ifTrue: [1 bitShift: 16] ifFalse: [0]) + + numLits! - "Compute the compiled method header that encodes the arguments - in the receiver's header format (see CompiledMehtod's class comment)." - self subclassResponsibility! Item was removed: - ----- Method: EncoderForV3>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method generation') ----- - computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex - | primBits | - numTemps > 63 ifTrue: - [^self error: 'Cannot compile -- too many temporary variables']. - numLits > 255 ifTrue: - [^self error: 'Cannot compile -- too many literals']. - primBits := primitiveIndex <= 16r1FF - ifTrue: [primitiveIndex] - ifFalse: "For now the high bit of primitive no. is in the 29th bit of header" - [primitiveIndex > 16r3FF ifTrue: [self error: 'prim num too large']. - (primitiveIndex bitAnd: 16r1FF) + ((primitiveIndex bitAnd: 16r200) bitShift: 19)]. - ^(numArgs bitShift: 24) - + (numTemps bitShift: 18) - "+ (largeBit bitShift: 17)" "largeBit gets filled in later" - + (numLits bitShift: 9) - + primBits! Item was changed: ----- Method: EncoderForV3PlusClosures class>>bytecodeSize: (in category 'instruction stream support') ----- bytecodeSize: bytecode "Answer the number of bytes in the bytecode." bytecode <= 125 ifTrue: [^1]. bytecode >= 176 ifTrue: [^1]. bytecode >= 160 ifTrue: "long jumps" [^2]. bytecode >= 144 ifTrue: "short jumps" [^1]. "extensions" bytecode >= 128 ifTrue: + [^#(2 2 2 2 3 2 2 1 1 1 2 3 3 3 3 4) at: bytecode - 127]. - [^#(2 2 2 2 3 2 2 1 1 1 2 nil 3 3 3 4) at: bytecode - 127]. ^nil! Item was added: + ----- Method: EncoderForV3PlusClosures class>>callPrimitiveCode (in category 'bytecode decoding') ----- + callPrimitiveCode + "139 11101111 iiiiiiii jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)" + ^139! Item was added: + ----- Method: EncoderForV3PlusClosures>>genCallPrimitive: (in category 'bytecode generation') ----- + genCallPrimitive: primitiveIndex + "139 11101111 iiiiiiii jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)" + (primitiveIndex < 1 or: [primitiveIndex > 65535]) ifTrue: + [self outOfRangeError: 'primitive index' index: primitiveIndex range: 1 to: 65535]. + stream + nextPut: 139; + nextPut: (primitiveIndex bitAnd: 255); + nextPut: (primitiveIndex bitShift: -8)! Item was changed: ----- Method: MethodNode>>generate:using: (in category 'code generation') ----- generate: trailer using: aCompiledMethodClass "The receiver is the root of a parse tree. Answer an instance of aCompiledMethodClass. The argument, trailer, is arbitrary but is typically either the reference to the source code that is stored with every CompiledMethod, or an encoding of the method's temporary names." + | primErrNode blkSize nLits locals literals stack header method | - | primErrNode blkSize nLits literals stack method | self generate: trailer using: aCompiledMethodClass ifQuick: [:m | encoder noteBlockExtent: (0 to: 2) hasLocals: arguments. m literalAt: 2 put: encoder associationForClass; properties: properties. ^m]. primErrNode := self primitiveErrorVariableName ifNotNil: [encoder fixTemp: self primitiveErrorVariableName]. + self ensureClosureAnalysisDone. + encoder rootNode: self. "this is for BlockNode>>sizeCodeForClosureValue:" - encoder supportsClosureOpcodes ifTrue: - [self ensureClosureAnalysisDone. - encoder rootNode: self. "this is for BlockNode>>sizeCodeForClosureValue:"]. blkSize := (block sizeCodeForEvaluatedValue: encoder) + + (primitive > 0 + ifTrue: [encoder sizeCallPrimitive: primitive] + ifFalse: [0]) + (primErrNode ifNil: [0] ifNotNil: [primErrNode index: arguments size + temporaries size; sizeCodeForStore: encoder "The VM relies on storeIntoTemp: (129)"]). + locals := arguments, temporaries, (primErrNode ifNil: [#()] ifNotNil: [{primErrNode}]). + encoder noteBlockExtent: block blockExtent hasLocals: locals. + header := encoder computeMethodHeaderForNumArgs: arguments size + numTemps: locals size + numLits: (nLits := (literals := encoder allLiterals) size) + primitive: primitive. + method := trailer + createMethod: blkSize + class: aCompiledMethodClass + header: header. - method := aCompiledMethodClass - newBytes: blkSize - trailerBytes: trailer - nArgs: arguments size - nTemps: (encoder supportsClosureOpcodes - ifTrue: [| locals | - locals := arguments, - temporaries, - (primErrNode - ifNil: [#()] - ifNotNil: [{primErrNode}]). - encoder - noteBlockExtent: block blockExtent - hasLocals: locals. - locals size] - ifFalse: [encoder maxTemp]) - nStack: 0 - nLits: (nLits := (literals := encoder allLiterals) size) - primitive: primitive. - nLits > 255 ifTrue: - [^self error: 'Too many literals referenced']. 1 to: nLits do: [:lit | method literalAt: lit put: (literals at: lit)]. encoder streamToMethod: method. stack := ParseStack new init. + primitive > 0 ifTrue: + [encoder genCallPrimitive: primitive. + primErrNode ifNotNil: + [primErrNode emitCodeForStore: stack encoder: encoder]]. - primErrNode ifNotNil: [primErrNode emitCodeForStore: stack encoder: encoder]. stack position: method numTemps. [block emitCodeForEvaluatedValue: stack encoder: encoder] on: Error "If an attempt is made to write too much code the method will be asked" do: [:ex| "to grow, and the grow attempt will fail in CompiledMethod class>>#new:" ex signalerContext sender method = (CompiledMethod class>>#new:) ifTrue: [^self error: 'Compiler code size discrepancy'] ifFalse: [ex pass]]. stack position ~= (method numTemps + 1) ifTrue: [^self error: 'Compiler stack discrepancy']. encoder methodStreamPosition ~= (method size - trailer size) ifTrue: [^self error: 'Compiler code size discrepancy']. method needsFrameSize: stack size - method numTemps. method properties: properties. ^method! From commits at source.squeak.org Thu Jul 9 00:21:26 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 9 00:21:29 2015 Subject: [squeak-dev] The Trunk: Compiler.spur-eem.304.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler.spur-eem.304.mcz ==================== Summary ==================== Name: Compiler.spur-eem.304 Author: eem Time: 8 July 2015, 5:19:58.822 pm UUID: 9fe8461a-fa5c-4c3d-8bf3-7c26f8d8169b Ancestors: Compiler-eem.304, Compiler.spur-topa.302 Compiler-eem.304 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Fix stack depth regression from Compiler-eem.300; this time with the correct version number for the MC package. =============== Diff against Compiler-eem.304 =============== Item was changed: ----- Method: BytecodeEncoder>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method generation') ----- computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex + numArgs > 15 ifTrue: + [^self error: 'Cannot compile -- too many arguments']. + numTemps > 63 ifTrue: + [^self error: 'Cannot compile -- too many temporary variables']. + numLits > 65535 ifTrue: + [^self error: 'Cannot compile -- too many literals']. + ^(CompiledMethod headerFlagForEncoder: self) + + (numArgs bitShift: 24) + + (numTemps bitShift: 18) + "+ (largeBit bitShift: 17)" "largeBit gets filled in later" + + (primitiveIndex > 0 ifTrue: [1 bitShift: 16] ifFalse: [0]) + + numLits! - "Compute the compiled method header that encodes the arguments - in the receiver's header format (see CompiledMehtod's class comment)." - self subclassResponsibility! Item was removed: - ----- Method: EncoderForV3>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method generation') ----- - computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex - | primBits | - numTemps > 63 ifTrue: - [^self error: 'Cannot compile -- too many temporary variables']. - numLits > 255 ifTrue: - [^self error: 'Cannot compile -- too many literals']. - primBits := primitiveIndex <= 16r1FF - ifTrue: [primitiveIndex] - ifFalse: "For now the high bit of primitive no. is in the 29th bit of header" - [primitiveIndex > 16r3FF ifTrue: [self error: 'prim num too large']. - (primitiveIndex bitAnd: 16r1FF) + ((primitiveIndex bitAnd: 16r200) bitShift: 19)]. - ^(numArgs bitShift: 24) - + (numTemps bitShift: 18) - "+ (largeBit bitShift: 17)" "largeBit gets filled in later" - + (numLits bitShift: 9) - + primBits! Item was changed: ----- Method: EncoderForV3PlusClosures class>>bytecodeSize: (in category 'instruction stream support') ----- bytecodeSize: bytecode "Answer the number of bytes in the bytecode." bytecode <= 125 ifTrue: [^1]. bytecode >= 176 ifTrue: [^1]. bytecode >= 160 ifTrue: "long jumps" [^2]. bytecode >= 144 ifTrue: "short jumps" [^1]. "extensions" bytecode >= 128 ifTrue: + [^#(2 2 2 2 3 2 2 1 1 1 2 3 3 3 3 4) at: bytecode - 127]. - [^#(2 2 2 2 3 2 2 1 1 1 2 nil 3 3 3 4) at: bytecode - 127]. ^nil! Item was added: + ----- Method: EncoderForV3PlusClosures class>>callPrimitiveCode (in category 'bytecode decoding') ----- + callPrimitiveCode + "139 11101111 iiiiiiii jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)" + ^139! Item was added: + ----- Method: EncoderForV3PlusClosures>>genCallPrimitive: (in category 'bytecode generation') ----- + genCallPrimitive: primitiveIndex + "139 11101111 iiiiiiii jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)" + (primitiveIndex < 1 or: [primitiveIndex > 65535]) ifTrue: + [self outOfRangeError: 'primitive index' index: primitiveIndex range: 1 to: 65535]. + stream + nextPut: 139; + nextPut: (primitiveIndex bitAnd: 255); + nextPut: (primitiveIndex bitShift: -8)! Item was changed: ----- Method: MethodNode>>generate:using: (in category 'code generation') ----- generate: trailer using: aCompiledMethodClass "The receiver is the root of a parse tree. Answer an instance of aCompiledMethodClass. The argument, trailer, is arbitrary but is typically either the reference to the source code that is stored with every CompiledMethod, or an encoding of the method's temporary names." + | primErrNode blkSize nLits locals literals stack header method | - | primErrNode blkSize nLits literals stack method | self generate: trailer using: aCompiledMethodClass ifQuick: [:m | encoder noteBlockExtent: (0 to: 2) hasLocals: arguments. m literalAt: 2 put: encoder associationForClass; properties: properties. ^m]. primErrNode := self primitiveErrorVariableName ifNotNil: [encoder fixTemp: self primitiveErrorVariableName]. + self ensureClosureAnalysisDone. + encoder rootNode: self. "this is for BlockNode>>sizeCodeForClosureValue:" - encoder supportsClosureOpcodes ifTrue: - [self ensureClosureAnalysisDone. - encoder rootNode: self. "this is for BlockNode>>sizeCodeForClosureValue:"]. blkSize := (block sizeCodeForEvaluatedValue: encoder) + + (primitive > 0 + ifTrue: [encoder sizeCallPrimitive: primitive] + ifFalse: [0]) + (primErrNode ifNil: [0] ifNotNil: [primErrNode index: arguments size + temporaries size; sizeCodeForStore: encoder "The VM relies on storeIntoTemp: (129)"]). + locals := arguments, temporaries, (primErrNode ifNil: [#()] ifNotNil: [{primErrNode}]). + encoder noteBlockExtent: block blockExtent hasLocals: locals. + header := encoder computeMethodHeaderForNumArgs: arguments size + numTemps: locals size + numLits: (nLits := (literals := encoder allLiterals) size) + primitive: primitive. + method := trailer + createMethod: blkSize + class: aCompiledMethodClass + header: header. - method := aCompiledMethodClass - newBytes: blkSize - trailerBytes: trailer - nArgs: arguments size - nTemps: (encoder supportsClosureOpcodes - ifTrue: [| locals | - locals := arguments, - temporaries, - (primErrNode - ifNil: [#()] - ifNotNil: [{primErrNode}]). - encoder - noteBlockExtent: block blockExtent - hasLocals: locals. - locals size] - ifFalse: [encoder maxTemp]) - nStack: 0 - nLits: (nLits := (literals := encoder allLiterals) size) - primitive: primitive. - nLits > 255 ifTrue: - [^self error: 'Too many literals referenced']. 1 to: nLits do: [:lit | method literalAt: lit put: (literals at: lit)]. encoder streamToMethod: method. stack := ParseStack new init. + primitive > 0 ifTrue: + [encoder genCallPrimitive: primitive. + primErrNode ifNotNil: + [primErrNode emitCodeForStore: stack encoder: encoder]]. - primErrNode ifNotNil: [primErrNode emitCodeForStore: stack encoder: encoder]. stack position: method numTemps. [block emitCodeForEvaluatedValue: stack encoder: encoder] on: Error "If an attempt is made to write too much code the method will be asked" do: [:ex| "to grow, and the grow attempt will fail in CompiledMethod class>>#new:" ex signalerContext sender method = (CompiledMethod class>>#new:) ifTrue: [^self error: 'Compiler code size discrepancy'] ifFalse: [ex pass]]. stack position ~= (method numTemps + 1) ifTrue: [^self error: 'Compiler stack discrepancy']. encoder methodStreamPosition ~= (method size - trailer size) ifTrue: [^self error: 'Compiler code size discrepancy']. method needsFrameSize: stack size - method numTemps. method properties: properties. ^method! From commits at source.squeak.org Thu Jul 9 00:58:08 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 9 00:58:10 2015 Subject: [squeak-dev] Squeak 4.6: Compiler-eem.304.mcz Message-ID: Chris Muller uploaded a new version of Compiler to project Squeak 4.6: http://source.squeak.org/squeak46/Compiler-eem.304.mcz ==================== Summary ==================== Name: Compiler-eem.304 Author: eem Time: 8 July 2015, 5:15:09.812 pm UUID: 3b07ef9d-69d2-424d-845c-affde45643b8 Ancestors: Compiler-topa.302 Fix stack depth regression from Compiler-eem.300; this time with the correct version number for the MC package. =============== Diff against Compiler-topa.302 =============== From lewis at mail.msen.com Thu Jul 9 02:14:55 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Thu Jul 9 02:14:57 2015 Subject: [squeak-dev] The Trunk: Compiler-eem.304.mcz In-Reply-To: <201507090015.t690FUrA011002@shell.msen.com> References: <201507090015.t690FUrA011002@shell.msen.com> Message-ID: <20150709021455.GA25660@shell.msen.com> Confirming - this fixes the problem of interpreter VM crashes after a system recompile, so this is the version that should go into the 4.6/5.0 release. Thanks! Dave On Thu, Jul 09, 2015 at 12:15:16AM +0000, commits@source.squeak.org wrote: > Eliot Miranda uploaded a new version of Compiler to project The Trunk: > http://source.squeak.org/trunk/Compiler-eem.304.mcz > > ==================== Summary ==================== > > Name: Compiler-eem.304 > Author: eem > Time: 8 July 2015, 5:15:09.812 pm > UUID: 3b07ef9d-69d2-424d-845c-affde45643b8 > Ancestors: Compiler-topa.302 > > Fix stack depth regression from Compiler-eem.300; this time with the correct version number for the MC package. > > =============== Diff against Compiler-topa.302 =============== > > Item was changed: > ----- Method: BlockNode>>emitCodeForEvaluatedClosureValue:encoder: (in category 'code generation (closures)') ----- > emitCodeForEvaluatedClosureValue: stack encoder: encoder > | position | > position := stack position. > + stack position: arguments size + temporaries size + copiedValues size. > - stack position: arguments size + copiedValues size. > encoder genPushNClosureTemps: temporaries size. > self > reindexingLocalsDo: [self emitCodeForEvaluatedValue: stack encoder: encoder] > encoder: encoder. > self returns ifFalse: > [encoder genReturnTopToCaller. > pc := encoder methodStreamPosition]. > stack position: position! > From lewis at mail.msen.com Thu Jul 9 02:37:04 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Thu Jul 9 02:37:06 2015 Subject: [squeak-dev] accessing file permissions within the image In-Reply-To: References: Message-ID: <20150709023704.GC25660@shell.msen.com> On Wed, Jul 08, 2015 at 11:43:50PM +0200, Levente Uzonyi wrote: > > On Wed, 8 Jul 2015, Chris Muller wrote: > > > >Is it possible to determine the Linux file permissions of a file or > >directory from within the image running on Linux? > > > > IIRC the Pharo guys have added that feature to their version of > FilePlugin. > OSProcess accessor fileStat: '/etc/hosts' ==> #(0 0 #(0 6 4 4)) The primitive is in UnixOSProcessPlugin, and is accessed like this: UnixOSProcessAccessor>>primFileStat: aPathString "Call stat(2) to obtain the file protection mask for a file. Answer errno on failure, or on success answer an array with: UID with: GID with: protectionMask. The protectionMask is an Array of four integers representing the protection mask, or answer errno on failure. The protection mask is four Integers, each of which may be considered an octal digit (0-7), with bit values 4, 2, and 1. The first digit selects the set user ID (4) and set group ID (2) and save text image (1) attributes. The second digit selects permissions for the user who owns the file: read (4), write (2), and execute (1); the third selects permissions for other users in the file's group, with the same values; and the fourth for other users not in the file's group, with the same values." ^ nil Dave From lists at fniephaus.com Thu Jul 9 07:37:44 2015 From: lists at fniephaus.com (Fabio Niephaus) Date: Thu Jul 9 07:37:59 2015 Subject: [squeak-dev] Squeak 4.6 -- 3rd Release Candidate In-Reply-To: References: Message-ID: Hi Chris, This is very exciting! And I'll be happy to test the All-In-One on my Mac. Please let me know if I can be of any additional help. Best, Fabio -- On Wed, Jul 8, 2015 at 11:49 PM Chris Muller wrote: > This is most likely going to be the one. > > http://ftp.squeak.org/4.6/Squeak4.6-15101.zip > > Another new sources file, as before, is required, be sure not to use > any old SqueakV46.sources files. > > http://ftp.squeak.org/4.6/SqueakV46.sources.zip > > I'll try the All-In-One tomorrow but will probably need Mac help again. > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150709/c9397cd9/attachment.htm From ma.chris.m at gmail.com Thu Jul 9 16:14:25 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Thu Jul 9 16:14:30 2015 Subject: [squeak-dev] Squeak-4.6-All-In-One posted for Linux and Windows Message-ID: I managed to get the 4.6-All-In-One uploaded and tested on Windows and Ubuntu Linux. However, I did nothing for Mac (not even the VM replacement) I need a Mac owner to please download it, dig into the zip and make the necessary changes so it will launch on Mac. The Mac-specific folders appear to be: ./Squeak-4.6-All-In-One/Squeak-4.6-All-in-One.app/Contents/_CodeSignature ./Squeak-4.6-All-In-One/Squeak-4.6-All-in-One.app/Contents/MacOS ./Squeak-4.6-All-In-One/Squeak-4.6-All-in-One.app/Contents/Resources ./Squeak-4.6-All-In-One/Squeak-4.6-All-in-One.app/Contents/Library ./Squeak-4.6-All-In-One/Squeak-4.6-All-in-One.app/Contents/PkgInfo ./Squeak-4.6-All-In-One/Squeak-4.6-All-in-One.app/Contents/Info.plist Mac volunteer, please download it, unzip, make the necessary adjustments, re-Zip, and send me a link where I can download it. Then, I'll re-upload it to squeak.org. Thanks. From stephan at stack.nl Thu Jul 9 18:43:03 2015 From: stephan at stack.nl (Stephan Eggermont) Date: Thu Jul 9 18:43:16 2015 Subject: [squeak-dev] ProportionalLayout not so suitable for Drag-and-Drop? Message-ID: I have been playing with drag-and-drop and layouts, and noticed that TableLayout seems to have much better support for drag-and-drop than ProportionalLayout. Are there other LayoutPolicies that I should take a look at? Stephan From karlramberg at gmail.com Thu Jul 9 18:49:29 2015 From: karlramberg at gmail.com (karl ramberg) Date: Thu Jul 9 18:49:35 2015 Subject: [squeak-dev] Squeak-4.6-All-In-One posted for Linux and Windows In-Reply-To: References: Message-ID: Great news :-) Karl On Thu, Jul 9, 2015 at 6:14 PM, Chris Muller wrote: > I managed to get the 4.6-All-In-One uploaded and tested on Windows and > Ubuntu Linux. > > However, I did nothing for Mac (not even the VM replacement) I need a > Mac owner to please download it, dig into the zip and make the > necessary changes so it will launch on Mac. > > The Mac-specific folders appear to be: > > > ./Squeak-4.6-All-In-One/Squeak-4.6-All-in-One.app/Contents/_CodeSignature > ./Squeak-4.6-All-In-One/Squeak-4.6-All-in-One.app/Contents/MacOS > ./Squeak-4.6-All-In-One/Squeak-4.6-All-in-One.app/Contents/Resources > ./Squeak-4.6-All-In-One/Squeak-4.6-All-in-One.app/Contents/Library > ./Squeak-4.6-All-In-One/Squeak-4.6-All-in-One.app/Contents/PkgInfo > ./Squeak-4.6-All-In-One/Squeak-4.6-All-in-One.app/Contents/Info.plist > > Mac volunteer, please download it, unzip, make the necessary > adjustments, re-Zip, and send me a link where I can download it. > Then, I'll re-upload it to squeak.org. Thanks. > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150709/fce02597/attachment.htm From tim at rowledge.org Thu Jul 9 19:03:04 2015 From: tim at rowledge.org (tim Rowledge) Date: Thu Jul 9 19:03:13 2015 Subject: [squeak-dev] ProportionalLayout not so suitable for Drag-and-Drop? In-Reply-To: References: Message-ID: On 09-07-2015, at 11:43 AM, Stephan Eggermont wrote: > I have been playing with drag-and-drop and layouts, You might get something useful from a) http://wiki.squeak.org/squeak/6194, and b)http://wiki.squeak.org/squeak/2141 Whatever you find out - please update any relevant pages on the swiki. We *really* need improvements in so many places! tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim You can swear at the keyboard and it won't be offended. It was going to treat you badly anyway From ma.chris.m at gmail.com Thu Jul 9 20:08:50 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Thu Jul 9 20:08:52 2015 Subject: [squeak-dev] Collapsing the .spur branch for Squeak 5 Message-ID: Hi Eliot, thanks for uploading the new trunk46-spur images 20150807. However, it has four merged dirty packages. I have already created a Squeak5.0-15102 and uploaded it to http://ftp.squeak.org/5.0alpha/. So, we have something which essentially reflects the last state of the last 4.x (e.g., 4.6) in the new Spur format. Nice. Now we're ready to figure out how to move forward. I think we should save these dirty merged packages one last time as ".spur" before we resave all of the .spur packages for the first time as the mainline names (e.g., without ".spur"). Would you like to take care of that or me? From leves at elte.hu Thu Jul 9 21:18:01 2015 From: leves at elte.hu (Levente Uzonyi) Date: Thu Jul 9 21:18:04 2015 Subject: [squeak-dev] Collapsing the .spur branch for Squeak 5 In-Reply-To: References: Message-ID: There's one more thing. The spur bootstrap removes ObjectHistory, but it leaves references to the class in #oopAge and #oopTimestamp. Those methods should also be removed, otherwise ObjectHistory will be in Undeclared in 5.0. Levente On Thu, 9 Jul 2015, Chris Muller wrote: > Hi Eliot, thanks for uploading the new trunk46-spur images 20150807. > > However, it has four merged dirty packages. I have already created a > Squeak5.0-15102 and uploaded it to http://ftp.squeak.org/5.0alpha/. > So, we have something which essentially reflects the last state of the > last 4.x (e.g., 4.6) in the new Spur format. Nice. > > Now we're ready to figure out how to move forward. I think we should > save these dirty merged packages one last time as ".spur" before we > resave all of the .spur packages for the first time as the mainline > names (e.g., without ".spur"). Would you like to take care of that or > me? > > From commits at source.squeak.org Thu Jul 9 21:55:01 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Thu Jul 9 21:55:03 2015 Subject: [squeak-dev] Daily Commit Log Message-ID: <20150709215501.25698.qmail@box4.squeakfoundation.org> Changes to Trunk (http://source.squeak.org/trunk.html) in the last 24 hours: http://lists.squeakfoundation.org/pipermail/packages/2015-July/008821.html Name: Compiler-eem.303 Ancestors: Compiler-topa.302 Fix stack depth regression from Compiler-eem.300. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008822.html Name: Compiler-eem.304 Ancestors: Compiler-topa.302 Fix stack depth regression from Compiler-eem.300; this time with the correct version number for the MC package. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008823.html Name: Compiler.spur-eem.303 Ancestors: Compiler-eem.303, Compiler.spur-topa.302 Compiler-eem.303 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Fix stack depth regression from Compiler-eem.300. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008824.html Name: Collections.spur-topa.638 Ancestors: Collections-topa.638, Collections.spur-topa.637 Collections-topa.638 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Let's say PluggableTextAttributes are not serializable. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008825.html Name: Compiler.spur-dtl.303 Ancestors: Compiler-dtl.303, Compiler.spur-topa.302 Compiler-dtl.303 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Revert two methods from Compiler-eem.300 because they work on a stack interpreter but not on a context interpreter (VM crash). ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008826.html Name: Compiler.spur-eem.304 Ancestors: Compiler-eem.304, Compiler.spur-topa.302 Compiler-eem.304 patched for Spur by SpurBootstrapMonticelloPackagePatcher Cog-eem.270 Fix stack depth regression from Compiler-eem.300; this time with the correct version number for the MC package. ============================================= From eliot.miranda at gmail.com Fri Jul 10 00:13:11 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri Jul 10 00:13:19 2015 Subject: [squeak-dev] Re: Collapsing the .spur branch for Squeak 5 In-Reply-To: References: Message-ID: <3CF44302-EDAF-446B-8ED7-2E7A20E18557@gmail.com> Hi Chris, Eliot (phone) On Jul 9, 2015, at 1:08 PM, Chris Muller wrote: > Hi Eliot, thanks for uploading the new trunk46-spur images 20150807. > > However, it has four merged dirty packages. I have already created a > Squeak5.0-15102 and uploaded it to http://ftp.squeak.org/5.0alpha/. > So, we have something which essentially reflects the last state of the > last 4.x (e.g., 4.6) in the new Spur format. Nice. > > Now we're ready to figure out how to move forward. I think we should > save these dirty merged packages one last time as ".spur" before we > resave all of the .spur packages for the first time as the mainline > names (e.g., without ".spur"). Would you like to take care of that or > me? The packages are dirty only as a left-over from the merge in the update process. If I check for differences the dirty mark will disappear. I had forgotten to do that. Thanks for the reminder. I'll do it tomorrow at the latest (booked this evening and have been busy in the day). From eliot.miranda at gmail.com Fri Jul 10 00:14:39 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri Jul 10 00:14:46 2015 Subject: [squeak-dev] Collapsing the .spur branch for Squeak 5 In-Reply-To: References: Message-ID: <921E1A24-C159-4DED-A857-E7DB47B820F8@gmail.com> Hi Levente, I had hoped that those two methods were deleted by the bootstrap. Again that might be as a result of the merge. I'll take care if it when I clean the packages. Eliot (phone) On Jul 9, 2015, at 2:18 PM, Levente Uzonyi wrote: > There's one more thing. The spur bootstrap removes ObjectHistory, but it leaves references to the class in #oopAge and #oopTimestamp. Those methods should also be removed, otherwise ObjectHistory will be in Undeclared in 5.0. > > Levente > > On Thu, 9 Jul 2015, Chris Muller wrote: > >> Hi Eliot, thanks for uploading the new trunk46-spur images 20150807. >> >> However, it has four merged dirty packages. I have already created a >> Squeak5.0-15102 and uploaded it to http://ftp.squeak.org/5.0alpha/. >> So, we have something which essentially reflects the last state of the >> last 4.x (e.g., 4.6) in the new Spur format. Nice. >> >> Now we're ready to figure out how to move forward. I think we should >> save these dirty merged packages one last time as ".spur" before we >> resave all of the .spur packages for the first time as the mainline >> names (e.g., without ".spur"). Would you like to take care of that or >> me? >> >> From Marcel.Taeumel at hpi.de Fri Jul 10 12:34:26 2015 From: Marcel.Taeumel at hpi.de (marcel.taeumel) Date: Fri Jul 10 12:57:50 2015 Subject: [squeak-dev] Re: ProportionalLayout not so suitable for Drag-and-Drop? In-Reply-To: References: Message-ID: <1436531666897-4836912.post@n4.nabble.com> Yes, proportional layouts are difficult to update when dropping an object into the hierarchy. If you take a look at how proportional splitters work, you can see that they tweak the #offset property of the adjacent layout frames. There is only the TableLayout left, which fits better for adding morphs into the respective container on-the-fly. You might want to take a look at the layout policy that I use in Vivide: https://github.com/hpi-swa/vivide/tree/master/repository/Vivide.package/ViConstraintLayout.class (It also needs #boundsInOwner: from https://github.com/hpi-swa/vivide/tree/master/repository/Vivide.package/Morph.extension/instance but should work in Squeak 4.6 without Vivide.) It provides interactive layout configuration and automatic scaling. Here is an example: m := Morph new. m layoutPolicy: ViConstraintLayout new. m topLeft: 0@0; extent: 100@100. m addMorph: (Morph new topLeft: m topLeft; extent: 30@30; color: Color random). m addMorph: (Morph new topLeft: m topLeft + (50@50); extent: 30@30; color: Color random). m openInHand. Best, Marcel -- View this message in context: http://forum.world.st/ProportionalLayout-not-so-suitable-for-Drag-and-Drop-tp4836801p4836912.html Sent from the Squeak - Dev mailing list archive at Nabble.com. From stephan at stack.nl Fri Jul 10 13:45:25 2015 From: stephan at stack.nl (Stephan Eggermont) Date: Fri Jul 10 13:45:52 2015 Subject: [squeak-dev] Re: ProportionalLayout not so suitable for Drag-and-Drop? In-Reply-To: <1436531666897-4836912.post@n4.nabble.com> References: <1436531666897-4836912.post@n4.nabble.com> Message-ID: On 10-07-15 14:34, marcel.taeumel wrote: > Yes, proportional layouts are difficult to update when dropping an object > into the hierarchy. If you take a look at how proportional splitters work, > you can see that they tweak the #offset property of the adjacent layout > frames. Thanks, I'll take a look. > There is only the TableLayout left, which fits better for adding morphs into > the respective container on-the-fly. > > You might want to take a look at the layout policy that I use in Vivide: > https://github.com/hpi-swa/vivide/tree/master/repository/Vivide.package/ViConstraintLayout.class > (It also needs #boundsInOwner: from > https://github.com/hpi-swa/vivide/tree/master/repository/Vivide.package/Morph.extension/instance > but should work in Squeak 4.6 without Vivide.) That looks like a more workable layoutpolicy. Thanks. Stephan From Marcel.Taeumel at hpi.de Fri Jul 10 13:26:21 2015 From: Marcel.Taeumel at hpi.de (marcel.taeumel) Date: Fri Jul 10 13:49:45 2015 Subject: [squeak-dev] Re: ProportionalLayout not so suitable for Drag-and-Drop? In-Reply-To: <1436531666897-4836912.post@n4.nabble.com> References: <1436531666897-4836912.post@n4.nabble.com> Message-ID: <1436534781500-4836933.post@n4.nabble.com> Best, Marcel -- View this message in context: http://forum.world.st/ProportionalLayout-not-so-suitable-for-Drag-and-Drop-tp4836801p4836933.html Sent from the Squeak - Dev mailing list archive at Nabble.com. From ma.chris.m at gmail.com Fri Jul 10 18:45:25 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Fri Jul 10 18:45:27 2015 Subject: [squeak-dev] Squeak 4.6 -- 3rd Release Candidate In-Reply-To: References: Message-ID: > This is very exciting! I agree, IMO this is the best release of Squeak in a while (relative to its predecessor). > And I'll be happy to test the All-In-One on my Mac. > Please let me know if I can be of any additional help. Cool thanks! If you know how to make the All-In-One work on Mac we could use some help on that. I guess it needs the VM updated and signed, which may require a license from Apple. I think Craig Latta has one.. PS -- big thanks for the new web site, it looks great From asqueaker at gmail.com Fri Jul 10 18:46:54 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 10 18:46:57 2015 Subject: [squeak-dev] accessing file permissions within the image In-Reply-To: <20150709023704.GC25660@shell.msen.com> References: <20150709023704.GC25660@shell.msen.com> Message-ID: Dave, I would like to say, OSProcess is one fine package! I keep getting surprised at the cool things (like RemoteTask) in there. It seems to have become a permanent part of my images. On Wed, Jul 8, 2015 at 9:37 PM, David T. Lewis wrote: > On Wed, Jul 08, 2015 at 11:43:50PM +0200, Levente Uzonyi wrote: >> >> On Wed, 8 Jul 2015, Chris Muller wrote: >> > >> >Is it possible to determine the Linux file permissions of a file or >> >directory from within the image running on Linux? >> > >> >> IIRC the Pharo guys have added that feature to their version of >> FilePlugin. >> > > OSProcess accessor fileStat: '/etc/hosts' ==> #(0 0 #(0 6 4 4)) > > The primitive is in UnixOSProcessPlugin, and is accessed like this: > > UnixOSProcessAccessor>>primFileStat: aPathString > "Call stat(2) to obtain the file protection mask for a file. Answer errno on failure, > or on success answer an array with: UID with: GID with: protectionMask. The > protectionMask is an Array of four integers representing the protection mask, or > answer errno on failure. The protection mask is four Integers, each of which may > be considered an octal digit (0-7), with bit values 4, 2, and 1. The first digit selects > the set user ID (4) and set group ID (2) and save text image (1) attributes. The second > digit selects permissions for the user who owns the file: read (4), write (2), and > execute (1); the third selects permissions for other users in the file's group, with > the same values; and the fourth for other users not in the file's group, with the > same values." > > > ^ nil > > Dave > > From craig at netjam.org Fri Jul 10 22:24:05 2015 From: craig at netjam.org (Craig Latta) Date: Fri Jul 10 22:24:17 2015 Subject: [squeak-dev] re: Squeak 4.6 -- 3rd Release Candidate In-Reply-To: References: Message-ID: Hi Chris and all-- > If you know how to make the All-In-One work on Mac we could use some > help on that. I guess it needs the VM updated and signed, which may > require a license from Apple. I think Craig Latta has one. Sure, just point me at the right bits and I'll construct and sign. -C -- Craig Latta netjam.org +31 6 2757 7177 (SMS ok) + 1 415 287 3547 (no SMS) From lists at fniephaus.com Sat Jul 11 06:58:26 2015 From: lists at fniephaus.com (Fabio Niephaus) Date: Sat Jul 11 06:58:39 2015 Subject: [squeak-dev] Squeak 4.6 -- 3rd Release Candidate In-Reply-To: References: Message-ID: I'm glad you like the new website. When I downloaded the All-In-One, it was already working on my Mac without any problems, so I thought that someone must have been done that already. Unfortunately, I haven't signed anything for OS X before. So it'd be great if Craig could take care of this while I make sure to know how it works for the next time ;) We will update the website accordingly as soon as the release is ready. Best, Fabio -- On Fri, Jul 10, 2015 at 8:45 PM Chris Muller wrote: > > This is very exciting! > > I agree, IMO this is the best release of Squeak in a while (relative > to its predecessor). > > > And I'll be happy to test the All-In-One on my Mac. > > Please let me know if I can be of any additional help. > > Cool thanks! If you know how to make the All-In-One work on Mac we > could use some help on that. I guess it needs the VM updated and > signed, which may require a license from Apple. I think Craig Latta > has one.. > > PS -- big thanks for the new web site, it looks great > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150711/18358d13/attachment.htm From asqueaker at gmail.com Sat Jul 11 17:53:28 2015 From: asqueaker at gmail.com (Chris Muller) Date: Sat Jul 11 17:53:33 2015 Subject: [squeak-dev] re: Squeak 4.6 -- 3rd Release Candidate In-Reply-To: References: Message-ID: Thanks Craig, its here. http://ftp.squeak.org/4.6/Squeak-4.6-All-in-One.zip On Fri, Jul 10, 2015 at 5:24 PM, Craig Latta wrote: > > Hi Chris and all-- > >> If you know how to make the All-In-One work on Mac we could use some >> help on that. I guess it needs the VM updated and signed, which may >> require a license from Apple. I think Craig Latta has one. > > Sure, just point me at the right bits and I'll construct and sign. > > > -C > > -- > Craig Latta > netjam.org > +31 6 2757 7177 (SMS ok) > + 1 415 287 3547 (no SMS) > > From asqueaker at gmail.com Sat Jul 11 20:23:44 2015 From: asqueaker at gmail.com (Chris Muller) Date: Sat Jul 11 20:23:49 2015 Subject: [squeak-dev] cogspurlinuxht under daemontools In-Reply-To: References: Message-ID: Hi Levente, I'm still having the same trouble with this even after rebooting the server. I'd like to be able to run with the "HT" VM, but I think I may be wasting my time because its not possible at all [1]. Maybe there's a way around that, I don't know.. Which is why I'd like to ask: Can you confirm that you have or are successfully running the HT vm when the effective UID of the process does not match the UID of the user that invoked it (as when daemontools, running under root, would use "setuidgid" to run the VM)? Thanks. [1] The manpage referred to earlier says: "Subject to the same rules, another unprivileged process can also make these changes, as long as the effective user ID of the process making the change matches the real or effective user ID of the target process." On Fri, Jun 19, 2015 at 8:16 AM, Levente Uzonyi wrote: > Try restarting the daemontools daemon. Changes to the limits affect only the > processes started after the change. > > Levente > > > On Thu, 18 Jun 2015, Chris Muller wrote: > >> I am having trouble using the "HT" version of the Spur VM under >> daemontools. When the daemon attempts to launch the image it gets the >> familiar pthread error: >> >> pthread_setschedparam failed: Operation not permitted >> Read e.g. http://www.mirandabanda.org/files/Cog/VM/VM.r3370/README.3370 >> >> however, I *definitely* have my /etc/security/limits.d/squeak.conf >> file set up as instructed (been working fine for ages), and in fact >> I'm able to run the same image with the same startup script under the >> same uidgid manually. (e.g., I'm able to cut-n-paste the line from my >> "run" script into the terminal and it works fine...) >> >> exec setuidgid magma /usr/local/bin/spur -vm display=none >> server-spur.image $DIR/run.st `cat port` >> >> ... but when daemontools runs it, gets the pthread error. Weird! Any >> ideas? >> >> > From eliot.miranda at gmail.com Sat Jul 11 21:30:05 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 11 21:30:15 2015 Subject: [squeak-dev] cogspurlinuxht under daemontools In-Reply-To: References: Message-ID: <62E3AA0A-1491-4DD5-A1CC-3D0B637594BB@gmail.com> Hi Chris, I really know very little about this. I don't understand the mechanism. But I'm told that the limits file takes effect on login. i.e. if the file is created while a user is logged in it won't take effect for that user until that user logs out and logs back in again and only applies to those sessions that logged in once the file had been created. I /dont/ know whether su sets up a new session. i should try that experiment. So perhaps you could have daemon tools run login or su to create a new session and see if the ht version can be run by daemontools in that session. Presumably daemons launched at boot aren't in the right state. (What an absurdity they've invented here). Eliot (phone) On Jul 11, 2015, at 1:23 PM, Chris Muller wrote: > Hi Levente, I'm still having the same trouble with this even after > rebooting the server. I'd like to be able to run with the "HT" VM, > but I think I may be wasting my time because its not possible at all > [1]. Maybe there's a way around that, I don't know.. > > Which is why I'd like to ask: Can you confirm that you have or are > successfully running the HT vm when the effective UID of the process > does not match the UID of the user that invoked it (as when > daemontools, running under root, would use "setuidgid" to run the VM)? > > Thanks. > > [1] The manpage referred to earlier says: "Subject to the same rules, > another unprivileged process can also make these changes, as long as > the effective user ID of the process making the change matches the > real or effective user ID of the target process." > > On Fri, Jun 19, 2015 at 8:16 AM, Levente Uzonyi wrote: >> Try restarting the daemontools daemon. Changes to the limits affect only the >> processes started after the change. >> >> Levente >> >> >> On Thu, 18 Jun 2015, Chris Muller wrote: >> >>> I am having trouble using the "HT" version of the Spur VM under >>> daemontools. When the daemon attempts to launch the image it gets the >>> familiar pthread error: >>> >>> pthread_setschedparam failed: Operation not permitted >>> Read e.g. http://www.mirandabanda.org/files/Cog/VM/VM.r3370/README.3370 >>> >>> however, I *definitely* have my /etc/security/limits.d/squeak.conf >>> file set up as instructed (been working fine for ages), and in fact >>> I'm able to run the same image with the same startup script under the >>> same uidgid manually. (e.g., I'm able to cut-n-paste the line from my >>> "run" script into the terminal and it works fine...) >>> >>> exec setuidgid magma /usr/local/bin/spur -vm display=none >>> server-spur.image $DIR/run.st `cat port` >>> >>> ... but when daemontools runs it, gets the pthread error. Weird! Any >>> ideas? > From hannes.hirzel at gmail.com Mon Jul 13 05:45:03 2015 From: hannes.hirzel at gmail.com (H. Hirzel) Date: Mon Jul 13 05:45:06 2015 Subject: [squeak-dev] Vivide IDE? Message-ID: On 7/10/15, marcel.taeumel wrote: ... > You might want to take a look at the layout policy that I use in Vivide: > https://github.com/hpi-swa/vivide/tree/master/repository/Vivide.package/ViConstraintLayout.class .... Hello Marcel Where should I start reading about Vivide? Is it ready for general use? Kind regards Hannes From Marcel.Taeumel at hpi.de Mon Jul 13 07:54:05 2015 From: Marcel.Taeumel at hpi.de (marcel.taeumel) Date: Mon Jul 13 08:17:46 2015 Subject: [squeak-dev] Re: Vivide IDE? In-Reply-To: References: Message-ID: <1436774045894-4837304.post@n4.nabble.com> Hi Hannes, you can start reading here: http://hirschfeld.org/writings/media/TaeumelPerscheidSteinertLinckeHirschfeld_2014_InterleavingOfModificationAndUseInDataDrivenToolDevelopment_AcmDL.pdf Then watch some videos listed here: https://github.com/hpi-swa/vivide and also this one: https://vimeo.com/132182606 For actual use, take a look also at Vivide's dependent projects: https://github.com/hpi-swa/signals https://github.com/hpi-swa/animations https://github.com/hpi-swa/widgets It might be interesting to load all scripts (resp. profiles) to play around with: Metacello new baseline: 'Vivide'; repository: 'github://hpi-swa/vivide/repository'; load: #(dev). (Smalltalk classNamed: 'ViScriptArchive') mergeAll. You can find more information here: https://github.com/hpi-swa/vivide/wiki/FAQ Best, Marcel -- View this message in context: http://forum.world.st/Vivide-IDE-tp4837299p4837304.html Sent from the Squeak - Dev mailing list archive at Nabble.com. From Das.Linux at gmx.de Tue Jul 14 07:02:29 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Tue Jul 14 07:02:33 2015 Subject: [squeak-dev] name puzzle: how to name a message In-Reply-To: References: <8DECD321-65C8-4CF0-B734-3492664D188B@freudenbergs.de> Message-ID: On 08.07.2015, at 15:19, Tobias Pape wrote: > Hi all > > > thanks for your feedback, and to calm Chris C. and Eliot, I don't > intend to add yet another convenience message? just because. > If there had been immediate consensus, probably. I just found it > stunning that quite a few people at my lab had to think hard to > a) explain the problem and b) suggest a name :). This came just to my mind: 5 toBias: 4 ? I show myself out -T From eliot.miranda at gmail.com Wed Jul 15 00:42:35 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed Jul 15 00:42:38 2015 Subject: [squeak-dev] the Warning changes Message-ID: Hi All, has anyone else noticed that now the Notifier doesn't contain a stack trace, only a copy of the title, the message text of the exception? Isn't this a regression from the recent Warning changes? Can we please have the stack trace back in cases other than Warning? I'm playing with events in the VM simulator which are breaking the UI, and its difficult to debug without a stack trace to show me where I've botched things up. -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150714/08af9b54/attachment.htm From eliot.miranda at gmail.com Wed Jul 15 00:58:20 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed Jul 15 00:58:22 2015 Subject: [squeak-dev] Re: the Warning changes In-Reply-To: References: Message-ID: Hi All, yes, Chris, the change to Debugger>>openNotifierContents:label:, cmm 7/2/2015 11:18, borks the stack trace. i.e. this spec := self buildNotifierWith: builder label: label message: msg. became spec := self buildNotifierWith: builder label: label message: (msg ifNil: [label]). which means no stack trace ever. I think it needs to be something like spec := self buildNotifierWith: builder label: label message: (msg ifNil: [(label beginsWith: 'Warning:') ifTrue: [label]]). Is this serious enough to go for another release candidate? IMO it is, but I'd like to canvas opinions. On Tue, Jul 14, 2015 at 5:42 PM, Eliot Miranda wrote: > Hi All, > > has anyone else noticed that now the Notifier doesn't contain a stack > trace, only a copy of the title, the message text of the exception? Isn't > this a regression from the recent Warning changes? Can we please have the > stack trace back in cases other than Warning? I'm playing with events in > the VM simulator which are breaking the UI, and its difficult to debug > without a stack trace to show me where I've botched things up. > -- > best, > Eliot > -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150714/88622002/attachment.htm From lewis at mail.msen.com Wed Jul 15 01:28:44 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Wed Jul 15 01:28:46 2015 Subject: [squeak-dev] Re: the Warning changes In-Reply-To: References: Message-ID: <20150715012844.GA97721@shell.msen.com> On Tue, Jul 14, 2015 at 05:58:20PM -0700, Eliot Miranda wrote: > > On Tue, Jul 14, 2015 at 5:42 PM, Eliot Miranda wrote: > > > > has anyone else noticed that now the Notifier doesn't contain a stack > > trace, only a copy of the title, the message text of the exception? Isn't > > this a regression from the recent Warning changes? Can we please have the > > stack trace back in cases other than Warning? I'm playing with events in > > the VM simulator which are breaking the UI, and its difficult to debug > > without a stack trace to show me where I've botched things up. > > > yes, Chris, the change to Debugger>>openNotifierContents:label:, cmm > 7/2/2015 11:18, borks the stack trace. i.e. this > > spec := self buildNotifierWith: builder label: label message: msg. > > became > > spec := self buildNotifierWith: builder label: label message: (msg ifNil: > [label]). > > which means no stack trace ever. I think it needs to be something like > > spec := self buildNotifierWith: builder label: label message: (msg ifNil: > [(label beginsWith: 'Warning:') ifTrue: [label]]). > > Is this serious enough to go for another release candidate? IMO it is, but > I'd like to canvas opinions. Yes I have noticed it, and yes I would like to see it fixed. No, it is not serious enough to require another release candidate. There is (or will be) a 4.6 update stream available to manage updates like this. The 4.6 release is almost done. Let's make it so. Dave From asqueaker at gmail.com Wed Jul 15 02:25:45 2015 From: asqueaker at gmail.com (Chris Muller) Date: Wed Jul 15 02:25:50 2015 Subject: [squeak-dev] Re: the Warning changes In-Reply-To: <20150715012844.GA97721@shell.msen.com> References: <20150715012844.GA97721@shell.msen.com> Message-ID: Hi Eliot, yes, I am missing the mini-stack too, the plan was is to fix it after the release. Tim and I had a brief talk about it the other day. http://lists.squeakfoundation.org/pipermail/squeak-dev/2015-July/185153.html I think your suggestion to check for the prefix string "Warning" could be a quick and easy fix, and I almost did that exact same thing (instead of cmm 7/2/2015 11:18), but after briefly exploring the API between ToolSet and Debugger and seeing that there are already configuration hints being passed, and so may be potential opportunities for improvement there (i.e., passing the signaling Exception so it can decide the debugger config). Something like that, too much for this release. On Tue, Jul 14, 2015 at 8:28 PM, David T. Lewis wrote: > On Tue, Jul 14, 2015 at 05:58:20PM -0700, Eliot Miranda wrote: >> >> On Tue, Jul 14, 2015 at 5:42 PM, Eliot Miranda wrote: >> > >> > has anyone else noticed that now the Notifier doesn't contain a stack >> > trace, only a copy of the title, the message text of the exception? Isn't >> > this a regression from the recent Warning changes? Can we please have the >> > stack trace back in cases other than Warning? I'm playing with events in >> > the VM simulator which are breaking the UI, and its difficult to debug >> > without a stack trace to show me where I've botched things up. >> >> >> yes, Chris, the change to Debugger>>openNotifierContents:label:, cmm >> 7/2/2015 11:18, borks the stack trace. i.e. this >> >> spec := self buildNotifierWith: builder label: label message: msg. >> >> became >> >> spec := self buildNotifierWith: builder label: label message: (msg ifNil: >> [label]). >> >> which means no stack trace ever. I think it needs to be something like >> >> spec := self buildNotifierWith: builder label: label message: (msg ifNil: >> [(label beginsWith: 'Warning:') ifTrue: [label]]). >> >> Is this serious enough to go for another release candidate? IMO it is, but >> I'd like to canvas opinions. > > Yes I have noticed it, and yes I would like to see it fixed. > > No, it is not serious enough to require another release candidate. There is > (or will be) a 4.6 update stream available to manage updates like this. > > The 4.6 release is almost done. Let's make it so. > > Dave > > From Marcel.Taeumel at hpi.de Wed Jul 15 05:28:34 2015 From: Marcel.Taeumel at hpi.de (marcel.taeumel) Date: Wed Jul 15 05:28:42 2015 Subject: [squeak-dev] Re: the Warning changes In-Reply-To: References: <20150715012844.GA97721@shell.msen.com> Message-ID: <1436938114707-4837524.post@n4.nabble.com> It's not only the mini-stack but it was my way of getting a real debugger: just click on any list item. :-) We can defer it to the update stream like David suggested. Best, Marcel -- View this message in context: http://forum.world.st/the-Warning-changes-tp4837519p4837524.html Sent from the Squeak - Dev mailing list archive at Nabble.com. From asqueaker at gmail.com Wed Jul 15 15:08:03 2015 From: asqueaker at gmail.com (Chris Muller) Date: Wed Jul 15 15:08:07 2015 Subject: [squeak-dev] Re: the Warning changes In-Reply-To: <1436938114707-4837524.post@n4.nabble.com> References: <20150715012844.GA97721@shell.msen.com> <1436938114707-4837524.post@n4.nabble.com> Message-ID: Since we have the "Debug" button, it was much more important not to lose application-formatted messages in the pre-debugger. You know, I thought we had a preference which would skip the pre-debug notifier window and go straight into the debugger, but I guess we don't. Sounds like something some developer-actors may wish to have.. On Wed, Jul 15, 2015 at 12:28 AM, marcel.taeumel wrote: > It's not only the mini-stack but it was my way of getting a real debugger: > just click on any list item. :-) We can defer it to the update stream like > David suggested. > > Best, > Marcel > > > > -- > View this message in context: http://forum.world.st/the-Warning-changes-tp4837519p4837524.html > Sent from the Squeak - Dev mailing list archive at Nabble.com. > From ma.chris.m at gmail.com Wed Jul 15 16:17:34 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Wed Jul 15 16:17:41 2015 Subject: [squeak-dev] cogspurlinuxht under daemontools In-Reply-To: <62E3AA0A-1491-4DD5-A1CC-3D0B637594BB@gmail.com> References: <62E3AA0A-1491-4DD5-A1CC-3D0B637594BB@gmail.com> Message-ID: On Sat, Jul 11, 2015 at 4:30 PM, Eliot Miranda wrote: > Hi Chris, > > I really know very little about this. I don't understand the mechanism. But I'm told that the limits file takes effect on login. i.e. if the file is created while a user is logged in it won't take effect for that user until that user logs out and logs back in again and only applies to those sessions that logged in once the file had been created. I /dont/ know whether su sets up a new session. i should try that experiment. > > So perhaps you could have daemon tools run login or su to create a new session and see if the ht version can be run by daemontools in that session. Presumably daemons launched at boot aren't in the right state. (What an absurdity they've invented here). Good suggestion to try, unfortunately it didn't work. I tried logging in as root to see if it would "initialize" that account to have those permissions, then logging out and starting the daemon. Same error. For the sake of progress, I've switched to using the ITHB vm. From eliot.miranda at gmail.com Wed Jul 15 16:38:50 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed Jul 15 16:38:56 2015 Subject: [squeak-dev] cogspurlinuxht under daemontools In-Reply-To: References: <62E3AA0A-1491-4DD5-A1CC-3D0B637594BB@gmail.com> Message-ID: Hi Chris, On Wed, Jul 15, 2015 at 9:17 AM, Chris Muller wrote: > On Sat, Jul 11, 2015 at 4:30 PM, Eliot Miranda > wrote: > > Hi Chris, > > > > I really know very little about this. I don't understand the > mechanism. But I'm told that the limits file takes effect on login. i.e. > if the file is created while a user is logged in it won't take effect for > that user until that user logs out and logs back in again and only applies > to those sessions that logged in once the file had been created. I /dont/ > know whether su sets up a new session. i should try that experiment. > > > > So perhaps you could have daemon tools run login or su to create a new > session and see if the ht version can be run by daemontools in that > session. Presumably daemons launched at boot aren't in the right state. > (What an absurdity they've invented here). > > Good suggestion to try, unfortunately it didn't work. I tried logging > in as root to see if it would "initialize" that account to have those > permissions, then logging out and starting the daemon. Same error. > See http://superuser.com/questions/454465/make-ulimits-work-with-start-stop-daemon. Apparently "At this time, you can't. limits.conf(5) is the configuration for pam_limits(8), which is activated by the PAM stack according to the configuration in /etc/pam.d. However, start-stop-daemon(8) as launched from an init.d script doesn't pass through the PAM stack, so those kinds of settings are never applied. Debian bug #302079 contains a patch to enable setting limits from start-stop-daemon(8), but the bug has been open since 2005 and the patch hasn't been merged yet. While not ideal, AFAIK the recommended way to accomplish this right now is to add a ulimitcall in your init.d script." Looks like this is settable via ulimit -r; From man ulimit(1) (actually from bash (1)) -r The maximum real-time scheduling priority Of course this may not work: ulimit -r 3 $ -bash: ulimit: real-time priority: cannot modify limit: Operation not permitted But it's worth a try. For the sake of progress, I've switched to using the ITHB vm. > -- best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150715/3345cbf7/attachment-0001.htm From leves at elte.hu Thu Jul 16 18:39:41 2015 From: leves at elte.hu (Levente Uzonyi) Date: Thu Jul 16 18:39:44 2015 Subject: [squeak-dev] cogspurlinuxht under daemontools In-Reply-To: References: <62E3AA0A-1491-4DD5-A1CC-3D0B637594BB@gmail.com> Message-ID: This should work, because the daemontools start script is executed by root. I assume that it's enough to the highest priority to 2, so the following should work: ulimit -r 2 exec setuidgid ... Levente On Wed, 15 Jul 2015, Eliot Miranda wrote: > Hi Chris, > On Wed, Jul 15, 2015 at 9:17 AM, Chris Muller wrote: > On Sat, Jul 11, 2015 at 4:30 PM, Eliot Miranda wrote: > > Hi Chris, > > > >? ? ?I really know very little about this.? I don't understand the mechanism.? But I'm told that the limits file takes effect on login.? i.e. if the file is created while a user is logged in it > won't take effect for that user until that user logs out and logs back in again and only applies to those sessions that logged in once the file had been created.? I /dont/ know whether su sets up > a new session.? i should try that experiment. > > > > So perhaps you could have daemon tools run login or su to create a new session and see if the ht version can be run by daemontools in that session.? Presumably daemons launched at boot aren't in > the right state.? (What an absurdity they've invented here). > > Good suggestion to try, unfortunately it didn't work.? I tried logging > in as root to see if it would "initialize" that account to have those > permissions, then logging out and starting the daemon.? Same error. > > > See http://superuser.com/questions/454465/make-ulimits-work-with-start-stop-daemon.? Apparently > > "At this time, you can't.?limits.conf(5)?is the configuration for?pam_limits(8), which is activated by the PAM stack according to the configuration in?/etc/pam.d. However,?start-stop-daemon(8)?as launched > from an init.d script doesn't pass through the PAM stack, so those kinds of settings are never applied. > > Debian bug?#302079?contains a patch to enable setting limits from?start-stop-daemon(8), but the bug has been open since 2005 and the patch hasn't been merged yet. > > While not ideal, AFAIK the recommended way to accomplish this right now is to add a?ulimitcall in your init.d script." > > Looks like this is settable via ulimit -r; From man ulimit(1) (actually from bash (1)) > ? ? ? ? ? ? ? -r ? ? The maximum real-time scheduling priority > > Of course this may not work: > > ulimit -r 3$? > -bash: ulimit: real-time priority: cannot modify limit: Operation not permitted > > But it's worth a try. > > For the sake of progress, I've switched to using the ITHB vm. > > > -- > best,Eliot > > From ma.chris.m at gmail.com Thu Jul 16 18:40:04 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Thu Jul 16 18:40:08 2015 Subject: [squeak-dev] 4.6 All-in-One updated Message-ID: Craig updated the Mac VM inside the All-in-One and signed it. I've uploaded and I just noticed the package was several MB smaller than the 4.5. This is accounted for by the lack of several plugin bundles that were included in the 4.5 All-in-One, but not in this latest one. Is this okay? Some of the missing include CurlPlugin, FT2, IA32ABI, Kedama, Locale, mpeg3, ObjectiveC, printJob, Quicktime, Rome, SerialExtendedUnix, Services, Spelling and TestOSA. The updated one from Craig is the one with today's date ("All-In-One"). I was about to rename this over the "All-in-One" but, just in case one more rebuild + sign might be needed (i.e., to include the above plugins), I'll hold-off to make sure. - Chris From eliot.miranda at gmail.com Thu Jul 16 18:52:05 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu Jul 16 18:52:09 2015 Subject: [squeak-dev] cogspurlinuxht under daemontools In-Reply-To: References: <62E3AA0A-1491-4DD5-A1CC-3D0B637594BB@gmail.com> Message-ID: Chris, can you confirm? If it does, I'll add it to the relevant readmes. On Thu, Jul 16, 2015 at 11:39 AM, Levente Uzonyi wrote: > This should work, because the daemontools start script is executed by > root. I assume that it's enough to the highest priority to 2, so the > following should work: > > ulimit -r 2 > exec setuidgid ... > > Levente > > On Wed, 15 Jul 2015, Eliot Miranda wrote: > > Hi Chris, >> On Wed, Jul 15, 2015 at 9:17 AM, Chris Muller >> wrote: >> On Sat, Jul 11, 2015 at 4:30 PM, Eliot Miranda < >> eliot.miranda@gmail.com> wrote: >> > Hi Chris, >> > >> > I really know very little about this. I don't understand the >> mechanism. But I'm told that the limits file takes effect on login. i.e. >> if the file is created while a user is logged in it >> won't take effect for that user until that user logs out and logs >> back in again and only applies to those sessions that logged in once the >> file had been created. I /dont/ know whether su sets up >> a new session. i should try that experiment. >> > >> > So perhaps you could have daemon tools run login or su to create >> a new session and see if the ht version can be run by daemontools in that >> session. Presumably daemons launched at boot aren't in >> the right state. (What an absurdity they've invented here). >> >> Good suggestion to try, unfortunately it didn't work. I tried >> logging >> in as root to see if it would "initialize" that account to have >> those >> permissions, then logging out and starting the daemon. Same error. >> >> >> See >> http://superuser.com/questions/454465/make-ulimits-work-with-start-stop-daemon. >> Apparently >> >> "At this time, you can't. limits.conf(5) is the configuration >> for pam_limits(8), which is activated by the PAM stack according to the >> configuration in /etc/pam.d. However, start-stop-daemon(8) as launched >> from an init.d script doesn't pass through the PAM stack, so those kinds >> of settings are never applied. >> >> Debian bug #302079 contains a patch to enable setting limits >> from start-stop-daemon(8), but the bug has been open since 2005 and the >> patch hasn't been merged yet. >> >> While not ideal, AFAIK the recommended way to accomplish this right now >> is to add a ulimitcall in your init.d script." >> >> Looks like this is settable via ulimit -r; From man ulimit(1) (actually >> from bash (1)) >> -r The maximum real-time scheduling priority >> >> Of course this may not work: >> >> ulimit -r 3$ >> -bash: ulimit: real-time priority: cannot modify limit: Operation not >> permitted >> >> But it's worth a try. >> >> For the sake of progress, I've switched to using the ITHB vm. >> >> >> -- >> best,Eliot >> >> -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150716/69c1285f/attachment.htm From Das.Linux at gmx.de Thu Jul 16 19:07:15 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Thu Jul 16 19:07:19 2015 Subject: [squeak-dev] 4.6 All-in-One updated In-Reply-To: References: Message-ID: <2B6AF98B-8509-49C1-BE77-8CED6CB39DF2@gmx.de> I'd suggest to include the plugins. Best -Tobias On 16.07.2015, at 20:40, Chris Muller wrote: > Craig updated the Mac VM inside the All-in-One and signed it. I've > uploaded and I just noticed the package was several MB smaller than > the 4.5. This is accounted for by the lack of several plugin bundles > that were included in the 4.5 All-in-One, but not in this latest one. > Is this okay? Some of the missing include CurlPlugin, FT2, IA32ABI, > Kedama, Locale, mpeg3, ObjectiveC, printJob, Quicktime, Rome, > SerialExtendedUnix, Services, Spelling and TestOSA. > > The updated one from Craig is the one with today's date > ("All-In-One"). I was about to rename this over the "All-in-One" but, > just in case one more rebuild + sign might be needed (i.e., to include > the above plugins), I'll hold-off to make sure. > > - Chris From ma.chris.m at gmail.com Thu Jul 16 19:15:54 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Thu Jul 16 19:15:57 2015 Subject: [squeak-dev] how to get your app into the default catalog list of the best Squeak ever Message-ID: New SqueakMap Categories have been created for 4.6 and 5.0. If you have applications which are (still) compatible with 4.6 and 5.0, it only takes a few minutes to update your SqueakMap entries so they'll appear by default in the Catalog of these new releases. Some guidance on how to do this is here: http://wiki.squeak.org/squeak/6181 From asqueaker at gmail.com Thu Jul 16 19:52:33 2015 From: asqueaker at gmail.com (Chris Muller) Date: Thu Jul 16 19:52:39 2015 Subject: [squeak-dev] cogspurlinuxht under daemontools In-Reply-To: References: <62E3AA0A-1491-4DD5-A1CC-3D0B637594BB@gmail.com> Message-ID: It says: @4000000055a8092e00454854 ./run: 7: ulimit: Illegal option -r I'm using Ubuntu 14.04LTS 64-bit server edition. It has no man page for ulimit but my own Ubuntu 12.04 on my laptop does. It said args to that are UL_GETFSIZE and UL_SETFSIZE. So I tried adding ulimit UL_SETFSIZE 2 before my exec but it said: @4000000055a80a732330e364 ./run: 7: ulimit: too many arguments This is not a huge deal since the ITHB vm works, I just thought you might have already succeeded with HT and "knew the trick" to it.. On Thu, Jul 16, 2015 at 1:39 PM, Levente Uzonyi wrote: > This should work, because the daemontools start script is executed by root. > I assume that it's enough to the highest priority to 2, so the following > should work: > > ulimit -r 2 > exec setuidgid ... > > Levente > > > On Wed, 15 Jul 2015, Eliot Miranda wrote: > >> Hi Chris, >> On Wed, Jul 15, 2015 at 9:17 AM, Chris Muller >> wrote: >> On Sat, Jul 11, 2015 at 4:30 PM, Eliot Miranda >> wrote: >> > Hi Chris, >> > >> > I really know very little about this. I don't understand the >> mechanism. But I'm told that the limits file takes effect on login. i.e. >> if the file is created while a user is logged in it >> won't take effect for that user until that user logs out and logs >> back in again and only applies to those sessions that logged in once the >> file had been created. I /dont/ know whether su sets up >> a new session. i should try that experiment. >> > >> > So perhaps you could have daemon tools run login or su to create a >> new session and see if the ht version can be run by daemontools in that >> session. Presumably daemons launched at boot aren't in >> the right state. (What an absurdity they've invented here). >> >> Good suggestion to try, unfortunately it didn't work. I tried >> logging >> in as root to see if it would "initialize" that account to have >> those >> permissions, then logging out and starting the daemon. Same error. >> >> >> See >> http://superuser.com/questions/454465/make-ulimits-work-with-start-stop-daemon. >> Apparently >> >> "At this time, you can't. limits.conf(5) is the configuration for >> pam_limits(8), which is activated by the PAM stack according to the >> configuration in /etc/pam.d. However, start-stop-daemon(8) as launched >> from an init.d script doesn't pass through the PAM stack, so those kinds >> of settings are never applied. >> >> Debian bug #302079 contains a patch to enable setting limits from >> start-stop-daemon(8), but the bug has been open since 2005 and the patch >> hasn't been merged yet. >> >> While not ideal, AFAIK the recommended way to accomplish this right now is >> to add a ulimitcall in your init.d script." >> >> Looks like this is settable via ulimit -r; From man ulimit(1) (actually >> from bash (1)) >> -r The maximum real-time scheduling priority >> >> Of course this may not work: >> >> ulimit -r 3$ >> -bash: ulimit: real-time priority: cannot modify limit: Operation not >> permitted >> >> But it's worth a try. >> >> For the sake of progress, I've switched to using the ITHB vm. >> >> >> -- >> best,Eliot >> > > > From leves at elte.hu Thu Jul 16 20:43:06 2015 From: leves at elte.hu (Levente Uzonyi) Date: Thu Jul 16 20:43:09 2015 Subject: [Box-Admins] Re: [squeak-dev] cogspurlinuxht under daemontools In-Reply-To: References: <62E3AA0A-1491-4DD5-A1CC-3D0B637594BB@gmail.com> Message-ID: The following works on my machine (Ubuntu 14.04): #!/bin/bash cd /path/to/squeak/directory ulimit -r 2 exec setuidgid ./coglinuxht/squeak -vm display-null -vm sound-null squeak.image Note that ulimit requires bash, so using #!/bin/bash is a must. Levente On Thu, 16 Jul 2015, Chris Muller wrote: > It says: > > @4000000055a8092e00454854 ./run: 7: ulimit: Illegal option -r > > I'm using Ubuntu 14.04LTS 64-bit server edition. It has no man page > for ulimit but my own Ubuntu 12.04 on my laptop does. It said args to > that are UL_GETFSIZE and UL_SETFSIZE. So I tried adding > > ulimit UL_SETFSIZE 2 > > before my exec but it said: > > @4000000055a80a732330e364 ./run: 7: ulimit: too many arguments > > This is not a huge deal since the ITHB vm works, I just thought you > might have already succeeded with HT and "knew the trick" to it.. > > On Thu, Jul 16, 2015 at 1:39 PM, Levente Uzonyi wrote: >> This should work, because the daemontools start script is executed by root. >> I assume that it's enough to the highest priority to 2, so the following >> should work: >> >> ulimit -r 2 >> exec setuidgid ... >> >> Levente >> >> >> On Wed, 15 Jul 2015, Eliot Miranda wrote: >> >>> Hi Chris, >>> On Wed, Jul 15, 2015 at 9:17 AM, Chris Muller >>> wrote: >>> On Sat, Jul 11, 2015 at 4:30 PM, Eliot Miranda >>> wrote: >>> > Hi Chris, >>> > >>> > I really know very little about this. I don't understand the >>> mechanism. But I'm told that the limits file takes effect on login. i.e. >>> if the file is created while a user is logged in it >>> won't take effect for that user until that user logs out and logs >>> back in again and only applies to those sessions that logged in once the >>> file had been created. I /dont/ know whether su sets up >>> a new session. i should try that experiment. >>> > >>> > So perhaps you could have daemon tools run login or su to create a >>> new session and see if the ht version can be run by daemontools in that >>> session. Presumably daemons launched at boot aren't in >>> the right state. (What an absurdity they've invented here). >>> >>> Good suggestion to try, unfortunately it didn't work. I tried >>> logging >>> in as root to see if it would "initialize" that account to have >>> those >>> permissions, then logging out and starting the daemon. Same error. >>> >>> >>> See >>> http://superuser.com/questions/454465/make-ulimits-work-with-start-stop-daemon. >>> Apparently >>> >>> "At this time, you can't. limits.conf(5) is the configuration for >>> pam_limits(8), which is activated by the PAM stack according to the >>> configuration in /etc/pam.d. However, start-stop-daemon(8) as launched >>> from an init.d script doesn't pass through the PAM stack, so those kinds >>> of settings are never applied. >>> >>> Debian bug #302079 contains a patch to enable setting limits from >>> start-stop-daemon(8), but the bug has been open since 2005 and the patch >>> hasn't been merged yet. >>> >>> While not ideal, AFAIK the recommended way to accomplish this right now is >>> to add a ulimitcall in your init.d script." >>> >>> Looks like this is settable via ulimit -r; From man ulimit(1) (actually >>> from bash (1)) >>> -r The maximum real-time scheduling priority >>> >>> Of course this may not work: >>> >>> ulimit -r 3$ >>> -bash: ulimit: real-time priority: cannot modify limit: Operation not >>> permitted >>> >>> But it's worth a try. >>> >>> For the sake of progress, I've switched to using the ITHB vm. >>> >>> >>> -- >>> best,Eliot >>> >> >> >> > From ma.chris.m at gmail.com Thu Jul 16 21:32:34 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Thu Jul 16 21:32:38 2015 Subject: [Box-Admins] Re: [squeak-dev] cogspurlinuxht under daemontools In-Reply-To: References: <62E3AA0A-1491-4DD5-A1CC-3D0B637594BB@gmail.com> Message-ID: On Thu, Jul 16, 2015 at 3:43 PM, Levente Uzonyi wrote: > The following works on my machine (Ubuntu 14.04): > > #!/bin/bash > > cd /path/to/squeak/directory > ulimit -r 2 > exec setuidgid ./coglinuxht/squeak -vm display-null -vm sound-null > squeak.image > > Note that ulimit requires bash, so using #!/bin/bash is a must. That got it, thank you!! From eliot.miranda at gmail.com Fri Jul 17 23:31:58 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri Jul 17 23:32:01 2015 Subject: [squeak-dev] Re: [Pharo-dev] Pharo 64bit planned? In-Reply-To: <20150718002223.6336ad0f@Zero.StormByte.org> References: <20150718002223.6336ad0f@Zero.StormByte.org> Message-ID: Hi David, On Fri, Jul 17, 2015 at 3:22 PM, David wrote: > I did not see any progress over the time in making a (stable) release > of pharo in 64 bit flavor. > > For servers, it is a common practice (and also a good one if no 32bit > executables are planned) to completelly disable 32bit support (by not > compiling any library in 32bit, disabling emulation of 32bit in > kernel), and also performance, as under 64bit, 32bit code runs slightly > slower. > > The above make enough reasons to make it interesting to have a 64bit > version of pharo, but... Is it intended/in progress? Or nothing really > at the moment? > 64-bit development of Spur is in progress. There is a somewhat functional 64-bit Squeak Spur image and a functional Linux 64-bit Stack interpreter. Coincidentally I'm currently working on an input event processing bug which only occurs in the real VM. You may know that the next release of Pharo (Pharo 6?) is intended to be a Spur release. Esteban Lorenzano is working on the Pharo Spur bootstrap. I am working in Squeak and my priorities are first, to get the Spur Squeak 64-bit image working fully on the Stack Interpreter and then to work on an x64 JIT VM. I expect that by the time Pharo 6 is ready to release, the 64-bit version will also be ready. Hope this helps. -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150717/b606a1cd/attachment.htm From eliot.miranda at gmail.com Sat Jul 18 00:34:39 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 18 00:34:41 2015 Subject: [squeak-dev] how do we get at the mail archives? Message-ID: Specifically http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/119023.html answers 404. They're supposed to be archives. -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150717/97737a98/attachment.htm From hannes.hirzel at gmail.com Sat Jul 18 01:43:17 2015 From: hannes.hirzel at gmail.com (H. Hirzel) Date: Sat Jul 18 01:43:20 2015 Subject: [squeak-dev] how do we get at the mail archives? In-Reply-To: References: Message-ID: What about this? http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/ On 7/18/15, Eliot Miranda wrote: > Specifically > http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/119023.html > answers 404. They're supposed to be archives. > -- > _,,,^..^,,,_ > best, Eliot > From eliot.miranda at gmail.com Sat Jul 18 02:24:38 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 18 02:24:40 2015 Subject: [squeak-dev] how do we get at the mail archives? In-Reply-To: References: Message-ID: On Fri, Jul 17, 2015 at 6:43 PM, H. Hirzel wrote: > What about this? > > http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/ Thanks, but that's not good enough. To find the message in question I have to trawl through those messages until I find the one with the right id. The above URL I gave you is cited in several places, including a Mantis bug report. The link *must* work for the archives to be useful. Can we not fix up this index again? What happened? Where is the link broken? > > On 7/18/15, Eliot Miranda wrote: > > Specifically > > > http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/119023.html > > answers 404. They're supposed to be archives. > > -- > > _,,,^..^,,,_ > > best, Eliot > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150717/4118808b/attachment.htm From brasspen at gmail.com Sat Jul 18 03:45:38 2015 From: brasspen at gmail.com (Chris Cunnington) Date: Sat Jul 18 03:45:42 2015 Subject: [squeak-dev] how do we get at the mail archives? Message-ID: http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-August/119023.html This may be what you?re looking for. It has the number #119023 in the month subsequent to your link. http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/119023.html Perhaps the reason your link goes nowhere is because it really does just that ? go nowhere. Each email is numbered: so #119022 is before #119023 and followed by #119024. It is possible somebody wrote down the URL wrong. It?s possible (though highly unlikely as every email is a numbered file on disk) that the files were renumbered. At any rate there is no #119023 possible for the month of July 2007 as that month starts with #118020 and ends with #118995 as clicking on any email will demonstrate: http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/date.html FWIW, Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150717/39114927/attachment.htm From pdebruic at gmail.com Sat Jul 18 05:40:39 2015 From: pdebruic at gmail.com (Paul DeBruicker) Date: Sat Jul 18 05:41:08 2015 Subject: [squeak-dev] Re: how do we get at the mail archives? In-Reply-To: References: Message-ID: <1437198039860-4838026.post@n4.nabble.com> They were renumbered somehow. If you click the link Dave Lewis posts in this message: http://lists.squeakfoundation.org/pipermail/vm-dev/2010-January/003813.html you get a 404 error. It should point to http://lists.squeakfoundation.org/pipermail/squeak-dev/2010-January/143652.html It may mean someone deleted some messages from the mbox and reindexed them between when the messages were written and now. Chris Cunnington-4 wrote > http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-August/119023.html > <http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-August/119023.html> > > This may be what you?re looking for. It has the number #119023 in the > month subsequent to your link. > > http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/119023.html > <http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/119023.html> > > Perhaps the reason your link goes nowhere is because it really does just > that ? go nowhere. > > Each email is numbered: so #119022 is before #119023 and followed by > #119024. It is possible somebody wrote down the URL wrong. It?s possible > (though highly unlikely as every email is a numbered file on disk) that > the files were renumbered. At any rate there is no #119023 possible for > the month of July 2007 as that month starts with #118020 and ends with > #118995 as clicking on any email will demonstrate: > > http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/date.html > <http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/date.html> > > FWIW, > Chris -- View this message in context: http://forum.world.st/how-do-we-get-at-the-mail-archives-tp4838025p4838026.html Sent from the Squeak - Dev mailing list archive at Nabble.com. From marcus.denker at inria.fr Sat Jul 18 08:13:44 2015 From: marcus.denker at inria.fr (Marcus Denker) Date: Sat Jul 18 08:13:50 2015 Subject: [squeak-dev] Re: [Pharo-dev] Pharo 64bit planned? In-Reply-To: References: <20150718002223.6336ad0f@Zero.StormByte.org> Message-ID: <04E44593-84DF-458D-BB72-AD44DA1E3289@inria.fr> > On 18 Jul 2015, at 01:31, Eliot Miranda wrote: > > Hi David, > > On Fri, Jul 17, 2015 at 3:22 PM, David > wrote: > I did not see any progress over the time in making a (stable) release > of pharo in 64 bit flavor. > > For servers, it is a common practice (and also a good one if no 32bit > executables are planned) to completelly disable 32bit support (by not > compiling any library in 32bit, disabling emulation of 32bit in > kernel), and also performance, as under 64bit, 32bit code runs slightly > slower. > > The above make enough reasons to make it interesting to have a 64bit > version of pharo, but... Is it intended/in progress? Or nothing really > at the moment? > > 64-bit development of Spur is in progress. There is a somewhat functional 64-bit Squeak Spur image and a functional Linux 64-bit Stack interpreter. Coincidentally I'm currently working on an input event processing bug which only occurs in the real VM. You may know that the next release of Pharo (Pharo 6?) is intended to be a Spur release. The idea is that we will do a Pharo4s in the fall that is just Pharo4+Spur. Pharo5 (next release) in spring 2016 will be based on spur of course, too. This has in addition lots image side improvements? e.g. - new text editor - the MetaLink model for behavioral reflection - breakpoints - First class Variables usable, but not yet used in the image - ?. lots more > Esteban Lorenzano is working on the Pharo Spur bootstrap. I am working in Squeak and my priorities are first, to get the Spur Squeak 64-bit image working fully on the Stack Interpreter and then to work on an x64 JIT VM. I expect that by the time Pharo 6 is ready to release, the 64-bit version will also be ready. > Yes, we might then again do a Pharo5s that is Pharo5+64bit Spur? because Pharo6 will be a HUGE step: It will be based on Bloc, the replacement of Morphic that is now under active development. On top of Bloc there will be a complete, clean, modern set of widgets, a new text model and the next iteration of GT tools based on all that. Marcus -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150718/c669e6ae/attachment.htm From brasspen at gmail.com Sat Jul 18 13:01:08 2015 From: brasspen at gmail.com (Chris Cunnington) Date: Sat Jul 18 13:01:11 2015 Subject: [squeak-dev] Re: how do we get at the mail archives? Message-ID: <3C5AE3F6-3C3D-499E-902B-C1EE5E9DCD49@gmail.com> http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/118834.html http://lists.squeakfoundation.org/pipermail/squeak-dev/2006-August/107429.html Renumbered. Yikes. That?s an unsettling thought. The difference between the your false and true link is #189. I subtracted that from Eliot?s starting place and came up with the the above link. It links to another also provided above. The topic of both is ?image freezing?. FWIW, Chris >They were renumbered somehow. If you click the link Dave Lewis posts in this >message: >http://lists.squeakfoundation.org/pipermail/vm-dev/2010-January/003813.html >you get a 404 error. It should point to >http://lists.squeakfoundation.org/pipermail/squeak-dev/2010-January/143652.html >It may mean someone deleted some messages from the mbox and reindexed them >between when the messages were written and now. Chris Cunnington-4 wrote > http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-August/119023.html > <http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-August/119023.html> > > This may be what you?re looking for. It has the number #119023 in the > month subsequent to your link. > > http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/119023.html > <http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/119023.html> > > Perhaps the reason your link goes nowhere is because it really does just > that ? go nowhere. > > Each email is numbered: so #119022 is before #119023 and followed by > #119024. It is possible somebody wrote down the URL wrong. It?s possible > (though highly unlikely as every email is a numbered file on disk) that > the files were renumbered. At any rate there is no #119023 possible for > the month of July 2007 as that month starts with #118020 and ends with > #118995 as clicking on any email will demonstrate: > > http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/date.html > <http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/date.html> > > FWIW, > Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150718/13e2ee0f/attachment.htm From nicolas.cellier.aka.nice at gmail.com Sat Jul 18 15:56:47 2015 From: nicolas.cellier.aka.nice at gmail.com (Nicolas Cellier) Date: Sat Jul 18 15:56:51 2015 Subject: [squeak-dev] how do we get at the mail archives? In-Reply-To: References: Message-ID: It's most probably a typo because this message number is in august in a different thread... http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-August/119023.html Unless we lost a chunk of history? I presume the issue is http://bugs.squeak.org/view.php?id=6581 and if it's about image freezing problem as suggested by http://news.squeak.org/2006/10/26/image-freezing/, then the head of the thread is http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/118834.html Cheers 2015-07-18 4:24 GMT+02:00 Eliot Miranda : > > > On Fri, Jul 17, 2015 at 6:43 PM, H. Hirzel > wrote: > >> What about this? >> >> http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/ > > > Thanks, but that's not good enough. To find the message in question I > have to trawl through those messages until I find the one with the right > id. The above URL I gave you is cited in several places, including a > Mantis bug report. The link *must* work for the archives to be useful. > Can we not fix up this index again? What happened? Where is the link > broken? > > >> >> On 7/18/15, Eliot Miranda wrote: >> > Specifically >> > >> http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-July/119023.html >> > answers 404. They're supposed to be archives. >> > -- >> > _,,,^..^,,,_ >> > best, Eliot >> > >> >> > > > -- > _,,,^..^,,,_ > best, Eliot > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150718/516717e5/attachment.htm From eliot.miranda at gmail.com Sat Jul 18 17:08:34 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 18 17:08:37 2015 Subject: [squeak-dev] Re: [Pharo-dev] Pharo 64bit planned? In-Reply-To: References: <20150718002223.6336ad0f@Zero.StormByte.org> Message-ID: On Fri, Jul 17, 2015 at 4:31 PM, Eliot Miranda wrote: > Hi David, > > On Fri, Jul 17, 2015 at 3:22 PM, David wrote: > >> I did not see any progress over the time in making a (stable) release >> of pharo in 64 bit flavor. >> >> For servers, it is a common practice (and also a good one if no 32bit >> executables are planned) to completelly disable 32bit support (by not >> compiling any library in 32bit, disabling emulation of 32bit in >> kernel), and also performance, as under 64bit, 32bit code runs slightly >> slower. >> >> The above make enough reasons to make it interesting to have a 64bit >> version of pharo, but... Is it intended/in progress? Or nothing really >> at the moment? >> > > 64-bit development of Spur is in progress. There is a somewhat functional > 64-bit Squeak Spur image and a functional Linux 64-bit Stack > interpreter. Coincidentally I'm currently working on an input event > processing bug which only occurs in the real VM. You may know that the > next release of Pharo (Pharo 6?) is intended to be a Spur release. Esteban > Lorenzano is working on the Pharo Spur bootstrap. I am working in Squeak > and my priorities are first, to get the Spur Squeak 64-bit image working > fully on the Stack Interpreter and then to work on an x64 JIT VM. I expect > that by the time Pharo 6 is ready to release, the 64-bit version will also > be ready. > and I've understood and fixed the event processing bug (which was nothing to do with 64-bits) so I can say that the Squeak Spur 64-bit Linux StackInterpreter is functional (again). Hope this helps. > -- > _,,,^..^,,,_ > best, Eliot > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150718/c9a8134d/attachment-0001.htm From commits at source.squeak.org Sat Jul 18 17:24:45 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sat Jul 18 17:24:47 2015 Subject: [squeak-dev] The Trunk: Morphic-eem.994.mcz Message-ID: Eliot Miranda uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-eem.994.mcz ==================== Summary ==================== Name: Morphic-eem.994 Author: eem Time: 18 July 2015, 10:22:51.401 am UUID: bd1bf232-933d-4017-95d5-974200758bb6 Ancestors: Morphic-cmm.993 Fix a serious bug with interCyclePause:. On the first invocation, lastCycleTime may be far in the future (since it will be whatever it was when the image is saved), hence Time millisecondsSince: lastCycleTime can be large and negative, hence milliSecs - (Time millisecondsSince: lastCycleTime) can be large and positive, which can result in a delay of many minutes in the first invocation. This was causing the unresponsivness of the 64-bit Spur image on start-up. The fix is simple; if lastCycleTime iks in the future it should be reset. Change HandMorph>>handleEvent: to only update EventStats if it is non-nil, and change the package prologue to nil it. Nothing reads EventStats, so it is taking cycles for no purpose. This isn;t an issue until the count of mouse move events rolls over into large positive integers, at which point there's real overhead. There's a comment in the method to allow one to "install" EventStats if and when one does want to collect such stats. But IMO this shouldn't be enabled by default. Waste not, want not. =============== Diff against Morphic-cmm.993 =============== Item was changed: ----- Method: HandMorph>>handleEvent: (in category 'events-processing') ----- handleEvent: anEvent | evt ofs | owner ifNil:[^self]. evt := anEvent. + "EventStats ifNil:[EventStats := IdentityDictionary new] ifNotNil: [EventStats := nil]." + EventStats ifNotNil: + [EventStats + at: #TypicalStack ifAbsentPut: [thisContext copyStack]; + at: #count put: (EventStats at: #count ifAbsent:[0]) + 1; + at: evt type put: (EventStats at: evt type ifAbsent:[0]) + 1]. - EventStats ifNil:[EventStats := IdentityDictionary new]. - EventStats at: #count put: (EventStats at: #count ifAbsent:[0]) + 1. - EventStats at: evt type put: (EventStats at: evt type ifAbsent:[0]) + 1. evt isMouseOver ifTrue:[^self sendMouseEvent: evt]. ShowEvents == true ifTrue:[ Display fill: (0@0 extent: 250@120) rule: Form over fillColor: Color white. ofs := (owner hands indexOf: self) - 1 * 60. evt printString displayAt: (0@ofs) + (evt isKeyboard ifTrue:[0@30] ifFalse:[0@0]). self keyboardFocus printString displayAt: (0@ofs)+(0@45). ]. "Notify listeners" self sendListenEvent: evt to: self eventListeners. evt isWindowEvent ifTrue: [ self sendEvent: evt focus: nil. ^self mouseOverHandler processMouseOver: lastMouseEvent]. evt isKeyboard ifTrue:[ self sendListenEvent: evt to: self keyboardListeners. self sendKeyboardEvent: evt. ^self mouseOverHandler processMouseOver: lastMouseEvent]. evt isDropEvent ifTrue:[ self sendEvent: evt focus: nil. ^self mouseOverHandler processMouseOver: lastMouseEvent]. evt isMouse ifTrue:[ self sendListenEvent: evt to: self mouseListeners. lastMouseEvent := evt]. "Check for pending drag or double click operations." mouseClickState ifNotNil:[ (mouseClickState handleEvent: evt from: self) ifFalse:[ "Possibly dispatched #click: or something and will not re-establish otherwise" ^self mouseOverHandler processMouseOver: lastMouseEvent]]. evt isMove ifTrue:[ self position: evt position. self sendMouseEvent: evt. ] ifFalse:[ "Issue a synthetic move event if we're not at the position of the event" (evt position = self position) ifFalse:[self moveToEvent: evt]. "Drop submorphs on button events" (self hasSubmorphs) ifTrue:[self dropMorphs: evt] ifFalse:[self sendMouseEvent: evt]. ]. ShowEvents == true ifTrue:[self mouseFocus printString displayAt: (0@ofs) + (0@15)]. self mouseOverHandler processMouseOver: lastMouseEvent. "self handleDragOutside: anEvent." ! Item was changed: ----- Method: WorldState>>interCyclePause: (in category 'update cycle') ----- interCyclePause: milliSecs + "Delay enough that the previous cycle plus the amount of delay will equal milliSecs. If the cycle is + already expensive, then no delay occurs. However, if the system is idly waiting for interaction from + the user, the method will delay for a proportionally long time and cause the overall CPU usage of + Squeak to be low. If the preference #serverMode is enabled, always do a complete delay of 50ms, + independant of my argument. This prevents the freezing problem described in Mantis #6581" - "delay enough that the previous cycle plus the amount of delay will equal milliSecs. If the cycle is already expensive, then no delay occurs. However, if the system is idly waiting for interaction from the user, the method will delay for a proportionally long time and cause the overall CPU usage of Squeak to be low. - If the preference #serverMode is enabled, always do a complete delay of 50ms, independant of my argument. This prevents the freezing problem described in Mantis #6581" + | now millisecondsToWait | + now := Time millisecondClockValue. + "Be careful not to be misled by the first invocation after start-up. + lastCycleTime may be a left-over. On clock wraparound, this will + result in a delya-less cycle, which should not be a problem." + (lastCycleTime notNil and: [lastCycleTime > now]) ifTrue: + [lastCycleTime := nil]. - | millisecondsToWait | millisecondsToWait := Preferences serverMode ifTrue: [ 50 ] + ifFalse: "e.g. CanSurrenderToOS is falsified by mouse move events in the SketchEditor for maximal responsiveness." + [ (lastCycleTime isNil or: [ CanSurrenderToOS == false ]) - ifFalse: [ - (lastCycleTime isNil or: [ CanSurrenderToOS == false ]) ifTrue: [ 0 ] + ifFalse: [ milliSecs - (now - lastCycleTime) ] ]. + millisecondsToWait > 0 ifTrue: + [ (interCycleDelay isNil or: [ interCycleDelay beingWaitedOn ]) - ifFalse: [ milliSecs - (Time millisecondsSince: lastCycleTime) ] ]. - millisecondsToWait > 0 ifTrue: [ - (interCycleDelay isNil or: [ interCycleDelay beingWaitedOn ]) ifTrue: [ interCycleDelay := Delay forMilliseconds: millisecondsToWait ] ifFalse: [ interCycleDelay delayDuration: millisecondsToWait ]. interCycleDelay wait ]. + lastCycleTime := now. + CanSurrenderToOS := true! - lastCycleTime := Time millisecondClockValue. - CanSurrenderToOS := true.! Item was changed: (PackageInfo named: 'Morphic') postscript: '"Initialize the key bindings and menus" Editor initialize. "apply the new icons" MenuIcons initializeIcons. TheWorldMainDockingBar updateInstances. "Fix missing inset of old-style windows." SystemWindow allSubInstancesDo: [:ea | (ea paneMorphs detect: [:m | m layoutFrame leftFraction = 0] ifNone: []) ifNotNil: [:m | m layoutFrame leftOffset > 0 ifTrue: [ea layoutInset: 0]]]. "Remove non-functional tools from world menu." LanguageEditor unload. UUniverseBrowser unload. + UUniverseEditor unload. + + "Nuke the dubious EventStats dictionary" + HandMorph classPool at: #EventStats put: nil.'! - UUniverseEditor unload.'! From asqueaker at gmail.com Sat Jul 18 17:31:26 2015 From: asqueaker at gmail.com (Chris Muller) Date: Sat Jul 18 17:31:31 2015 Subject: [squeak-dev] The Trunk: Morphic-eem.994.mcz In-Reply-To: <55aa8be2.8ac98c0a.9cb7.ffffe9afSMTPIN_ADDED_MISSING@mx.google.com> References: <55aa8be2.8ac98c0a.9cb7.ffffe9afSMTPIN_ADDED_MISSING@mx.google.com> Message-ID: Does this only affect the 64-bit image? If so, we should move this to Inbox until we finish the release. On Sat, Jul 18, 2015 at 12:24 PM, wrote: > Eliot Miranda uploaded a new version of Morphic to project The Trunk: > http://source.squeak.org/trunk/Morphic-eem.994.mcz > > ==================== Summary ==================== > > Name: Morphic-eem.994 > Author: eem > Time: 18 July 2015, 10:22:51.401 am > UUID: bd1bf232-933d-4017-95d5-974200758bb6 > Ancestors: Morphic-cmm.993 > > Fix a serious bug with interCyclePause:. On the first invocation, lastCycleTime may be far in the future (since it will be whatever it was when the image is saved), hence Time millisecondsSince: lastCycleTime can be large and negative, hence milliSecs - (Time millisecondsSince: lastCycleTime) can be large and positive, which can result in a delay of many minutes in the first invocation. This was causing the unresponsivness of the 64-bit Spur image on start-up. The fix is simple; if lastCycleTime iks in the future it should be reset. > > Change HandMorph>>handleEvent: to only update EventStats if it is non-nil, and change the package prologue to nil it. Nothing reads EventStats, so it is taking cycles for no purpose. This isn;t an issue until the count of mouse move events rolls over into large positive integers, at which point there's real overhead. There's a comment in the method to allow one to "install" EventStats if and when one does want to collect such stats. But IMO this shouldn't be enabled by default. Waste not, want not. > > =============== Diff against Morphic-cmm.993 =============== > > Item was changed: > ----- Method: HandMorph>>handleEvent: (in category 'events-processing') ----- > handleEvent: anEvent > | evt ofs | > owner ifNil:[^self]. > evt := anEvent. > > + "EventStats ifNil:[EventStats := IdentityDictionary new] ifNotNil: [EventStats := nil]." > + EventStats ifNotNil: > + [EventStats > + at: #TypicalStack ifAbsentPut: [thisContext copyStack]; > + at: #count put: (EventStats at: #count ifAbsent:[0]) + 1; > + at: evt type put: (EventStats at: evt type ifAbsent:[0]) + 1]. > - EventStats ifNil:[EventStats := IdentityDictionary new]. > - EventStats at: #count put: (EventStats at: #count ifAbsent:[0]) + 1. > - EventStats at: evt type put: (EventStats at: evt type ifAbsent:[0]) + 1. > > evt isMouseOver ifTrue:[^self sendMouseEvent: evt]. > > ShowEvents == true ifTrue:[ > Display fill: (0@0 extent: 250@120) rule: Form over fillColor: Color white. > ofs := (owner hands indexOf: self) - 1 * 60. > evt printString displayAt: (0@ofs) + (evt isKeyboard ifTrue:[0@30] ifFalse:[0@0]). > self keyboardFocus printString displayAt: (0@ofs)+(0@45). > ]. > "Notify listeners" > self sendListenEvent: evt to: self eventListeners. > > evt isWindowEvent ifTrue: [ > self sendEvent: evt focus: nil. > ^self mouseOverHandler processMouseOver: lastMouseEvent]. > > evt isKeyboard ifTrue:[ > self sendListenEvent: evt to: self keyboardListeners. > self sendKeyboardEvent: evt. > ^self mouseOverHandler processMouseOver: lastMouseEvent]. > > evt isDropEvent ifTrue:[ > self sendEvent: evt focus: nil. > ^self mouseOverHandler processMouseOver: lastMouseEvent]. > > evt isMouse ifTrue:[ > self sendListenEvent: evt to: self mouseListeners. > lastMouseEvent := evt]. > > "Check for pending drag or double click operations." > mouseClickState ifNotNil:[ > (mouseClickState handleEvent: evt from: self) ifFalse:[ > "Possibly dispatched #click: or something and will not re-establish otherwise" > ^self mouseOverHandler processMouseOver: lastMouseEvent]]. > > evt isMove ifTrue:[ > self position: evt position. > self sendMouseEvent: evt. > ] ifFalse:[ > "Issue a synthetic move event if we're not at the position of the event" > (evt position = self position) ifFalse:[self moveToEvent: evt]. > "Drop submorphs on button events" > (self hasSubmorphs) > ifTrue:[self dropMorphs: evt] > ifFalse:[self sendMouseEvent: evt]. > ]. > ShowEvents == true ifTrue:[self mouseFocus printString displayAt: (0@ofs) + (0@15)]. > self mouseOverHandler processMouseOver: lastMouseEvent. > "self handleDragOutside: anEvent." > ! > > Item was changed: > ----- Method: WorldState>>interCyclePause: (in category 'update cycle') ----- > interCyclePause: milliSecs > + "Delay enough that the previous cycle plus the amount of delay will equal milliSecs. If the cycle is > + already expensive, then no delay occurs. However, if the system is idly waiting for interaction from > + the user, the method will delay for a proportionally long time and cause the overall CPU usage of > + Squeak to be low. If the preference #serverMode is enabled, always do a complete delay of 50ms, > + independant of my argument. This prevents the freezing problem described in Mantis #6581" > - "delay enough that the previous cycle plus the amount of delay will equal milliSecs. If the cycle is already expensive, then no delay occurs. However, if the system is idly waiting for interaction from the user, the method will delay for a proportionally long time and cause the overall CPU usage of Squeak to be low. > - If the preference #serverMode is enabled, always do a complete delay of 50ms, independant of my argument. This prevents the freezing problem described in Mantis #6581" > > + | now millisecondsToWait | > + now := Time millisecondClockValue. > + "Be careful not to be misled by the first invocation after start-up. > + lastCycleTime may be a left-over. On clock wraparound, this will > + result in a delya-less cycle, which should not be a problem." > + (lastCycleTime notNil and: [lastCycleTime > now]) ifTrue: > + [lastCycleTime := nil]. > - | millisecondsToWait | > millisecondsToWait := Preferences serverMode > ifTrue: [ 50 ] > + ifFalse: "e.g. CanSurrenderToOS is falsified by mouse move events in the SketchEditor for maximal responsiveness." > + [ (lastCycleTime isNil or: [ CanSurrenderToOS == false ]) > - ifFalse: [ > - (lastCycleTime isNil or: [ CanSurrenderToOS == false ]) > ifTrue: [ 0 ] > + ifFalse: [ milliSecs - (now - lastCycleTime) ] ]. > + millisecondsToWait > 0 ifTrue: > + [ (interCycleDelay isNil or: [ interCycleDelay beingWaitedOn ]) > - ifFalse: [ milliSecs - (Time millisecondsSince: lastCycleTime) ] ]. > - millisecondsToWait > 0 ifTrue: [ > - (interCycleDelay isNil or: [ interCycleDelay beingWaitedOn ]) > ifTrue: [ interCycleDelay := Delay forMilliseconds: millisecondsToWait ] > ifFalse: [ interCycleDelay delayDuration: millisecondsToWait ]. > interCycleDelay wait ]. > + lastCycleTime := now. > + CanSurrenderToOS := true! > - lastCycleTime := Time millisecondClockValue. > - CanSurrenderToOS := true.! > > Item was changed: > (PackageInfo named: 'Morphic') postscript: '"Initialize the key bindings and menus" > Editor initialize. > > "apply the new icons" > MenuIcons initializeIcons. > TheWorldMainDockingBar updateInstances. > > "Fix missing inset of old-style windows." > SystemWindow allSubInstancesDo: [:ea | > (ea paneMorphs detect: [:m | m layoutFrame leftFraction = 0] ifNone: []) > ifNotNil: [:m | m layoutFrame leftOffset > 0 > ifTrue: [ea layoutInset: 0]]]. > > "Remove non-functional tools from world menu." > LanguageEditor unload. > UUniverseBrowser unload. > + UUniverseEditor unload. > + > + "Nuke the dubious EventStats dictionary" > + HandMorph classPool at: #EventStats put: nil.'! > - UUniverseEditor unload.'! > > From eliot.miranda at gmail.com Sat Jul 18 17:37:54 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 18 17:37:57 2015 Subject: [squeak-dev] The Trunk: Morphic-eem.994.mcz In-Reply-To: References: <55aa8be2.8ac98c0a.9cb7.ffffe9afSMTPIN_ADDED_MISSING@mx.google.com> Message-ID: Hi Chris, On Sat, Jul 18, 2015 at 10:31 AM, Chris Muller wrote: > Does this only affect the 64-bit image? If so, we should move this to > Inbox until we finish the release. > OK. Go ahead. In fact, I may just have mis-diagnosed the bug. I'll take another look. But feel free to move it to inbox. > > On Sat, Jul 18, 2015 at 12:24 PM, wrote: > > Eliot Miranda uploaded a new version of Morphic to project The Trunk: > > http://source.squeak.org/trunk/Morphic-eem.994.mcz > > > > ==================== Summary ==================== > > > > Name: Morphic-eem.994 > > Author: eem > > Time: 18 July 2015, 10:22:51.401 am > > UUID: bd1bf232-933d-4017-95d5-974200758bb6 > > Ancestors: Morphic-cmm.993 > > > > Fix a serious bug with interCyclePause:. On the first invocation, > lastCycleTime may be far in the future (since it will be whatever it was > when the image is saved), hence Time millisecondsSince: lastCycleTime can > be large and negative, hence milliSecs - (Time millisecondsSince: > lastCycleTime) can be large and positive, which can result in a delay of > many minutes in the first invocation. This was causing the unresponsivness > of the 64-bit Spur image on start-up. The fix is simple; if lastCycleTime > iks in the future it should be reset. > > > > Change HandMorph>>handleEvent: to only update EventStats if it is > non-nil, and change the package prologue to nil it. Nothing reads > EventStats, so it is taking cycles for no purpose. This isn;t an issue > until the count of mouse move events rolls over into large positive > integers, at which point there's real overhead. There's a comment in the > method to allow one to "install" EventStats if and when one does want to > collect such stats. But IMO this shouldn't be enabled by default. Waste > not, want not. > > > > =============== Diff against Morphic-cmm.993 =============== > > > > Item was changed: > > ----- Method: HandMorph>>handleEvent: (in category > 'events-processing') ----- > > handleEvent: anEvent > > | evt ofs | > > owner ifNil:[^self]. > > evt := anEvent. > > > > + "EventStats ifNil:[EventStats := IdentityDictionary new] > ifNotNil: [EventStats := nil]." > > + EventStats ifNotNil: > > + [EventStats > > + at: #TypicalStack ifAbsentPut: [thisContext > copyStack]; > > + at: #count put: (EventStats at: #count > ifAbsent:[0]) + 1; > > + at: evt type put: (EventStats at: evt type > ifAbsent:[0]) + 1]. > > - EventStats ifNil:[EventStats := IdentityDictionary new]. > > - EventStats at: #count put: (EventStats at: #count ifAbsent:[0]) > + 1. > > - EventStats at: evt type put: (EventStats at: evt type > ifAbsent:[0]) + 1. > > > > evt isMouseOver ifTrue:[^self sendMouseEvent: evt]. > > > > ShowEvents == true ifTrue:[ > > Display fill: (0@0 extent: 250@120) rule: Form over fillColor: > Color white. > > ofs := (owner hands indexOf: self) - 1 * 60. > > evt printString displayAt: (0@ofs) + (evt isKeyboard > ifTrue:[0@30] ifFalse:[0@0]). > > self keyboardFocus printString displayAt: (0@ofs)+(0@45). > > ]. > > "Notify listeners" > > self sendListenEvent: evt to: self eventListeners. > > > > evt isWindowEvent ifTrue: [ > > self sendEvent: evt focus: nil. > > ^self mouseOverHandler processMouseOver: lastMouseEvent]. > > > > evt isKeyboard ifTrue:[ > > self sendListenEvent: evt to: self keyboardListeners. > > self sendKeyboardEvent: evt. > > ^self mouseOverHandler processMouseOver: lastMouseEvent]. > > > > evt isDropEvent ifTrue:[ > > self sendEvent: evt focus: nil. > > ^self mouseOverHandler processMouseOver: lastMouseEvent]. > > > > evt isMouse ifTrue:[ > > self sendListenEvent: evt to: self mouseListeners. > > lastMouseEvent := evt]. > > > > "Check for pending drag or double click operations." > > mouseClickState ifNotNil:[ > > (mouseClickState handleEvent: evt from: self) ifFalse:[ > > "Possibly dispatched #click: or something and > will not re-establish otherwise" > > ^self mouseOverHandler processMouseOver: > lastMouseEvent]]. > > > > evt isMove ifTrue:[ > > self position: evt position. > > self sendMouseEvent: evt. > > ] ifFalse:[ > > "Issue a synthetic move event if we're not at the > position of the event" > > (evt position = self position) ifFalse:[self > moveToEvent: evt]. > > "Drop submorphs on button events" > > (self hasSubmorphs) > > ifTrue:[self dropMorphs: evt] > > ifFalse:[self sendMouseEvent: evt]. > > ]. > > ShowEvents == true ifTrue:[self mouseFocus printString > displayAt: (0@ofs) + (0@15)]. > > self mouseOverHandler processMouseOver: lastMouseEvent. > > "self handleDragOutside: anEvent." > > ! > > > > Item was changed: > > ----- Method: WorldState>>interCyclePause: (in category 'update > cycle') ----- > > interCyclePause: milliSecs > > + "Delay enough that the previous cycle plus the amount of delay > will equal milliSecs. If the cycle is > > + already expensive, then no delay occurs. However, if the > system is idly waiting for interaction from > > + the user, the method will delay for a proportionally long time > and cause the overall CPU usage of > > + Squeak to be low. If the preference #serverMode is enabled, > always do a complete delay of 50ms, > > + independant of my argument. This prevents the freezing problem > described in Mantis #6581" > > - "delay enough that the previous cycle plus the amount of delay > will equal milliSecs. If the cycle is already expensive, then no delay > occurs. However, if the system is idly waiting for interaction from the > user, the method will delay for a proportionally long time and cause the > overall CPU usage of Squeak to be low. > > - If the preference #serverMode is enabled, always do a complete > delay of 50ms, independant of my argument. This prevents the freezing > problem described in Mantis #6581" > > > > + | now millisecondsToWait | > > + now := Time millisecondClockValue. > > + "Be careful not to be misled by the first invocation after > start-up. > > + lastCycleTime may be a left-over. On clock wraparound, this > will > > + result in a delya-less cycle, which should not be a problem." > > + (lastCycleTime notNil and: [lastCycleTime > now]) ifTrue: > > + [lastCycleTime := nil]. > > - | millisecondsToWait | > > millisecondsToWait := Preferences serverMode > > ifTrue: [ 50 ] > > + ifFalse: "e.g. CanSurrenderToOS is falsified by mouse > move events in the SketchEditor for maximal responsiveness." > > + [ (lastCycleTime isNil or: [ CanSurrenderToOS == > false ]) > > - ifFalse: [ > > - (lastCycleTime isNil or: [ CanSurrenderToOS == > false ]) > > ifTrue: [ 0 ] > > + ifFalse: [ milliSecs - (now - > lastCycleTime) ] ]. > > + millisecondsToWait > 0 ifTrue: > > + [ (interCycleDelay isNil or: [ interCycleDelay > beingWaitedOn ]) > > - ifFalse: [ milliSecs - (Time > millisecondsSince: lastCycleTime) ] ]. > > - millisecondsToWait > 0 ifTrue: [ > > - (interCycleDelay isNil or: [ interCycleDelay > beingWaitedOn ]) > > ifTrue: [ interCycleDelay := Delay > forMilliseconds: millisecondsToWait ] > > ifFalse: [ interCycleDelay delayDuration: > millisecondsToWait ]. > > interCycleDelay wait ]. > > + lastCycleTime := now. > > + CanSurrenderToOS := true! > > - lastCycleTime := Time millisecondClockValue. > > - CanSurrenderToOS := true.! > > > > Item was changed: > > (PackageInfo named: 'Morphic') postscript: '"Initialize the key > bindings and menus" > > Editor initialize. > > > > "apply the new icons" > > MenuIcons initializeIcons. > > TheWorldMainDockingBar updateInstances. > > > > "Fix missing inset of old-style windows." > > SystemWindow allSubInstancesDo: [:ea | > > (ea paneMorphs detect: [:m | m layoutFrame leftFraction = 0] > ifNone: []) > > ifNotNil: [:m | m layoutFrame leftOffset > 0 > > ifTrue: [ea layoutInset: 0]]]. > > > > "Remove non-functional tools from world menu." > > LanguageEditor unload. > > UUniverseBrowser unload. > > + UUniverseEditor unload. > > + > > + "Nuke the dubious EventStats dictionary" > > + HandMorph classPool at: #EventStats put: nil.'! > > - UUniverseEditor unload.'! > > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150718/6f741cbc/attachment.htm From eliot.miranda at gmail.com Sat Jul 18 19:06:12 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 18 19:06:19 2015 Subject: [squeak-dev] The Trunk: Morphic-eem.994.mcz In-Reply-To: References: <55aa8be2.8ac98c0a.9cb7.ffffe9afSMTPIN_ADDED_MISSING@mx.google.com> Message-ID: Hi Chris, thank you. You've stopped me driving a baaaad bug underground. In fact it looks like a bootstrap bug. In normal images (Time classPool at: #MillisecondClockMask) = 16r1FFFFFFF but in the 64-bit Spur image (Time classPool at: #MillisecondClockMask) = -1 Eek :-). So please disregard Morphic-eem.994. There is /some/ goodness in that version, but at least the method commentary is wrong. On Sat, Jul 18, 2015 at 10:31 AM, Chris Muller wrote: > Does this only affect the 64-bit image? If so, we should move this to > Inbox until we finish the release. > > On Sat, Jul 18, 2015 at 12:24 PM, wrote: > > Eliot Miranda uploaded a new version of Morphic to project The Trunk: > > http://source.squeak.org/trunk/Morphic-eem.994.mcz > > > > ==================== Summary ==================== > > > > Name: Morphic-eem.994 > > Author: eem > > Time: 18 July 2015, 10:22:51.401 am > > UUID: bd1bf232-933d-4017-95d5-974200758bb6 > > Ancestors: Morphic-cmm.993 > > > > Fix a serious bug with interCyclePause:. On the first invocation, > lastCycleTime may be far in the future (since it will be whatever it was > when the image is saved), hence Time millisecondsSince: lastCycleTime can > be large and negative, hence milliSecs - (Time millisecondsSince: > lastCycleTime) can be large and positive, which can result in a delay of > many minutes in the first invocation. This was causing the unresponsivness > of the 64-bit Spur image on start-up. The fix is simple; if lastCycleTime > iks in the future it should be reset. > > > > Change HandMorph>>handleEvent: to only update EventStats if it is > non-nil, and change the package prologue to nil it. Nothing reads > EventStats, so it is taking cycles for no purpose. This isn;t an issue > until the count of mouse move events rolls over into large positive > integers, at which point there's real overhead. There's a comment in the > method to allow one to "install" EventStats if and when one does want to > collect such stats. But IMO this shouldn't be enabled by default. Waste > not, want not. > > > > =============== Diff against Morphic-cmm.993 =============== > > > > Item was changed: > > ----- Method: HandMorph>>handleEvent: (in category > 'events-processing') ----- > > handleEvent: anEvent > > | evt ofs | > > owner ifNil:[^self]. > > evt := anEvent. > > > > + "EventStats ifNil:[EventStats := IdentityDictionary new] > ifNotNil: [EventStats := nil]." > > + EventStats ifNotNil: > > + [EventStats > > + at: #TypicalStack ifAbsentPut: [thisContext > copyStack]; > > + at: #count put: (EventStats at: #count > ifAbsent:[0]) + 1; > > + at: evt type put: (EventStats at: evt type > ifAbsent:[0]) + 1]. > > - EventStats ifNil:[EventStats := IdentityDictionary new]. > > - EventStats at: #count put: (EventStats at: #count ifAbsent:[0]) > + 1. > > - EventStats at: evt type put: (EventStats at: evt type > ifAbsent:[0]) + 1. > > > > evt isMouseOver ifTrue:[^self sendMouseEvent: evt]. > > > > ShowEvents == true ifTrue:[ > > Display fill: (0@0 extent: 250@120) rule: Form over fillColor: > Color white. > > ofs := (owner hands indexOf: self) - 1 * 60. > > evt printString displayAt: (0@ofs) + (evt isKeyboard > ifTrue:[0@30] ifFalse:[0@0]). > > self keyboardFocus printString displayAt: (0@ofs)+(0@45). > > ]. > > "Notify listeners" > > self sendListenEvent: evt to: self eventListeners. > > > > evt isWindowEvent ifTrue: [ > > self sendEvent: evt focus: nil. > > ^self mouseOverHandler processMouseOver: lastMouseEvent]. > > > > evt isKeyboard ifTrue:[ > > self sendListenEvent: evt to: self keyboardListeners. > > self sendKeyboardEvent: evt. > > ^self mouseOverHandler processMouseOver: lastMouseEvent]. > > > > evt isDropEvent ifTrue:[ > > self sendEvent: evt focus: nil. > > ^self mouseOverHandler processMouseOver: lastMouseEvent]. > > > > evt isMouse ifTrue:[ > > self sendListenEvent: evt to: self mouseListeners. > > lastMouseEvent := evt]. > > > > "Check for pending drag or double click operations." > > mouseClickState ifNotNil:[ > > (mouseClickState handleEvent: evt from: self) ifFalse:[ > > "Possibly dispatched #click: or something and > will not re-establish otherwise" > > ^self mouseOverHandler processMouseOver: > lastMouseEvent]]. > > > > evt isMove ifTrue:[ > > self position: evt position. > > self sendMouseEvent: evt. > > ] ifFalse:[ > > "Issue a synthetic move event if we're not at the > position of the event" > > (evt position = self position) ifFalse:[self > moveToEvent: evt]. > > "Drop submorphs on button events" > > (self hasSubmorphs) > > ifTrue:[self dropMorphs: evt] > > ifFalse:[self sendMouseEvent: evt]. > > ]. > > ShowEvents == true ifTrue:[self mouseFocus printString > displayAt: (0@ofs) + (0@15)]. > > self mouseOverHandler processMouseOver: lastMouseEvent. > > "self handleDragOutside: anEvent." > > ! > > > > Item was changed: > > ----- Method: WorldState>>interCyclePause: (in category 'update > cycle') ----- > > interCyclePause: milliSecs > > + "Delay enough that the previous cycle plus the amount of delay > will equal milliSecs. If the cycle is > > + already expensive, then no delay occurs. However, if the > system is idly waiting for interaction from > > + the user, the method will delay for a proportionally long time > and cause the overall CPU usage of > > + Squeak to be low. If the preference #serverMode is enabled, > always do a complete delay of 50ms, > > + independant of my argument. This prevents the freezing problem > described in Mantis #6581" > > - "delay enough that the previous cycle plus the amount of delay > will equal milliSecs. If the cycle is already expensive, then no delay > occurs. However, if the system is idly waiting for interaction from the > user, the method will delay for a proportionally long time and cause the > overall CPU usage of Squeak to be low. > > - If the preference #serverMode is enabled, always do a complete > delay of 50ms, independant of my argument. This prevents the freezing > problem described in Mantis #6581" > > > > + | now millisecondsToWait | > > + now := Time millisecondClockValue. > > + "Be careful not to be misled by the first invocation after > start-up. > > + lastCycleTime may be a left-over. On clock wraparound, this > will > > + result in a delya-less cycle, which should not be a problem." > > + (lastCycleTime notNil and: [lastCycleTime > now]) ifTrue: > > + [lastCycleTime := nil]. > > - | millisecondsToWait | > > millisecondsToWait := Preferences serverMode > > ifTrue: [ 50 ] > > + ifFalse: "e.g. CanSurrenderToOS is falsified by mouse > move events in the SketchEditor for maximal responsiveness." > > + [ (lastCycleTime isNil or: [ CanSurrenderToOS == > false ]) > > - ifFalse: [ > > - (lastCycleTime isNil or: [ CanSurrenderToOS == > false ]) > > ifTrue: [ 0 ] > > + ifFalse: [ milliSecs - (now - > lastCycleTime) ] ]. > > + millisecondsToWait > 0 ifTrue: > > + [ (interCycleDelay isNil or: [ interCycleDelay > beingWaitedOn ]) > > - ifFalse: [ milliSecs - (Time > millisecondsSince: lastCycleTime) ] ]. > > - millisecondsToWait > 0 ifTrue: [ > > - (interCycleDelay isNil or: [ interCycleDelay > beingWaitedOn ]) > > ifTrue: [ interCycleDelay := Delay > forMilliseconds: millisecondsToWait ] > > ifFalse: [ interCycleDelay delayDuration: > millisecondsToWait ]. > > interCycleDelay wait ]. > > + lastCycleTime := now. > > + CanSurrenderToOS := true! > > - lastCycleTime := Time millisecondClockValue. > > - CanSurrenderToOS := true.! > > > > Item was changed: > > (PackageInfo named: 'Morphic') postscript: '"Initialize the key > bindings and menus" > > Editor initialize. > > > > "apply the new icons" > > MenuIcons initializeIcons. > > TheWorldMainDockingBar updateInstances. > > > > "Fix missing inset of old-style windows." > > SystemWindow allSubInstancesDo: [:ea | > > (ea paneMorphs detect: [:m | m layoutFrame leftFraction = 0] > ifNone: []) > > ifNotNil: [:m | m layoutFrame leftOffset > 0 > > ifTrue: [ea layoutInset: 0]]]. > > > > "Remove non-functional tools from world menu." > > LanguageEditor unload. > > UUniverseBrowser unload. > > + UUniverseEditor unload. > > + > > + "Nuke the dubious EventStats dictionary" > > + HandMorph classPool at: #EventStats put: nil.'! > > - UUniverseEditor unload.'! > > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150718/4aca8230/attachment.htm From ma.chris.m at gmail.com Sat Jul 18 20:59:53 2015 From: ma.chris.m at gmail.com (Chris Muller) Date: Sat Jul 18 20:59:57 2015 Subject: [squeak-dev] final Squeak-4.6-All-in-One posted Message-ID: There was 1 vote for including the legacy Mac plugins and 0 against. So Craig and I made one last All-in-One and its uploaded. So, I think can we call 4.6 "done" then? From eliot.miranda at gmail.com Sat Jul 18 21:06:18 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat Jul 18 21:06:22 2015 Subject: [squeak-dev] final Squeak-4.6-All-in-One posted In-Reply-To: References: Message-ID: On Sat, Jul 18, 2015 at 1:59 PM, Chris Muller wrote: > There was 1 vote for including the legacy Mac plugins and 0 against. > So Craig and I made one last All-in-One and its uploaded. > > So, I think can we call 4.6 "done" then? > Do we have any volunteers to do some shake down tests? dare we do some shake down tests? SHould we instead release and handle problems as users find them? Chris, have you run your test suite using the 4.6 yet? -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150718/79c932b4/attachment.htm From commits at source.squeak.org Sat Jul 18 21:55:03 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sat Jul 18 21:55:05 2015 Subject: [squeak-dev] Daily Commit Log Message-ID: <20150718215503.7421.qmail@box4.squeakfoundation.org> Changes to Trunk (http://source.squeak.org/trunk.html) in the last 24 hours: http://lists.squeakfoundation.org/pipermail/packages/2015-July/008827.html Name: Morphic-eem.994 Ancestors: Morphic-cmm.993 Fix a serious bug with interCyclePause:. On the first invocation, lastCycleTime may be far in the future (since it will be whatever it was when the image is saved), hence Time millisecondsSince: lastCycleTime can be large and negative, hence milliSecs - (Time millisecondsSince: lastCycleTime) can be large and positive, which can result in a delay of many minutes in the first invocation. This was causing the unresponsivness of the 64-bit Spur image on start-up. The fix is simple; if lastCycleTime iks in the future it should be reset. Change HandMorph>>handleEvent: to only update EventStats if it is non-nil, and change the package prologue to nil it. Nothing reads EventStats, so it is taking cycles for no purpose. This isn;t an issue until the count of mouse move events rolls over into large positive integers, at which point there's real overhead. There's a comment in the method to allow one to "install" EventStats if and when one does want to collect such stats. But IMO this shouldn't be enabled by default. Waste not, want not. ============================================= From eliot.miranda at gmail.com Sun Jul 19 05:26:56 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sun Jul 19 05:26:59 2015 Subject: [squeak-dev] New Cog VMs available Message-ID: ... at http://www.mirandabanda.org/files/Cog/VM/VM.r3410 Note that there's a functional 64-bit Spur Linux StackInterpreter included with these VMs and a 64-bit image to test at http://mirandabanda.org/files/Cog/SpurImages. CogVM binaries as per VMMaker.oscog-eem.1427/r3410 General: Implement a machine code perform:[with:]* primitive. Eliminate the duplication of SimpleStackBasedCogit/StackToRegisterMappingCogit>>compileOpenPIC:numArgs: now that we have dead code elimination enabled. Change the type of the event buffer from int[8] to long[8], along with the matching event typedefs in sq.h (fixes 64-bit SPur issues). Add a fence before reading checkSignalRequests and useTideA in doSignalExternalSemaphores. ARM Include the Alien support in the Squeak ARM VMs now that it works to a fair extent in Newspeak. ARM Cogits: Use __aeabit_idivmod to implement machine code div/mod primitives on ARM. 64-bit Spur Fix at least one set of 64-bit issues caused by Slang. In particular the integerObjectOf: code resulted in (objectMemory integerObjectOf: MillisecondClockMask) evaluating to the -1 object, instead of the 16r1FFFFFFF object, which was the cause of the initially nresponsive 64-bit image on the real VM. Newspeak: Compile Newspeak self and super sends as clean sends as well. Slower in monomorphic case but net win for the larger benchmarks, presumably because it avoids I-cache flushes in the polymorphic case. Also means implementing polymorphic caches for clean sends will benefit all non-ordinary sends. DeltaBlue +8.2% Splay +7.6% ParserCombinators +4.7% Richards +0.5% SlotRead (replaced with self send) -17.6% Spill ReceiverResultReg before runtime call to fix pushEnclosingObject on ARM. (ReceiverResultReg is edx/caller-saved on IA32 but r7/callee-saved on ARM.) Fix some primitiveFail[For:] calls in potential mirror primitives that did not return after falure, and could hence continue to do damage after detecting a failure condition. Fix the 64-bit Newspeak builds' plugins.ext Integrate Ryan's code for ARM call-out and callback support in the Alien plugin. Implement the relevant implicitReceiveCacheAt: for the ARM Cogits. ThreadedFFIPlugin: Allow ffiCreateIntegralResultOop:ofAtomicType:in: to be inlined. Reduce the number of tests leading to the common case of an integral return in ffiCalloutTo:SpecOnStack:in: etc. Refactor the remapOop:in: idiom up into InterpreterPlugin and use it in the ThreadedFFIPlugin. Hence avoid unnecessary push/popRemappableOop calls. -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150718/3fc3005f/attachment.htm From lists at fniephaus.com Sun Jul 19 08:56:44 2015 From: lists at fniephaus.com (Fabio Niephaus) Date: Sun Jul 19 08:56:59 2015 Subject: [squeak-dev] final Squeak-4.6-All-in-One posted In-Reply-To: References: Message-ID: + 1 for releasing 4.6 and handling problems as users find them :) But there's one problem that I just found: try and run the following and you should get a SqueakSSL error (-5): (WebClient new httpGet: ' https://api.travis-ci.org/repos/squeak-smalltalk/squeak.org/builds') content Looks like we forgot to update the SqueakSSL plugins with the ones from [1]? After doing that manually, the above works just fine... Regards, Fabio [1] https://github.com/itsmeront/squeakssl/releases -- On Sat, Jul 18, 2015 at 11:06 PM Eliot Miranda wrote: > On Sat, Jul 18, 2015 at 1:59 PM, Chris Muller > wrote: > >> There was 1 vote for including the legacy Mac plugins and 0 against. >> So Craig and I made one last All-in-One and its uploaded. >> >> So, I think can we call 4.6 "done" then? >> > > Do we have any volunteers to do some shake down tests? dare we do some > shake down tests? SHould we instead release and handle problems as users > find them? Chris, have you run your test suite using the 4.6 yet? > > -- > _,,,^..^,,,_ > best, Eliot > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150719/8932c9ef/attachment.htm From asqueaker at gmail.com Sun Jul 19 16:34:29 2015 From: asqueaker at gmail.com (Chris Muller) Date: Sun Jul 19 16:34:35 2015 Subject: [squeak-dev] final Squeak-4.6-All-in-One posted In-Reply-To: References: Message-ID: Thanks Fabio, say, which platform did you test on? Hm, something interesting -- that new SqueakSSL (for Linux) is 7 MB where the one I have been using is only 27K, which easily makes it the largest plugin and would slightly inflate teh size of the All-In-One. Why is it so much bigger, is it compiled with debug information or something? On Sun, Jul 19, 2015 at 3:56 AM, Fabio Niephaus wrote: > + 1 for releasing 4.6 and handling problems as users find them :) > > But there's one problem that I just found: try and run the following and you > should get a SqueakSSL error (-5): > > (WebClient new httpGet: > 'https://api.travis-ci.org/repos/squeak-smalltalk/squeak.org/builds') > content > > Looks like we forgot to update the SqueakSSL plugins with the ones from [1]? > After doing that manually, the above works just fine... > > Regards, > Fabio > > [1] https://github.com/itsmeront/squeakssl/releases > > -- > > On Sat, Jul 18, 2015 at 11:06 PM Eliot Miranda > wrote: >> >> On Sat, Jul 18, 2015 at 1:59 PM, Chris Muller >> wrote: >>> >>> There was 1 vote for including the legacy Mac plugins and 0 against. >>> So Craig and I made one last All-in-One and its uploaded. >>> >>> So, I think can we call 4.6 "done" then? >> >> >> Do we have any volunteers to do some shake down tests? dare we do some >> shake down tests? SHould we instead release and handle problems as users >> find them? Chris, have you run your test suite using the 4.6 yet? >> >> -- >> _,,,^..^,,,_ >> best, Eliot > > > > From Das.Linux at gmx.de Sun Jul 19 16:48:28 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Sun Jul 19 16:48:34 2015 Subject: [squeak-dev] final Squeak-4.6-All-in-One posted In-Reply-To: References: Message-ID: On 19.07.2015, at 18:34, Chris Muller wrote: > Thanks Fabio, say, which platform did you test on? Hm, something > interesting -- that new SqueakSSL (for Linux) is 7 MB where the one I > have been using is only 27K, which easily makes it the largest plugin > and would slightly inflate teh size of the All-In-One. > > Why is it so much bigger, is it compiled with debug information or something? No, I statically linked against LibreSSL. Best regards -Tobias > > > > On Sun, Jul 19, 2015 at 3:56 AM, Fabio Niephaus wrote: >> + 1 for releasing 4.6 and handling problems as users find them :) >> >> But there's one problem that I just found: try and run the following and you >> should get a SqueakSSL error (-5): >> >> (WebClient new httpGet: >> 'https://api.travis-ci.org/repos/squeak-smalltalk/squeak.org/builds') >> content >> >> Looks like we forgot to update the SqueakSSL plugins with the ones from [1]? >> After doing that manually, the above works just fine... >> >> Regards, >> Fabio >> >> [1] https://github.com/itsmeront/squeakssl/releases >> >> -- >> >> On Sat, Jul 18, 2015 at 11:06 PM Eliot Miranda >> wrote: >>> >>> On Sat, Jul 18, 2015 at 1:59 PM, Chris Muller >>> wrote: >>>> >>>> There was 1 vote for including the legacy Mac plugins and 0 against. >>>> So Craig and I made one last All-in-One and its uploaded. >>>> >>>> So, I think can we call 4.6 "done" then? >>> >>> >>> Do we have any volunteers to do some shake down tests? dare we do some >>> shake down tests? SHould we instead release and handle problems as users >>> find them? Chris, have you run your test suite using the 4.6 yet? >>> >>> -- >>> _,,,^..^,,,_ >>> best, Eliot From commits at source.squeak.org Sun Jul 19 18:17:37 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sun Jul 19 18:17:39 2015 Subject: [squeak-dev] The Trunk: Collections-cmm.639.mcz Message-ID: Chris Muller uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections-cmm.639.mcz ==================== Summary ==================== Name: Collections-cmm.639 Author: cmm Time: 19 July 2015, 1:16:45.217 pm UUID: 09c450e3-5490-437a-9799-9444bef22954 Ancestors: Collections-topa.638 Squeak 5.0 release, Spur bootstrap changes to transition to Spur object model and core system. =============== Diff against Collections-topa.638 =============== Item was changed: ----- Method: Array>>elementsExchangeIdentityWith: (in category 'converting') ----- elementsExchangeIdentityWith: otherArray + "This primitive performs a bulk mutation, causing all pointers to the elements of the + receiver to be replaced by pointers to the corresponding elements of otherArray. + At the same time, all pointers to the elements of otherArray are replaced by + pointers to the corresponding elements of this array. The identityHashes remain + with the pointers rather than with the objects so that objects in hashed structures + should still be properly indexed after the mutation." - "This primitive performs a bulk mutation, causing all pointers to the elements of this array to be replaced by pointers to the corresponding elements of otherArray. At the same time, all pointers to the elements of otherArray are replaced by pointers to the corresponding elements of this array. The identityHashes remain with the pointers rather than with the objects so that objects in hashed structures should still be properly indexed after the mutation." + + ec == #'bad receiver' ifTrue: + [^self error: 'receiver must be of class Array']. + ec == #'bad argument' ifTrue: + [^self error: (otherArray class == Array + ifTrue: ['arg must be of class Array'] + ifFalse: ['receiver and argument must have the same size'])]. + ec == #'inappropriate operation' ifTrue: + [^self error: 'can''t become immediates such as SmallIntegers or Characters']. + ec == #'no modification' ifTrue: + [^self error: 'can''t become immutable objects']. + ec == #'object is pinned' ifTrue: + [^self error: 'can''t become pinned objects']. + ec == #'insufficient object memory' ifTrue: + [Smalltalk garbageCollect < 1048576 ifTrue: + [Smalltalk growMemoryByAtLeast: 1048576]. + ^self elementsExchangeIdentityWith: otherArray]. + self primitiveFailed! - - otherArray class == Array ifFalse: [^ self error: 'arg must be array']. - self size = otherArray size ifFalse: [^ self error: 'arrays must be same size']. - (self anySatisfy: [:obj | obj class == SmallInteger]) ifTrue: [^ self error: 'can''t become SmallIntegers']. - (otherArray anySatisfy: [:obj | obj class == SmallInteger]) ifTrue: [^ self error: 'can''t become SmallIntegers']. - self with: otherArray do:[:a :b| a == b ifTrue:[^self error:'can''t become yourself']]. - - "Must have failed because not enough space in forwarding table (see ObjectMemory-prepareForwardingTableForBecoming:with:twoWay:). Do GC and try again only once" - (Smalltalk bytesLeft: true) = Smalltalk primitiveGarbageCollect - ifTrue: [^ self primitiveFailed]. - ^ self elementsExchangeIdentityWith: otherArray! Item was changed: ----- Method: Array>>elementsForwardIdentityTo: (in category 'converting') ----- elementsForwardIdentityTo: otherArray + "This primitive performs a bulk mutation, causing all pointers to the elements of the + receiver to be replaced by pointers to the corresponding elements of otherArray. + The identityHashes remain with the pointers rather than with the objects so that + the objects in this array should still be properly indexed in any existing hashed + structures after the mutation." + - "This primitive performs a bulk mutation, causing all pointers to the elements of this array to be replaced by pointers to the corresponding elements of otherArray. The identityHashes remain with the pointers rather than with the objects so that the objects in this array should still be properly indexed in any existing hashed structures after the mutation." - self primitiveFailed! Item was changed: ----- Method: Array>>elementsForwardIdentityTo:copyHash: (in category 'converting') ----- elementsForwardIdentityTo: otherArray copyHash: copyHash + "This primitive performs a bulk mutation, causing all pointers to the elements of the + receiver to be replaced by pointers to the corresponding elements of otherArray. + If copyHash is true, the identityHashes remain with the pointers rather than with the + objects so that the objects in the receiver should still be properly indexed in any + existing hashed structures after the mutation. If copyHash is false, then the hashes + of the objects in otherArray remain unchanged. If you know what you're doing this + may indeed be what you want." + - "This primitive performs a bulk mutation, causing all pointers to the elements of this array to be replaced by pointers to the corresponding elements of otherArray. The identityHashes remain with the pointers rather than with the objects so that the objects in this array should still be properly indexed in any existing hashed structures after the mutation." - self primitiveFailed! Item was changed: ==== ERROR === Error: Unrecognized class type 19 July 2015 6:17:36.982 pm VM: unix - a SmalltalkImage Image: Squeak3.11alpha [latest update: #8824] SecurityManager state: Restricted: false FileAccess: true SocketAccess: true Working Dir /home/squeaksource Trusted Dir /home/squeaksource/secure Untrusted Dir /home/squeaksource/My Squeak MCClassDefinition(Object)>>error: Receiver: a MCClassDefinition(Character) Arguments and temporary variables: aString: 'Unrecognized class type' Receiver's instance variables: name: #Character superclassName: #Magnitude variables: an OrderedCollection(a MCClassVariableDefinition(AlphaNumericMask) a...etc... category: #'Collections-Strings' type: #immediate comment: 'I represent a character by storing its associated Unicode as an unsig...etc... commentStamp: 'eem 8/12/2014 14:53' traitComposition: nil classTraitComposition: nil MCClassDefinition>>kindOfSubclass Receiver: a MCClassDefinition(Character) Arguments and temporary variables: Receiver's instance variables: name: #Character superclassName: #Magnitude variables: an OrderedCollection(a MCClassVariableDefinition(AlphaNumericMask) a...etc... category: #'Collections-Strings' type: #immediate comment: 'I represent a character by storing its associated Unicode as an unsig...etc... commentStamp: 'eem 8/12/2014 14:53' traitComposition: nil classTraitComposition: nil MCClassDefinition>>printDefinitionOn: Receiver: a MCClassDefinition(Character) Arguments and temporary variables: stream: a WriteStream Receiver's instance variables: name: #Character superclassName: #Magnitude variables: an OrderedCollection(a MCClassVariableDefinition(AlphaNumericMask) a...etc... category: #'Collections-Strings' type: #immediate comment: 'I represent a character by storing its associated Unicode as an unsig...etc... commentStamp: 'eem 8/12/2014 14:53' traitComposition: nil classTraitComposition: nil [] in MCDiffyTextWriter(MCStWriter)>>writeClassDefinition: Receiver: a MCDiffyTextWriter Arguments and temporary variables: definition: a WriteStream s: a MCClassDefinition(Character) Receiver's instance variables: stream: a WriteStream initStream: nil --- The full stack --- MCClassDefinition(Object)>>error: MCClassDefinition>>kindOfSubclass MCClassDefinition>>printDefinitionOn: [] in MCDiffyTextWriter(MCStWriter)>>writeClassDefinition: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - String class(SequenceableCollection class)>>new:streamContents: String class(SequenceableCollection class)>>streamContents: MCDiffyTextWriter(MCTextWriter)>>chunkContents: MCDiffyTextWriter(MCStWriter)>>writeClassDefinition: MCDiffyTextWriter(MCStWriter)>>visitClassDefinition: MCClassDefinition>>accept: [] in MCDiffyTextWriter(MCTextWriter)>>visitInFork: String class(SequenceableCollection class)>>new:streamContents: String class(SequenceableCollection class)>>streamContents: MCDiffyTextWriter(MCTextWriter)>>visitInFork: MCDiffyTextWriter>>writePatchFrom:to: MCDiffyTextWriter>>writeModification: [] in MCDiffyTextWriter>>writePatch: SortedCollection(OrderedCollection)>>do: MCDiffyTextWriter>>writePatch: SSDiffyTextWriter>>writePatch: [] in SSDiffyTextWriter>>writeVersion:for: BlockClosure>>on:do: SSDiffyTextWriter>>writeVersion:for: [] in SSEMailSubscription>>versionAdded:to: BlockClosure>>on:do: SSEMailSubscription>>versionAdded:to: [] in [] in SSProject>>versionAdded: [] in BlockClosure>>newProcess From commits at source.squeak.org Sun Jul 19 18:18:04 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sun Jul 19 18:18:07 2015 Subject: [squeak-dev] The Trunk: Compiler-cmm.305.mcz Message-ID: Chris Muller uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-cmm.305.mcz ==================== Summary ==================== Name: Compiler-cmm.305 Author: cmm Time: 19 July 2015, 1:17:46.629 pm UUID: 732f4143-cf38-4b59-9fac-d1445778b213 Ancestors: Compiler-eem.304 Squeak 5.0 release, Spur bootstrap changes to transition to Spur object model and core system. =============== Diff against Compiler-eem.304 =============== Item was changed: ----- Method: BytecodeEncoder>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method generation') ----- computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex + numArgs > 15 ifTrue: + [^self error: 'Cannot compile -- too many arguments']. + numTemps > 63 ifTrue: + [^self error: 'Cannot compile -- too many temporary variables']. + numLits > 65535 ifTrue: + [^self error: 'Cannot compile -- too many literals']. + ^(CompiledMethod headerFlagForEncoder: self) + + (numArgs bitShift: 24) + + (numTemps bitShift: 18) + "+ (largeBit bitShift: 17)" "largeBit gets filled in later" + + (primitiveIndex > 0 ifTrue: [1 bitShift: 16] ifFalse: [0]) + + numLits! - "Compute the compiled method header that encodes the arguments - in the receiver's header format (see CompiledMehtod's class comment)." - self subclassResponsibility! Item was removed: - ----- Method: EncoderForV3>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method generation') ----- - computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex - | primBits | - numTemps > 63 ifTrue: - [^self error: 'Cannot compile -- too many temporary variables']. - numLits > 255 ifTrue: - [^self error: 'Cannot compile -- too many literals']. - primBits := primitiveIndex <= 16r1FF - ifTrue: [primitiveIndex] - ifFalse: "For now the high bit of primitive no. is in the 29th bit of header" - [primitiveIndex > 16r3FF ifTrue: [self error: 'prim num too large']. - (primitiveIndex bitAnd: 16r1FF) + ((primitiveIndex bitAnd: 16r200) bitShift: 19)]. - ^(numArgs bitShift: 24) - + (numTemps bitShift: 18) - "+ (largeBit bitShift: 17)" "largeBit gets filled in later" - + (numLits bitShift: 9) - + primBits! Item was changed: ----- Method: EncoderForV3PlusClosures class>>bytecodeSize: (in category 'instruction stream support') ----- bytecodeSize: bytecode "Answer the number of bytes in the bytecode." bytecode <= 125 ifTrue: [^1]. bytecode >= 176 ifTrue: [^1]. bytecode >= 160 ifTrue: "long jumps" [^2]. bytecode >= 144 ifTrue: "short jumps" [^1]. "extensions" bytecode >= 128 ifTrue: + [^#(2 2 2 2 3 2 2 1 1 1 2 3 3 3 3 4) at: bytecode - 127]. - [^#(2 2 2 2 3 2 2 1 1 1 2 nil 3 3 3 4) at: bytecode - 127]. ^nil! Item was added: + ----- Method: EncoderForV3PlusClosures class>>callPrimitiveCode (in category 'bytecode decoding') ----- + callPrimitiveCode + "139 11101111 iiiiiiii jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)" + ^139! Item was added: + ----- Method: EncoderForV3PlusClosures>>genCallPrimitive: (in category 'bytecode generation') ----- + genCallPrimitive: primitiveIndex + "139 11101111 iiiiiiii jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)" + (primitiveIndex < 1 or: [primitiveIndex > 65535]) ifTrue: + [self outOfRangeError: 'primitive index' index: primitiveIndex range: 1 to: 65535]. + stream + nextPut: 139; + nextPut: (primitiveIndex bitAnd: 255); + nextPut: (primitiveIndex bitShift: -8)! Item was changed: ----- Method: MethodNode>>generate:using: (in category 'code generation') ----- generate: trailer using: aCompiledMethodClass "The receiver is the root of a parse tree. Answer an instance of aCompiledMethodClass. The argument, trailer, is arbitrary but is typically either the reference to the source code that is stored with every CompiledMethod, or an encoding of the method's temporary names." + | primErrNode blkSize nLits locals literals stack header method | - | primErrNode blkSize nLits literals stack method | self generate: trailer using: aCompiledMethodClass ifQuick: [:m | encoder noteBlockExtent: (0 to: 2) hasLocals: arguments. m literalAt: 2 put: encoder associationForClass; properties: properties. ^m]. primErrNode := self primitiveErrorVariableName ifNotNil: [encoder fixTemp: self primitiveErrorVariableName]. + self ensureClosureAnalysisDone. + encoder rootNode: self. "this is for BlockNode>>sizeCodeForClosureValue:" - encoder supportsClosureOpcodes ifTrue: - [self ensureClosureAnalysisDone. - encoder rootNode: self. "this is for BlockNode>>sizeCodeForClosureValue:"]. blkSize := (block sizeCodeForEvaluatedValue: encoder) + + (primitive > 0 + ifTrue: [encoder sizeCallPrimitive: primitive] + ifFalse: [0]) + (primErrNode ifNil: [0] ifNotNil: [primErrNode index: arguments size + temporaries size; sizeCodeForStore: encoder "The VM relies on storeIntoTemp: (129)"]). + locals := arguments, temporaries, (primErrNode ifNil: [#()] ifNotNil: [{primErrNode}]). + encoder noteBlockExtent: block blockExtent hasLocals: locals. + header := encoder computeMethodHeaderForNumArgs: arguments size + numTemps: locals size + numLits: (nLits := (literals := encoder allLiterals) size) + primitive: primitive. + method := trailer + createMethod: blkSize + class: aCompiledMethodClass + header: header. - method := aCompiledMethodClass - newBytes: blkSize - trailerBytes: trailer - nArgs: arguments size - nTemps: (encoder supportsClosureOpcodes - ifTrue: [| locals | - locals := arguments, - temporaries, - (primErrNode - ifNil: [#()] - ifNotNil: [{primErrNode}]). - encoder - noteBlockExtent: block blockExtent - hasLocals: locals. - locals size] - ifFalse: [encoder maxTemp]) - nStack: 0 - nLits: (nLits := (literals := encoder allLiterals) size) - primitive: primitive. - nLits > 255 ifTrue: - [^self error: 'Too many literals referenced']. 1 to: nLits do: [:lit | method literalAt: lit put: (literals at: lit)]. encoder streamToMethod: method. stack := ParseStack new init. + primitive > 0 ifTrue: + [encoder genCallPrimitive: primitive. + primErrNode ifNotNil: + [primErrNode emitCodeForStore: stack encoder: encoder]]. - primErrNode ifNotNil: [primErrNode emitCodeForStore: stack encoder: encoder]. stack position: method numTemps. [block emitCodeForEvaluatedValue: stack encoder: encoder] on: Error "If an attempt is made to write too much code the method will be asked" do: [:ex| "to grow, and the grow attempt will fail in CompiledMethod class>>#new:" ex signalerContext sender method = (CompiledMethod class>>#new:) ifTrue: [^self error: 'Compiler code size discrepancy'] ifFalse: [ex pass]]. stack position ~= (method numTemps + 1) ifTrue: [^self error: 'Compiler stack discrepancy']. encoder methodStreamPosition ~= (method size - trailer size) ifTrue: [^self error: 'Compiler code size discrepancy']. method needsFrameSize: stack size - method numTemps. method properties: properties. ^method! From commits at source.squeak.org Sun Jul 19 18:20:00 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sun Jul 19 18:20:04 2015 Subject: [squeak-dev] The Trunk: System-cmm.754.mcz Message-ID: Chris Muller uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-cmm.754.mcz ==================== Summary ==================== Name: System-cmm.754 Author: cmm Time: 19 July 2015, 1:19:26.763 pm UUID: 8f6319b1-3618-4258-8bbf-afed22e87937 Ancestors: System-topa.753 Squeak 5.0 release, Spur bootstrap changes to transition to Spur object model and core system. =============== Diff against System-topa.753 =============== Item was removed: - Object subclass: #ObjectHistory - instanceVariableNames: 'marks markProcess' - classVariableNames: 'Current ObjectHistoryEnabled' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! - ObjectHistory holds ObjectHistoryMark objects which are placed in the object memory at regular intervals by its markProcess in the background. Adjacent marks (with no remaining objects inbetween) are coalesced so over time the collection does not grow unnecessarily large. - - Using these markers it is possible to determine the age of objects in memory from the time the ObjectHistory was initialized. Try e.g.: - self oopTimestamp. - self oopAge. - ObjectHistory current oopClassesByDate. - - Instance Variables - marks: SortedCollection of ObjectHistoryMark objects - markProcess: a Process running our markLoop - ! Item was removed: - ----- Method: ObjectHistory class>>current (in category 'accessing') ----- - current - ^ Current ifNil: [Current := self new]! Item was removed: - ----- Method: ObjectHistory class>>initialize (in category 'class initialization') ----- - initialize - self current. - ! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category 'preferences') ----- - keepTrackOfObjectHistory - - ^ ObjectHistoryEnabled ifNil: [ - Current - ifNil: [false] - ifNotNil: [:objectHistory | objectHistory isRunning]]! Item was removed: - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in category 'preferences') ----- - keepTrackOfObjectHistory: aBoolean - " Reflect the desired state by starting/stopping the process if necessary " - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. - ObjectHistoryEnabled := aBoolean. - - Current - ifNil: [aBoolean ifTrue: [self current]] - ifNotNil: [:objectHistory | - (objectHistory isRunning xor: aBoolean) "state switch needed" - ifTrue: [objectHistory toggleRunning]].! Item was removed: - ----- Method: ObjectHistory class>>obsolete (in category 'class initialization') ----- - obsolete - "Kill the mark process before removing the class." - Current ifNotNil: - [:objectHistory| - objectHistory terminate]. - super obsolete! Item was removed: - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- - ageOf: anObject - "Age of anObject in seconds" - | timestamp | - timestamp := self timestampOf: anObject. - timestamp ifNil: [^0]. - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! Item was removed: - ----- Method: ObjectHistory>>initialize (in category 'initializing') ----- - initialize - self restartMarkProcess. - - ! Item was removed: - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- - isRunning - ^ markProcess - ifNil: [false] - ifNotNil: [:process | - process isSuspended not and: [ - process isTerminated not]]! Item was removed: - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- - markLoop - [true] whileTrue: [ - self markUpdate. - (Delay forSeconds: self markRate) wait]! Item was removed: - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- - markRate - "rate of creating ObjectHistoryMarks" - ^60! Item was removed: - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- - markUpdate - "Add a new mark and compact the marks collection" - | mark prev | - "lazy init so this happens in the background process" - marks ifNil: [self reinitMarks]. - "add new mark to object memory" - mark := self newMark. - mark timestamp <= marks last timestamp ifTrue: [^self "could happen if clock is wrong"]. - marks addLast: mark. - "compact the table by removing adjacent marks" - prev := marks first. - marks removeAllSuchThat: [:each | | doDelete | - doDelete := prev objectAfter == each. - prev := each. - doDelete]. - "The loop above is O(n) in number of marks, but that number should never become so large to be an issue. Even if the number was large, this is running at system background priority so should not interfere with any user process, not even user background processes. The symptom should only be that the system is less idle. - - If we ever get to a point where the number of marks is an issue then the compacting here could be made partial: since old marks rarely get coalesced it would make sense to only check the newer ones often, and the old ones perhaps only at the system startup."! Item was removed: - ----- Method: ObjectHistory>>newMark (in category 'private') ----- - newMark - ^ ObjectHistoryMark new! Item was removed: - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- - oopClassesByAge - "Answer collection of (oopAge in seconds -> sorted counts of object classes) sorted from lowest age" - "ObjectHistory current oopClassesByAge" - - | stats prev endOfMemory now bag age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - bag := Bag new. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> bag sortedCounts]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') ----- - oopClassesByDate - "Answer collection of (Date -> sorted counts of object classes) sorted from newest date" - "ObjectHistory current oopClassesByDate" - - | stats prev endOfMemory bag date obj thisDate | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - thisDate := nil. - bag := Bag new. - marks do: [:mark | - prev ifNotNil: [ - obj := prev objectAfter. - [obj == mark] whileFalse: [ - bag add: obj class. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - date := mark timestamp asDate. - thisDate = date ifFalse: [ - stats addFirst: date -> bag sortedCounts. - bag := Bag new. - thisDate := date]]. - prev := mark]. - thisDate = date ifFalse: [ - stats addLast: date -> bag sortedCounts]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- - oopCountsByAge - "Answer collection of (oopAge in seconds -> number of objects) sorted from lowest age" - "ObjectHistory current oopCountsByAge" - - | stats prev endOfMemory now n age obj | - endOfMemory := Object new. - stats := OrderedCollection new: 1000. - prev := nil. - now := self newMark timestamp. - marks do: [:mark | - prev ifNotNil: [ - n := 0. - obj := prev objectAfter. - [obj == mark] whileFalse: [ - n := n + 1. - obj := obj nextObject. - obj == endOfMemory ifTrue: [self error: 'should not happen']]. - age := (now - mark timestamp) asSeconds roundTo: self markRate. - stats addFirst: age -> n]. - prev := mark]. - ^ stats - ! Item was removed: - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- - reinitMarks - marks := ObjectHistoryMark allInstances asOrderedCollection. - marks - ifEmpty: [marks add: self newMark] - ifNotEmpty: [ | prev | - prev := nil. - marks removeAllSuchThat: [:obj | - prev notNil and: [prev timestamp >= obj timestamp]]]. - ! Item was removed: - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') ----- - restartMarkProcess - markProcess ifNotNil: [markProcess terminate]. - markProcess := [self markLoop] - forkAt: Processor systemBackgroundPriority - named: 'ObjectHistory''s markProcess'. - ! Item was removed: - ----- Method: ObjectHistory>>terminate (in category 'private') ----- - terminate - markProcess ifNotNil: - [markProcess terminate]! Item was removed: - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- - timestampOf: anObject - "Timestamp of anObject, or nil if too new" - | endOfMemory mark | - anObject class == SmallInteger ifTrue: [^nil]. - mark := anObject. - endOfMemory := Object new. - [mark class == ObjectHistoryMark] whileFalse: [ - mark := mark nextObject. - mark == endOfMemory ifTrue: [^nil]]. - ^mark timestamp! Item was removed: - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- - toggleRunning - self isRunning - ifTrue: [self terminate] - ifFalse: [self restartMarkProcess]! Item was removed: - Object subclass: #ObjectHistoryMark - instanceVariableNames: 'timestamp' - classVariableNames: '' - poolDictionaries: '' - category: 'System-Support'! - - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! - An ObjectHistoryMark is a permanent mark in the object memory. It holds a timestamp. - - While the timestamp could be used directly as mark by ObjectHistory, it's conceivable that its format might change in the future, and we do not want the mark's relative position in memory to change (which would be the case if it was migrated to a new format). So we use a distinct object instead (and we protect it against accidental become-ing by overriding those methods).! Item was removed: - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- - become: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') ----- - becomeForward: otherObject - ^self error: 'marks need to stay fixed in the object memory'! Item was removed: - ----- Method: ObjectHistoryMark>>initialize (in category 'initialization') ----- - initialize - timestamp := DateAndTime now floor. - ! Item was removed: - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') ----- - objectAfter - "Answer the next object in memory after me and my timestamp" - | successor | - successor := self nextObject. - successor == timestamp - ifTrue: [successor := successor nextObject]. - ^ successor! Item was removed: - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- - printOn: aStream - aStream - nextPutAll: self class name; - nextPut: $(; - print: timestamp; - nextPut: $)! Item was removed: - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') ----- - timestamp - ^timestamp - ! Item was changed: ----- Method: SmalltalkImage>>compactClassesArray (in category 'special objects') ----- compactClassesArray "Smalltalk compactClassesArray" + "Backward-compatibility support. Spur does not have compact classes." + ^{}! - "Return the array of 31 classes whose instances may be - represented compactly" - ^ self specialObjectsArray at: 29! Item was added: + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Essential. Fail if no memory is available." + + (numBytes isInteger and: [numBytes > 0]) ifTrue: + [OutOfMemory signal]. + ^self primitiveFailed! Item was added: + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was changed: ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') ----- primBytesLeft + "Primitive. Answer the number of free bytes available in old space. + Not accurate unless preceded by - "Primitive. Answer the number of bytes available for new object data. - Not accurate unless preceded by Smalltalk garbageCollectMost (for reasonable accuracy), or Smalltalk garbageCollect (for real accuracy). + See Object documentation whatIsAPrimitive." - See Object documentation whatIsAPrimitive." + ^0! - ^ 0! Item was changed: ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category 'memory space') ----- primitiveGarbageCollect + "Primitive. Reclaims all garbage and answers the size of the largest free chunk in old space.." - "Primitive. Reclaims all garbage and answers the number of bytes of available space." + ^self primitiveFailed! - ^ self primBytesLeft! Item was changed: ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category 'special objects') ----- recreateSpecialObjectsArray "Smalltalk recreateSpecialObjectsArray" "To external package developers: **** DO NOT OVERRIDE THIS METHOD. ***** If you are writing a plugin and need additional special object(s) for your own use, use addGCRoot() function and use own, separate special objects registry " "The Special Objects Array is an array of objects used by the Squeak virtual machine. Its contents are critical and accesses to it by the VM are unchecked, so don't even think of playing here unless you know what you are doing." | newArray | + newArray := Array new: 60. - newArray := Array new: 58. "Nil false and true get used throughout the interpreter" newArray at: 1 put: nil. newArray at: 2 put: false. newArray at: 3 put: true. "This association holds the active process (a ProcessScheduler)" newArray at: 4 put: (self specialObjectsArray at: 4) "(self bindingOf: #Processor) but it answers an Alias". "Numerous classes below used for type checking and instantiation" newArray at: 5 put: Bitmap. newArray at: 6 put: SmallInteger. newArray at: 7 put: ByteString. newArray at: 8 put: Array. newArray at: 9 put: Smalltalk. + newArray at: 10 put: BoxedFloat64. + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: [self globals at: #Context]). + newArray at: 12 put: nil. "was BlockContext." - newArray at: 10 put: Float. - newArray at: 11 put: MethodContext. - newArray at: 12 put: BlockContext. newArray at: 13 put: Point. newArray at: 14 put: LargePositiveInteger. newArray at: 15 put: Display. newArray at: 16 put: Message. newArray at: 17 put: CompiledMethod. + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: [Semaphore new]). "low space Semaphore" - newArray at: 18 put: (self specialObjectsArray at: 18). - "(low space Semaphore)" newArray at: 19 put: Semaphore. newArray at: 20 put: Character. newArray at: 21 put: #doesNotUnderstand:. newArray at: 22 put: #cannotReturn:. newArray at: 23 put: nil. "This is the process signalling low space." "An array of the 32 selectors that are compiled as special bytecodes, paired alternately with the number of arguments each takes." newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 #* 1 #/ 1 #\\ 1 #@ 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 #at: 1 #at:put: 2 #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 #blockCopy: 1 #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). "An array of the 255 Characters in ascii order. + Cog inlines table into machine code at: prim so do not regenerate it. + This is nil in Spur, which has immediate Characters." - Cog inlines table into machine code at: prim so do not regenerate it." newArray at: 25 put: (self specialObjectsArray at: 25). newArray at: 26 put: #mustBeBoolean. newArray at: 27 put: ByteArray. newArray at: 28 put: Process. + "An array of up to 31 classes whose instances will have compact headers; an empty array in Spur" - "An array of up to 31 classes whose instances will have compact headers" newArray at: 29 put: self compactClassesArray. + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: [Semaphore new]). "delay Semaphore" + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: [Semaphore new]). "user interrupt Semaphore" - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay Semaphore)" - newArray at: 31 put: (self specialObjectsArray at: 31). "(user interrupt Semaphore)" "Entries 32 - 34 unreferenced. Previously these contained prototype instances to be copied for fast initialization" + newArray at: 32 put: nil. "was the prototype Float" + newArray at: 33 put: nil. "was the prototype 4-byte LargePositiveInteger" + newArray at: 34 put: nil. "was the prototype Point" - newArray at: 32 put: nil. "was (Float new: 2)" - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" - newArray at: 34 put: nil. "was Point new" newArray at: 35 put: #cannotInterpret:. + newArray at: 36 put: nil. "was the prototype MethodContext" - "Note: This must be fixed once we start using context prototypes (yeah, right)" - "(MethodContext new: CompiledMethod fullFrameSize)." - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the prototype MethodContext (unused by the VM)" newArray at: 37 put: BlockClosure. + newArray at: 38 put: nil. "was the prototype BlockContext" - "(BlockContext new: CompiledMethod fullFrameSize)." - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the prototype BlockContext (unused by the VM)" "array of objects referred to by external code" + newArray at: 39 put: (self specialObjectsArray at: 39). "external semaphores" - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve external semaphores" newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls in CogMT" + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). "finalization Semaphore" - newArray at: 41 put: nil. "Reserved for a LinkedList instance for overlapped calls in CogMT" - "finalization Semaphore" - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). newArray at: 43 put: LargeNegativeInteger. "External objects for callout. Note: Written so that one can actually completely remove the FFI." newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). newArray at: 46 put: (self at: #ExternalData ifAbsent: []). newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). newArray at: 49 put: #aboutToReturn:through:. newArray at: 50 put: #run:with:in:. "51 reserved for immutability message" + newArray at: 51 put: #attemptToAssign:withIndex:. - "newArray at: 51 put: #attemptToAssign:withIndex:." - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: []). newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' #'bad argument' #'bad index' #'bad number of arguments' #'inappropriate operation' #'unsupported operation' #'no modification' #'insufficient object memory' #'insufficient C memory' #'not found' #'bad method' #'internal error in named primitive machinery' #'object may move' #'resource limit exceeded' + #'object is pinned' #'primitive write beyond end of object'). - #'object is pinned'). "53 to 55 are for Alien" newArray at: 53 put: (self at: #Alien ifAbsent: []). + newArray at: 54 put: #invokeCallbackContext:. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." - newArray at: 54 put: #invokeCallbackContext::. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). + "Used to be WeakFinalizationList for WeakFinalizationList hasNewFinalization, obsoleted by ephemeron support." + newArray at: 56 put: nil. - "Weak reference finalization" - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: []). "reserved for foreign callback process" newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: []). newArray at: 58 put: #unusedBytecode. + "59 reserved for Sista counter tripped message" + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. + "60 reserved for Sista class trap message" + newArray at: 60 put: #classTrapFor:. "Now replace the interpreter's reference in one atomic operation" + self specialObjectsArray becomeForward: newArray! - self specialObjectsArray becomeForward: newArray - ! Item was changed: ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and quit') ----- setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" - "Adjust the VM's default GC parameters to avoid premature tenuring." + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! - self vmParameterAt: 5 put: 4000. "do an incremental GC after this many allocations" - self vmParameterAt: 6 put: 2000. "tenure when more than this many objects survive the GC" - ! Item was changed: ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance size') ----- spaceForInstancesOf: aClass + "Answer a pair of the number of bytes consumed by all instances of the + given class, including their object headers, and the number of instances." - "Answer the number of bytes consumed by all instances of the given class, including their object headers and the number of instances." + | instances total | + instances := aClass allInstances. + instances isEmpty ifTrue: [^#(0 0)]. - | smallHeaderSize instVarBytes isVariable bytesPerElement total lastInstance instance instanceCount | - instance := aClass someInstance ifNil: [ ^#(0 0) ]. - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. - instVarBytes := aClass instSize * 4. - isVariable := aClass isVariable. - bytesPerElement := isVariable - ifFalse: [ 0 ] - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. total := 0. + aClass isVariable + ifTrue: + [instances do: + [:i| total := total + (aClass byteSizeOfInstanceOfSize: i basicSize)]] + ifFalse: + [total := instances size * aClass byteSizeOfInstance]. + ^{ total. instances size }! - instanceCount := 0. - "A modified version of #allInstancesDo: is inlined here. It avoids an infinite loop when another process is creating new instances of aClass." - self flag: #allInstancesDo:. - lastInstance := - aClass == CompiledMethod "CompiledMethod has special format, see its class comment" - ifTrue: [aClass new] - ifFalse: [aClass basicNew]. - [ instance == lastInstance ] whileFalse: [ - | contentBytes headerBytes | - contentBytes := instVarBytes + (isVariable - ifFalse: [ 0 ] - ifTrue: [ instance basicSize * bytesPerElement ]). - headerBytes := contentBytes > 255 - ifTrue: [ 12 ] - ifFalse: [ smallHeaderSize ]. - total := total + headerBytes + (contentBytes roundUpTo: 4). - instanceCount := instanceCount + 1. - instance := instance nextInstance ]. - ^{ total. instanceCount }! Item was added: + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category 'memory space') ----- + growMemoryByAtLeast: numBytes + "Grow memory by at least the requested number of bytes. + Primitive. Fail if no memory is available. Essential." + + ^(numBytes isInteger and: [numBytes > 0]) + ifTrue: [OutOfMemory signal] + ifFalse: [self primitiveFailed]! Item was added: + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system attributes') ----- + maxIdentityHash + "Answer the maximum identityHash value supported by the VM." + + ^self primitiveFailed! Item was added: + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot and quit') ----- + setGCParameters + "Adjust the VM's default GC parameters to avoid too much tenuring. + Maybe this should be left to the VM?" + + | proportion edenSize survivorSize averageObjectSize numObjects | + proportion := 0.9. "tenure when 90% of pastSpace is full" + edenSize := SmalltalkImage current vmParameterAt: 44. + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" + averageObjectSize := 8 * self wordSize. "a good approximation" + numObjects := (proportion * survivorSize / averageObjectSize) rounded. + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! Item was added: + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- + allObjects + "Answer an Array of all objects in the system. Fail if + there isn't enough memory to instantiate the result." + + ^self primitiveFailed! Item was changed: ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- allObjectsDo: aBlock + "Evaluate the argument, aBlock, for each object in the system, excluding immediates + such as SmallInteger and Character." + self allObjectsOrNil + ifNotNil: [:allObjects| allObjects do: aBlock] + ifNil: + ["Fall back on the old single object primitive code. With closures, this needs + to use an end marker (lastObject) since activation of the block will create + new contexts and cause an infinite loop. The lastObject must be created + before calling someObject, so that the VM can settle the enumeration (e.g. + by flushing new space) as a side effect of someObject" + | object lastObject | + lastObject := Object new. + object := self someObject. + [lastObject == object or: [0 == object]] whileFalse: + [aBlock value: object. + object := object nextObject]]! - "Evaluate the argument, aBlock, for each object in the system - excluding SmallIntegers. With closures, this needs to use an end - marker (lastObject) since activation of the block will create new - contexts and cause an infinite loop." - | object lastObject | - object := self someObject. - lastObject := Object new. - [lastObject == object or: [0 == object]] - whileFalse: [aBlock value: object. - object := object nextObject]! Item was added: + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') ----- + allObjectsOrNil + "Answer an Array of all objects in the system. Fail if there isn't + enough memory to instantiate the result and answer nil." + + ^nil! From lists at fniephaus.com Sun Jul 19 19:01:25 2015 From: lists at fniephaus.com (Fabio Niephaus) Date: Sun Jul 19 19:01:40 2015 Subject: [squeak-dev] final Squeak-4.6-All-in-One posted In-Reply-To: References: Message-ID: I'm using OS X Yosemite. Hope this helps. Regards, Fabio -- On Sun, Jul 19, 2015 at 6:48 PM Tobias Pape wrote: > > On 19.07.2015, at 18:34, Chris Muller wrote: > > > Thanks Fabio, say, which platform did you test on? Hm, something > > interesting -- that new SqueakSSL (for Linux) is 7 MB where the one I > > have been using is only 27K, which easily makes it the largest plugin > > and would slightly inflate teh size of the All-In-One. > > > > Why is it so much bigger, is it compiled with debug information or > something? > > No, I statically linked against LibreSSL. > > Best regards > -Tobias > > > > > > > > > On Sun, Jul 19, 2015 at 3:56 AM, Fabio Niephaus > wrote: > >> + 1 for releasing 4.6 and handling problems as users find them :) > >> > >> But there's one problem that I just found: try and run the following > and you > >> should get a SqueakSSL error (-5): > >> > >> (WebClient new httpGet: > >> 'https://api.travis-ci.org/repos/squeak-smalltalk/squeak.org/builds') > >> content > >> > >> Looks like we forgot to update the SqueakSSL plugins with the ones from > [1]? > >> After doing that manually, the above works just fine... > >> > >> Regards, > >> Fabio > >> > >> [1] https://github.com/itsmeront/squeakssl/releases > >> > >> -- > >> > >> On Sat, Jul 18, 2015 at 11:06 PM Eliot Miranda > > >> wrote: > >>> > >>> On Sat, Jul 18, 2015 at 1:59 PM, Chris Muller > >>> wrote: > >>>> > >>>> There was 1 vote for including the legacy Mac plugins and 0 against. > >>>> So Craig and I made one last All-in-One and its uploaded. > >>>> > >>>> So, I think can we call 4.6 "done" then? > >>> > >>> > >>> Do we have any volunteers to do some shake down tests? dare we do some > >>> shake down tests? SHould we instead release and handle problems as > users > >>> find them? Chris, have you run your test suite using the 4.6 yet? > >>> > >>> -- > >>> _,,,^..^,,,_ > >>> best, Eliot > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150719/e6e29632/attachment.htm From leves at elte.hu Sun Jul 19 19:12:48 2015 From: leves at elte.hu (Levente Uzonyi) Date: Sun Jul 19 19:12:53 2015 Subject: [squeak-dev] The Trunk: System-cmm.754.mcz In-Reply-To: References: Message-ID: #oopAge and #oopTimestamp should be removed from Object. Levente On Sun, 19 Jul 2015, commits@source.squeak.org wrote: > Chris Muller uploaded a new version of System to project The Trunk: > http://source.squeak.org/trunk/System-cmm.754.mcz > > ==================== Summary ==================== > > Name: System-cmm.754 > Author: cmm > Time: 19 July 2015, 1:19:26.763 pm > UUID: 8f6319b1-3618-4258-8bbf-afed22e87937 > Ancestors: System-topa.753 > > Squeak 5.0 release, Spur bootstrap changes to transition to Spur object model and core system. > > =============== Diff against System-topa.753 =============== > > Item was removed: > - Object subclass: #ObjectHistory > - instanceVariableNames: 'marks markProcess' > - classVariableNames: 'Current ObjectHistoryEnabled' > - poolDictionaries: '' > - category: 'System-Support'! > - > - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! > - ObjectHistory holds ObjectHistoryMark objects which are placed in the object memory at regular intervals by its markProcess in the background. Adjacent marks (with no remaining objects inbetween) are coalesced so over time the collection does not grow unnecessarily large. > - > - Using these markers it is possible to determine the age of objects in memory from the time the ObjectHistory was initialized. Try e.g.: > - self oopTimestamp. > - self oopAge. > - ObjectHistory current oopClassesByDate. > - > - Instance Variables > - marks: SortedCollection of ObjectHistoryMark objects > - markProcess: a Process running our markLoop > - ! > > Item was removed: > - ----- Method: ObjectHistory class>>current (in category 'accessing') ----- > - current > - ^ Current ifNil: [Current := self new]! > > Item was removed: > - ----- Method: ObjectHistory class>>initialize (in category 'class initialization') ----- > - initialize > - self current. > - ! > > Item was removed: > - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category 'preferences') ----- > - keepTrackOfObjectHistory > - - category: #('debug' 'general' 'performance') > - description: 'Collect marker objects in the object memory at regular intervals in the background. > - > - Using these markers it is possible to determine the age of objects in memory from the time the object history was initialized.' > - type: #Boolean> > - ^ ObjectHistoryEnabled ifNil: [ > - Current > - ifNil: [false] > - ifNotNil: [:objectHistory | objectHistory isRunning]]! > > Item was removed: > - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in category 'preferences') ----- > - keepTrackOfObjectHistory: aBoolean > - " Reflect the desired state by starting/stopping the process if necessary " > - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. > - ObjectHistoryEnabled := aBoolean. > - > - Current > - ifNil: [aBoolean ifTrue: [self current]] > - ifNotNil: [:objectHistory | > - (objectHistory isRunning xor: aBoolean) "state switch needed" > - ifTrue: [objectHistory toggleRunning]].! > > Item was removed: > - ----- Method: ObjectHistory class>>obsolete (in category 'class initialization') ----- > - obsolete > - "Kill the mark process before removing the class." > - Current ifNotNil: > - [:objectHistory| > - objectHistory terminate]. > - super obsolete! > > Item was removed: > - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- > - ageOf: anObject > - "Age of anObject in seconds" > - | timestamp | > - timestamp := self timestampOf: anObject. > - timestamp ifNil: [^0]. > - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! > > Item was removed: > - ----- Method: ObjectHistory>>initialize (in category 'initializing') ----- > - initialize > - self restartMarkProcess. > - > - ! > > Item was removed: > - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- > - isRunning > - ^ markProcess > - ifNil: [false] > - ifNotNil: [:process | > - process isSuspended not and: [ > - process isTerminated not]]! > > Item was removed: > - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- > - markLoop > - [true] whileTrue: [ > - self markUpdate. > - (Delay forSeconds: self markRate) wait]! > > Item was removed: > - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- > - markRate > - "rate of creating ObjectHistoryMarks" > - ^60! > > Item was removed: > - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- > - markUpdate > - "Add a new mark and compact the marks collection" > - | mark prev | > - "lazy init so this happens in the background process" > - marks ifNil: [self reinitMarks]. > - "add new mark to object memory" > - mark := self newMark. > - mark timestamp <= marks last timestamp ifTrue: [^self "could happen if clock is wrong"]. > - marks addLast: mark. > - "compact the table by removing adjacent marks" > - prev := marks first. > - marks removeAllSuchThat: [:each | | doDelete | > - doDelete := prev objectAfter == each. > - prev := each. > - doDelete]. > - "The loop above is O(n) in number of marks, but that number should never become so large to be an issue. Even if the number was large, this is running at system background priority so should not interfere with any user process, not even user background processes. The symptom should only be that the system is less idle. > - > - If we ever get to a point where the number of marks is an issue then the compacting here could be made partial: since old marks rarely get coalesced it would make sense to only check the newer ones often, and the old ones perhaps only at the system startup."! > > Item was removed: > - ----- Method: ObjectHistory>>newMark (in category 'private') ----- > - newMark > - ^ ObjectHistoryMark new! > > Item was removed: > - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- > - oopClassesByAge > - "Answer collection of (oopAge in seconds -> sorted counts of object classes) sorted from lowest age" > - "ObjectHistory current oopClassesByAge" > - > - | stats prev endOfMemory now bag age obj | > - endOfMemory := Object new. > - stats := OrderedCollection new: 1000. > - prev := nil. > - now := self newMark timestamp. > - marks do: [:mark | > - prev ifNotNil: [ > - bag := Bag new. > - obj := prev objectAfter. > - [obj == mark] whileFalse: [ > - bag add: obj class. > - obj := obj nextObject. > - obj == endOfMemory ifTrue: [self error: 'should not happen']]. > - age := (now - mark timestamp) asSeconds roundTo: self markRate. > - stats addFirst: age -> bag sortedCounts]. > - prev := mark]. > - ^ stats > - ! > > Item was removed: > - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') ----- > - oopClassesByDate > - "Answer collection of (Date -> sorted counts of object classes) sorted from newest date" > - "ObjectHistory current oopClassesByDate" > - > - | stats prev endOfMemory bag date obj thisDate | > - endOfMemory := Object new. > - stats := OrderedCollection new: 1000. > - prev := nil. > - thisDate := nil. > - bag := Bag new. > - marks do: [:mark | > - prev ifNotNil: [ > - obj := prev objectAfter. > - [obj == mark] whileFalse: [ > - bag add: obj class. > - obj := obj nextObject. > - obj == endOfMemory ifTrue: [self error: 'should not happen']]. > - date := mark timestamp asDate. > - thisDate = date ifFalse: [ > - stats addFirst: date -> bag sortedCounts. > - bag := Bag new. > - thisDate := date]]. > - prev := mark]. > - thisDate = date ifFalse: [ > - stats addLast: date -> bag sortedCounts]. > - ^ stats > - ! > > Item was removed: > - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- > - oopCountsByAge > - "Answer collection of (oopAge in seconds -> number of objects) sorted from lowest age" > - "ObjectHistory current oopCountsByAge" > - > - | stats prev endOfMemory now n age obj | > - endOfMemory := Object new. > - stats := OrderedCollection new: 1000. > - prev := nil. > - now := self newMark timestamp. > - marks do: [:mark | > - prev ifNotNil: [ > - n := 0. > - obj := prev objectAfter. > - [obj == mark] whileFalse: [ > - n := n + 1. > - obj := obj nextObject. > - obj == endOfMemory ifTrue: [self error: 'should not happen']]. > - age := (now - mark timestamp) asSeconds roundTo: self markRate. > - stats addFirst: age -> n]. > - prev := mark]. > - ^ stats > - ! > > Item was removed: > - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- > - reinitMarks > - marks := ObjectHistoryMark allInstances asOrderedCollection. > - marks > - ifEmpty: [marks add: self newMark] > - ifNotEmpty: [ | prev | > - prev := nil. > - marks removeAllSuchThat: [:obj | > - prev notNil and: [prev timestamp >= obj timestamp]]]. > - ! > > Item was removed: > - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') ----- > - restartMarkProcess > - markProcess ifNotNil: [markProcess terminate]. > - markProcess := [self markLoop] > - forkAt: Processor systemBackgroundPriority > - named: 'ObjectHistory''s markProcess'. > - ! > > Item was removed: > - ----- Method: ObjectHistory>>terminate (in category 'private') ----- > - terminate > - markProcess ifNotNil: > - [markProcess terminate]! > > Item was removed: > - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- > - timestampOf: anObject > - "Timestamp of anObject, or nil if too new" > - | endOfMemory mark | > - anObject class == SmallInteger ifTrue: [^nil]. > - mark := anObject. > - endOfMemory := Object new. > - [mark class == ObjectHistoryMark] whileFalse: [ > - mark := mark nextObject. > - mark == endOfMemory ifTrue: [^nil]]. > - ^mark timestamp! > > Item was removed: > - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- > - toggleRunning > - self isRunning > - ifTrue: [self terminate] > - ifFalse: [self restartMarkProcess]! > > Item was removed: > - Object subclass: #ObjectHistoryMark > - instanceVariableNames: 'timestamp' > - classVariableNames: '' > - poolDictionaries: '' > - category: 'System-Support'! > - > - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! > - An ObjectHistoryMark is a permanent mark in the object memory. It holds a timestamp. > - > - While the timestamp could be used directly as mark by ObjectHistory, it's conceivable that its format might change in the future, and we do not want the mark's relative position in memory to change (which would be the case if it was migrated to a new format). So we use a distinct object instead (and we protect it against accidental become-ing by overriding those methods).! > > Item was removed: > - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- > - become: otherObject > - ^self error: 'marks need to stay fixed in the object memory'! > > Item was removed: > - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') ----- > - becomeForward: otherObject > - ^self error: 'marks need to stay fixed in the object memory'! > > Item was removed: > - ----- Method: ObjectHistoryMark>>initialize (in category 'initialization') ----- > - initialize > - timestamp := DateAndTime now floor. > - ! > > Item was removed: > - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') ----- > - objectAfter > - "Answer the next object in memory after me and my timestamp" > - | successor | > - successor := self nextObject. > - successor == timestamp > - ifTrue: [successor := successor nextObject]. > - ^ successor! > > Item was removed: > - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- > - printOn: aStream > - aStream > - nextPutAll: self class name; > - nextPut: $(; > - print: timestamp; > - nextPut: $)! > > Item was removed: > - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') ----- > - timestamp > - ^timestamp > - ! > > Item was changed: > ----- Method: SmalltalkImage>>compactClassesArray (in category 'special objects') ----- > compactClassesArray > "Smalltalk compactClassesArray" > + "Backward-compatibility support. Spur does not have compact classes." > + ^{}! > - "Return the array of 31 classes whose instances may be > - represented compactly" > - ^ self specialObjectsArray at: 29! > > Item was added: > + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory space') ----- > + growMemoryByAtLeast: numBytes > + "Grow memory by at least the requested number of bytes. > + Primitive. Essential. Fail if no memory is available." > + > + (numBytes isInteger and: [numBytes > 0]) ifTrue: > + [OutOfMemory signal]. > + ^self primitiveFailed! > > Item was added: > + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system attributes') ----- > + maxIdentityHash > + "Answer the maximum identityHash value supported by the VM." > + > + ^self primitiveFailed! > > Item was changed: > ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') ----- > primBytesLeft > + "Primitive. Answer the number of free bytes available in old space. > + Not accurate unless preceded by > - "Primitive. Answer the number of bytes available for new object data. > - Not accurate unless preceded by > Smalltalk garbageCollectMost (for reasonable accuracy), or > Smalltalk garbageCollect (for real accuracy). > + See Object documentation whatIsAPrimitive." > - See Object documentation whatIsAPrimitive." > > > + ^0! > - ^ 0! > > Item was changed: > ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category 'memory space') ----- > primitiveGarbageCollect > + "Primitive. Reclaims all garbage and answers the size of the largest free chunk in old space.." > - "Primitive. Reclaims all garbage and answers the number of bytes of available space." > > > + ^self primitiveFailed! > - ^ self primBytesLeft! > > Item was changed: > ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category 'special objects') ----- > recreateSpecialObjectsArray > "Smalltalk recreateSpecialObjectsArray" > > "To external package developers: > **** DO NOT OVERRIDE THIS METHOD. ***** > If you are writing a plugin and need additional special object(s) for your own use, > use addGCRoot() function and use own, separate special objects registry " > > "The Special Objects Array is an array of objects used by the Squeak virtual machine. > Its contents are critical and accesses to it by the VM are unchecked, so don't even > think of playing here unless you know what you are doing." > | newArray | > + newArray := Array new: 60. > - newArray := Array new: 58. > "Nil false and true get used throughout the interpreter" > newArray at: 1 put: nil. > newArray at: 2 put: false. > newArray at: 3 put: true. > "This association holds the active process (a ProcessScheduler)" > newArray at: 4 put: (self specialObjectsArray at: 4) "(self bindingOf: #Processor) but it answers an Alias". > "Numerous classes below used for type checking and instantiation" > newArray at: 5 put: Bitmap. > newArray at: 6 put: SmallInteger. > newArray at: 7 put: ByteString. > newArray at: 8 put: Array. > newArray at: 9 put: Smalltalk. > + newArray at: 10 put: BoxedFloat64. > + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: [self globals at: #Context]). > + newArray at: 12 put: nil. "was BlockContext." > - newArray at: 10 put: Float. > - newArray at: 11 put: MethodContext. > - newArray at: 12 put: BlockContext. > newArray at: 13 put: Point. > newArray at: 14 put: LargePositiveInteger. > newArray at: 15 put: Display. > newArray at: 16 put: Message. > newArray at: 17 put: CompiledMethod. > + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: [Semaphore new]). "low space Semaphore" > - newArray at: 18 put: (self specialObjectsArray at: 18). > - "(low space Semaphore)" > newArray at: 19 put: Semaphore. > newArray at: 20 put: Character. > newArray at: 21 put: #doesNotUnderstand:. > newArray at: 22 put: #cannotReturn:. > newArray at: 23 put: nil. "This is the process signalling low space." > "An array of the 32 selectors that are compiled as special bytecodes, > paired alternately with the number of arguments each takes." > newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 > #* 1 #/ 1 #\\ 1 #@ 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 > #at: 1 #at:put: 2 #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 > #blockCopy: 1 #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). > "An array of the 255 Characters in ascii order. > + Cog inlines table into machine code at: prim so do not regenerate it. > + This is nil in Spur, which has immediate Characters." > - Cog inlines table into machine code at: prim so do not regenerate it." > newArray at: 25 put: (self specialObjectsArray at: 25). > newArray at: 26 put: #mustBeBoolean. > newArray at: 27 put: ByteArray. > newArray at: 28 put: Process. > + "An array of up to 31 classes whose instances will have compact headers; an empty array in Spur" > - "An array of up to 31 classes whose instances will have compact headers" > newArray at: 29 put: self compactClassesArray. > + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: [Semaphore new]). "delay Semaphore" > + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: [Semaphore new]). "user interrupt Semaphore" > - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay Semaphore)" > - newArray at: 31 put: (self specialObjectsArray at: 31). "(user interrupt Semaphore)" > "Entries 32 - 34 unreferenced. Previously these contained prototype instances to be copied for fast initialization" > + newArray at: 32 put: nil. "was the prototype Float" > + newArray at: 33 put: nil. "was the prototype 4-byte LargePositiveInteger" > + newArray at: 34 put: nil. "was the prototype Point" > - newArray at: 32 put: nil. "was (Float new: 2)" > - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" > - newArray at: 34 put: nil. "was Point new" > newArray at: 35 put: #cannotInterpret:. > + newArray at: 36 put: nil. "was the prototype MethodContext" > - "Note: This must be fixed once we start using context prototypes (yeah, right)" > - "(MethodContext new: CompiledMethod fullFrameSize)." > - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the prototype MethodContext (unused by the VM)" > newArray at: 37 put: BlockClosure. > + newArray at: 38 put: nil. "was the prototype BlockContext" > - "(BlockContext new: CompiledMethod fullFrameSize)." > - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the prototype BlockContext (unused by the VM)" > "array of objects referred to by external code" > + newArray at: 39 put: (self specialObjectsArray at: 39). "external semaphores" > - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve external semaphores" > newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" > + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls in CogMT" > + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). "finalization Semaphore" > - newArray at: 41 put: nil. "Reserved for a LinkedList instance for overlapped calls in CogMT" > - "finalization Semaphore" > - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: [Semaphore new]). > newArray at: 43 put: LargeNegativeInteger. > "External objects for callout. > Note: Written so that one can actually completely remove the FFI." > newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). > newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). > newArray at: 46 put: (self at: #ExternalData ifAbsent: []). > newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). > newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). > newArray at: 49 put: #aboutToReturn:through:. > newArray at: 50 put: #run:with:in:. > "51 reserved for immutability message" > + newArray at: 51 put: #attemptToAssign:withIndex:. > - "newArray at: 51 put: #attemptToAssign:withIndex:." > - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: []). > newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' > #'bad argument' #'bad index' > #'bad number of arguments' > #'inappropriate operation' #'unsupported operation' > #'no modification' #'insufficient object memory' > #'insufficient C memory' #'not found' #'bad method' > #'internal error in named primitive machinery' > #'object may move' #'resource limit exceeded' > + #'object is pinned' #'primitive write beyond end of object'). > - #'object is pinned'). > "53 to 55 are for Alien" > newArray at: 53 put: (self at: #Alien ifAbsent: []). > + newArray at: 54 put: #invokeCallbackContext:. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." > - newArray at: 54 put: #invokeCallbackContext::. "use invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." > newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). > > + "Used to be WeakFinalizationList for WeakFinalizationList hasNewFinalization, obsoleted by ephemeron support." > + newArray at: 56 put: nil. > - "Weak reference finalization" > - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: []). > > "reserved for foreign callback process" > newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: []). > > newArray at: 58 put: #unusedBytecode. > + "59 reserved for Sista counter tripped message" > + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. > + "60 reserved for Sista class trap message" > + newArray at: 60 put: #classTrapFor:. > > "Now replace the interpreter's reference in one atomic operation" > + self specialObjectsArray becomeForward: newArray! > - self specialObjectsArray becomeForward: newArray > - ! > > Item was changed: > ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and quit') ----- > setGCParameters > + "Adjust the VM's default GC parameters to avoid too much tenuring. > + Maybe this should be left to the VM?" > - "Adjust the VM's default GC parameters to avoid premature tenuring." > > + | proportion edenSize survivorSize averageObjectSize numObjects | > + proportion := 0.9. "tenure when 90% of pastSpace is full" > + edenSize := SmalltalkImage current vmParameterAt: 44. > + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" > + averageObjectSize := 8 * self wordSize. "a good approximation" > + numObjects := (proportion * survivorSize / averageObjectSize) rounded. > + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! > - self vmParameterAt: 5 put: 4000. "do an incremental GC after this many allocations" > - self vmParameterAt: 6 put: 2000. "tenure when more than this many objects survive the GC" > - ! > > Item was changed: > ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance size') ----- > spaceForInstancesOf: aClass > + "Answer a pair of the number of bytes consumed by all instances of the > + given class, including their object headers, and the number of instances." > - "Answer the number of bytes consumed by all instances of the given class, including their object headers and the number of instances." > > + | instances total | > + instances := aClass allInstances. > + instances isEmpty ifTrue: [^#(0 0)]. > - | smallHeaderSize instVarBytes isVariable bytesPerElement total lastInstance instance instanceCount | > - instance := aClass someInstance ifNil: [ ^#(0 0) ]. > - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. > - instVarBytes := aClass instSize * 4. > - isVariable := aClass isVariable. > - bytesPerElement := isVariable > - ifFalse: [ 0 ] > - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. > total := 0. > + aClass isVariable > + ifTrue: > + [instances do: > + [:i| total := total + (aClass byteSizeOfInstanceOfSize: i basicSize)]] > + ifFalse: > + [total := instances size * aClass byteSizeOfInstance]. > + ^{ total. instances size }! > - instanceCount := 0. > - "A modified version of #allInstancesDo: is inlined here. It avoids an infinite loop when another process is creating new instances of aClass." > - self flag: #allInstancesDo:. > - lastInstance := > - aClass == CompiledMethod "CompiledMethod has special format, see its class comment" > - ifTrue: [aClass new] > - ifFalse: [aClass basicNew]. > - [ instance == lastInstance ] whileFalse: [ > - | contentBytes headerBytes | > - contentBytes := instVarBytes + (isVariable > - ifFalse: [ 0 ] > - ifTrue: [ instance basicSize * bytesPerElement ]). > - headerBytes := contentBytes > 255 > - ifTrue: [ 12 ] > - ifFalse: [ smallHeaderSize ]. > - total := total + headerBytes + (contentBytes roundUpTo: 4). > - instanceCount := instanceCount + 1. > - instance := instance nextInstance ]. > - ^{ total. instanceCount }! > > Item was added: > + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category 'memory space') ----- > + growMemoryByAtLeast: numBytes > + "Grow memory by at least the requested number of bytes. > + Primitive. Fail if no memory is available. Essential." > + > + ^(numBytes isInteger and: [numBytes > 0]) > + ifTrue: [OutOfMemory signal] > + ifFalse: [self primitiveFailed]! > > Item was added: > + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system attributes') ----- > + maxIdentityHash > + "Answer the maximum identityHash value supported by the VM." > + > + ^self primitiveFailed! > > Item was added: > + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot and quit') ----- > + setGCParameters > + "Adjust the VM's default GC parameters to avoid too much tenuring. > + Maybe this should be left to the VM?" > + > + | proportion edenSize survivorSize averageObjectSize numObjects | > + proportion := 0.9. "tenure when 90% of pastSpace is full" > + edenSize := SmalltalkImage current vmParameterAt: 44. > + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 x 28kb survivor spaces; Spur uses the same ratios :-)" > + averageObjectSize := 8 * self wordSize. "a good approximation" > + numObjects := (proportion * survivorSize / averageObjectSize) rounded. > + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure when more than this many objects survive the GC"! > > Item was added: > + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- > + allObjects > + "Answer an Array of all objects in the system. Fail if > + there isn't enough memory to instantiate the result." > + > + ^self primitiveFailed! > > Item was changed: > ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- > allObjectsDo: aBlock > + "Evaluate the argument, aBlock, for each object in the system, excluding immediates > + such as SmallInteger and Character." > + self allObjectsOrNil > + ifNotNil: [:allObjects| allObjects do: aBlock] > + ifNil: > + ["Fall back on the old single object primitive code. With closures, this needs > + to use an end marker (lastObject) since activation of the block will create > + new contexts and cause an infinite loop. The lastObject must be created > + before calling someObject, so that the VM can settle the enumeration (e.g. > + by flushing new space) as a side effect of someObject" > + | object lastObject | > + lastObject := Object new. > + object := self someObject. > + [lastObject == object or: [0 == object]] whileFalse: > + [aBlock value: object. > + object := object nextObject]]! > - "Evaluate the argument, aBlock, for each object in the system > - excluding SmallIntegers. With closures, this needs to use an end > - marker (lastObject) since activation of the block will create new > - contexts and cause an infinite loop." > - | object lastObject | > - object := self someObject. > - lastObject := Object new. > - [lastObject == object or: [0 == object]] > - whileFalse: [aBlock value: object. > - object := object nextObject]! > > Item was added: > + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') ----- > + allObjectsOrNil > + "Answer an Array of all objects in the system. Fail if there isn't > + enough memory to instantiate the result and answer nil." > + > + ^nil! > > > From vaidasd at gmail.com Sun Jul 19 20:11:40 2015 From: vaidasd at gmail.com (=?UTF-8?Q?Vaidotas_Did=C5=BEbalis?=) Date: Sun Jul 19 20:12:24 2015 Subject: [squeak-dev] final Squeak-4.6-All-in-One posted In-Reply-To: References: Message-ID: Project saving is broken, though project related items are part of the docking bar menu. ?Vaidotas -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150719/5f1451fe/attachment.htm From commits at source.squeak.org Sun Jul 19 21:55:02 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Sun Jul 19 21:55:04 2015 Subject: [squeak-dev] Daily Commit Log Message-ID: <20150719215502.9684.qmail@box4.squeakfoundation.org> Changes to Trunk (http://source.squeak.org/trunk.html) in the last 24 hours: http://lists.squeakfoundation.org/pipermail/packages/2015-July/008828.html Name: Collections-cmm.639 Ancestors: Collections-topa.638 Squeak 5.0 release, Spur bootstrap changes to transition to Spur object model and core system. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008829.html Name: Compiler-cmm.305 Ancestors: Compiler-eem.304 Squeak 5.0 release, Spur bootstrap changes to transition to Spur object model and core system. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008830.html Name: Kernel-cmm.936 Ancestors: Kernel-topa.935 Squeak 5.0 release, Spur bootstrap changes to transition to Spur object model and core system. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008831.html Name: System-cmm.754 Ancestors: System-topa.753 Squeak 5.0 release, Spur bootstrap changes to transition to Spur object model and core system. ============================================= From asqueaker at gmail.com Mon Jul 20 00:44:46 2015 From: asqueaker at gmail.com (Chris Muller) Date: Mon Jul 20 00:44:51 2015 Subject: [squeak-dev] The Trunk: System-cmm.754.mcz In-Reply-To: References: Message-ID: Got it. Good catch, thanks. On Sun, Jul 19, 2015 at 2:12 PM, Levente Uzonyi wrote: > #oopAge and #oopTimestamp should be removed from Object. > > Levente > > On Sun, 19 Jul 2015, commits@source.squeak.org wrote: > >> Chris Muller uploaded a new version of System to project The Trunk: >> http://source.squeak.org/trunk/System-cmm.754.mcz >> >> >> ==================== Summary ==================== >> >> Name: System-cmm.754 >> Author: cmm >> Time: 19 July 2015, 1:19:26.763 pm >> UUID: 8f6319b1-3618-4258-8bbf-afed22e87937 >> Ancestors: System-topa.753 >> >> Squeak 5.0 release, Spur bootstrap changes to transition to Spur object >> model and core system. >> >> =============== Diff against System-topa.753 =============== >> >> Item was removed: >> - Object subclass: #ObjectHistory >> - instanceVariableNames: 'marks markProcess' >> - classVariableNames: 'Current ObjectHistoryEnabled' >> - poolDictionaries: '' >> - category: 'System-Support'! >> - >> - !ObjectHistory commentStamp: 'bf 11/16/2012 12:19' prior: 0! >> - ObjectHistory holds ObjectHistoryMark objects which are placed in the >> object memory at regular intervals by its markProcess in the background. >> Adjacent marks (with no remaining objects inbetween) are coalesced so over >> time the collection does not grow unnecessarily large. >> - >> - Using these markers it is possible to determine the age of objects in >> memory from the time the ObjectHistory was initialized. Try e.g.: >> - self oopTimestamp. >> - self oopAge. >> - ObjectHistory current oopClassesByDate. >> - >> - Instance Variables >> - marks: SortedCollection of ObjectHistoryMark objects >> - markProcess: a Process running our markLoop >> - ! >> >> Item was removed: >> - ----- Method: ObjectHistory class>>current (in category 'accessing') >> ----- >> - current >> - ^ Current ifNil: [Current := self new]! >> >> Item was removed: >> - ----- Method: ObjectHistory class>>initialize (in category 'class >> initialization') ----- >> - initialize >> - self current. >> - ! >> >> Item was removed: >> - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory (in category >> 'preferences') ----- >> - keepTrackOfObjectHistory >> - > - category: #('debug' 'general' 'performance') >> - description: 'Collect marker objects in the object memory >> at regular intervals in the background. >> - >> - Using these markers it is possible to determine the age of objects in >> memory from the time the object history was initialized.' >> - type: #Boolean> >> - ^ ObjectHistoryEnabled ifNil: [ >> - Current >> - ifNil: [false] >> - ifNotNil: [:objectHistory | objectHistory >> isRunning]]! >> >> Item was removed: >> - ----- Method: ObjectHistory class>>keepTrackOfObjectHistory: (in >> category 'preferences') ----- >> - keepTrackOfObjectHistory: aBoolean >> - " Reflect the desired state by starting/stopping the process if >> necessary " >> - ObjectHistoryEnabled = aBoolean ifTrue: [^ self]. >> - ObjectHistoryEnabled := aBoolean. >> - >> - Current >> - ifNil: [aBoolean ifTrue: [self current]] >> - ifNotNil: [:objectHistory | >> - (objectHistory isRunning xor: aBoolean) "state >> switch needed" >> - ifTrue: [objectHistory toggleRunning]].! >> >> Item was removed: >> - ----- Method: ObjectHistory class>>obsolete (in category 'class >> initialization') ----- >> - obsolete >> - "Kill the mark process before removing the class." >> - Current ifNotNil: >> - [:objectHistory| >> - objectHistory terminate]. >> - super obsolete! >> >> Item was removed: >> - ----- Method: ObjectHistory>>ageOf: (in category 'queries') ----- >> - ageOf: anObject >> - "Age of anObject in seconds" >> - | timestamp | >> - timestamp := self timestampOf: anObject. >> - timestamp ifNil: [^0]. >> - ^(DateAndTime now - timestamp) asSeconds roundTo: self markRate! >> >> Item was removed: >> - ----- Method: ObjectHistory>>initialize (in category 'initializing') >> ----- >> - initialize >> - self restartMarkProcess. >> - >> - ! >> >> Item was removed: >> - ----- Method: ObjectHistory>>isRunning (in category 'testing') ----- >> - isRunning >> - ^ markProcess >> - ifNil: [false] >> - ifNotNil: [:process | >> - process isSuspended not and: [ >> - process isTerminated not]]! >> >> Item was removed: >> - ----- Method: ObjectHistory>>markLoop (in category 'marking') ----- >> - markLoop >> - [true] whileTrue: [ >> - self markUpdate. >> - (Delay forSeconds: self markRate) wait]! >> >> Item was removed: >> - ----- Method: ObjectHistory>>markRate (in category 'marking') ----- >> - markRate >> - "rate of creating ObjectHistoryMarks" >> - ^60! >> >> Item was removed: >> - ----- Method: ObjectHistory>>markUpdate (in category 'marking') ----- >> - markUpdate >> - "Add a new mark and compact the marks collection" >> - | mark prev | >> - "lazy init so this happens in the background process" >> - marks ifNil: [self reinitMarks]. >> - "add new mark to object memory" >> - mark := self newMark. >> - mark timestamp <= marks last timestamp ifTrue: [^self "could >> happen if clock is wrong"]. >> - marks addLast: mark. >> - "compact the table by removing adjacent marks" >> - prev := marks first. >> - marks removeAllSuchThat: [:each | | doDelete | >> - doDelete := prev objectAfter == each. >> - prev := each. >> - doDelete]. >> - "The loop above is O(n) in number of marks, but that number should >> never become so large to be an issue. Even if the number was large, this is >> running at system background priority so should not interfere with any user >> process, not even user background processes. The symptom should only be that >> the system is less idle. >> - >> - If we ever get to a point where the number of marks is an issue >> then the compacting here could be made partial: since old marks rarely get >> coalesced it would make sense to only check the newer ones often, and the >> old ones perhaps only at the system startup."! >> >> Item was removed: >> - ----- Method: ObjectHistory>>newMark (in category 'private') ----- >> - newMark >> - ^ ObjectHistoryMark new! >> >> Item was removed: >> - ----- Method: ObjectHistory>>oopClassesByAge (in category 'stats') ----- >> - oopClassesByAge >> - "Answer collection of (oopAge in seconds -> sorted counts of >> object classes) sorted from lowest age" >> - "ObjectHistory current oopClassesByAge" >> - >> - | stats prev endOfMemory now bag age obj | >> - endOfMemory := Object new. >> - stats := OrderedCollection new: 1000. >> - prev := nil. >> - now := self newMark timestamp. >> - marks do: [:mark | >> - prev ifNotNil: [ >> - bag := Bag new. >> - obj := prev objectAfter. >> - [obj == mark] whileFalse: [ >> - bag add: obj class. >> - obj := obj nextObject. >> - obj == endOfMemory ifTrue: [self error: >> 'should not happen']]. >> - age := (now - mark timestamp) asSeconds roundTo: >> self markRate. >> - stats addFirst: age -> bag sortedCounts]. >> - prev := mark]. >> - ^ stats >> - ! >> >> Item was removed: >> - ----- Method: ObjectHistory>>oopClassesByDate (in category 'stats') >> ----- >> - oopClassesByDate >> - "Answer collection of (Date -> sorted counts of object classes) >> sorted from newest date" >> - "ObjectHistory current oopClassesByDate" >> - >> - | stats prev endOfMemory bag date obj thisDate | >> - endOfMemory := Object new. >> - stats := OrderedCollection new: 1000. >> - prev := nil. >> - thisDate := nil. >> - bag := Bag new. >> - marks do: [:mark | >> - prev ifNotNil: [ >> - obj := prev objectAfter. >> - [obj == mark] whileFalse: [ >> - bag add: obj class. >> - obj := obj nextObject. >> - obj == endOfMemory ifTrue: [self error: >> 'should not happen']]. >> - date := mark timestamp asDate. >> - thisDate = date ifFalse: [ >> - stats addFirst: date -> bag sortedCounts. >> - bag := Bag new. >> - thisDate := date]]. >> - prev := mark]. >> - thisDate = date ifFalse: [ >> - stats addLast: date -> bag sortedCounts]. >> - ^ stats >> - ! >> >> Item was removed: >> - ----- Method: ObjectHistory>>oopCountsByAge (in category 'stats') ----- >> - oopCountsByAge >> - "Answer collection of (oopAge in seconds -> number of objects) >> sorted from lowest age" >> - "ObjectHistory current oopCountsByAge" >> - >> - | stats prev endOfMemory now n age obj | >> - endOfMemory := Object new. >> - stats := OrderedCollection new: 1000. >> - prev := nil. >> - now := self newMark timestamp. >> - marks do: [:mark | >> - prev ifNotNil: [ >> - n := 0. >> - obj := prev objectAfter. >> - [obj == mark] whileFalse: [ >> - n := n + 1. >> - obj := obj nextObject. >> - obj == endOfMemory ifTrue: [self error: >> 'should not happen']]. >> - age := (now - mark timestamp) asSeconds roundTo: >> self markRate. >> - stats addFirst: age -> n]. >> - prev := mark]. >> - ^ stats >> - ! >> >> Item was removed: >> - ----- Method: ObjectHistory>>reinitMarks (in category 'private') ----- >> - reinitMarks >> - marks := ObjectHistoryMark allInstances asOrderedCollection. >> - marks >> - ifEmpty: [marks add: self newMark] >> - ifNotEmpty: [ | prev | >> - prev := nil. >> - marks removeAllSuchThat: [:obj | >> - prev notNil and: [prev timestamp >= obj >> timestamp]]]. >> - ! >> >> Item was removed: >> - ----- Method: ObjectHistory>>restartMarkProcess (in category 'marking') >> ----- >> - restartMarkProcess >> - markProcess ifNotNil: [markProcess terminate]. >> - markProcess := [self markLoop] >> - forkAt: Processor systemBackgroundPriority >> - named: 'ObjectHistory''s markProcess'. >> - ! >> >> Item was removed: >> - ----- Method: ObjectHistory>>terminate (in category 'private') ----- >> - terminate >> - markProcess ifNotNil: >> - [markProcess terminate]! >> >> Item was removed: >> - ----- Method: ObjectHistory>>timestampOf: (in category 'queries') ----- >> - timestampOf: anObject >> - "Timestamp of anObject, or nil if too new" >> - | endOfMemory mark | >> - anObject class == SmallInteger ifTrue: [^nil]. >> - mark := anObject. >> - endOfMemory := Object new. >> - [mark class == ObjectHistoryMark] whileFalse: [ >> - mark := mark nextObject. >> - mark == endOfMemory ifTrue: [^nil]]. >> - ^mark timestamp! >> >> Item was removed: >> - ----- Method: ObjectHistory>>toggleRunning (in category 'private') ----- >> - toggleRunning >> - self isRunning >> - ifTrue: [self terminate] >> - ifFalse: [self restartMarkProcess]! >> >> Item was removed: >> - Object subclass: #ObjectHistoryMark >> - instanceVariableNames: 'timestamp' >> - classVariableNames: '' >> - poolDictionaries: '' >> - category: 'System-Support'! >> - >> - !ObjectHistoryMark commentStamp: 'bf 11/7/2012 00:12' prior: 0! >> - An ObjectHistoryMark is a permanent mark in the object memory. It holds >> a timestamp. >> - >> - While the timestamp could be used directly as mark by ObjectHistory, >> it's conceivable that its format might change in the future, and we do not >> want the mark's relative position in memory to change (which would be the >> case if it was migrated to a new format). So we use a distinct object >> instead (and we protect it against accidental become-ing by overriding those >> methods).! >> >> Item was removed: >> - ----- Method: ObjectHistoryMark>>become: (in category 'mutating') ----- >> - become: otherObject >> - ^self error: 'marks need to stay fixed in the object memory'! >> >> Item was removed: >> - ----- Method: ObjectHistoryMark>>becomeForward: (in category 'mutating') >> ----- >> - becomeForward: otherObject >> - ^self error: 'marks need to stay fixed in the object memory'! >> >> Item was removed: >> - ----- Method: ObjectHistoryMark>>initialize (in category >> 'initialization') ----- >> - initialize >> - timestamp := DateAndTime now floor. >> - ! >> >> Item was removed: >> - ----- Method: ObjectHistoryMark>>objectAfter (in category 'accessing') >> ----- >> - objectAfter >> - "Answer the next object in memory after me and my timestamp" >> - | successor | >> - successor := self nextObject. >> - successor == timestamp >> - ifTrue: [successor := successor nextObject]. >> - ^ successor! >> >> Item was removed: >> - ----- Method: ObjectHistoryMark>>printOn: (in category 'printing') ----- >> - printOn: aStream >> - aStream >> - nextPutAll: self class name; >> - nextPut: $(; >> - print: timestamp; >> - nextPut: $)! >> >> Item was removed: >> - ----- Method: ObjectHistoryMark>>timestamp (in category 'accessing') >> ----- >> - timestamp >> - ^timestamp >> - ! >> >> Item was changed: >> ----- Method: SmalltalkImage>>compactClassesArray (in category 'special >> objects') ----- >> compactClassesArray >> "Smalltalk compactClassesArray" >> + "Backward-compatibility support. Spur does not have compact >> classes." >> + ^{}! >> - "Return the array of 31 classes whose instances may be >> - represented compactly" >> - ^ self specialObjectsArray at: 29! >> >> Item was added: >> + ----- Method: SmalltalkImage>>growMemoryByAtLeast: (in category 'memory >> space') ----- >> + growMemoryByAtLeast: numBytes >> + "Grow memory by at least the requested number of bytes. >> + Primitive. Essential. Fail if no memory is available." >> + >> + (numBytes isInteger and: [numBytes > 0]) ifTrue: >> + [OutOfMemory signal]. >> + ^self primitiveFailed! >> >> Item was added: >> + ----- Method: SmalltalkImage>>maxIdentityHash (in category 'system >> attributes') ----- >> + maxIdentityHash >> + "Answer the maximum identityHash value supported by the VM." >> + >> + ^self primitiveFailed! >> >> Item was changed: >> ----- Method: SmalltalkImage>>primBytesLeft (in category 'memory space') >> ----- >> primBytesLeft >> + "Primitive. Answer the number of free bytes available in old >> space. >> + Not accurate unless preceded by >> - "Primitive. Answer the number of bytes available for new object >> data. >> - Not accurate unless preceded by >> Smalltalk garbageCollectMost (for reasonable accuracy), or >> Smalltalk garbageCollect (for real accuracy). >> + See Object documentation whatIsAPrimitive." >> - See Object documentation whatIsAPrimitive." >> >> >> + ^0! >> - ^ 0! >> >> Item was changed: >> ----- Method: SmalltalkImage>>primitiveGarbageCollect (in category >> 'memory space') ----- >> primitiveGarbageCollect >> + "Primitive. Reclaims all garbage and answers the size of the >> largest free chunk in old space.." >> - "Primitive. Reclaims all garbage and answers the number of bytes >> of available space." >> >> >> + ^self primitiveFailed! >> - ^ self primBytesLeft! >> >> Item was changed: >> ----- Method: SmalltalkImage>>recreateSpecialObjectsArray (in category >> 'special objects') ----- >> recreateSpecialObjectsArray >> "Smalltalk recreateSpecialObjectsArray" >> >> "To external package developers: >> **** DO NOT OVERRIDE THIS METHOD. ***** >> If you are writing a plugin and need additional special object(s) >> for your own use, >> use addGCRoot() function and use own, separate special objects >> registry " >> >> "The Special Objects Array is an array of objects used by the >> Squeak virtual machine. >> Its contents are critical and accesses to it by the VM are >> unchecked, so don't even >> think of playing here unless you know what you are doing." >> | newArray | >> + newArray := Array new: 60. >> - newArray := Array new: 58. >> "Nil false and true get used throughout the interpreter" >> newArray at: 1 put: nil. >> newArray at: 2 put: false. >> newArray at: 3 put: true. >> "This association holds the active process (a ProcessScheduler)" >> newArray at: 4 put: (self specialObjectsArray at: 4) "(self >> bindingOf: #Processor) but it answers an Alias". >> "Numerous classes below used for type checking and instantiation" >> newArray at: 5 put: Bitmap. >> newArray at: 6 put: SmallInteger. >> newArray at: 7 put: ByteString. >> newArray at: 8 put: Array. >> newArray at: 9 put: Smalltalk. >> + newArray at: 10 put: BoxedFloat64. >> + newArray at: 11 put: (self globals at: #MethodContext ifAbsent: >> [self globals at: #Context]). >> + newArray at: 12 put: nil. "was BlockContext." >> - newArray at: 10 put: Float. >> - newArray at: 11 put: MethodContext. >> - newArray at: 12 put: BlockContext. >> newArray at: 13 put: Point. >> newArray at: 14 put: LargePositiveInteger. >> newArray at: 15 put: Display. >> newArray at: 16 put: Message. >> newArray at: 17 put: CompiledMethod. >> + newArray at: 18 put: ((self specialObjectsArray at: 18) ifNil: >> [Semaphore new]). "low space Semaphore" >> - newArray at: 18 put: (self specialObjectsArray at: 18). >> - "(low space Semaphore)" >> newArray at: 19 put: Semaphore. >> newArray at: 20 put: Character. >> newArray at: 21 put: #doesNotUnderstand:. >> newArray at: 22 put: #cannotReturn:. >> newArray at: 23 put: nil. "This is the process signalling low >> space." >> "An array of the 32 selectors that are compiled as special >> bytecodes, >> paired alternately with the number of arguments each takes." >> newArray at: 24 put: #( #+ 1 #- 1 #< 1 #> 1 #<= 1 #>= 1 #= 1 #~= 1 >> #* 1 #/ 1 #\\ 1 #@ >> 1 #bitShift: 1 #// 1 #bitAnd: 1 #bitOr: 1 >> #at: 1 #at:put: 2 >> #size 0 #next 0 #nextPut: 1 #atEnd 0 #== 1 #class 0 >> #blockCopy: 1 >> #value 0 #value: 1 #do: 1 #new 0 #new: 1 #x 0 #y 0 ). >> "An array of the 255 Characters in ascii order. >> + Cog inlines table into machine code at: prim so do not regenerate >> it. >> + This is nil in Spur, which has immediate Characters." >> - Cog inlines table into machine code at: prim so do not regenerate >> it." >> newArray at: 25 put: (self specialObjectsArray at: 25). >> newArray at: 26 put: #mustBeBoolean. >> newArray at: 27 put: ByteArray. >> newArray at: 28 put: Process. >> + "An array of up to 31 classes whose instances will have compact >> headers; an empty array in Spur" >> - "An array of up to 31 classes whose instances will have compact >> headers" >> newArray at: 29 put: self compactClassesArray. >> + newArray at: 30 put: ((self specialObjectsArray at: 30) ifNil: >> [Semaphore new]). "delay Semaphore" >> + newArray at: 31 put: ((self specialObjectsArray at: 31) ifNil: >> [Semaphore new]). "user interrupt Semaphore" >> - newArray at: 30 put: (self specialObjectsArray at: 30). "(delay >> Semaphore)" >> - newArray at: 31 put: (self specialObjectsArray at: 31). "(user >> interrupt Semaphore)" >> "Entries 32 - 34 unreferenced. Previously these contained >> prototype instances to be copied for fast initialization" >> + newArray at: 32 put: nil. "was the prototype Float" >> + newArray at: 33 put: nil. "was the prototype 4-byte >> LargePositiveInteger" >> + newArray at: 34 put: nil. "was the prototype Point" >> - newArray at: 32 put: nil. "was (Float new: 2)" >> - newArray at: 33 put: nil. "was (LargePositiveInteger new: 4)" >> - newArray at: 34 put: nil. "was Point new" >> newArray at: 35 put: #cannotInterpret:. >> + newArray at: 36 put: nil. "was the prototype MethodContext" >> - "Note: This must be fixed once we start using context prototypes >> (yeah, right)" >> - "(MethodContext new: CompiledMethod fullFrameSize)." >> - newArray at: 36 put: (self specialObjectsArray at: 36). "Is the >> prototype MethodContext (unused by the VM)" >> newArray at: 37 put: BlockClosure. >> + newArray at: 38 put: nil. "was the prototype BlockContext" >> - "(BlockContext new: CompiledMethod fullFrameSize)." >> - newArray at: 38 put: (self specialObjectsArray at: 38). "Is the >> prototype BlockContext (unused by the VM)" >> "array of objects referred to by external code" >> + newArray at: 39 put: (self specialObjectsArray at: 39). "external >> semaphores" >> - newArray at: 39 put: (self specialObjectsArray at: 39). "preserve >> external semaphores" >> newArray at: 40 put: nil. "Reserved for Mutex in Cog VMs" >> + newArray at: 41 put: ((self specialObjectsArray at: 41) ifNil: >> [LinkedList new]). "Reserved for a LinkedList instance for overlapped calls >> in CogMT" >> + newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: >> [Semaphore new]). "finalization Semaphore" >> - newArray at: 41 put: nil. "Reserved for a LinkedList instance for >> overlapped calls in CogMT" >> - "finalization Semaphore" >> - newArray at: 42 put: ((self specialObjectsArray at: 42) ifNil: >> [Semaphore new]). >> newArray at: 43 put: LargeNegativeInteger. >> "External objects for callout. >> Note: Written so that one can actually completely remove the >> FFI." >> newArray at: 44 put: (self at: #ExternalAddress ifAbsent: []). >> newArray at: 45 put: (self at: #ExternalStructure ifAbsent: []). >> newArray at: 46 put: (self at: #ExternalData ifAbsent: []). >> newArray at: 47 put: (self at: #ExternalFunction ifAbsent: []). >> newArray at: 48 put: (self at: #ExternalLibrary ifAbsent: []). >> newArray at: 49 put: #aboutToReturn:through:. >> newArray at: 50 put: #run:with:in:. >> "51 reserved for immutability message" >> + newArray at: 51 put: #attemptToAssign:withIndex:. >> - "newArray at: 51 put: #attemptToAssign:withIndex:." >> - newArray at: 51 put: (self specialObjectsArray at: 51 ifAbsent: >> []). >> newArray at: 52 put: #(nil "nil => generic error" #'bad receiver' >> #'bad argument' >> #'bad index' >> #'bad number of >> arguments' >> #'inappropriate >> operation' #'unsupported operation' >> #'no modification' >> #'insufficient object memory' >> #'insufficient C >> memory' #'not found' #'bad method' >> #'internal error >> in named primitive machinery' >> #'object may move' >> #'resource limit exceeded' >> + #'object is >> pinned' #'primitive write beyond end of object'). >> - #'object is >> pinned'). >> "53 to 55 are for Alien" >> newArray at: 53 put: (self at: #Alien ifAbsent: []). >> + newArray at: 54 put: #invokeCallbackContext:. "use >> invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." >> - newArray at: 54 put: #invokeCallbackContext::. "use >> invokeCallback:stack:registers:jmpbuf: for old Alien callbacks." >> newArray at: 55 put: (self at: #UnsafeAlien ifAbsent: []). >> >> + "Used to be WeakFinalizationList for WeakFinalizationList >> hasNewFinalization, obsoleted by ephemeron support." >> + newArray at: 56 put: nil. >> - "Weak reference finalization" >> - newArray at: 56 put: (self at: #WeakFinalizationList ifAbsent: >> []). >> >> "reserved for foreign callback process" >> newArray at: 57 put: (self specialObjectsArray at: 57 ifAbsent: >> []). >> >> newArray at: 58 put: #unusedBytecode. >> + "59 reserved for Sista counter tripped message" >> + newArray at: 59 put: #conditionalBranchCounterTrippedOn:. >> + "60 reserved for Sista class trap message" >> + newArray at: 60 put: #classTrapFor:. >> >> "Now replace the interpreter's reference in one atomic operation" >> + self specialObjectsArray becomeForward: newArray! >> - self specialObjectsArray becomeForward: newArray >> - ! >> >> Item was changed: >> ----- Method: SmalltalkImage>>setGCParameters (in category 'snapshot and >> quit') ----- >> setGCParameters >> + "Adjust the VM's default GC parameters to avoid too much tenuring. >> + Maybe this should be left to the VM?" >> - "Adjust the VM's default GC parameters to avoid premature >> tenuring." >> >> + | proportion edenSize survivorSize averageObjectSize numObjects | >> + proportion := 0.9. "tenure when 90% of pastSpace is full" >> + edenSize := SmalltalkImage current vmParameterAt: 44. >> + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 >> x 28kb survivor spaces; Spur uses the same ratios :-)" >> + averageObjectSize := 8 * self wordSize. "a good approximation" >> + numObjects := (proportion * survivorSize / averageObjectSize) >> rounded. >> + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure >> when more than this many objects survive the GC"! >> - self vmParameterAt: 5 put: 4000. "do an incremental GC after this >> many allocations" >> - self vmParameterAt: 6 put: 2000. "tenure when more than this many >> objects survive the GC" >> - ! >> >> Item was changed: >> ----- Method: SpaceTally>>spaceForInstancesOf: (in category 'instance >> size') ----- >> spaceForInstancesOf: aClass >> + "Answer a pair of the number of bytes consumed by all instances of >> the >> + given class, including their object headers, and the number of >> instances." >> - "Answer the number of bytes consumed by all instances of the given >> class, including their object headers and the number of instances." >> >> + | instances total | >> + instances := aClass allInstances. >> + instances isEmpty ifTrue: [^#(0 0)]. >> - | smallHeaderSize instVarBytes isVariable bytesPerElement total >> lastInstance instance instanceCount | >> - instance := aClass someInstance ifNil: [ ^#(0 0) ]. >> - smallHeaderSize := aClass isCompact ifTrue: [ 4 ] ifFalse: [ 8 ]. >> - instVarBytes := aClass instSize * 4. >> - isVariable := aClass isVariable. >> - bytesPerElement := isVariable >> - ifFalse: [ 0 ] >> - ifTrue: [ aClass isBytes ifTrue: [ 1 ] ifFalse: [ 4 ] ]. >> total := 0. >> + aClass isVariable >> + ifTrue: >> + [instances do: >> + [:i| total := total + (aClass >> byteSizeOfInstanceOfSize: i basicSize)]] >> + ifFalse: >> + [total := instances size * aClass >> byteSizeOfInstance]. >> + ^{ total. instances size }! >> - instanceCount := 0. >> - "A modified version of #allInstancesDo: is inlined here. It avoids >> an infinite loop when another process is creating new instances of aClass." >> - self flag: #allInstancesDo:. >> - lastInstance := >> - aClass == CompiledMethod "CompiledMethod has special >> format, see its class comment" >> - ifTrue: [aClass new] >> - ifFalse: [aClass basicNew]. >> - [ instance == lastInstance ] whileFalse: [ >> - | contentBytes headerBytes | >> - contentBytes := instVarBytes + (isVariable >> - ifFalse: [ 0 ] >> - ifTrue: [ instance basicSize * bytesPerElement ]). >> - headerBytes := contentBytes > 255 >> - ifTrue: [ 12 ] >> - ifFalse: [ smallHeaderSize ]. >> - total := total + headerBytes + (contentBytes roundUpTo: >> 4). >> - instanceCount := instanceCount + 1. >> - instance := instance nextInstance ]. >> - ^{ total. instanceCount }! >> >> Item was added: >> + ----- Method: SystemDictionary>>growMemoryByAtLeast: (in category >> 'memory space') ----- >> + growMemoryByAtLeast: numBytes >> + "Grow memory by at least the requested number of bytes. >> + Primitive. Fail if no memory is available. Essential." >> + >> + ^(numBytes isInteger and: [numBytes > 0]) >> + ifTrue: [OutOfMemory signal] >> + ifFalse: [self primitiveFailed]! >> >> Item was added: >> + ----- Method: SystemDictionary>>maxIdentityHash (in category 'system >> attributes') ----- >> + maxIdentityHash >> + "Answer the maximum identityHash value supported by the VM." >> + >> + ^self primitiveFailed! >> >> Item was added: >> + ----- Method: SystemDictionary>>setGCParameters (in category 'snapshot >> and quit') ----- >> + setGCParameters >> + "Adjust the VM's default GC parameters to avoid too much tenuring. >> + Maybe this should be left to the VM?" >> + >> + | proportion edenSize survivorSize averageObjectSize numObjects | >> + proportion := 0.9. "tenure when 90% of pastSpace is full" >> + edenSize := SmalltalkImage current vmParameterAt: 44. >> + survivorSize := edenSize / 5.0. "David's paper uses 140Kb eden + 2 >> x 28kb survivor spaces; Spur uses the same ratios :-)" >> + averageObjectSize := 8 * self wordSize. "a good approximation" >> + numObjects := (proportion * survivorSize / averageObjectSize) >> rounded. >> + SmalltalkImage current vmParameterAt: 6 put: numObjects "tenure >> when more than this many objects survive the GC"! >> >> Item was added: >> + ----- Method: SystemNavigation>>allObjects (in category 'query') ----- >> + allObjects >> + "Answer an Array of all objects in the system. Fail if >> + there isn't enough memory to instantiate the result." >> + >> + ^self primitiveFailed! >> >> Item was changed: >> ----- Method: SystemNavigation>>allObjectsDo: (in category 'query') ----- >> allObjectsDo: aBlock >> + "Evaluate the argument, aBlock, for each object in the system, >> excluding immediates >> + such as SmallInteger and Character." >> + self allObjectsOrNil >> + ifNotNil: [:allObjects| allObjects do: aBlock] >> + ifNil: >> + ["Fall back on the old single object primitive >> code. With closures, this needs >> + to use an end marker (lastObject) since >> activation of the block will create >> + new contexts and cause an infinite loop. The >> lastObject must be created >> + before calling someObject, so that the VM can >> settle the enumeration (e.g. >> + by flushing new space) as a side effect of >> someObject" >> + | object lastObject | >> + lastObject := Object new. >> + object := self someObject. >> + [lastObject == object or: [0 == object]] >> whileFalse: >> + [aBlock value: object. >> + object := object nextObject]]! >> - "Evaluate the argument, aBlock, for each object in the system >> - excluding SmallIntegers. With closures, this needs to use an end >> - marker (lastObject) since activation of the block will create new >> - contexts and cause an infinite loop." >> - | object lastObject | >> - object := self someObject. >> - lastObject := Object new. >> - [lastObject == object or: [0 == object]] >> - whileFalse: [aBlock value: object. >> - object := object nextObject]! >> >> Item was added: >> + ----- Method: SystemNavigation>>allObjectsOrNil (in category 'query') >> ----- >> + allObjectsOrNil >> + "Answer an Array of all objects in the system. Fail if there >> isn't >> + enough memory to instantiate the result and answer nil." >> + >> + ^nil! >> >> >> > From hannes.hirzel at gmail.com Mon Jul 20 07:48:51 2015 From: hannes.hirzel at gmail.com (H. Hirzel) Date: Mon Jul 20 07:48:53 2015 Subject: [squeak-dev] final Squeak-4.6-All-in-One posted In-Reply-To: References: Message-ID: I think that project saving has been broken for quite some time. There should be a note in 'known issues'. On 7/19/15, Vaidotas Did?balis wrote: > Project saving is broken, though project related items are part of the > docking bar menu. > ?Vaidotas > From lecteur at zogotounga.net Mon Jul 20 09:50:41 2015 From: lecteur at zogotounga.net (=?iso-8859-1?q?St=E9phane?= Rollandin) Date: Mon Jul 20 09:50:45 2015 Subject: [squeak-dev] how to get your app into the default catalog list of the best Squeak ever In-Reply-To: References: Message-ID: <55ACC471.4030606@zogotounga.net> > New SqueakMap Categories have been created for 4.6 and 5.0. If you > have applications which are (still) compatible with 4.6 and 5.0, it > only takes a few minutes to update your SqueakMap entries so they'll > appear by default in the Catalog of these new releases. Some guidance > on how to do this is here: > > http://wiki.squeak.org/squeak/6181 > I successfully updated the muO package supported versions to 4.6 and 5.0, but I cannot do so at the releases level. I get a "One or more fields failed validation" error message. This is via the web interface at http://map.squeak.org See attached picture. Stef -------------- next part -------------- A non-text attachment was scrubbed... Name: Squeakmap.png Type: image/png Size: 22186 bytes Desc: not available Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150720/342dc02a/Squeakmap.png From vaidasd at gmail.com Mon Jul 20 11:07:18 2015 From: vaidasd at gmail.com (=?UTF-8?Q?Vaidotas_Did=C5=BEbalis?=) Date: Mon Jul 20 11:08:04 2015 Subject: [squeak-dev] final Squeak-4.6-All-in-One posted In-Reply-To: References: Message-ID: On Mon, Jul 20, 2015 at 10:48 AM, H. Hirzel wrote: > I think that project saving has been broken for quite some time. > Yes, this is the reason why we use 4.4 version for development. The whole concept of Projects makes no sense if Project can not be persisted, this is essential. We use this, eToys use this. What is the meaning of the Projects if they can not be saved? It is an irony that introduction of Environments have had an opposite effect. Couldn't Environments coexist with Projects? Maybe someone could elaborate what is the problem, what can be done? >From UI perspective, currently stock image is one click away from debugger popup. regards, Vaidotas -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150720/4376dfa2/attachment.htm From Marcel.Taeumel at hpi.de Mon Jul 20 11:41:14 2015 From: Marcel.Taeumel at hpi.de (marcel.taeumel) Date: Mon Jul 20 11:41:57 2015 Subject: [squeak-dev] Re: how to get your app into the default catalog list of the best Squeak ever In-Reply-To: <55ACC471.4030606@zogotounga.net> References: <55ACC471.4030606@zogotounga.net> Message-ID: <1437392474368-4838335.post@n4.nabble.com> You have to select something in the "Squeak4.6" and "Squeak5.0" boxes. What are the options? "None" is apparently not accepted. Best, Marcel -- View this message in context: http://forum.world.st/how-to-get-your-app-into-the-default-catalog-list-of-the-best-Squeak-ever-tp4837879p4838335.html Sent from the Squeak - Dev mailing list archive at Nabble.com. From lecteur at zogotounga.net Mon Jul 20 12:08:25 2015 From: lecteur at zogotounga.net (=?iso-8859-1?q?St=E9phane?= Rollandin) Date: Mon Jul 20 12:08:25 2015 Subject: [squeak-dev] Re: how to get your app into the default catalog list of the best Squeak ever In-Reply-To: <1437392474368-4838335.post@n4.nabble.com> References: <55ACC471.4030606@zogotounga.net> <1437392474368-4838335.post@n4.nabble.com> Message-ID: <55ACE4B9.9080104@zogotounga.net> > You have to select something in the "Squeak4.6" and "Squeak5.0" boxes. What > are the options? "None" is apparently not accepted. There are no other options. My guess is that "Squeak4.6" and "Squeak5.0" have been created as top categories where they should be subcategories of "Squeak versions". Stef From asqueaker at gmail.com Mon Jul 20 16:09:07 2015 From: asqueaker at gmail.com (Chris Muller) Date: Mon Jul 20 16:09:10 2015 Subject: [squeak-dev] how to get your app into the default catalog list of the best Squeak ever In-Reply-To: <55ACC471.4030606@zogotounga.net> References: <55ACC471.4030606@zogotounga.net> Message-ID: Ah, okay I guess I better understand the "Mandatory" attribute of SM Categories now -- saying for what kind of object such a category must be set. It was set for PackageReleases, it shouldn't have been. I've corrected that. St?phane could you please try again? On Mon, Jul 20, 2015 at 4:50 AM, St?phane Rollandin wrote: >> New SqueakMap Categories have been created for 4.6 and 5.0. If you >> have applications which are (still) compatible with 4.6 and 5.0, it >> only takes a few minutes to update your SqueakMap entries so they'll >> appear by default in the Catalog of these new releases. Some guidance >> on how to do this is here: >> >> http://wiki.squeak.org/squeak/6181 >> > > I successfully updated the muO package supported versions to 4.6 and 5.0, > but I cannot do so at the releases level. > > I get a "One or more fields failed validation" error message. This is via > the web interface at http://map.squeak.org > > See attached picture. > > > Stef > > > > From lecteur at zogotounga.net Mon Jul 20 16:53:10 2015 From: lecteur at zogotounga.net (=?iso-8859-1?q?St=E9phane?= Rollandin) Date: Mon Jul 20 16:53:12 2015 Subject: [squeak-dev] how to get your app into the default catalog list of the best Squeak ever In-Reply-To: References: <55ACC471.4030606@zogotounga.net> Message-ID: <55AD2776.4080201@zogotounga.net> > St?phane could you please try again? Seems to work now ! Thanks, Stef From hannes.hirzel at gmail.com Mon Jul 20 17:39:51 2015 From: hannes.hirzel at gmail.com (H. Hirzel) Date: Mon Jul 20 17:39:54 2015 Subject: [squeak-dev] final Squeak-4.6-All-in-One posted In-Reply-To: References: Message-ID: A note that 'Project saving does not work, use 4.4 should be used instead' should be included in the release notes. --Hannes On 7/20/15, Vaidotas Did?balis wrote: > On Mon, Jul 20, 2015 at 10:48 AM, H. Hirzel > wrote: > >> I think that project saving has been broken for quite some time. >> > > Yes, this is the reason why we use 4.4 version for development. The whole > concept of Projects makes no sense if Project can not be persisted, this is > essential. We use this, eToys use this. What is the meaning of the Projects > if they can not be saved? > It is an irony that introduction of Environments have had an opposite > effect. Couldn't Environments coexist with Projects? Maybe someone could > elaborate what is the problem, what can be done? > >From UI perspective, currently stock image is one click away from debugger > popup. > regards, > Vaidotas > From commits at source.squeak.org Mon Jul 20 19:25:59 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 20 19:26:01 2015 Subject: [squeak-dev] The Trunk: System-cmm.755.mcz Message-ID: Chris Muller uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-cmm.755.mcz ==================== Summary ==================== Name: System-cmm.755 Author: cmm Time: 20 July 2015, 2:25:20.981 pm UUID: 874d786b-5d3e-4338-8552-0a22f651fe33 Ancestors: System-cmm.754 Remove references to ObjectHistory, because Spur cannot support it. =============== Diff against System-cmm.754 =============== Item was removed: - ----- Method: Object>>oopAge (in category '*system-support') ----- - oopAge - ^ ObjectHistory current ageOf: self! Item was removed: - ----- Method: Object>>oopTimestamp (in category '*system-support') ----- - oopTimestamp - ^ ObjectHistory current timestampOf: self! From commits at source.squeak.org Mon Jul 20 19:30:26 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 20 19:30:28 2015 Subject: [squeak-dev] The Trunk: ReleaseBuilder-cmm.127.mcz Message-ID: Chris Muller uploaded a new version of ReleaseBuilder to project The Trunk: http://source.squeak.org/trunk/ReleaseBuilder-cmm.127.mcz ==================== Summary ==================== Name: ReleaseBuilder-cmm.127 Author: cmm Time: 20 July 2015, 2:30:19.147 pm UUID: f5862f3f-3989-4381-8924-e39fdf731300 Ancestors: ReleaseBuilder-cmm.126 - Use the same contents of setPreferences46 for this 5.0 release, but remove the version-specific nomenclature. - Update the system versionString to Squeak5.0. =============== Diff against ReleaseBuilder-cmm.126 =============== Item was removed: - ----- Method: ReleaseBuilder class>>projectBackground45 (in category 'resources') ----- - projectBackground45 - - ^ Form fromBinaryStream: 'iVBORw0KGgoAAAANSUhEUgAAAGYAAABXCAYAAAD2+TBqAAAvWUlEQVR4Xl3d19ocRZKA4b7/ - k72BPRqz45YBZkAIhDzyXkLe/0hIyOIlJEFtvdn9NbVzUE+XzYwMnxGR2audB+emR998OT1/ - eWP66uH56fzFvdPFL/dP9786Oz1+cnl69uL69ODrC9PV61+M32s3jozj7Pk905Vrh6cjx/41 - 3b57cjp24qNxfHnl4HTy9CfTmXOfjXd8d+7C59OtOyemC5f2jXtPnl0d7965d2p6/ebhuK+N - l9/dGv0fP/nxdP3m0enS5QOj/2+eXhnf+cZ72nTuOZjv3j893n/6/Np0+uyn04lTu6a3vz6e - btw6Nt758ef7072dM+N6mp5P3/1wZ8D09eNLY5za/uXt1+Mc/N5x/fPrr6Zvv789DrB6H4xg - gAP9Xr4y4+XhpenZ85vTo8dXxvH8xa3p60eXpxs3T0wvv70znb+wfzp1+rNx/9btU9O168em - na8uTO9+fTpdvXZ8evrs1vTrby+m23fOTtdvnJzevH06rQz68tVDAyAEevXLgzEowAPUYCDC - gP06IAAhDRjQAP7hp3vjW4h076dXO+PXtcM3COvdm7ePD2Q49IuIkInQEIg4+oN07foFI4J/ - cfTD8T6EnzqzexAR0hDKN9rWpl/t+S5G8hwB3def7w998f7oz+G+dhHNe34PH/lgnGsPbPD1 - 8NHFwWj6PnFy94zcowPZFy8dnI6f+GTcu37j+HT33tnp4KEPpiNHP5rOnts7I/70eNczBL1w - 8cBM1MvT/Z2L052756Zz5w+MA4FWkIsgqK9jiHvx7c3RucH4JTkOQBnc/oP/OxCxM0ube5/v - +9tW6gzEABHVwCEFYg0OYd68ezQ4DuFIjv78OhAQIRw48/sf7w64tI2wYP1tejo42fvu6d/h - G+/rw7UxQCb4SWTn/Wofco3Z2Pz6Vpv6NDYwuo5BtesaPJ5hxFevv55e//JoKymPv7k6JIUU - 3bt/btz76sHFQSTX3zy5Ns4ffv3l9MOPO9PNWyfHt965c/fMkKj7O+enFWAgCiCQBCgcaOAG - CyjXAPOewUA27j1w6L2h9gDrGQ4yaN8cPPzPcc9z77tGKARyrj0ExP0kVP9Hj/97DFrfuNU7 - 7377ZisJpJg0aA9iIArnG4PvcT3m6D1wRSDnxqNNY/CNdl1ry3lE1iYVi3jgdy9V71v3++bF - y9vTk6fXhyRQZ5ANye5D+Okze8a9X948HhKCID/+9NVWxfnWd1Tb9z/cH4T88vLhaaVDg4Aw - qgdidWiQCIUAOAqXegY4nAnwCOI8AkOKdwGeunMvhOgLByMItZhK8qtPRPMLmdSW9xGJhILF - e6k+7aSeIJAkJwG+1Z8+PAe3AzOkumpnz96/bm0aiU+VOpI47xqfdzCQX31e+vLQdOXqkUEA - v9TZseO7hiQgwr797w0JgPxz5/eNe5BPoqg80oaoh7/417j/86uHg2ArnQLEAAwEgAaXqkAE - SAUYQDN8dLdrxh9HQS7k+Ta16L24MJVloFRA9kP7SRlVhsN96xqBIdm5A4zgdQ/htYEhEM89 - /ZJasCAiVex975GoDHhEqn33MA+4tAcGDgC44cQ7SZ9z8PoGYUgF9YXznSMCVcWe+HUfotmZ - iPfFkX+Pc8QhHYjLBrFTvnd/pQPIgSQIMfhEF2JxfLrYu4DCVQZN7eBsBPKO57gbVxqAd1wj - Yh6S9iEZM7iG4O7pC/IMGCIREmLZJTBqE8LAmienT7DmPaXiwEtF+oXQCBuBMCBGADemQ6gM - f9+7N03PRh+pRn3pWxvsHZvANnz3/b0hDQjx9t2TgVzP2CBqy7Pu8dgQ0TVJSb0hEmnT3grA - AIMMiAgBiILziC1AcBIipGcNMIPoGkK4mJADeO9DoOfuaTfDm53SfoQMKQ5c7/AOO+YZafQM - MiGJpOYkcD4wC0bRvl/IdA/sCGKM2kwFudY+pvLrPc/AhpFSc6Sw77WNONqhKjHGyVOfDvUF - +VQT1YXzSQUXmTTxwrzD9vDGSAWb4pqj4JpKo+5I2SBM6sBgdARAg25+srQvCAdAv75LLRho - Rpi9yZbgWEjPWFMXuNdAEQ8hEZikOJqTaGfMEWYE4VxtuNYOIkCK8wgJDrAmnZANeZgu+6ZN - DNL8rDHlbGgDLAgNtlzk1LbrHCPX8DQckZkI3353d9p/4J8D+aSBywzhDirKNQkhTRBPUqg6 - v5wbfWI4mgF8xrzSGQAyktmC9LxBxNWQBxhS4D4E4KBUzt79fx+cPYzizH3NGSBAewaE4BlX - 5/sO/GMMFsE/+fRP4x3tI1J6Pe8QnK4NArw5Ekk7+HLvfeM9/bI3kI443nUPIc1hfN8k0z3n - YE9t6RNTQZq2wap9v+Bn5HlbpIUEZPSn6eXWbpAYEuIgDe7lxemT5oAPMMIXLbHSgc4BD1BA - NbhsCATgUoNAOFzUNc5M1xtwkzCI0hEExY2Q7j5mgACSRcW57/AOhDdxRDT3SaM+89QQURvN - T/LM3POt++AAd3OpvDb3PNNmDKSvvDTIdu0cfDw2RCN1Dn0gGqIPJ2ImBgRzh83kzVVIAylC - JAd1Rl15F3GoOFKEOMZnDOFZ+9pdxRE8EhySl4IoXvAM8ZoHFBHAuQ7A7mzCOhp1jbDZnr4x - UIOJ6w3W+/olZc4Zds/i3AgAHjA4MvQITAVQScGkP3Ak0UUl3ANj3h04qNFgwxze8evbVGBT - CN/mAKXuaZHhyc7GnFcFyYhCPVFhPDH3HNSYZ0+f3RjzG+quOQu8ciJIJNwZP5ysiA6AAGLQ - BuIFSMBpGWWAp48BnHoKUYiIOyGzSEFc2aBIpf5SmzgTF2fsM876x0nNa0ICoqbj9QNBhYx8 - q32I85z0M/7ew1xNCYxVH+BoVu9bttG34MIgfl2zk95rAr6MNhg7tcUFZvx/+vnBVmIg35wE - AUiPe94jKVQc6eGB6fvsec7Xvhn+2SO7d3JcD4kBQCqiiVaz/aFHN2JmsIAzcA36RYzEEQES - S+cRN98fgryL01OVBlygFLJiCm04RxQwQIjvC5bGQNoFm3ZJV0FOY6EKEYR05kW5/9nnf/l/ - sTBjKAphXNpzUJFgKUaHyYobgkG7EMzG7N33v9Onn/11OACIcPTYx9Oez/8+JMrBFUYQaoxE - IVzOyrUb5pDwZjwXZmY5s57HQBLASE2eQXaCQS1+hkMyisTNd83sSY17TUghHOdRNdqjOryH - GBEn2+N58anUkL69bx5R7M59fVNB2tV3XhS4vI/zU1H6zGPTR6EbR+pW21vuX/Sx9OIKR/Us - b3TgbrYfJIUKY9hJCOmhvpyb37A9ucPmNe4hlv708eJbbdJAp2eh2D+ItGp2v5wJ8wpwLEQz - flSGI48p17TwB2TjpiaaGfBlhMAAER/nea4vA9YPAiIMVzibkEqkSnB9ahP3atN5HBfxU8vF - 41JBvEXvI3bf6pd0ZMNIlz6MmZQgrPe99+v0ZMBY3BBMGHgN+8th0BHDOeSToml6sSWAZ+41 - 30FA0gU+hLl6/fAsoQfmPm/POCHJe6YVpBVugYDEGCEgl7hCsAYysoUkICbVkdsdQRAwdYj7 - nCN+4Rnvl18pzFO+JvUDceDST6Ej50UU3EOovKtUTnG17E6SsPQUSxU0Z4oRSWHpBwQ0tuZT - BUqNyThdL3NAxlb4yrNUYzFGk/XwVf7JuAs1xVwYa1WcqnA3QAFX6MJ1EzEd5335JpEnJTou - 94KAfnUKCdkP1wUcM8DazkZRK+DwTuov9RND6DO1E7yeNe8xWAci9C1Gg5QiHODIPUbI5lik - jORAkva9i6BLt1tfpTIwa2pOP80Hs48OcGgHrM6L45UTyg7qrzFpY1WDzcghmWooxI9IgIPI - DHkRWggI6UVjC20UkfXMOWQXTXYOyNzjvCWE0AYkIaj+cXWBTW012cSJ5Wkg3T2z6OyUc4zl - uqBsMTDSlqueOobomNTYC+9E7IK68AFf2TLvglt/4CuSgSgFR7VvLNSfdzkx2qcS4UBbvtG3 - Z65XkJdXgpJN1gAP+QaXmkAYwLlXnAvHpU6aFWckAevXwCDBt3GGftkyRCNdANUmLkIY7UE+ - j6wJpsFRY/UdM3i3w7dlKyHHWPxqHxH0bazNi9IWzcvAAv5m4eCr7ybQxps3u4wjlp9yv4mq - PuCoEFfpdu2lthyuMyu+WwVsXofz8vsonlezdIUBXxaxuY3fIrjNSXRMPQBG54Vi0rG41DdJ - WSrS/f8MSHofrKmqJpTBWOq6eVLByCaFRR7AUS4o1apvB5XlfgQpgoAQmGM5+0eAvLOICKYm - w01K83oLDJcpTYoar/czDca9ys3UGNHENWUlHQYBoSWJTAgLzRRGB2xOAwDLEEYwHaZ2AKYd - 14ibKil/kl2hwspGNp8Amz48J4FJKXXgHilCNAMtDgaJeV5FxisOyaaVp6m/VBeVggmp2TxW - jFk6Qbuew4FzM3iqCCzOvQd2Y9KXMWlL28sohbaK9zm0sUqUSvuiKu6o8ALCigZDRiEKCNIR - MYUEDefbe7cij8InkA44wCa2f/jTf41JlYP/buZ75hw7NU/EznwyS9t7s/2gEj4a1w7n3vMO - F7NCEsiOifTF7mAiDBWsSW6RdO9ypd1DDAzjnZJuhV6aUpSqyLMqIJsnWPoidZVNLe7me3Cl - ZmmVXbv/OO7lAPlWu1vjny5OHLMFgKoipGQRoJ17D8dk5ByFxrVn0AZWcg3x3PdtDgYffucB - cT43CHT77omZqGzU9THpcl+Ywn0z4sdPvhwTspffsQfXtpPUose4z3iK50Fyqe+mAJBchBoM - nmEYxPF9EQvMBdkQZ44FwRWZxISl17PFudkRKfxqL0nxbXA1v4qRs32rQvsAK7RODKk1jacm - MugVahgEafK8erS4yjkA/Jba1SlEIE7zJO1B8vWbRwbyf3n7cIQkEOPdb4/HZIuEODcrJk1v - 3n09iHPk2IfjW3CWmwd3M3ZwVZMWgfKGmmeAl4NS1Dt161vtaQuMog9V0DjHwFXz+JZHBcnF - 8TBd7rtn+gUL+IqqUG/eyaMDI3wXeF1llPOEqtlqnlGQ0MCKwhbjQpi4q3RwvrzGC5sUujG4 - JpkFIh98fX5WnR+Pg2oSwPvi6AezhL0/I3z3IAaVRnUhINVGpYkvUWmlJJLo4lnNfSC5yZ7+ - SXWSDpkkPBVHuo276IYDMlMxpRbgqwKP3PFwoO8YUVtwUCqFu6wdcBGETIb3w2NJs6HK8rUr - oijf7h6xXQb1NOY3L4S6SocmDaVtdd5ELa5rotV8ouK6ZuIVFDZnylPM+8uVNZhCJqlTz9hB - 72fgc3W1yxaWaU09I2r9F21o3gVG3+z+7M/bejXfFScsolDoCT7AllPimyay2vNObncBVyEv - 91N9TXpXBfF8qEMckrtJBDOMvec8ianKpVl/yHQNMZDQ3KMCDAegCp0XSQjRTbR8XykUqUUs - Ym8w1YlVGtukN3tWGnqZzi58X5EFBgIbQ5u3tkx3hGRjBBPJ870+XOvDN2CKafQBh753Hy4L - loq3lbdaFoPkKMERwhif9lcmRYlzaeEOzwCe57PMMlYcgZsckFOYvioZnSIcBGVM3WtGj1tK - +xYWacKoLV7VMvdiMH4ZYwdpFsLHYc5zLgyw2F/FiY1B37moEI3IFf95VgTckaHWptBJFajF - w5rXaR88xg4GjoL+vOu8uZTxNgfLPiMklVqfZWpXEFdopTlN5bAoWllps+lKkZocVXUJMR2J - McAAjPAGhavo2Yo5tF1evgJzfRsEg1jyDsBlKzPkxeUMrtKl5jDGoZ9SFpXflidKJRmPtnsW - TMvIgLHmZVUKZWxFxqsYSlKrzatGGyxwUo0CRi/SAjef7vmf7eS1sXs2vDKAV5GJy5roFFUG - YPW+y5xIbrKBNonLhlT3W4wJp1fk7RxCcq8z1FU5Gpg2cZ9r/TaoJA4zFMYvZBPCIFD7TXhz - i1NL2Qv9L/MsfrWH85u9Y8i80qYQvimY6j1c3yoC7WIwDK8vKi1nooJHvwi8jHQnuanAVZk7 - DwHE2OXduPYB5ET9osS4C9DlaIoOFCavhqxQeLGoZr4QV66/6vxC9S3dWKpQfcY4lfS6V4wP - LGDGjb2DkMWyckryOhGvVHiwJyFLlet7k0DwxEDFyiJcklLlp3HmKGWrKiosFJQtS/1le3yv - WmglkaMoQD5aJYdqdOU11UF5Jq+tUM07Ej5VpjukSRUZuFeJZ0khSxAkhNRSuadoQamovLfc - uKRSIQzIcJ5z4WgegRMxRRlShM376nlqr8laKweWaezCRanHsVRkzseXfQS7Mbtn3FW/yDqW - DIMD5UhSw36byBZnq6IzaUVEhG+ul5qv6KU4Xhnj8lWrgZw5NQp5UqCAUOEBsDdvvxmdQ7h3 - KvWswkPFx29C9/MvAkG6ch3XUq4yet5FODlvTKDyXTmoe6NCceYW6jIHpLkOKSnehrMhFLIr - QEco0QTSXBSBBHof1+NW6qVoRjaPROYul7PHJFVKIo66YuNwDm54kI2sFEkJLMZd14892wZQ - 2bXsJJj0jwEQzjNIx1hJonFSd5XqIloxtJXOcAtgdKqQQJlnlYQKCtwHmGp1BHGuwgMREVSB - QbW4Ds9xlu8RwveVhiJa7/mmpRdUQ/EmIp7v34R1mctpYHFllThlAAu98Iiqma7itARfAUnM - ZkwKKkhL+XtjQDCEMW5jwKAOBHR/MPAm3a3f5i15aMEZc2A2Ul46goOT05D6LWqyIpKOuAVh - AAFgnbeopgU5nlN3iEm8K98hHaTH8yTm873/GAQxGGrMgN03IFUkJKyZOyQhUC5unlIeYp5j - dioDzFgWSvcNBHiXAa3UtbKmIskFbkkMdYsADhKMQTGa8RkXHOz65M8Dfs+reiHxCApGhC9t - DfYchBZrFT9kd8pgYkKEMiVpFYUD0RBzhUsgLO6HWEimbgBH3ypawzUIUXlni3KogKTO4AzA - e4iEaIiA4J5V5V7drr6r4WIPnBdRwE0GTV3Rud4xiMqW3v/wv7eVl+YYGV5zhdRVKsw31GXz - FoRmo8YsfYYffCQb4505+/n4jaFIDtUFVnB7r5VhnpU+Zq/KlJpoFmbBIMu4GearxLZEmecm - oDlFY+Yf9yKKuic1uDgCITJyuAOwDCGEuwdAyK1O17sI5t6hwx+O5QU4z2Egvsd9VIbDPdIT - B1cLBvnVqhUeoZJajFqoHXdVqV9Kt/LdjK92Kt1NSpYrGzwzHozUYqJ1tcuLQSxMlIQgGOZD - EOMAO81QxnLptusHnBWyfPzJH8a4mmiWws74OzAOorBRYBteGaRCnI5xBa7HMQBzD3K9o7LQ - ewhAonAbwrgPWN8AtgJqjgWiejcPD0ER1rsHDr6/rX3Onc29NAgGtEwpwHFiqqx6gdbMVMzn - HGdCGCnM62tNCw5nA4ouGAuGxJgkBNMYP8bMbmJcOBhFevN918Y+GGxTfF9srTTEsmYtKY8B - wYOQyxXXRVswlWcr4sjroI4gLpUGqa4BiziAAFCAAzRisBUkjRvsHUTBURwEnFYxNSYgobnL - +srlheBqA6gbUrFccYbz0uF5bKV8izhU6tRKguZkBm/AELgusLs53OvBuRsXmSSAyXjhAsyY - zj3MBhfOU9OIhskQvsxvSzuqT0MQsGAW4ygq7b3GY+wttuo9v6uWCkAwaYFw5Z756xDtGSBw - P1HPr0e8VlIhBOBzjz3n4fglMQ3a+5ChD0e6tgK8uLm4XVlGiK6osAEu5w6VKxUQrWagYouW - gFQa1RI+RCAVYCYR4GVXjdH43DNmlZSpa2N0H744HMX1CvuzES2X12eGHxOBuYBlcbXSCUk2 - yV9BJsQ78rIy1s67B8k4HiflXuIkog1YXMQGRdCWUyMG4rZcwQos7/h29LlJMTTzrkqlOrLm - MpXOFuku1FMcrRhfxSWFTNLZuLpoA0Tk2RmHMZIasJL8JtuuMSqbaWGSd1N9DuqsYsbmIPVf - HLF9AYqo96xCfNdFlQtdYbxVi2lwcrbBRBOXkIJff3s2uAp388IglipDHMClztoJokp27dWm - QeLIPJvmCWN2PRMiiWFDMogAx3kkiMdS5SY1AMEVuBtMxrysanVfLVmvisWzgoXlbzCUcWK+ - xty6liIhGM4vxspuwpHzwivVu+mrFd2lKkonYJ7SC5jLt8ZSsLVxGOOqnR10DMGQz8bgetxC - Uog24ADuHECeQ67vHNrAUVSeoza9a/DNoqm1llaPSMA8IMivBgvCEQDSWkC0TEu3gizOqvCh - +J6BZ1ArN0Jw19ot+FoexjiyJ83TwEhdkRzXDtLTO+Y+bKdvEbtS4RKK5YMqpCxaXX0AKWNX - wEFaqlKiDknyWB8D2a0JLC5GIiDNPQhEIICkwqgmhCJpLaUGOGlBDIZRG9pujxWE8T6iO9c+ - VQCgJmNV4xTZxknFx4rWlnpt+bdQR/cKjWRrmtuU9tZ2FZ3NOXiGYCfxfmkEDJQKtsiVc9Nq - 4zZMgCeMWdKwiHgFF8tClsYY4ZZLVcqk5rh0PWJlkNmMvQBkUkJiIJJoI1AA8qwA73tc5Dni - GUg2Rlva9bx+vKP9iIUYLQ+kClo7yVC2qU7rWXCfCSTO9w5urWg8T6wlGFXlI1JVLZ61iZB+ - x6rkmVEwW1X5EI4Zk+iWUjQ9oFWce0bblFiDcPBRwWVyXVe/ZnzVQsQg2ZkiA4gVQ61wCMDa - dAZi29kB4nTe/CRC8VicA7DgHmlq5ZTBttuDb1MVRaPdw5XOly5wyIWwZQF4tQTFy/L1WxpS - XVlpgzKc2RQDrgqzEE85d8h25LSwicZnCkE6MCFNYCwkiLvv3dRcsbllqe4ynbDMbLqfl4gQ - NIAxVTpV3mtMMBn3lqYxarg6dQZQnlU7PADQPe81Actt9NxgtOfcdwxkNkmb2uZ2mpD6BtEN - KqBw93K3imbthfQrtsjTKvFU4XfrYSJGM+1SBBBVDVrr/5urGCMGay1lO124P1TWfJ49dY5B - B842dc9CSHldrXBYepyV7FZ11K5PlQdngypkGTN/1A9ZEA+hOAchWgmFuxGrqAA1hut10pqW - uDqqQw5OMQ/Bve3lUuq4yV7zChxUBJY3UyWo99rnpdQudQYR4AQziSXBxkDSczKaHEIiJBsv - ArTLEcJ4RgOQbM4Pddvs3kFajBWxfOudVF/LyKk89xEVLostahfu4BhMMT4m1kbM2PITzDiM - vxA/RGssO1KU2YdFlzWG+3FKCz5JTquiKtouVV3lCf2Lg1pU2hpOnFHOu+wl++Ge78p9U02t - cNNHXlslpgwzAw5BkJiqAXsq0zVJiLHaBAHCqHLvOvdbILZ4mDFS8cNR2aRHpEL05zoHQfsI - 2oSdDQaLe3CaJLoP58UM22etAnjjGkHMfPURUJw7wn0GYlAIVeyM3UHxQjAClzrM4yEx3D2c - naRUi1bAMO+rUtDKntrRqZUGeTW9X5mTe6m1gpbZtrKQyzQGDsdE1Gszea4899215yTKWMo5 - CWCm2rRb4DLHwDPn2iERvoEf98vh+HYsFV+YBu+GV8/BCIYmpiXRKgYZ7rKPil+RiDarIW51 - BEAcgJMQDAeNmf2mBqsocbmRanuLnlZJEmeYNLaXWJ6KttqZiQS13IMUeaeFTevNd56v19PM - nJvXCEHF5cBrLJgJl0MSrYDDMZuxmdEvQ1EhOMkqEgAfqXNSpR1EIx2IXvQ8wpTxxRSu2zsG - 04MH8UtlV1edZmm6sCrHXYg/I59v7/4y/+8ckGzP2AtyU37UKuEKu0sctRqs1HA5Bwfvq7oy - 122x1SKmKiQjsvMmknlnYAUb5LVdSHMQzFPopOArBJaJhDQIYg98W66pKIXnRd8xZOnx6hr0 - 1bukAfIjbPtj+iat5NukFFxDejaLgqnolnOMeQz9DLiSXRnIElp0pM5Q32CJPOdAiAaBCj62 - qKhcSOvvqbgW6bQMzrsV8CUp6ddWhbVusrRwC2hbENQeliE4FVwCrvR1Qcj2FaM+cgaoNIf3 - GOnqEIzV2LRHIkiIbytEyZjrt33HIBlRi8QnddorxIMBEKQdM7xrvEUvWmY41mCipk4BqoM8 - FQAUsm+3h/I2DufuVeFe6Wnxn4KEVE8BxGq4chnTq6WAK/TOeWh5YDVdVdLw+7XpPsRRIcYA - zgomWsINAdRKISbcivGEVfLCeF0FJhly43ZIjTPUxQS1kRfnW4REEIQuylFaPXxiCJLkNzh9 - hxGGpM3MZUxUdtGAESsbOZHNHKMPU1eJaZuleUfHOQs4qSpHhMltbvl021PFFSZaxZJwB4lo - EubwXfuUUYE8tzblyS1vKV6+P66sqqVKHbawBB/CuK78qsxsM/dKsop8sAHLLXpDcIHXbAv7 - pM/mdhGreFs7/aVai4ZwovTLefDMuKsxo84Kwo58TN4GoHFGgbt2PtWYwVFh3jUonsxwL2ek - te4DwlF/GeYu3FAGrzhRDkETwiofW2uZlLR6TTt5Y6VnxzLCTTIPjGCGLMg2LsRpt1ZSA7EY - 0Xmzes9xL6SlxooAlOxrDoJwCMN4N3HWH0ZNs7iHKO2wlA1LtWkrczE00WZaUDSj81Uh+wx7 - olpOu2CljjTql+9f/RWkaZwhR/3synJ11bJQuw2l2x+spXSkrixjqYCWUPznEozKlnyXuvKr - aKKdjTARz8u4wJnqobY4A+7jXCorA59NyPkpDWLM3i2gyy5rZyTKNlEN53BZMQpC6t85PJZA - 5DS5X8VQtdftrpinumrn02bzeTAGSywNKu5JtIsUj1TrYnWuw3k1yJXWlpWskK81McviiAr2 - eGYt10PgylzbQaIIrfeb+YMboiCVJECAcRhDEfIiFrg41ed93F4RBuSVl3EUimlbq1SasXeu - n1Il+q5uQt8movohsRjBvaLxNNCos1hkN5croleV5iztR+WhOiAdAMYBbfQM+MQeMXAvg2Vu - Eve3rcmy3qvCN+8XjW0OkzrTTtt04aZiTS27RvjlntCQhgsRA1zp9VznotzNzUohG6cxOcq1 - IEbjShKbnxQngxdqTJ/tQZaNzpP1W4C3suGqkDCHPkiqZ20B1r4KxdNWeVwhHMXbWbvIsk5J - Fi+FDfJOKgDSSESeFsq3n1nloG3X2FylUthWmvWtcxyDgxDLuy3UrSypSsrSBAbXbq0Q9tme - vw3EsIHghAzMV0mW+wjDeHNecLM2jL8abgxq/KTMt6XflyW0cAZfnI32Va6qJm2C0HCXJIOv - +ogIjdlawl56fSwnp7ZwhYbKZy8NlOsmX+ldgDTpSpW19wwELtf9I1ohl/LwrfKC3DyvqjGr - AaueGcEAmuvdBgxtu2WQ7REGESGtjCwYqS9EcY2hqJFsirEWP8sBaq9+424iDUdtEa+NagWa - NDb7zxFo1z+S4zyJ1Ka+ttv7bv47oOXrmI8tXWU/ymLmGrtGYWKde8yb8cxgATmq+DfbMxbM - hCwqbRl+yf1tf5jmOUlAHllBy1Z+le2rzjh71M5L498sNmqiIkIIN0fZ/elftpWfSRXYlzXU - FVxArAMujDsJooowZoRb1uDpD4FLO7suyu27zACCIGR/tuC9iD4YflMgWOC2FXErSM91RFGi - S282mDZqBlx6FZfxLAyycAwfXGih1G6ViYjQ9vDtqVygs8Wxhb4LWLaHprRxmco23mlDVe9D - ZEFCkgJR4AMnpoIgE9D+RmRpgHmb/eEB97dCRd9WV1egMy9VH21YXVrd4f2MemYBDp0XX9R2 - FaypR++07J3dxNAt619VBdhqqahHhbTitp2XKilqK8YWqlYoEaILq7RNYQUIJKP5TXVglotf - uXZobL7wyad/3P7LBvsy1jbOYaACrZDRgBypj5JVy40jKh+qCAOTtGC31W3Dc9wUMZZOLqCZ - 9IkElEaH/KLEpA2CI8hSNYKzsNBy5u+bIgxNfCu/JV3DGZjHo/9VyK7SI4AbXDZEUHHpui43 - 02kLwbZhzJa0m9FyE5z+D8a362Xlp8f6/bv3T42dL4pCb6vyLQ7aqKuKJNa2cP82b9KfCLUn - THt16qOlf01sI952S/xN5UuByQKd7Y8MqRDowPEkaxkPK3dV8o1EcSx8W1ShiHxho6LUhbZS - a65LCYxNfogPTq7ADuJbNAuZ4ldtcVW2sZl74eqhWjZ/NdJqY9/j0DbTWW7f3h/58MTshoFA - r375akgTBBb+NhActkw/ANwf4ZAkE0nqoP+DKQPYxg8IQCW2s1HbhLRsm0ou40kCIIgtzYhT - idShezlBpHb5TsRdTiZ5fBU1BnPwt4KgrX4r+cozpk5X5Tfa079KR2qs5dA8B1lECG+HiOq3 - KjLwbttNlRJu/5UWGRVKWS5BuHz14LTvwN/ntu109/mWaKlOwFIxkFcaYs1pv3NZi5eaJ2GA - igXB2xL4loAbmzGNKPbGa0sFVR3j131IgvAykMW+qB7PW0GHeUhLeyuXs9JucTTPTTpTmZ61 - PzM4TE8Kf61IQpO1ljkXj1ouL09KKpRotXEeVVs8dVTC2oKjVjrnvbleb+uxf2z0Y0Of9fa2 - a7XYOpZC8AaLC1Mdz1/c2VaqtB9OW72PUM3MbBisDGGqrEKNCiRSNy1pbMlJhRlDVc42AOez - GxwC0oXDEa2lj6QHAVqFlnpsfpXnt5b2M9saafcqSc6ZGH+6UCSYt1Rxdpu9Fe9K7zcHiTip - C+f9HRW12Ba/hVfaM7mVwi05X/+T0rGxac/Pr3eGE9BfULWJA8QbRN5OZUY//vTw95VqG08w - SU7ywQee5TUGQvjWRCJKQcwWbTVzh3ieGMZw3T7+VfojomekBYy8O8TkUFSAD+mFsBBFOwji - /by/8mCYr7TEqtAJVdP+xVVEts+M30L4Le1ux9dCCEsVYQ1+WzhCFJXSNsEtm674DTFs2MPG - rPcgO7jdPGdUxGz0bnOpCOWf8DKa1Ze1Urk5UNun5J63DrKN7sY/EG6K3KmXYmjNOZIkiPc8 - m9OEEizsT4mzvMeylr51ZEswUUsp3W8xcY5DcyVtrXJrKwKgh4tftUyOYWc0Kzdqk5727sfh - jvYBW2507dy31Vy1HRSboF0qzPZX9iNz3sZsLbnAodzHwuotm7h2/fcUcZuntltr0YP2HGhd - Z0V+qd5Rmb8plCiI2X+FQVJrZlJniLMsECw1whkgJaLOGfmxPfzGdjXXKeGW9CNyRR+VNuUM - rEhB23rkXrZMobUm7TBUuCCbk9tr8C2dbuMD7zQPalVu22w1l1iHW+6PjeO4zK/fPNiujSSp - Iyu6+euPjHPhkctXjm7XdVYJSV213WLeGQajtpIe99onxoSugCXV0wKu5T79VZ2WRCyO2NKU - lgR2RIQm6FXrFDsrYq1dNpPEtqs5wvuOp7nqXy+WG4Eud05d/rFBf7Cz3NsLQhT08djahbyd - M9pZKUcgSdRHKtQEkzfGK+MEFClA7BFV3swvqhTFnWsjenWb6GrJA+lta8X+GKhN5lyDuVhe - u9HygPrXpNIcVFm12PVd4LEJbnMZ33jWIqcyns30ScPyr7AKaeVYUG+lKIrtaXfV5mXVcbUV - bg5B4l+gsj94o5qqqo8D24u/HH7bWLE5ZSO50dWIkazmMH5JznJpuHMz7yruxcAcAPenngUR - 2yEJvFz0lgDqt9XLZVjzIqvmSQohvRl6gdqWlI/Q08ZrqlSqfA6ENgHG7dRU1TUV02dvqvKs - LjxPrTQ+qalmYNWm0FSQc9zd3l+Q099cOcrpk4pWUbXUroljy7tVWDbPKUqQO95Sg/UW9Z/N - avPOsC929WvRaH/aA2gc19YhBrIOg9zcIql8TfudYQywV+SwLQ7c2M2KOsaEeW6jxFh/mpA9 - w/FJDgK1WLiqTN+EyAiR1PiuySVitVCrpZIRkxdYyVOF7FIXq3amoIPbM7ly1vYQK9pbXVfG - tGhoxdNVSraBW4tE2y4X0qo3a08Y2yvaTtFE01aK1OLyf51L/xp0+n2dL18vQRzhmU2hR2W0 - xe0K6/T/Au0c2xRAQLS2K5dtMll5EdXCsBcv0/9yxQJpy42OEKVPiiRnO5IY0lN6ocIQxM79 - d38VR7elR3s5GmwlSQboHBe290nS0jIKbXCVqZE8sXYCb1/JkkDZobVxtkv5pa1X1oRUG+Yg - DGThj6V6uXFzvTkRQ1l51PJ/B4oBtu9yf8rWWFr11UKq1GKlW80zMswt6irk0mSxIsnsX65x - C5uqmy7Hn9vfxkfL8t6WHI55TFsKQhKxJ96tGl7+S8Uy89ifvbWdVos82+EoV7pVvP3/ZVuu - t8GCw86xzWWctyKg2T+OIv5Fa0OKWBk1N1K1m0RTaxmNhR1sR4r+4rG43nID6/a2qRaNWqko - pY1/imNV5NdeB21uBNmlmJd/VtpEtUlkgdHSE74ndam31Cf1tirwhyhtmd7/o4yto35e75M5 - KLuZYTdZKyffyqhpsxMTqcARLcGDiP4jM7VXgmxtw9abhvZPExFmuNWzOkAMiCHmGctmymuV - e3psDwxmbZYthSSOQ6qihbstLR8bA83SUkZTuyGNXTAvKdzSqjPRgFLrrSyrwmgk2Gb8VBze - XqBlJyMM1eg78HFmqiCl6sqMrgzKxtLr/Y7Pr5ehbZJhAPr51aMB7Mtv10mndoz9bZ4DVNXR - bkzrouwLm2XmB8Z9wOi8DeXYE32REvatVb84x95mEDn+pXuzPpE0cHlbQFu983oeZF7EHol4 - r/8Qp2Scds5fODi8t4uXuKCHxn/nOwqEps//syx4WfsADxBZwV5bmFQXVmlvtlZ4yZbF/jUJ - fOZnIhqcnGGbN8UZJB58Ozw4Ns5GF3Obru/P8KwM7N7OyWF8GeJKRg3k7btnM3FuDCTv+uQv - oxij5RUMtc2q0/3yI8eO754N6J65jb3b/6VvodDvC2APD7Vlj2UBTAMnxu0BRkLZleXG28vt - GcEpb2Oncgi4fvPw9PCxrRYvjHFUZvrosWXgJpAPZ/WgIF4VpfIkpao7wwNqblGhRLN/59QX - uNpsIttQerl9d9qZo1psBMEkd+7ZY1Na3Xzs2LgPbu0a37Pntwduf1ULpzSZhjFHm/u4MDsG - q9dv5OsvD2QJKLarhbD642+uDyMrLhWH9d8tQvVPn1/dclX/zVVtloEX5Bt/F7X5d6K3vz4a - O5GTUoFLnN0qZl5RRdXmI+0vs/xvl9barNc+qjt7fzp7YdcgyuMnF7f2DUdijCtXjw0mMZ4v - Lx+Zme6jbU0XSSbpubfmSmNHpc1+BWCHfOctayxx5xlmyp1vJ0E49A99l6/uHwQBF6aRCESc - lkZiZPCQktPzuB0k5/q1L6ZDB9+bVvsP/m2WlF1DtYzw+SbsbEB3761FjnrCMbi5bdjpdAhr - 6VsBPwimJ5sd08X97zGVBECzfSLOExsRgc1S7lEStdldon+9aLVvReUVB64rFo/NCJkdgftH - BxL8R0Bbf2Aq8K/d6itDgqi15aqG8jlt7VV1TPGsZQ1Y+f5lRSrNUl1y8TpaZL2bup2j9sxw - k/RTA18IM/YeGJlK/0I+ExKheWjSGSatM2FuXD/iL31PDe5lbKtsBCRq0s247cjRXVuj2DbA - 663f1wXSVBfA+fpVj1SKU2o3NQZANoYudt7/T0aEdeT4xtbLKRRTzgKDZBPWm+tcm67fsvbz - 4Ghvu57mEbVzZtgUREKgsp5tvdhqgjK1xQy7bidy1+120VodbYx/JtxUphrDOgpibzQphjvj - oI2oNmM2Heh/cspwsik/zlrm1c87sxqbx/rkyvTu7ZzBpOvXRmrzbxibUAEdaHD04KvXj7e5 - hXUM7NI4xrZUY73M86GXdUZttWVVq8NEj588W3tPVKY/SyhwySaIFLRGpiXbVZjg0o93/WlM - yBCKWqGCMIGQy4lTSnE/GGqNBLbj3toGfDYk3ziosrEoaUZuG3f37+nVB/CmOBYh3TstC6lu - oI1QW85ePR7GXG+tf2jAwbacPb97SAs7iJExTvutweUo4p+llQq7f2+2o/fnnM3DOYH28uZ6 - gpmLaR4AIesarQvDI5OQYiwhyWKl9W4Te4eLy3iv1yM+GMAR79a7r8uU9g9AvV/RhYAlQlWH - bNDNxh2tCG7eUuAw+8U7pJKogjEHGQM+vnUqivctt4iEhHIm6/9T2z2cF/Dwlhw8Okwao3Iy - wG+cVK9z4/DMOZU1ahM2RYBjddpYp7+O+e08OD2kmA1EpJu3jwxC6Xv97x/r9Dpi3Ll9YhyI - c9v+NzNj/R/B5L9fXci2wQAAAABJRU5ErkJggg==' base64Decoded asByteArray readStream! Item was removed: - ----- Method: ReleaseBuilder class>>projectBackground46 (in category 'resources') ----- (excessive size, no diff calculated) Item was removed: - ----- Method: ReleaseBuilder class>>projectBackground46Computed (in category 'resources') ----- - projectBackground46Computed - - | randomPoint col | - col := Color fromString: '#76A5BF'. - randomPoint := World right atRandom @ World bottom atRandom. - ^ ((GradientFillStyle colors: { - col. - col twiceDarker. - col twiceDarker twiceDarker}) - radial: true ; - origin: randomPoint; - direction: randomPoint; - normal: nil ; - yourself) - ! Item was changed: + ----- Method: ReleaseBuilder class>>setPreferences (in category 'preferences') ----- - ----- Method: ReleaseBuilder class>>setPreferences (in category 'private') ----- setPreferences + "Preferences class defaultValueTableForCurrentRelease" + self setProjectBackground: Color darkGray. + + "General User interaction" + Preferences + enable: #swapMouseButtons; + disable: #mouseOverForKeyboardFocus. + Morph indicateKeyboardFocus: true. + + "Text input." + TextEditor + autoEnclose: true ; + autoIndent: true ; + destructiveBackWord: false ; + blinkingCursor: true ; + dumbbellCursor: false. + Preferences + insertionPointColor: Color red. + PluggableTextMorph simpleFrameAdornments: false. + + "Windows" + Preferences installUniformWindowColors. + SystemWindow reuseWindows: false. + Model windowActiveOnFirstClick: false. "Not good for 800x600" + Preferences + disable: #showSplitterHandles; + enable: #fastDragWindowForMorphic. + CornerGripMorph drawCornerResizeHandles: false. + ProportionalSplitterMorph + smartHorizontalSplitters: false ; + smartVerticalSplitters: false. + + "Scroll bars." + Preferences + enable: #scrollBarsNarrow; + enable: #scrollBarsOnRight; + disable: #alwaysHideHScrollbar; + disable: #alwaysShowHScrollbar; + disable: #alwaysShowVScrollbar. + ScrollBar + scrollBarsWithoutArrowButtons: true; + scrollBarsWithoutMenuButton: true. + ScrollPane + useRetractableScrollBars: false. + + "Rounded corners." + Morph preferredCornerRadius: 6. + Preferences disable: #roundedWindowCorners. + PluggableButtonMorph roundedButtonCorners: false. + FillInTheBlankMorph roundedDialogCorners: false. + MenuMorph roundedMenuCorners: false. + ScrollBar roundedScrollBarLook: false. + + "Gradients." + Preferences disable: #gradientScrollBars. + SystemWindow gradientWindow: false. + MenuMorph gradientMenu: false. + PluggableButtonMorph gradientButton: false. + + "Shadows" + Preferences enable: #menuAppearance3d. + MenuMorph + menuBorderWidth: 1; + menuBorderColor: Color lightGray; + menuLineColor: Color lightGray. + Morph useSoftDropShadow: true.. + + "Lists and Trees" + PluggableListMorph + filterableLists: true; + clearFilterAutomatically: false; + highlightHoveredRow: true; + menuRequestUpdatesSelection: true. + PluggableTreeMorph + filterByLabelsOnly: false; + maximumSearchDepth: 1. + LazyListMorph + listSelectionTextColor: Color black; + listSelectionColor: (Color r: 0.72 g: 0.72 b: 0.9). + + "Standard Tools" + BalloonMorph setBalloonColorTo: + (TranslucentColor r: 0.92 g: 0.92 b: 0.706 alpha: 0.75). + Workspace shouldStyle: false. + Browser + listClassesHierarchically: true; + showClassIcons: true; + showMessageIcons: true; + sortMessageCategoriesAlphabetically: true. + Preferences enable: #annotationPanes; + enable: #optionalButtons; + enable: #diffsWithPrettyPrint; + enable: #traceMessages; + enable: #alternativeBrowseIt; + enable: #menuWithIcons; + enable: #visualExplorer. + SystemNavigation thoroughSenders: true. + + "Halo" + Preferences + enable: #showBoundsInHalo ; + disable: #alternateHandlesLook. + + "System" + NetNameResolver enableIPv6: false. + Scanner + allowUnderscoreAsAssignment: true; + prefAllowUnderscoreSelectors: true. + + "that's all, folks"! - self setPreferences46. ! Item was removed: - ----- Method: ReleaseBuilder class>>setPreferences45 (in category 'preferences') ----- - setPreferences45 - - self setProjectBackground: self projectBackground45. - - Workspace shouldStyle: false. - SystemWindow reuseWindows: true. - TextEditor - autoEnclose: true ; - autoIndent: false ; - destructiveBackWord: false ; - blinkingCursor: false ; - dumbbellCursor: false. - BalloonMorph setBalloonColorTo: - (TranslucentColor - r: 0.92 - g: 0.92 - b: 0.706 - alpha: 0.75). - Preferences - installBrightWindowColors ; - insertionPointColor: Color red ; - enable: #scrollBarsWithoutMenuButton ; - enable: #gradientScrollBars ; - enable: #swapMouseButtons ; - enable: #annotationPanes ; - disable: #showSplitterHandles ; - enable: #showBoundsInHalo ; - disable: #alternateHandlesLook ; - disable: #roundedMenuCorners ; - disable: #roundedWindowCorners ; - enable: #traceMessages ; - enable: #diffsWithPrettyPrint ; - disable: #alwaysShowVScrollbar ; - enable: #alternativeBrowseIt. - ProportionalSplitterMorph - smartHorizontalSplitters: false ; - smartVerticalSplitters: false. - PluggableButtonMorph roundedButtonCorners: false. - FillInTheBlankMorph roundedDialogCorners: false. - Workspace shouldStyle: false. - NetNameResolver enableIPv6: false. - Browser listClassesHierarchically: true. - SystemNavigation thoroughSenders: true! Item was removed: - ----- Method: ReleaseBuilder class>>setPreferences46 (in category 'preferences') ----- - setPreferences46 - "Preferences class defaultValueTableForCurrentRelease" - - self setProjectBackground: Color darkGray. - - "General User interaction" - Preferences - enable: #swapMouseButtons; - disable: #mouseOverForKeyboardFocus. - Morph indicateKeyboardFocus: true. - - "Text input." - TextEditor - autoEnclose: true ; - autoIndent: true ; - destructiveBackWord: false ; - blinkingCursor: true ; - dumbbellCursor: false. - Preferences - insertionPointColor: Color red. - PluggableTextMorph simpleFrameAdornments: false. - - "Windows" - Preferences installUniformWindowColors. - SystemWindow reuseWindows: false. - Model windowActiveOnFirstClick: false. "Not good for 800x600" - Preferences - disable: #showSplitterHandles; - enable: #fastDragWindowForMorphic. - CornerGripMorph drawCornerResizeHandles: false. - ProportionalSplitterMorph - smartHorizontalSplitters: false ; - smartVerticalSplitters: false. - - "Scroll bars." - Preferences - enable: #scrollBarsNarrow; - enable: #scrollBarsOnRight; - disable: #alwaysHideHScrollbar; - disable: #alwaysShowHScrollbar; - disable: #alwaysShowVScrollbar. - ScrollBar - scrollBarsWithoutArrowButtons: true; - scrollBarsWithoutMenuButton: true. - ScrollPane - useRetractableScrollBars: false. - - "Rounded corners." - Morph preferredCornerRadius: 6. - Preferences disable: #roundedWindowCorners. - PluggableButtonMorph roundedButtonCorners: false. - FillInTheBlankMorph roundedDialogCorners: false. - MenuMorph roundedMenuCorners: false. - ScrollBar roundedScrollBarLook: false. - - "Gradients." - Preferences disable: #gradientScrollBars. - SystemWindow gradientWindow: false. - MenuMorph gradientMenu: false. - PluggableButtonMorph gradientButton: false. - - "Shadows" - Preferences enable: #menuAppearance3d. - MenuMorph - menuBorderWidth: 1; - menuBorderColor: Color lightGray; - menuLineColor: Color lightGray. - Morph useSoftDropShadow: true.. - - "Lists and Trees" - PluggableListMorph - filterableLists: true; - clearFilterAutomatically: false; - highlightHoveredRow: true; - menuRequestUpdatesSelection: true. - PluggableTreeMorph - filterByLabelsOnly: false; - maximumSearchDepth: 1. - LazyListMorph - listSelectionTextColor: Color black; - listSelectionColor: (Color r: 0.72 g: 0.72 b: 0.9). - - "Standard Tools" - BalloonMorph setBalloonColorTo: - (TranslucentColor r: 0.92 g: 0.92 b: 0.706 alpha: 0.75). - Workspace shouldStyle: false. - Browser - listClassesHierarchically: true; - showClassIcons: true; - showMessageIcons: true; - sortMessageCategoriesAlphabetically: true. - Preferences enable: #annotationPanes; - enable: #optionalButtons; - enable: #diffsWithPrettyPrint; - enable: #traceMessages; - enable: #alternativeBrowseIt; - enable: #menuWithIcons; - enable: #visualExplorer. - SystemNavigation thoroughSenders: true. - - "Halo" - Preferences - enable: #showBoundsInHalo ; - disable: #alternateHandlesLook. - - "System" - NetNameResolver enableIPv6: false. - Scanner - allowUnderscoreAsAssignment: true; - prefAllowUnderscoreSelectors: true. - - "that's all, folks"! Item was removed: - ----- Method: ReleaseBuilder class>>setPreferences46LowDetails (in category 'preferences') ----- - setPreferences46LowDetails - "Higher performance." - - self setPreferences46. - - self setProjectBackground: (Color gray: 0.6). - - Preferences disable: #roundedWindowCorners. - PluggableButtonMorph roundedButtonCorners: false. - FillInTheBlankMorph roundedDialogCorners: false. - MenuMorph roundedMenuCorners: false. - ScrollBar roundedScrollBarLook: false. - - Preferences disable: #gradientScrollBars. - SystemWindow gradientWindow: false. - MenuMorph gradientMenu: false. - PluggableButtonMorph gradientButton: false. - - Preferences disable: #menuAppearance3d. - - Morph indicateKeyboardFocus: false. - - PluggableListMorph highlightHoveredRow: false. - Browser - listClassesHierarchically: false; - showClassIcons: false; - showMessageIcons: false; - sortMessageCategoriesAlphabetically: false. - Preferences - disable: #menuWithIcons; - disable: #visualExplorer. - - "Non-3D menu." - MenuMorph - menuBorderWidth: 1; - menuBorderColor: Color lightGray; - menuLineColor: Color lightGray.! Item was removed: - ----- Method: ReleaseBuilder class>>setPreferences46Retro (in category 'preferences') ----- - setPreferences46Retro - "Higher performance." - - self setPreferences46. - - self setProjectBackground: self projectBackground46Computed. - - "Rounded stuff." - Morph preferredCornerRadius: 8. - Preferences enable: #roundedWindowCorners. - PluggableButtonMorph roundedButtonCorners: true. - FillInTheBlankMorph roundedDialogCorners: true. - MenuMorph roundedMenuCorners: true. - "ScrollBar roundedScrollBarLook: true." - - "Gradients." - Preferences enable: #gradientScrollBars. - SystemWindow gradientWindow: true. - MenuMorph gradientMenu: true. - PluggableButtonMorph gradientButton: true. - - "Scroll bars." - Preferences - disable: #scrollBarsNarrow; - enable: #alwaysShowVScrollbar; - enable: #alwaysHideHScrollbar. - ScrollBar - scrollBarsWithoutArrowButtons: false; - scrollBarsWithoutMenuButton: false.! Item was changed: ----- Method: ReleaseBuilder class>>versionString (in category 'private') ----- versionString + ^ 'Squeak5.0'! - ^ 'Squeak4.6'! From commits at source.squeak.org Mon Jul 20 21:01:58 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 20 21:02:00 2015 Subject: [squeak-dev] The Trunk: Morphic-cmm.995.mcz Message-ID: Chris Muller uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-cmm.995.mcz ==================== Summary ==================== Name: Morphic-cmm.995 Author: cmm Time: 20 July 2015, 4:01:07.965 pm UUID: 04170d15-f911-45c5-8d06-ce0f4a99800d Ancestors: Morphic-cmm.994 Something got goofed up, reformat the release notes (sigh). =============== Diff against Morphic-cmm.994 =============== Item was changed: ----- Method: TheWorldMainDockingBar>>releaseNotes (in category 'submenu - help') ----- releaseNotes + ^'Squeak 5.0 - ^' - Squeak 5.0 Release Notes - A New Memory Model and Virtual Machine Fast Become Squeak 5 introduces a new object model and VM known as "Spur". Presented [1] by Eliot Miranda and Clément Béra at the International Symposium on Memory Management in year 2015, this new VM retains the direct-pointer representation of objects in previous Squeak versions but now without requiring a full scan of the heap for become. This is done by introducing hidden forwarding objects which allow references to be updated lazily as they are encountered. Spur''s innovation is in avoiding explicit read barriers in all common cases. Additional Immediate Types The new Spur memory model supports immediate Characters, so that Characters with unicode greater than 255 can be tested via #==, and wide string access is much faster. The 64-bit version, still under development, also provides immediate floats, occupying the middle 8th of the double precision exponent range. Simplified and Ready for 64-bit Internally Spur uses a 64-bit object header, a representation shared between the 32-bit and 64-bit versions, and one that is significantly simpler than the three different header sizes used in the previous version. This simplicity means that the JIT now generates code to implement more primitives, in particular new and new:, resulting in significantly higher performance, at the cost of a 15% increase in image size. Enhanced Memory Management Spur has a segmented heap, allowing the heap to grow and shrink a segment at a time. It provides per-object pinning to ensure specific objects will not be moved by the garbage collector, hence simplifying the FFI. Spur provides Ephemerons which allow for per-object finalization and the prevention of uncollectable cycles, for example in global property lists like DependentsFields (although this support has yet to be applied to the system). Squeak now runs on ARM + As a natural output of the Scratch application on Rasberry Pi project, the Spur VM can now run on the Rasberry Pi. The Future of Spur + Work is underway on an innovative adaptive optimizer/speculative inliner, and a 64-bit JIT for x64, and a global incremental mark-sweep collector is planned. See [2]. [1] -- http://conf.researchr.org/event/ismm-2015/ismm-2015-papers-a-partial-read-barrier-for-efficient-support-of-live-object-oriented-programming [2] -- http://www.mirandabanda.org/cogblog/cog-projects/ !! + ]style[(10 1 13 40 2 11 537 26 313 31 422 26 448 22 119 19 374)a2bFBitstreamVeraSerif#32.0,FBitstreamVeraSans#20.0a2,a2FBitstreamVeraSerif#24.0-,FBitstreamVeraSans#20.0,,b,,b,,b,,b,,FBitstreamVeraSans#20.0,,FBitstreamVeraSans#20.0,!!' readStream nextChunkText! - ]style[(1 10 1 14 2 38 2 11 120 44 162 6 203 2 26 9 302 2 31 1 421 26 448 22 118 18 374),ba2FBitstreamVeraSerif#32.0,FBitstreamVeraSerif#24.0----a2,FBitstreamVeraSerif#24.0a2-i,,bFBitstreamVeraSans#20.0,,b,,u,,i,,FBitmap DejaVu Sans#14,FBitmap DejaVu Sans#14b,FBitmap DejaVu Sans#14,,FBitmap DejaVu Sans#14,FBitmap DejaVu Sans#14b,FBitmap DejaVu Sans#14,,b,,bFBitstreamVeraSans#20.0,,FBitstreamVeraSans#20.0b,!!' readStream nextChunkText! From commits at source.squeak.org Mon Jul 20 21:55:02 2015 From: commits at source.squeak.org (commits@source.squeak.org) Date: Mon Jul 20 21:55:04 2015 Subject: [squeak-dev] Daily Commit Log Message-ID: <20150720215502.1196.qmail@box4.squeakfoundation.org> Changes to Trunk (http://source.squeak.org/trunk.html) in the last 24 hours: http://lists.squeakfoundation.org/pipermail/packages/2015-July/008832.html Name: System-cmm.755 Ancestors: System-cmm.754 Remove references to ObjectHistory, because Spur cannot support it. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008833.html Name: ReleaseBuilder-cmm.127 Ancestors: ReleaseBuilder-cmm.126 - Use the same contents of setPreferences46 for this 5.0 release, but remove the version-specific nomenclature. - Update the system versionString to Squeak5.0. ============================================= http://lists.squeakfoundation.org/pipermail/packages/2015-July/008834.html Name: Morphic-cmm.995 Ancestors: Morphic-cmm.994 Something got goofed up, reformat the release notes (sigh). ============================================= From Das.Linux at gmx.de Tue Jul 21 12:48:54 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Tue Jul 21 12:48:58 2015 Subject: [squeak-dev] Squeak-5.0-All-in-One does not open image on OSX Message-ID: Hi all, There's a glitch in the Squeak-5.0-All-in-One. The Info.plist still refers to Squeak4.6-15102.image instead of Squeak5.0-15110.image Best regards -Tobias From Das.Linux at gmx.de Tue Jul 21 12:51:08 2015 From: Das.Linux at gmx.de (Das.Linux@gmx.de) Date: Tue Jul 21 12:51:13 2015 Subject: [squeak-dev] Squeak-5.0-All-in-One does not open image on OSX In-Reply-To: References: Message-ID: Hi all, On 21.07.2015, at 14:48, Tobias Pape wrote: > Hi all, > > There's a glitch in the Squeak-5.0-All-in-One. > The Info.plist still refers to > Squeak4.6-15102.image > instead of > Squeak5.0-15110.image Also, the AIO seems to use a V3 Cog VM instead of a SPUR Cog VM: /Users/tobias/Downloads/Squeak-5.0-All-in-One/Squeak-5.0-All-in-One.app/Contents/MacOS/Squeak This interpreter (vers. 6505) cannot read image file (vers. 6521). Press CR to quit.. > Best regards > -Tobias > From asqueaker at gmail.com Tue Jul 21 18:59:30 2015 From: asqueaker at gmail.com (Chris Muller) Date: Tue Jul 21 18:59:35 2015 Subject: [squeak-dev] Squeak-5.0-All-in-One does not open image on OSX In-Reply-To: References: Message-ID: It's not done yet. I'm waiting for Craig to replace the Mac VM inside there and sign it. On Tue, Jul 21, 2015 at 7:51 AM, wrote: > Hi all, > > On 21.07.2015, at 14:48, Tobias Pape wrote: > >> Hi all, >> >> There's a glitch in the Squeak-5.0-All-in-One. >> The Info.plist still refers to >> Squeak4.6-15102.image >> instead of >> Squeak5.0-15110.image > > Also, the AIO seems to use a V3 Cog VM instead of a SPUR Cog VM: > > /Users/tobias/Downloads/Squeak-5.0-All-in-One/Squeak-5.0-All-in-One.app/Contents/MacOS/Squeak > This interpreter (vers. 6505) cannot read image file (vers. 6521). > Press CR to quit.. > > >> Best regards >> -Tobias >> > > From lewis at mail.msen.com Tue Jul 21 20:00:04 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Tue Jul 21 20:00:08 2015 Subject: [squeak-dev] Environments and Projects (was: final Squeak-4.6-All-in-One posted) In-Reply-To: References: Message-ID: <31202.136.2.1.105.1437508804.squirrel@webmail.msen.com> It would be great if we can put some focus on this as soon as we have completed the Squeak 4.6 and 5.0 releases (RSN). I think that Levente had summarized the open issues regarding Environments in a post to this list within the last year. We also had the thread "Thinking about environments" on the list last December. We should find Levente's summary and see if we can make progress against it in the coming months. Dave > On Mon, Jul 20, 2015 at 10:48 AM, H. Hirzel > wrote: > >> I think that project saving has been broken for quite some time. >> > > Yes, this is the reason why we use 4.4 version for development. The whole > concept of Projects makes no sense if Project can not be persisted, this > is > essential. We use this, eToys use this. What is the meaning of the > Projects > if they can not be saved? > It is an irony that introduction of Environments have had an opposite > effect. Couldn't Environments coexist with Projects? Maybe someone could > elaborate what is the problem, what can be done? >>From UI perspective, currently stock image is one click away from >> debugger > popup. > regards, > Vaidotas > > From asqueaker at gmail.com Tue Jul 21 20:02:54 2015 From: asqueaker at gmail.com (Chris Muller) Date: Tue Jul 21 20:02:59 2015 Subject: [squeak-dev] final final Squeak-4.6-All-in-One posted Message-ID: Okay, at he SqueakSSL plugin was replaced with the one from https://github.com/itsmeront/squeakssl/releases for all platforms. Tested it on Linux, worked. Fabio verified Mac. Craig signed it too. Thanks for your help with this shakeout. Can anyone think of anything else we need to do? From jgr.asselin at me.com Tue Jul 21 20:24:00 2015 From: jgr.asselin at me.com (Raymond Asselin) Date: Tue Jul 21 20:24:06 2015 Subject: [squeak-dev] Environments and Projects (was: final Squeak-4.6-All-in-One posted) In-Reply-To: <31202.136.2.1.105.1437508804.squirrel@webmail.msen.com> References: <31202.136.2.1.105.1437508804.squirrel@webmail.msen.com> Message-ID: <9F4784D2-5909-407F-A27A-30E1EABCC33B@me.com> I agree that I missed project long enough so something must be made. May be Environment was a must but it seems that nobody know how to use it. And the doc is waiting. Project in is side is used but don"t work. Is it a feature of Skeak or only a "try for yourself'. My intention here is not bashing I know there is so lot to do and so few ressources, but... Retain that I would like something is done for project Raymond Asselin > Le 2015-07-21 ? 16:00, David T. Lewis a ?crit : > > It would be great if we can put some focus on this as soon as we have > completed the Squeak 4.6 and 5.0 releases (RSN). > > I think that Levente had summarized the open issues regarding Environments > in a post to this list within the last year. We also had the thread > "Thinking about environments" on the list last December. We should find > Levente's summary and see if we can make progress against it in the coming > months. > > Dave > > >> On Mon, Jul 20, 2015 at 10:48 AM, H. Hirzel >> wrote: >> >>> I think that project saving has been broken for quite some time. >> >> Yes, this is the reason why we use 4.4 version for development. The whole >> concept of Projects makes no sense if Project can not be persisted, this >> is >> essential. We use this, eToys use this. What is the meaning of the >> Projects >> if they can not be saved? >> It is an irony that introduction of Environments have had an opposite >> effect. Couldn't Environments coexist with Projects? Maybe someone could >> elaborate what is the problem, what can be done? >>> From UI perspective, currently stock image is one click away from >>> debugger >> popup. >> regards, >> Vaidotas > > > From lecteur at zogotounga.net Tue Jul 21 22:18:16 2015 From: lecteur at zogotounga.net (=?iso-8859-1?q?St=E9phane?= Rollandin) Date: Tue Jul 21 22:18:16 2015 Subject: [squeak-dev] final final Squeak-4.6-All-in-One posted In-Reply-To: References: Message-ID: <55AEC528.6060509@zogotounga.net> > Thanks for your help with this shakeout. Can anyone think of anything > else we need to do? Is the color theme still grey upon grey ? Stef From asqueaker at gmail.com Wed Jul 22 01:02:16 2015 From: asqueaker at gmail.com (Chris Muller) Date: Wed Jul 22 01:02:21 2015 Subject: [squeak-dev] final final Squeak-4.6-All-in-One posted In-Reply-To: <55AEC528.6060509@zogotounga.net> References: <55AEC528.6060509@zogotounga.net> Message-ID: The look and preferences of 4.6 were set up by Marcel and (I think) others at HPI. Marcel made tremendous contributions to the IDE of 4.6 and so it makes sense to let him finish his vision of what the release IDE should look and feel like. As a whole, Squeak is a successful example of design by committee, but an IDE's look and feel, like a piece of art, can benefit from being designed by a few or single mind due to the more cohesive vision of all the components. I certainly won't be running with gray windows -- it provides way too little delineation of background windows, leaving me with only the window position and its symbology (letters) for identification. However, I can appreciate the initial "look" that the image opens with. Like a classic movie, the black and white harkens back to original Smalltalk-80, but that modern drop-shadow subtlely indicating something more. Kinda pretty.. On Tue, Jul 21, 2015 at 5:18 PM, St?phane Rollandin wrote: >> Thanks for your help with this shakeout. Can anyone think of anything >> else we need to do? > > > Is the color theme still grey upon grey ? > > Stef > From lewis at mail.msen.com Wed Jul 22 01:36:01 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Wed Jul 22 01:36:05 2015 Subject: [squeak-dev] final final Squeak-4.6-All-in-One posted In-Reply-To: References: <55AEC528.6060509@zogotounga.net> Message-ID: <20150722013601.GA92309@shell.msen.com> On Tue, Jul 21, 2015 at 08:02:16PM -0500, Chris Muller wrote: > The look and preferences of 4.6 were set up by Marcel and (I think) > others at HPI. Marcel made tremendous contributions to the IDE of 4.6 > and so it makes sense to let him finish his vision of what the release > IDE should look and feel like. As a whole, Squeak is a successful > example of design by committee, but an IDE's look and feel, like a > piece of art, can benefit from being designed by a few or single mind > due to the more cohesive vision of all the components. Excellent summary, and FWIW I agree. Marcel also provided justification for this based on the reactions of many new users to the Squeak image. Even though I do not personally like the grey look, I recognize that the initial reaction of new users on first exposure to the release image is more important than my personal preference. > > I certainly won't be running with gray windows -- it provides way too > little delineation of background windows, leaving me with only the > window position and its symbology (letters) for identification. Me too. I think we should have a wiki page for "top 10 horrible preferences and how to make them go away". ;-) Dave > > However, I can appreciate the initial "look" that the image opens > with. Like a classic movie, the black and white harkens back to > original Smalltalk-80, but that modern drop-shadow subtlely indicating > something more. Kinda pretty.. > > On Tue, Jul 21, 2015 at 5:18 PM, St??phane Rollandin > wrote: > >> Thanks for your help with this shakeout. Can anyone think of anything > >> else we need to do? > > > > > > Is the color theme still grey upon grey ? > > > > Stef > > From tim at rowledge.org Wed Jul 22 03:11:49 2015 From: tim at rowledge.org (tim Rowledge) Date: Wed Jul 22 03:11:56 2015 Subject: [squeak-dev] final final Squeak-4.6-All-in-One posted In-Reply-To: References: <55AEC528.6060509@zogotounga.net> Message-ID: <4C38C91B-0964-489B-AE7B-73D3FBE2A895@rowledge.org> On 21-07-2015, at 6:02 PM, Chris Muller wrote: > but an IDE's look and feel, like a > piece of art, can benefit from being designed by a few or single mind > due to the more cohesive vision of all the components. This is usually true but I notice that at least the quit ?save changes before quitting?? dialogue still has the bluey colours. This may perhaps be a cache that needs clearing? And the Release Notes text jars a bit - for 4.6 there *isn?t* a new vm for the ARM - we only did the spur vm for ARM. In fact right now it would take some effort to make a plain ARM cog vm since the strictures of the abort trap etc mean there isn?t a suitable way to discriminate the nmethod type. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Oxymorons: Software documentation From Das.Linux at gmx.de Wed Jul 22 06:53:42 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Wed Jul 22 06:53:48 2015 Subject: [squeak-dev] =?utf-8?q?Fwd=3A_Build_failed_in_Jenkins=3A_Trunk_?= =?utf-8?q?=C2=BB_default_=232?= References: <6606111.0.1437547209169.JavaMail.jenkins@box3-squeak> Message-ID: <052C36FB-1458-4A77-B6E1-2E2B72018973@gmx.de> Dear all, it is currently impossible to test trunk (spur) on jenkins, can someone please have a look? -- Tobias Pape sent from a mobile device Anfang der weitergeleiteten E?Mail: > Von: squeak-ci > Datum: 22. Juli 2015 08:40:09 MESZ > An: Das.Linux@gmx.de > Betreff: Build failed in Jenkins: Trunk ? default #2 > > See > > Changes: > > [Tobias Pape] bump Cog > > ------------------------------------------ > [...truncated 353 lines...] > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > > stack page bytes 4096 available headroom 2788 minimum unused headroom 2984 > > (Recursive not understood error encountered) > Aborted > should pass all tests (FAILED - 1) > > Failures: > > 1) Trunk test suite for Spur image test suite should pass all tests > Failure/Error: run_image_with_cmd(@vm, vm_args(@os_name), RUN_TEST_IMAGE_NAME, "#{SRC}/tests.st", 30.minutes) > RuntimeError: > Process 10561 failed with exit status 134 > # ./lib/squeak-ci/build.rb:393:in `block in run_image_with_cmd' > # ./lib/squeak-ci/build.rb:26:in `counted_command' > # ./lib/squeak-ci/build.rb:352:in `run_image_with_cmd' > # ./test/spur_image_test.rb:37:in `block (4 levels) in ' > # ./test/spur_image_test.rb:32:in `chdir' > # ./test/spur_image_test.rb:32:in `block (3 levels) in ' > > Finished in 56.15 seconds > 1 example, 1 failure > > Failed examples: > > rspec ./test/spur_image_test.rb:31 # Trunk test suite for Spur image test suite should pass all tests > rake aborted! > /var/lib/jenkins/.rvm/rubies/ruby-1.9.3-p392/bin/ruby -S rspec test/spur_image_test.rb -fdoc failed > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:156:in `run_task' > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:124:in `block (2 levels) in initialize' > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:122:in `block in initialize' > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/bin/ruby_executable_hooks:15:in `eval' > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/bin/ruby_executable_hooks:15:in `
' > Tasks: TOP => spur_test > (See full trace by running task with --trace) > Build step 'Execute shell' marked build as failure > Discard old builds... > Recording test results -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150722/8cdbb574/attachment.htm From lewis at mail.msen.com Wed Jul 22 13:00:18 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Wed Jul 22 13:00:20 2015 Subject: [squeak-dev] Fwd: Build failed in Jenkins: Trunk ?? default #2 In-Reply-To: <052C36FB-1458-4A77-B6E1-2E2B72018973@gmx.de> References: <6606111.0.1437547209169.JavaMail.jenkins@box3-squeak> <052C36FB-1458-4A77-B6E1-2E2B72018973@gmx.de> Message-ID: <20150722130018.GA14855@shell.msen.com> I'm not sure what the problem was, but I just restarted Jenkins on box3 and it seems to be back now. Dave On Wed, Jul 22, 2015 at 08:53:42AM +0200, Tobias Pape wrote: > Dear all, it is currently impossible to test trunk (spur) on jenkins, can someone please have a look? > > -- > Tobias Pape > sent from a mobile device > > Anfang der weitergeleiteten E???Mail: > > > Von: squeak-ci > > Datum: 22. Juli 2015 08:40:09 MESZ > > An: Das.Linux@gmx.de > > Betreff: Build failed in Jenkins: Trunk ?? default #2 > > > > See > > > > Changes: > > > > [Tobias Pape] bump Cog > > > > ------------------------------------------ > > [...truncated 353 lines...] > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > nextObject > > > > stack page bytes 4096 available headroom 2788 minimum unused headroom 2984 > > > > (Recursive not understood error encountered) > > Aborted > > should pass all tests (FAILED - 1) > > > > Failures: > > > > 1) Trunk test suite for Spur image test suite should pass all tests > > Failure/Error: run_image_with_cmd(@vm, vm_args(@os_name), RUN_TEST_IMAGE_NAME, "#{SRC}/tests.st", 30.minutes) > > RuntimeError: > > Process 10561 failed with exit status 134 > > # ./lib/squeak-ci/build.rb:393:in `block in run_image_with_cmd' > > # ./lib/squeak-ci/build.rb:26:in `counted_command' > > # ./lib/squeak-ci/build.rb:352:in `run_image_with_cmd' > > # ./test/spur_image_test.rb:37:in `block (4 levels) in ' > > # ./test/spur_image_test.rb:32:in `chdir' > > # ./test/spur_image_test.rb:32:in `block (3 levels) in ' > > > > Finished in 56.15 seconds > > 1 example, 1 failure > > > > Failed examples: > > > > rspec ./test/spur_image_test.rb:31 # Trunk test suite for Spur image test suite should pass all tests > > rake aborted! > > /var/lib/jenkins/.rvm/rubies/ruby-1.9.3-p392/bin/ruby -S rspec test/spur_image_test.rb -fdoc failed > > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:156:in `run_task' > > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:124:in `block (2 levels) in initialize' > > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:122:in `block in initialize' > > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/bin/ruby_executable_hooks:15:in `eval' > > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/bin/ruby_executable_hooks:15:in `
' > > Tasks: TOP => spur_test > > (See full trace by running task with --trace) > > Build step 'Execute shell' marked build as failure > > Discard old builds... > > Recording test results > From Das.Linux at gmx.de Wed Jul 22 13:24:51 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Wed Jul 22 13:24:56 2015 Subject: [squeak-dev] Fwd: Build failed in Jenkins: Trunk ?? default #2 In-Reply-To: <20150722130018.GA14855@shell.msen.com> References: <6606111.0.1437547209169.JavaMail.jenkins@box3-squeak> <052C36FB-1458-4A77-B6E1-2E2B72018973@gmx.de> <20150722130018.GA14855@shell.msen.com> Message-ID: <33E083F0-8C59-448F-B767-83AE9017D46E@gmx.de> Hi Dave On 22.07.2015, at 15:00, David T. Lewis wrote: > I'm not sure what the problem was, but I just restarted Jenkins on box3 > and it seems to be back now. > Sorry for being too brief. Jenkins itself is/was fine, the point is that the Tests in a Trunk (SPUR) image seem to crash the VM? Best regards -Tobias > Dave > > On Wed, Jul 22, 2015 at 08:53:42AM +0200, Tobias Pape wrote: >> Dear all, it is currently impossible to test trunk (spur) on jenkins, can someone please have a look? >> >> -- >> Tobias Pape >> sent from a mobile device >> >> Anfang der weitergeleiteten E???Mail: >> >>> Von: squeak-ci >>> Datum: 22. Juli 2015 08:40:09 MESZ >>> An: Das.Linux@gmx.de >>> Betreff: Build failed in Jenkins: Trunk ?? default #2 >>> >>> See >>> >>> Changes: >>> >>> [Tobias Pape] bump Cog >>> >>> ------------------------------------------ >>> [...truncated 353 lines...] >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> >>> stack page bytes 4096 available headroom 2788 minimum unused headroom 2984 >>> >>> (Recursive not understood error encountered) >>> Aborted >>> should pass all tests (FAILED - 1) >>> >>> Failures: >>> >>> 1) Trunk test suite for Spur image test suite should pass all tests >>> Failure/Error: run_image_with_cmd(@vm, vm_args(@os_name), RUN_TEST_IMAGE_NAME, "#{SRC}/tests.st", 30.minutes) >>> RuntimeError: >>> Process 10561 failed with exit status 134 >>> # ./lib/squeak-ci/build.rb:393:in `block in run_image_with_cmd' >>> # ./lib/squeak-ci/build.rb:26:in `counted_command' >>> # ./lib/squeak-ci/build.rb:352:in `run_image_with_cmd' >>> # ./test/spur_image_test.rb:37:in `block (4 levels) in ' >>> # ./test/spur_image_test.rb:32:in `chdir' >>> # ./test/spur_image_test.rb:32:in `block (3 levels) in ' >>> >>> Finished in 56.15 seconds >>> 1 example, 1 failure >>> >>> Failed examples: >>> >>> rspec ./test/spur_image_test.rb:31 # Trunk test suite for Spur image test suite should pass all tests >>> rake aborted! >>> /var/lib/jenkins/.rvm/rubies/ruby-1.9.3-p392/bin/ruby -S rspec test/spur_image_test.rb -fdoc failed >>> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:156:in `run_task' >>> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:124:in `block (2 levels) in initialize' >>> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:122:in `block in initialize' >>> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/bin/ruby_executable_hooks:15:in `eval' >>> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/bin/ruby_executable_hooks:15:in `
' >>> Tasks: TOP => spur_test >>> (See full trace by running task with --trace) >>> Build step 'Execute shell' marked build as failure >>> Discard old builds... >>> Recording test results From karlramberg at gmail.com Wed Jul 22 13:43:07 2015 From: karlramberg at gmail.com (karl ramberg) Date: Wed Jul 22 13:43:12 2015 Subject: =?UTF-8?Q?Re=3A_=5Bsqueak=2Ddev=5D_Fwd=3A_Build_failed_in_Jenkins=3A_Trunk?= =?UTF-8?Q?_=C2=BB_default_=232?= In-Reply-To: <052C36FB-1458-4A77-B6E1-2E2B72018973@gmx.de> References: <6606111.0.1437547209169.JavaMail.jenkins@box3-squeak> <052C36FB-1458-4A77-B6E1-2E2B72018973@gmx.de> Message-ID: Console seems to indicate that it was testing ImageSegments which are not working IFAIK, and are crashing the windows vm at least. http://build.squeak.org/job/Trunk/default/2/consoleFull Karl On Wed, Jul 22, 2015 at 8:53 AM, Tobias Pape wrote: > Dear all, it is currently impossible to test trunk (spur) on jenkins, can > someone please have a look? > > -- > Tobias Pape > sent from a mobile device > > Anfang der weitergeleiteten E?Mail: > > *Von:* squeak-ci > *Datum:* 22. Juli 2015 08:40:09 MESZ > *An:* Das.Linux@gmx.de > *Betreff:* *Build failed in Jenkins: Trunk ? default #2* > > See > > Changes: > > [Tobias Pape] bump Cog > > ------------------------------------------ > [...truncated 353 lines...] > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > nextObject > > stack page bytes 4096 available headroom 2788 minimum unused headroom 2984 > > (Recursive not understood error encountered) > Aborted > should pass all tests (FAILED - 1) > > Failures: > > 1) Trunk test suite for Spur image test suite should pass all tests > Failure/Error: run_image_with_cmd(@vm, vm_args(@os_name), > RUN_TEST_IMAGE_NAME, "#{SRC}/tests.st", 30.minutes) > RuntimeError: > Process 10561 failed with exit status 134 > # ./lib/squeak-ci/build.rb:393:in `block in run_image_with_cmd' > # ./lib/squeak-ci/build.rb:26:in `counted_command' > # ./lib/squeak-ci/build.rb:352:in `run_image_with_cmd' > # ./test/spur_image_test.rb:37:in `block (4 levels) in (required)>' > # ./test/spur_image_test.rb:32:in `chdir' > # ./test/spur_image_test.rb:32:in `block (3 levels) in (required)>' > > Finished in 56.15 seconds > 1 example, 1 failure > > Failed examples: > > rspec ./test/spur_image_test.rb:31 # Trunk test suite for Spur image test > suite should pass all tests > rake aborted! > /var/lib/jenkins/.rvm/rubies/ruby-1.9.3-p392/bin/ruby -S rspec > test/spur_image_test.rb -fdoc failed > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:156:in > `run_task' > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:124:in > `block (2 levels) in initialize' > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:122:in > `block in initialize' > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/bin/ruby_executable_hooks:15:in > `eval' > /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/bin/ruby_executable_hooks:15:in > `
' > Tasks: TOP => spur_test > (See full trace by running task with --trace) > Build step 'Execute shell' marked build as failure > Discard old builds... > Recording test results > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150722/9a1ae18b/attachment.htm From lewis at mail.msen.com Wed Jul 22 15:02:17 2015 From: lewis at mail.msen.com (David T. Lewis) Date: Wed Jul 22 15:02:20 2015 Subject: [squeak-dev] Fwd: Build failed in Jenkins: Trunk =?iso-8859-1?Q?=C2=BB_default_#2?= In-Reply-To: References: <6606111.0.1437547209169.JavaMail.jenkins@box3-squeak> <052C36FB-1458-4A77-B6E1-2E2B72018973@gmx.de> Message-ID: <4540.136.2.1.105.1437577337.squirrel@webmail.msen.com> Actually, Jenkins was completely off line by the time I looked at it. I'm not sure if the problems may be related. Dave > Console seems to indicate that it was testing ImageSegments which are not > working IFAIK, and are crashing the windows vm at least. > > http://build.squeak.org/job/Trunk/default/2/consoleFull > > Karl > > On Wed, Jul 22, 2015 at 8:53 AM, Tobias Pape wrote: > >> Dear all, it is currently impossible to test trunk (spur) on jenkins, >> can >> someone please have a look? >> >> -- >> Tobias Pape >> sent from a mobile device >> >> Anfang der weitergeleiteten E???Mail: >> >> *Von:* squeak-ci >> *Datum:* 22. Juli 2015 08:40:09 MESZ >> *An:* Das.Linux@gmx.de >> *Betreff:* *Build failed in Jenkins: Trunk ?? default #2* >> >> See >> >> Changes: >> >> [Tobias Pape] bump Cog >> >> ------------------------------------------ >> [...truncated 353 lines...] >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> nextObject >> >> stack page bytes 4096 available headroom 2788 minimum unused headroom >> 2984 >> >> (Recursive not understood error encountered) >> Aborted >> should pass all tests (FAILED - 1) >> >> Failures: >> >> 1) Trunk test suite for Spur image test suite should pass all tests >> Failure/Error: run_image_with_cmd(@vm, vm_args(@os_name), >> RUN_TEST_IMAGE_NAME, "#{SRC}/tests.st", 30.minutes) >> RuntimeError: >> Process 10561 failed with exit status 134 >> # ./lib/squeak-ci/build.rb:393:in `block in run_image_with_cmd' >> # ./lib/squeak-ci/build.rb:26:in `counted_command' >> # ./lib/squeak-ci/build.rb:352:in `run_image_with_cmd' >> # ./test/spur_image_test.rb:37:in `block (4 levels) in > (required)>' >> # ./test/spur_image_test.rb:32:in `chdir' >> # ./test/spur_image_test.rb:32:in `block (3 levels) in > (required)>' >> >> Finished in 56.15 seconds >> 1 example, 1 failure >> >> Failed examples: >> >> rspec ./test/spur_image_test.rb:31 # Trunk test suite for Spur image >> test >> suite should pass all tests >> rake aborted! >> /var/lib/jenkins/.rvm/rubies/ruby-1.9.3-p392/bin/ruby -S rspec >> test/spur_image_test.rb -fdoc failed >> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:156:in >> `run_task' >> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:124:in >> `block (2 levels) in initialize' >> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:122:in >> `block in initialize' >> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/bin/ruby_executable_hooks:15:in >> `eval' >> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/bin/ruby_executable_hooks:15:in >> `
' >> Tasks: TOP => spur_test >> (See full trace by running task with --trace) >> Build step 'Execute shell' marked build as failure >> Discard old builds... >> Recording test results >> >> >> >> >> > > From asqueaker at gmail.com Wed Jul 22 15:04:42 2015 From: asqueaker at gmail.com (Chris Muller) Date: Wed Jul 22 15:04:47 2015 Subject: [squeak-dev] final final Squeak-4.6-All-in-One posted In-Reply-To: <4C38C91B-0964-489B-AE7B-73D3FBE2A895@rowledge.org> References: <55AEC528.6060509@zogotounga.net> <4C38C91B-0964-489B-AE7B-73D3FBE2A895@rowledge.org> Message-ID: >> but an IDE's look and feel, like a >> piece of art, can benefit from being designed by a few or single mind >> due to the more cohesive vision of all the components. > > This is usually true but I notice that at least the quit ?save changes before quitting?? dialogue still has the bluey colours. This may perhaps be a cache that needs clearing? No, that's the color they are. > And the Release Notes text jars a bit - for 4.6 there *isn?t* a new vm for the ARM - we only did the spur vm for ARM. In fact right now it would take some effort to make a plain ARM cog vm since the strictures of the abort trap etc mean there isn?t a suitable way to discriminate the nmethod type. We had MONTHS for people to make suggestions for the 4.6 release. Now that we've just collapsed the .spur branch to make trunk 5.0 earlier this week is not the time to start making suggestions for 4.6. There will be no more changes to 4.6, but there's still time for 5.0 -- where I might need to REMOVE that line from the release notes unless we can get it into the All-in-One... From Das.Linux at gmx.de Wed Jul 22 15:06:06 2015 From: Das.Linux at gmx.de (Tobias Pape) Date: Wed Jul 22 15:06:14 2015 Subject: =?windows-1252?Q?Re=3A_=5Bsqueak-dev=5D_Fwd=3A_Build_failed_in_J?= =?windows-1252?Q?enkins=3A_Trunk__=C2=BB_default_=232?= In-Reply-To: <4540.136.2.1.105.1437577337.squirrel@webmail.msen.com> References: <6606111.0.1437547209169.JavaMail.jenkins@box3-squeak> <052C36FB-1458-4A77-B6E1-2E2B72018973@gmx.de> <4540.136.2.1.105.1437577337.squirrel@webmail.msen.com> Message-ID: <513A199F-1797-44D6-8395-615F52E7F889@gmx.de> On 22.07.2015, at 17:02, David T. Lewis wrote: > Actually, Jenkins was completely off line by the time I looked at it. I'm > not sure if the problems may be related. > That should be different :/ > Dave > >> Console seems to indicate that it was testing ImageSegments which are not >> working IFAIK, and are crashing the windows vm at least. >> >> http://build.squeak.org/job/Trunk/default/2/consoleFull >> >> Karl >> >> On Wed, Jul 22, 2015 at 8:53 AM, Tobias Pape wrote: >> >>> Dear all, it is currently impossible to test trunk (spur) on jenkins, >>> can >>> someone please have a look? >>> >>> -- >>> Tobias Pape >>> sent from a mobile device >>> >>> Anfang der weitergeleiteten E???Mail: >>> >>> *Von:* squeak-ci >>> *Datum:* 22. Juli 2015 08:40:09 MESZ >>> *An:* Das.Linux@gmx.de >>> *Betreff:* *Build failed in Jenkins: Trunk ?? default #2* >>> >>> See >>> >>> Changes: >>> >>> [Tobias Pape] bump Cog >>> >>> ------------------------------------------ >>> [...truncated 353 lines...] >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> nextObject >>> >>> stack page bytes 4096 available headroom 2788 minimum unused headroom >>> 2984 >>> >>> (Recursive not understood error encountered) >>> Aborted >>> should pass all tests (FAILED - 1) >>> >>> Failures: >>> >>> 1) Trunk test suite for Spur image test suite should pass all tests >>> Failure/Error: run_image_with_cmd(@vm, vm_args(@os_name), >>> RUN_TEST_IMAGE_NAME, "#{SRC}/tests.st", 30.minutes) >>> RuntimeError: >>> Process 10561 failed with exit status 134 >>> # ./lib/squeak-ci/build.rb:393:in `block in run_image_with_cmd' >>> # ./lib/squeak-ci/build.rb:26:in `counted_command' >>> # ./lib/squeak-ci/build.rb:352:in `run_image_with_cmd' >>> # ./test/spur_image_test.rb:37:in `block (4 levels) in >> (required)>' >>> # ./test/spur_image_test.rb:32:in `chdir' >>> # ./test/spur_image_test.rb:32:in `block (3 levels) in >> (required)>' >>> >>> Finished in 56.15 seconds >>> 1 example, 1 failure >>> >>> Failed examples: >>> >>> rspec ./test/spur_image_test.rb:31 # Trunk test suite for Spur image >>> test >>> suite should pass all tests >>> rake aborted! >>> /var/lib/jenkins/.rvm/rubies/ruby-1.9.3-p392/bin/ruby -S rspec >>> test/spur_image_test.rb -fdoc failed >>> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:156:in >>> `run_task' >>> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:124:in >>> `block (2 levels) in initialize' >>> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/gems/rspec-core-2.13.0/lib/rspec/core/rake_task.rb:122:in >>> `block in initialize' >>> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/bin/ruby_executable_hooks:15:in >>> `eval' >>> /var/lib/jenkins/.rvm/gems/ruby-1.9.3-p392/bin/ruby_executable_hooks:15:in >>> `
' >>> Tasks: TOP => spur_test >>> (See full trace by running task with --trace) >>> Build step 'Execute shell' marked build as failure >>> Discard old builds... >>> Recording test results From asqueaker at gmail.com Wed Jul 22 15:09:10 2015 From: asqueaker at gmail.com (Chris Muller) Date: Wed Jul 22 15:09:14 2015 Subject: [squeak-dev] final final Squeak-4.6-All-in-One posted In-Reply-To: <20150722013601.GA92309@shell.msen.com> References: <55AEC528.6060509@zogotounga.net> <20150722013601.GA92309@shell.msen.com> Message-ID: > Me too. I think we should have a wiki page for "top 10 horrible > preferences and how to make them go away". Or, instead of just "go away" some narrative about what they do and why? "How the top 10 horrible preferences can actually make your life better.." From tim at rowledge.org Wed Jul 22 17:05:49 2015 From: tim at rowledge.org (tim Rowledge) Date: Wed Jul 22 17:05:57 2015 Subject: [squeak-dev] final final Squeak-4.6-All-in-One posted In-Reply-To: References: <55AEC528.6060509@zogotounga.net> <4C38C91B-0964-489B-AE7B-73D3FBE2A895@rowledge.org> Message-ID: <52A84E3C-AE19-4613-82FF-FE70EA2319C5@rowledge.org> On 22-07-2015, at 8:04 AM, Chris Muller wrote: > >> And the Release Notes text jars a bit - for 4.6 there *isn?t* a new vm for the ARM - we only did the spur vm for ARM. In fact right now it would take some effort to make a plain ARM cog vm since the strictures of the abort trap etc mean there isn?t a suitable way to discriminate the nmethod type. > > We had MONTHS for people to make suggestions for the 4.6 release. And somet1mes nobody notises the ovbious spilling or gramer mistake until thay happen to glanse at it juost the write whey. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Useful random insult:- He has a tenuous grip on the obvious. From dnorton at mindspring.com Wed Jul 22 22:17:06 2015 From: dnorton at mindspring.com (Dan Norton) Date: Wed Jul 22 22:17:50 2015 Subject: [squeak-dev] final final Squeak-4.6-All-in-One posted In-Reply-To: <20150722013601.GA92309@shell.msen.com> References: , , <20150722013601.GA92309@shell.msen.com> Message-ID: <55B01662.11063.200DF12@dnorton.mindspring.com> On 21 Jul 2015 at 21:36, David T. Lewis wrote: > On Tue, Jul 21, 2015 at 08:02:16PM -0500, Chris Muller wrote: > > The look and preferences of 4.6 were set up by Marcel and (I > think) > > others at HPI. Marcel made tremendous contributions to the IDE of > 4.6 > > and so it makes sense to let him finish his vision of what the > release > > IDE should look and feel like. As a whole, Squeak is a > successful > > example of design by committee, but an IDE's look and feel, like > a > > piece of art, can benefit from being designed by a few or single > mind > > due to the more cohesive vision of all the components. > > Excellent summary, and FWIW I agree. Marcel also provided > justification > for this based on the reactions of many new users to the Squeak > image. > Even though I do not personally like the grey look, I recognize that > the > initial reaction of new users on first exposure to the release image > is > more important than my personal preference. > > > > > I certainly won't be running with gray windows -- it provides way > too > > little delineation of background windows, leaving me with only > the > > window position and its symbology (letters) for identification. > > Me too. I think we should have a wiki page for "top 10 horrible > preferences and how to make them go away". > +1 - Dan From asqueaker at gmail.com Thu Jul 23 15:23:53 2015 From: asqueaker at gmail.com (Chris Muller) Date: Thu Jul 23 15:23:59 2015 Subject: [squeak-dev] [ANN] Squeak 4.6 Message-ID: The Squeak community is pleased to announce the release of version 4.6. More than a year in development, this release provides significant upgrades in core function and performance, as well as many improvements to the IDE resulting in more productive use and development. Specific notes for the release are here: http://wiki.squeak.org/squeak/6192 The main website, including download links is here. http://www.squeak.org Please note, 4.6 is an interim stepping stone to the 5.0 release which is planned for immediate release. From asqueaker at gmail.com Thu Jul 23 15:55:53 2015 From: asqueaker at gmail.com (Chris Muller) Date: Thu Jul 23 15:55:56 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB Message-ID: I managed to successfully incorporate the ARM platform into the 5.0 All-In-One -- so Squeak 5 will now start up with one-click on FOUR platforms, OOTB..!! I'm thankful to this community for collaborating to produce and shake out the 4.6 release. As this is a special dual release, your help is needed one more time to help shake out this 5.0 release. Would you please download this latest Squeak-5.0-All-in-One and check it out? We still have a chance to avoid obvious bugs, but we want to keep it as close to the 4.6 release as possible. http://ftp.squeak.org/5.0/Squeak-5.0-All-in-One.zip Here are some things I've noticed already, but I need your help to figure out how to deal with them: - someone said the VM is crashing in the Jenkins build due to ImageSegments tests. Do we want to disable those tests? - Actually, when I ran the tests in the image, there was no VM crash, but the dialog, "Running all tests might take a some minutes" (<--- hey that's some nice grammar there Marcel! ;-) ) appeared TWICE. When I clicked "Yes" the first time they ran, "Yes" a second time, no effect. Just a strange UI bug..? - Look at the image size, its DOUBLE the size of the 4.6 image. Why? I'm getting excited, thank you!! Chris From asqueaker at gmail.com Thu Jul 23 15:57:48 2015 From: asqueaker at gmail.com (Chris Muller) Date: Thu Jul 23 15:57:50 2015 Subject: [squeak-dev] Re: Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: In running the tests in the image, I also noticed this appeared on the console: 38451353:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../../ssl/s23_clnt.c:552: On Thu, Jul 23, 2015 at 10:55 AM, Chris Muller wrote: > I managed to successfully incorporate the ARM platform into the 5.0 > All-In-One -- so Squeak 5 will now start up with one-click on FOUR > platforms, OOTB..!! > > I'm thankful to this community for collaborating to produce and shake > out the 4.6 release. As this is a special dual release, your help is > needed one more time to help shake out this 5.0 release. Would you > please download this latest Squeak-5.0-All-in-One and check it out? > We still have a chance to avoid obvious bugs, but we want to keep it > as close to the 4.6 release as possible. > > http://ftp.squeak.org/5.0/Squeak-5.0-All-in-One.zip > > Here are some things I've noticed already, but I need your help to > figure out how to deal with them: > > - someone said the VM is crashing in the Jenkins build due to > ImageSegments tests. Do we want to disable those tests? > > - Actually, when I ran the tests in the image, there was no VM > crash, but the dialog, "Running all tests might take a some minutes" > (<--- hey that's some nice grammar there Marcel! ;-) ) appeared > TWICE. When I clicked "Yes" the first time they ran, "Yes" a second > time, no effect. Just a strange UI bug..? > > - Look at the image size, its DOUBLE the size of the 4.6 image. Why? > > I'm getting excited, thank you!! > Chris From tim at rowledge.org Thu Jul 23 17:18:50 2015 From: tim at rowledge.org (tim Rowledge) Date: Thu Jul 23 17:19:02 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: <814A417B-D5A6-4F93-9C9F-07F42549C21D@rowledge.org> On 23-07-2015, at 8:55 AM, Chris Muller wrote: > I managed to successfully incorporate the ARM platform into the 5.0 > All-In-One -- so Squeak 5 will now start up with one-click on FOUR > platforms, OOTB..!! Excellent - one tiny change needs to be made to let it work on a Pi2 though; the shell script test for ARMv6l, which is correct for PiA+, B * B+ but the Pi2 is ARMv7. With that changed it fired up on my pi2 ok. > > > > - Look at the image size, its DOUBLE the size of the 4.6 image. Why? Space analysis on my Pi2 shows a lot of MC* objects, which as we?ve seen before seem to hold onto a lot of the 4Mb of String and quite a few arrays, symbols etc listed. Oh, and I noticed in the Contents/Resources directory that there seems to be a spare _test.[image|changes] pair. Presumably not actually wanted? tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim EBCDIC: Erase, Back up, Chew Disk, Ignite Card From karlramberg at gmail.com Thu Jul 23 17:41:27 2015 From: karlramberg at gmail.com (karl ramberg) Date: Thu Jul 23 17:41:30 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: Great work :-) It seems control and alt keys are not swapped so out of the box you have to use alt+c to copy text on Windows. Karl On Thu, Jul 23, 2015 at 5:55 PM, Chris Muller wrote: > I managed to successfully incorporate the ARM platform into the 5.0 > All-In-One -- so Squeak 5 will now start up with one-click on FOUR > platforms, OOTB..!! > > I'm thankful to this community for collaborating to produce and shake > out the 4.6 release. As this is a special dual release, your help is > needed one more time to help shake out this 5.0 release. Would you > please download this latest Squeak-5.0-All-in-One and check it out? > We still have a chance to avoid obvious bugs, but we want to keep it > as close to the 4.6 release as possible. > > http://ftp.squeak.org/5.0/Squeak-5.0-All-in-One.zip > > Here are some things I've noticed already, but I need your help to > figure out how to deal with them: > > - someone said the VM is crashing in the Jenkins build due to > ImageSegments tests. Do we want to disable those tests? > > - Actually, when I ran the tests in the image, there was no VM > crash, but the dialog, "Running all tests might take a some minutes" > (<--- hey that's some nice grammar there Marcel! ;-) ) appeared > TWICE. When I clicked "Yes" the first time they ran, "Yes" a second > time, no effect. Just a strange UI bug..? > > - Look at the image size, its DOUBLE the size of the 4.6 image. Why? > > I'm getting excited, thank you!! > Chris > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150723/10f644f4/attachment.htm From karlramberg at gmail.com Thu Jul 23 18:01:45 2015 From: karlramberg at gmail.com (karl ramberg) Date: Thu Jul 23 18:01:49 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: StackMorph initializion causes a DNU in Objects tool Presentation category. :-( I don't really understand why this does not work now, what can have changed with this tool lately ?? On Thu, Jul 23, 2015 at 7:41 PM, karl ramberg wrote: > Great work :-) > > It seems control and alt keys are not swapped so out of the box you have > to use alt+c to copy text on Windows. > > Karl > > On Thu, Jul 23, 2015 at 5:55 PM, Chris Muller wrote: > >> I managed to successfully incorporate the ARM platform into the 5.0 >> All-In-One -- so Squeak 5 will now start up with one-click on FOUR >> platforms, OOTB..!! >> >> I'm thankful to this community for collaborating to produce and shake >> out the 4.6 release. As this is a special dual release, your help is >> needed one more time to help shake out this 5.0 release. Would you >> please download this latest Squeak-5.0-All-in-One and check it out? >> We still have a chance to avoid obvious bugs, but we want to keep it >> as close to the 4.6 release as possible. >> >> http://ftp.squeak.org/5.0/Squeak-5.0-All-in-One.zip >> >> Here are some things I've noticed already, but I need your help to >> figure out how to deal with them: >> >> - someone said the VM is crashing in the Jenkins build due to >> ImageSegments tests. Do we want to disable those tests? >> >> - Actually, when I ran the tests in the image, there was no VM >> crash, but the dialog, "Running all tests might take a some minutes" >> (<--- hey that's some nice grammar there Marcel! ;-) ) appeared >> TWICE. When I clicked "Yes" the first time they ran, "Yes" a second >> time, no effect. Just a strange UI bug..? >> >> - Look at the image size, its DOUBLE the size of the 4.6 image. Why? >> >> I'm getting excited, thank you!! >> Chris >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150723/75668365/attachment.htm From herbertkoenig at gmx.net Thu Jul 23 18:17:21 2015 From: herbertkoenig at gmx.net (=?UTF-8?Q?Herbert_K=c3=b6nig?=) Date: Thu Jul 23 18:17:24 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: <55B12FB1.8080005@gmx.net> Hey, great! downloaded it on the Pi A+ installed my trusty 24/7 cat surveillance app and it worked. CPU usage went down from 50 to 40%. It exercises BitBlt, Collections, file I/O incl. GPIO, OSProcess and CommandShell Memory went up from 52M to 75M which is critical as I use the PiNoir Camera. I'll watch what comes out of Tim's (Rowledge) recent post. And I'll watch if it runs as stable as 4.5. Thanks, Herbert Am 23.07.2015 um 17:55 schrieb Chris Muller: > I managed to successfully incorporate the ARM platform into the 5.0 > All-In-One -- so Squeak 5 will now start up with one-click on FOUR > platforms, OOTB..!! > From tim at rowledge.org Thu Jul 23 18:22:39 2015 From: tim at rowledge.org (tim Rowledge) Date: Thu Jul 23 18:22:44 2015 Subject: vm3410 segfault in SUnits (was: Re: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB) In-Reply-To: References: Message-ID: <0B87AE6F-6442-42A0-8E9F-9B2BFBFEDA58@rowledge.org> Dang; the 3410 Pi vm segfaults somewhere in StandardSourceFileArrayTest but the slightly older 3402 vm I?m using with my Scratch work doesn?t. Both with the all-in-one image of course. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Abdicate (v.), to give up all hope of ever having a flat stomach. From tim at rowledge.org Thu Jul 23 18:28:29 2015 From: tim at rowledge.org (tim Rowledge) Date: Thu Jul 23 18:28:32 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: <55B12FB1.8080005@gmx.net> References: <55B12FB1.8080005@gmx.net> Message-ID: On 23-07-2015, at 11:17 AM, Herbert K?nig wrote: > Hey, great! > > downloaded it on the Pi A+ installed my trusty 24/7 cat surveillance app and it worked. > CPU usage went down from 50 to 40%. It exercises BitBlt, Collections, file I/O incl. GPIO, OSProcess and CommandShell > Memory went up from 52M to 75M which is critical as I use the PiNoir Camera. Well the base image is about 20M bigger than the base 4.5 one for some reason, so that explains most of it. The VM is a touch bigger since it has the Cog translation system now, so you should notice a dramatic speedup. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Useful random insult:- He has a tenuous grip on the obvious. From herbertkoenig at gmx.net Thu Jul 23 18:58:52 2015 From: herbertkoenig at gmx.net (=?UTF-8?Q?Herbert_K=c3=b6nig?=) Date: Thu Jul 23 18:58:56 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: <55B12FB1.8080005@gmx.net> Message-ID: <55B1396C.6020206@gmx.net> Hi, speedup depends on what is exercised. See my previous post. I get about 20% in my app which I'll gladly use for a higher framerate but I don't consider that dramatic. My first priority is stability. Then I'll check which parts of the program account for the improvements. Cheers, Herbert Am 23.07.2015 um 20:28 schrieb tim Rowledge: > On 23-07-2015, at 11:17 AM, Herbert K?nig wrote: > >> Hey, great! >> >> downloaded it on the Pi A+ installed my trusty 24/7 cat surveillance app and it worked. >> CPU usage went down from 50 to 40%. It exercises BitBlt, Collections, file I/O incl. GPIO, OSProcess and CommandShell >> Memory went up from 52M to 75M which is critical as I use the PiNoir Camera. > Well the base image is about 20M bigger than the base 4.5 one for some reason, so that explains most of it. The VM is a touch bigger since it has the Cog translation system now, so you should notice a dramatic speedup. > > > tim > -- > tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim > Useful random insult:- He has a tenuous grip on the obvious. > > > From herbertkoenig at gmx.net Thu Jul 23 19:09:05 2015 From: herbertkoenig at gmx.net (=?UTF-8?Q?Herbert_K=c3=b6nig?=) Date: Thu Jul 23 19:09:10 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: <55B12FB1.8080005@gmx.net> References: <55B12FB1.8080005@gmx.net> Message-ID: <55B13BD1.9050500@gmx.net> Hi, I noticed some glitches: When I use list filtering for the instvars in an inspector the list doesn't automatically return to normal. Maybe a preference I missed. When I play with that list filtering at some point the CPU goes up to 90% and does not return until I shut down the image. The right click (personal) World menu has lost the entry to disable the main docking bar. I disabled it via preferences. Otherwise it survived the first hour :-)) Cheers, Herbert Am 23.07.2015 um 20:17 schrieb Herbert K?nig: > Hey, great! > > downloaded it on the Pi A+ installed my trusty 24/7 cat surveillance > app and it worked. > CPU usage went down from 50 to 40%. It exercises BitBlt, Collections, > file I/O incl. GPIO, OSProcess and CommandShell > Memory went up from 52M to 75M which is critical as I use the PiNoir > Camera. > > I'll watch what comes out of Tim's (Rowledge) recent post. > > And I'll watch if it runs as stable as 4.5. > > Thanks, > > Herbert > > > Am 23.07.2015 um 17:55 schrieb Chris Muller: >> I managed to successfully incorporate the ARM platform into the 5.0 >> All-In-One -- so Squeak 5 will now start up with one-click on FOUR >> platforms, OOTB..!! >> > > From pdebruic at gmail.com Thu Jul 23 21:03:06 2015 From: pdebruic at gmail.com (Paul DeBruicker) Date: Thu Jul 23 21:03:13 2015 Subject: [squeak-dev] Screamer for Smalltalk? Message-ID: <508E4985-2ADF-4A31-87D1-6E11A66FEA5B@gmail.com> Hi Screamer (https://nikodemus.github.io/screamer/) is a Lisp library that: "Screamer provides a nondeterministic choice-point operator, a backtracking mechanism, and a forward propagation facility." Is there an equivalent library available in Smalltalk? Thanks Paul From lecteur at zogotounga.net Thu Jul 23 21:42:54 2015 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Thu Jul 23 21:42:51 2015 Subject: [squeak-dev] Screamer for Smalltalk? In-Reply-To: <508E4985-2ADF-4A31-87D1-6E11A66FEA5B@gmail.com> References: <508E4985-2ADF-4A31-87D1-6E11A66FEA5B@gmail.com> Message-ID: <55B15FDE.2030509@zogotounga.net> > Screamer (https://nikodemus.github.io/screamer/) is a Lisp library that: > > "Screamer provides a nondeterministic choice-point operator, a backtracking mechanism, and a forward propagation facility." > > > Is there an equivalent library available in Smalltalk? There is AMB, for at least some part of it: http://map.squeak.org/package/7c77c4c4-58c0-4c7a-8cfb-484779ee639b Stef From leves at elte.hu Thu Jul 23 21:43:38 2015 From: leves at elte.hu (Levente Uzonyi) Date: Thu Jul 23 21:43:44 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: <55B12FB1.8080005@gmx.net> Message-ID: I think it's related to the segmented memory model of Spur, which uses more memmory than the the compact model of pre-Spur Squeak. I think in Spur there should be a primivite which condenses all (non-pinned) segments, and minimizes their number. I'd probably be worth using such thing on "Save and Quit", because that way all pinned objects could be condensed too. Levente On Thu, 23 Jul 2015, tim Rowledge wrote: > > On 23-07-2015, at 11:17 AM, Herbert K?nig wrote: > >> Hey, great! >> >> downloaded it on the Pi A+ installed my trusty 24/7 cat surveillance app and it worked. >> CPU usage went down from 50 to 40%. It exercises BitBlt, Collections, file I/O incl. GPIO, OSProcess and CommandShell >> Memory went up from 52M to 75M which is critical as I use the PiNoir Camera. > > Well the base image is about 20M bigger than the base 4.5 one for some reason, so that explains most of it. The VM is a touch bigger since it has the Cog translation system now, so you should notice a dramatic speedup. > > > tim > -- > tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim > Useful random insult:- He has a tenuous grip on the obvious. > > > > From unoduetre at poczta.onet.pl Thu Jul 23 21:52:11 2015 From: unoduetre at poczta.onet.pl (Mateusz Grotek) Date: Thu Jul 23 21:48:34 2015 Subject: [squeak-dev] Screamer for Smalltalk? In-Reply-To: <508E4985-2ADF-4A31-87D1-6E11A66FEA5B@gmail.com> (from pdebruic@gmail.com on Thu Jul 23 22:03:06 2015) Message-ID: <1437688331.23667.4@mglap> Dnia 23.07.2015 22:03:06, Paul DeBruicker napisa?(a): > Hi > > Screamer (https://nikodemus.github.io/screamer/) is a Lisp library > that: > > "Screamer provides a nondeterministic choice-point operator, a > backtracking mechanism, and a forward propagation facility." > > > Is there an equivalent library available in Smalltalk? > > > Thanks > > Paul > Check the following: http://ss3.gemstone.com/ss/Control.html Besides that it is very easy to implement it yourself. Check the following paper with the example source code: http://dl.acm.org/citation.cfm?id=62094&dl=ACM&coll=DL&CFID=695810388&CFTOKEN=37024291 From tim at rowledge.org Thu Jul 23 21:54:29 2015 From: tim at rowledge.org (tim Rowledge) Date: Thu Jul 23 21:54:36 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: <55B12FB1.8080005@gmx.net> Message-ID: <55AEA16A-2A3F-4742-88F9-6B6A3CC01AF6@rowledge.org> On 23-07-2015, at 2:43 PM, Levente Uzonyi wrote: > I think it's related to the segmented memory model of Spur, which uses more memmory than the the compact model of pre-Spur Squeak. Highly unlikely to make for a 16Mb -> 35Mb jump. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim If you don't pay the exorcist do you get repossessed? From tim at rowledge.org Fri Jul 24 00:34:15 2015 From: tim at rowledge.org (tim Rowledge) Date: Fri Jul 24 00:34:25 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: <55AEA16A-2A3F-4742-88F9-6B6A3CC01AF6@rowledge.org> References: <55B12FB1.8080005@gmx.net> <55AEA16A-2A3F-4742-88F9-6B6A3CC01AF6@rowledge.org> Message-ID: <1FDCE4BA-3E5A-423C-BFAC-281CADEBBC00@rowledge.org> On 23-07-2015, at 2:54 PM, tim Rowledge wrote: > > On 23-07-2015, at 2:43 PM, Levente Uzonyi wrote: > >> I think it's related to the segmented memory model of Spur, which uses more memmory than the the compact model of pre-Spur Squeak. > Highly unlikely to make for a 16Mb -> 35Mb jump. If you run the Space Analysis within the ?About Squeak? applet, it claims that the image has 300,000 objects taking up 25Mb . So somewhere there is 9Mb ?wasted? in some fashion. Since the tally code finds object sizes via a primitive that takes into account header sizes it should be adding up ok. There *is* code that avoids writing free space in each of the segments when snapshotting, as well as doing a garbage collect. So all in all, I?m puzzled where the space comes from. Run it under sim I guess and find out... tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Loyalty oaths.Secret searches.No-fly lists.Detention without legal recourse. Remind me - who won the cold war? From asqueaker at gmail.com Fri Jul 24 03:03:14 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 24 03:03:18 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: <814A417B-D5A6-4F93-9C9F-07F42549C21D@rowledge.org> References: <814A417B-D5A6-4F93-9C9F-07F42549C21D@rowledge.org> Message-ID: >> I managed to successfully incorporate the ARM platform into the 5.0 >> All-In-One -- so Squeak 5 will now start up with one-click on FOUR >> platforms, OOTB..!! > > Excellent - one tiny change needs to be made to let it work on a Pi2 though; the shell script test for ARMv6l, which is correct for PiA+, B * B+ but the Pi2 is ARMv7. With that changed it fired up on my pi2 ok. Is it case-sensitive? Mine reported armv6l, not ARMv6l. If it is, I'll bet on consistency, if it isn't, lowercase won't matter. I added a check for armv7l. >> - Look at the image size, its DOUBLE the size of the 4.6 image. Why? > > Space analysis on my Pi2 shows a lot of MC* objects, which as we?ve seen before seem to hold onto a lot of the 4Mb of String and quite a few arrays, symbols etc listed. I can't believe MCFileBasedRepository flushAllCaches is not part of #prepareNewRelease (which makes me wonder whether 4.6 may have a bunch of cached versions.. please no!). I'm adding it. > Oh, and I noticed in the Contents/Resources directory that there seems to be a spare _test.[image|changes] pair. Presumably not actually wanted? Oops.. From asqueaker at gmail.com Fri Jul 24 03:22:42 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 24 03:22:46 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: > It seems control and alt keys are not swapped so out of the box you have to > use alt+c to copy text on Windows. Is this the same as 4.6? From asqueaker at gmail.com Fri Jul 24 03:46:13 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 24 03:46:15 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: <55B13BD1.9050500@gmx.net> References: <55B12FB1.8080005@gmx.net> <55B13BD1.9050500@gmx.net> Message-ID: It appears I may have had my .prefs file loaded when I ran #prepareNewRelease, which sets many preferences but not all of them. The ones it doesn't set were left to my preference. I was surprised to notice my scratch pad preference was on, it shouldn't be for the release (actually it should! but I won't go there.. :) ). I'll have to fix this... somehow. Now we know why Bert wants to support Preferences outOfTheBox. The one use-case we're missing is, we need to be able to _generate_ a #defaultValueTableForCurrentRelease from current preference settings.. On Thu, Jul 23, 2015 at 2:09 PM, Herbert K?nig wrote: > Hi, > > I noticed some glitches: > When I use list filtering for the instvars in an inspector the list doesn't > automatically return to normal. Maybe a preference I missed. > When I play with that list filtering at some point the CPU goes up to 90% > and does not return until I shut down the image. > The right click (personal) World menu has lost the entry to disable the main > docking bar. I disabled it via preferences. > > Otherwise it survived the first hour :-)) > > Cheers, > > Herbert > > > Am 23.07.2015 um 20:17 schrieb Herbert K?nig: >> >> Hey, great! >> >> downloaded it on the Pi A+ installed my trusty 24/7 cat surveillance app >> and it worked. >> CPU usage went down from 50 to 40%. It exercises BitBlt, Collections, >> file I/O incl. GPIO, OSProcess and CommandShell >> Memory went up from 52M to 75M which is critical as I use the PiNoir >> Camera. >> >> I'll watch what comes out of Tim's (Rowledge) recent post. >> >> And I'll watch if it runs as stable as 4.5. >> >> Thanks, >> >> Herbert >> >> >> Am 23.07.2015 um 17:55 schrieb Chris Muller: >>> >>> I managed to successfully incorporate the ARM platform into the 5.0 >>> All-In-One -- so Squeak 5 will now start up with one-click on FOUR >>> platforms, OOTB..!! >>> >> >> > > From tim at rowledge.org Fri Jul 24 04:52:04 2015 From: tim at rowledge.org (tim Rowledge) Date: Fri Jul 24 04:52:10 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: <814A417B-D5A6-4F93-9C9F-07F42549C21D@rowledge.org> Message-ID: On 23-07-2015, at 8:03 PM, Chris Muller wrote: >> Excellent - one tiny change needs to be made to let it work on a Pi2 though; the shell script test for ARMv6l, which is correct for PiA+, B * B+ but the Pi2 is ARMv7. With that changed it fired up on my pi2 ok. > > Is it case-sensitive? Mine reported armv6l, not ARMv6l. If it is, > I'll bet on consistency, if it isn't, lowercase won't matter. I added > a check for armv7l. `uname -m` seems to return all lower case ?armv7l? on my particular Pi2 so I imagine that is typical. > >>> - Look at the image size, its DOUBLE the size of the 4.6 image. Why? >> >> Space analysis on my Pi2 shows a lot of MC* objects, which as we?ve seen before seem to hold onto a lot of the 4Mb of String and quite a few arrays, symbols etc listed. > > I can't believe MCFileBasedRepository flushAllCaches is not part of > #prepareNewRelease (which makes me wonder whether 4.6 may have a bunch > of cached versions.. please no!). I'm adding it. What I?m a bit puzzled about is that I have now tried out an assortment of MC reduction stuff - MCFileBasedRepository flushAllCaches. MCDefinition clearInstances. MCWorkingCopy stubAllAncestryForScratchRelease. MCWorkingCopy allManagers do: [:wc | wc unregister]. Project allSubInstancesDo:[:pr| pr resourceManager reset]. for example and it isn?t making any change to the image size at all so far as I can tell. I?ve even whacked the stubAncestry to to cut back to a single stub instead of 10 and no effect can be seen. Sumfing not right here... > >> Oh, and I noticed in the Contents/Resources directory that there seems to be a spare _test.[image|changes] pair. Presumably not actually wanted? > > Oops.. Many, many oops. Around 300,000 in that image :-) tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Strange OpCodes: WAF: Warn After the Fact From Marcel.Taeumel at hpi.de Fri Jul 24 06:26:56 2015 From: Marcel.Taeumel at hpi.de (marcel.taeumel) Date: Fri Jul 24 06:28:06 2015 Subject: [squeak-dev] Re: Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: <1437719216464-4839008.post@n4.nabble.com> I cannot reproduce the bug with the duplicate prompt. All tests ran after hitting the 'Yes' button. SUnit Results ------------- 3763 run, 3703 passes, 24 expected failures, 31 failures, 5 errors, 0 unexpected passes Best, Marcel -- View this message in context: http://forum.world.st/Squeak-5-will-run-on-Rasberry-Pi-OOTB-tp4838903p4839008.html Sent from the Squeak - Dev mailing list archive at Nabble.com. From brasspen at gmail.com Fri Jul 24 12:33:22 2015 From: brasspen at gmail.com (Chris Cunnington) Date: Fri Jul 24 12:33:30 2015 Subject: [squeak-dev] Compiling a 64-big virtual machine Message-ID: https://websela.wordpress.com/ Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150724/0298cb5a/attachment.htm From craig at netjam.org Fri Jul 24 12:37:53 2015 From: craig at netjam.org (Craig Latta) Date: Fri Jul 24 12:38:06 2015 Subject: [squeak-dev] re: diagnosing Spur object memory growth (was "Squeak 5 will run on Rasberry Pi OOTB") In-Reply-To: <1FDCE4BA-3E5A-423C-BFAC-281CADEBBC00@rowledge.org> References: <55B12FB1.8080005@gmx.net> <55AEA16A-2A3F-4742-88F9-6B6A3CC01AF6@rowledge.org> <1FDCE4BA-3E5A-423C-BFAC-281CADEBBC00@rowledge.org> Message-ID: Hi Tim and all-- > ...somewhere there is 9Mb ?wasted? in some fashion... Run it under > sim I guess and find out... If anyone has done this, please let me know what you found, so I'll know a bit more going in. Seems like a good use for [1]. -C [1] http://netjam.org/context/viz -- Craig Latta netjam.org +31 6 2757 7177 (SMS ok) + 1 415 287 3547 (no SMS) From karlramberg at gmail.com Fri Jul 24 13:06:52 2015 From: karlramberg at gmail.com (karl ramberg) Date: Fri Jul 24 13:06:56 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: <55B12FB1.8080005@gmx.net> <55B13BD1.9050500@gmx.net> Message-ID: The FileList services is not initialized to read .prefs from FileList in the 5.0 image. Do it: FileList initialize Then you can load any saved preference file with the FileList. Karl On Fri, Jul 24, 2015 at 5:46 AM, Chris Muller wrote: > It appears I may have had my .prefs file loaded when I ran > #prepareNewRelease, which sets many preferences but not all of them. > The ones it doesn't set were left to my preference. I was surprised > to notice my scratch pad preference was on, it shouldn't be for the > release (actually it should! but I won't go there.. :) ). > > I'll have to fix this... somehow. Now we know why Bert wants to > support Preferences outOfTheBox. The one use-case we're missing is, > we need to be able to _generate_ a #defaultValueTableForCurrentRelease > from current preference settings.. > > On Thu, Jul 23, 2015 at 2:09 PM, Herbert K?nig > wrote: > > Hi, > > > > I noticed some glitches: > > When I use list filtering for the instvars in an inspector the list > doesn't > > automatically return to normal. Maybe a preference I missed. > > When I play with that list filtering at some point the CPU goes up to 90% > > and does not return until I shut down the image. > > The right click (personal) World menu has lost the entry to disable the > main > > docking bar. I disabled it via preferences. > > > > Otherwise it survived the first hour :-)) > > > > Cheers, > > > > Herbert > > > > > > Am 23.07.2015 um 20:17 schrieb Herbert K?nig: > >> > >> Hey, great! > >> > >> downloaded it on the Pi A+ installed my trusty 24/7 cat surveillance app > >> and it worked. > >> CPU usage went down from 50 to 40%. It exercises BitBlt, Collections, > >> file I/O incl. GPIO, OSProcess and CommandShell > >> Memory went up from 52M to 75M which is critical as I use the PiNoir > >> Camera. > >> > >> I'll watch what comes out of Tim's (Rowledge) recent post. > >> > >> And I'll watch if it runs as stable as 4.5. > >> > >> Thanks, > >> > >> Herbert > >> > >> > >> Am 23.07.2015 um 17:55 schrieb Chris Muller: > >>> > >>> I managed to successfully incorporate the ARM platform into the 5.0 > >>> All-In-One -- so Squeak 5 will now start up with one-click on FOUR > >>> platforms, OOTB..!! > >>> > >> > >> > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150724/8c653c06/attachment-0001.htm From asqueaker at gmail.com Fri Jul 24 15:07:48 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 24 15:07:51 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: On Thu, Jul 23, 2015 at 1:01 PM, karl ramberg wrote: > StackMorph initializion causes a DNU in Objects tool Presentation category. > > :-( > > I don't really understand why this does not work now, what can have changed > with this tool lately ?? Its after running the tests I think... Before running tests I think its fine. From asqueaker at gmail.com Fri Jul 24 15:31:34 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 24 15:31:39 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: <55B13BD1.9050500@gmx.net> References: <55B12FB1.8080005@gmx.net> <55B13BD1.9050500@gmx.net> Message-ID: > I noticed some glitches: > When I use list filtering for the instvars in an inspector the list doesn't > automatically return to normal. > Maybe a preference I missed. Preference is "Filterable Lists Clear Automatically". Looks like it was conciously decided to set that off for this release. > When I play with that list filtering at some point the CPU goes up to 90% > and does not return until I shut down the image. How to reproduce? > The right click (personal) World menu has lost the entry to disable the main > docking bar. I disabled it via preferences. This is due to #generalizedYellowButtonMenu. I'll set it explicitly in the release builder. > Otherwise it survived the first hour :-)) Thanks for the report! From karlramberg at gmail.com Fri Jul 24 15:33:22 2015 From: karlramberg at gmail.com (karl ramberg) Date: Fri Jul 24 15:33:26 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: Skipped content of type multipart/alternative-------------- next part -------------- A non-text attachment was scrubbed... Name: DisableProjectSaving.1.cs Type: application/octet-stream Size: 7457 bytes Desc: not available Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150724/36021e81/DisableProjectSaving.1.obj From asqueaker at gmail.com Fri Jul 24 16:22:03 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 24 16:22:07 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: I believe every reproducible issue in this thread is addressed except the following: I wrote: > someone said the VM is crashing in the Jenkins build due to > ImageSegments tests. Do we want to disable those tests? No tests were disabled. Are we ok? > - Look at the image size, its DOUBLE the size of the 4.6 image. Why? The top 10 consumers of space are essentially the same in 4.6 and 5.0. So the extra space consumption must be something related to Spur internals. Herbert wrote: > When I use list filtering for the instvars in an inspector the list doesn't > automatically return to normal. Maybe a preference I missed. Marcel (un)set this as the new default for this release. "Filterable Lists Clear Automatically". Karl wrote: > It seems control and alt keys are not swapped so out of the box you have to > use alt+c to copy text on Windows. This is how it was in 4.6 and even 4.5. Won't change this for 5.0 at this point. ======= I just uploaded a new 5.0 All-in-One with all the other issues addressed. On Fri, Jul 24, 2015 at 10:33 AM, karl ramberg wrote: > Disable project saving from menus until we can make it work again. > > You probably have to do a "Rebuild menus" from Extras menu in the Docking > bar > > On Thu, Jul 23, 2015 at 5:55 PM, Chris Muller wrote: >> >> I managed to successfully incorporate the ARM platform into the 5.0 >> All-In-One -- so Squeak 5 will now start up with one-click on FOUR >> platforms, OOTB..!! >> >> I'm thankful to this community for collaborating to produce and shake >> out the 4.6 release. As this is a special dual release, your help is >> needed one more time to help shake out this 5.0 release. Would you >> please download this latest Squeak-5.0-All-in-One and check it out? >> We still have a chance to avoid obvious bugs, but we want to keep it >> as close to the 4.6 release as possible. >> >> http://ftp.squeak.org/5.0/Squeak-5.0-All-in-One.zip >> >> Here are some things I've noticed already, but I need your help to >> figure out how to deal with them: >> >> - someone said the VM is crashing in the Jenkins build due to >> ImageSegments tests. Do we want to disable those tests? >> >> - Actually, when I ran the tests in the image, there was no VM >> crash, but the dialog, "Running all tests might take a some minutes" >> (<--- hey that's some nice grammar there Marcel! ;-) ) appeared >> TWICE. When I clicked "Yes" the first time they ran, "Yes" a second >> time, no effect. Just a strange UI bug..? >> >> - Look at the image size, its DOUBLE the size of the 4.6 image. Why? >> >> I'm getting excited, thank you!! >> Chris >> > > > > From lecteur at zogotounga.net Fri Jul 24 16:50:24 2015 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Fri Jul 24 16:50:20 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: <55B26CD0.2050607@zogotounga.net> Just a question: On Windows both all-in-one VMs have the effect of preference swapMouseButtons inverted with regard to what I'm used to: when turned off the yellow button is the middle one while I would expect it to be the right one, as it is in my current VM. Both VMs say they are a Cog VM 4.5 from july 6, 2015. Is it a new convention, or am I missing something ? Stef From karlramberg at gmail.com Fri Jul 24 17:20:33 2015 From: karlramberg at gmail.com (karl ramberg) Date: Fri Jul 24 17:20:38 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: <55B26CD0.2050607@zogotounga.net> References: <55B26CD0.2050607@zogotounga.net> Message-ID: It is probably a VM configuration. In the Squeak.ini file set 3ButtonMouse to 1 or 0 depending on your what it is currently. Karl On Fri, Jul 24, 2015 at 6:50 PM, St?phane Rollandin wrote: > Just a question: > > On Windows both all-in-one VMs have the effect of preference > swapMouseButtons inverted with regard to what I'm used to: when turned off > the yellow button is the middle one while I would expect it to be the right > one, as it is in my current VM. Both VMs say they are a Cog VM 4.5 from > july 6, 2015. > > Is it a new convention, or am I missing something ? > > Stef > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150724/088bcd85/attachment.htm From lecteur at zogotounga.net Fri Jul 24 17:33:00 2015 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Fri Jul 24 17:32:53 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: <55B26CD0.2050607@zogotounga.net> Message-ID: <55B276CC.4050304@zogotounga.net> > In the Squeak.ini file set 3ButtonMouse to 1 or 0 depending on your what > it is currently. Ah, that's it. Thanks ! Stef From tim at rowledge.org Fri Jul 24 17:37:52 2015 From: tim at rowledge.org (tim Rowledge) Date: Fri Jul 24 17:38:02 2015 Subject: [squeak-dev] Compiling a 64-big virtual machine In-Reply-To: References: Message-ID: <9A64ABFA-7DB2-47E4-8922-5F6DD671F0A4@rowledge.org> A 64-big machine? Sounds like a new rapper in town? Sort of a cross between notorious BIG and an inflation corrected 50c. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Useful Latin Phrases:- Vacca foeda = Stupid cow From karlramberg at gmail.com Fri Jul 24 17:57:20 2015 From: karlramberg at gmail.com (karl ramberg) Date: Fri Jul 24 17:57:23 2015 Subject: [squeak-dev] Compiling a 64-big virtual machine In-Reply-To: <9A64ABFA-7DB2-47E4-8922-5F6DD671F0A4@rowledge.org> References: <9A64ABFA-7DB2-47E4-8922-5F6DD671F0A4@rowledge.org> Message-ID: 50c vent bankrupt. I don't know his denomination anymore On Fri, Jul 24, 2015 at 7:37 PM, tim Rowledge wrote: > A 64-big machine? Sounds like a new rapper in town? > Sort of a cross between notorious BIG and an inflation corrected 50c. > > tim > -- > tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim > Useful Latin Phrases:- Vacca foeda = Stupid cow > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150724/1eefd0ed/attachment.htm From tim at rowledge.org Fri Jul 24 18:02:25 2015 From: tim at rowledge.org (tim Rowledge) Date: Fri Jul 24 18:02:29 2015 Subject: [squeak-dev] Compiling a 64-big virtual machine In-Reply-To: References: <9A64ABFA-7DB2-47E4-8922-5F6DD671F0A4@rowledge.org> Message-ID: On 24-07-2015, at 10:57 AM, karl ramberg wrote: > 50c vent bankrupt. I don't know his denomination anymore centsless? tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Useful random insult:- If you stand close enough to him, you can hear the ocean From leves at elte.hu Fri Jul 24 18:09:24 2015 From: leves at elte.hu (Levente Uzonyi) Date: Fri Jul 24 18:09:29 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: <55AEA16A-2A3F-4742-88F9-6B6A3CC01AF6@rowledge.org> References: <55B12FB1.8080005@gmx.net> <55AEA16A-2A3F-4742-88F9-6B6A3CC01AF6@rowledge.org> Message-ID: You may be right, the average size of the object headers might also have become a bit larger (from <8 to 8). But if you check the images on Eliot's site[1], you'll find that the growth is not related to the 5.0 release, because all Spur images are larger than the pre-Spur images. Levente [1] http://www.mirandabanda.org/files/Cog/SpurImages/ On Thu, 23 Jul 2015, tim Rowledge wrote: > > On 23-07-2015, at 2:43 PM, Levente Uzonyi wrote: > >> I think it's related to the segmented memory model of Spur, which uses more memmory than the the compact model of pre-Spur Squeak. > Highly unlikely to make for a 16Mb -> 35Mb jump. > > tim > -- > tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim > If you don't pay the exorcist do you get repossessed? > > > > > > > From asqueaker at gmail.com Fri Jul 24 18:19:29 2015 From: asqueaker at gmail.com (Chris Muller) Date: Fri Jul 24 18:19:33 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: <55B276CC.4050304@zogotounga.net> References: <55B26CD0.2050607@zogotounga.net> <55B276CC.4050304@zogotounga.net> Message-ID: Hi St?phane, no, 3ButtonMouse should always be 1, else right-click won't work. The 5.0-All-in-One I just uploaded today has the 4.6 preferences restored, so your usual right click should work as you expect. The one you tested which had swapMouseButtons unset was from yesterday, its now fixed in today's. On Fri, Jul 24, 2015 at 12:33 PM, St?phane Rollandin wrote: >> In the Squeak.ini file set 3ButtonMouse to 1 or 0 depending on your what >> it is currently. > > > Ah, that's it. Thanks ! > > Stef > > From brasspen at gmail.com Fri Jul 24 18:20:57 2015 From: brasspen at gmail.com (Chris Cunnington) Date: Fri Jul 24 18:21:03 2015 Subject: [squeak-dev] Compiling a 64-big virtual machine Message-ID: <2D697BB6-02CE-4D18-B357-B06AC8046D4E@gmail.com> >On 24-07-2015, at 10:57 AM, karl ramberg > wrote: > 50c vent bankrupt. I don't know his denomination anymore >centsless? >tim I?m more of an Eminem guy myself. Eliot made it work. 64-bit. It?s awesome. Sunday morning was Christmas come early. https://www.youtube.com/watch?v=D-8tMD77bvI Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150724/b332ed57/attachment.htm From tim at rowledge.org Fri Jul 24 18:26:10 2015 From: tim at rowledge.org (tim Rowledge) Date: Fri Jul 24 18:26:19 2015 Subject: [squeak-dev] Compiling a 64-big virtual machine In-Reply-To: <2D697BB6-02CE-4D18-B357-B06AC8046D4E@gmail.com> References: <2D697BB6-02CE-4D18-B357-B06AC8046D4E@gmail.com> Message-ID: On 24-07-2015, at 11:20 AM, Chris Cunnington wrote: > > I?m more of an Eminem guy myself. I prefer Smarties myself, the original UK ones. Less sugar in the chocolate tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Fractured Idiom:- AMICUS PURIAE - Platonic friend From herbertkoenig at gmx.net Fri Jul 24 19:50:31 2015 From: herbertkoenig at gmx.net (=?UTF-8?Q?Herbert_K=c3=b6nig?=) Date: Fri Jul 24 19:50:35 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: <55B12FB1.8080005@gmx.net> <55B13BD1.9050500@gmx.net> Message-ID: <55B29707.5080401@gmx.net> Thanks for the pointers. Am 24.07.2015 um 17:31 schrieb Chris Muller: >> When I play with that list filtering at some point the CPU goes up to 90% >> and does not return until I shut down the image. > How to reproduce? > > By now I think the high CPU has nothing to do with list filtering but either with the new inspector or with not enough Umph of the Pi. To reproduce, file in the attached class, from a Browser get a sample instance. In that inspector click on "all inst vars". Maybe I have too many too big arrays but it hasn't returned from 96% CPU since a quarter of an hour. With that knowledge I checked the same in a 4.5 Image running on the VM that comes with the Pi. It shows the same problem. So it's not a 5.0 or 4.6 issue. Sorry for the noise. OTOH on my Windows laptop the same test is instantaneous. Which means it is over a Factor 1000 slower on the ARM V6. I seem to remember the Pi being a factor of 70 slower than this laptop. Cheers, Herbert -------------- next part -------------- 'From Squeak5.0 of 20 July 2015 [latest update: #15110] on 24 July 2015 at 9:13:09 pm'! Object subclass: #PictureCompare instanceVariableNames: 'pict1 pict2 rectSize rectangles sideRectangles rectanglesWorld compareResults regions compareAveraged oldAveraged longAverages changeTallys numAverages numLongAverages quotients aboveThreshold threshold pict1DominantColors pict2DominantColors emptyGardens state possibleCats savedAverages gpio irLight darkLight' classVariableNames: '' poolDictionaries: '' category: 'hk-PictureAnalyse'! !PictureCompare methodsFor: 'analyzing' stamp: 'hk 7/23/2015 06:13'! analyzeCameraQuarter "take one image after the other and analyze each pair of consecutive pictures. If Motion detected saveimage2. use quarter camera resolution, no Display, 15 secs between images. cameraOptionsLight and -Dark changed these set picture resolution" |proc alarms pictureFolder folderName i outString drawing| self initGPIO. rectSize := 18@18. self waitKillTimelapse. darkLight := self lightSensorState. proc := self startTimelapse. pictureFolder := self getRamdisk. folderName := pictureFolder pathName, '/'. drawing := true. self initializePic1: pictureFolder. self initResultArraysQuarter. alarms := 0. i := 0. state := #emptyGarden. [true] whileTrue: [|max pict2Copy| i := i + 1. self getPict2From: pictureFolder folderName: folderName. pict2Copy := pict2 deepCopy. self pict2As16Bit. "in the hope that outlines will suffer less from differences in brightness or color" self shift: pict2 by: 4@4. "pict2Copy displayOn: Display." "self drawPict2." self compare; doAverages: i. max := quotients max. alarms := self doAlarm: alarms max: max runs: i save: pict2Copy. "drawing ifTrue: [self drawOverlaidRectangles. (Delay forMilliseconds: 600) wait. World doOneCycle]." "(drawing and: [numLongAverages > 0]) ifTrue: [ self drawLongAverages. self drawBinary: longAverages on: Display]." "restart Raspistill with other exposure options if we changed between darkness and daylight" proc := self handleDarkLight: i process: proc. "Sensor redButtonPressed ifTrue: [drawing := drawing not]." "linke Maus" Sensor blueButtonPressed ifTrue: [Display restore. 0 halt]. "Mausrad" outString := Character cr asString, i printString, ' Max ', (max printShowingDecimalPlaces: 3), ' alarms ', alarms printString. Transcript show: outString. pict1 := pict2. oldAveraged := compareAveraged copy. proc := self checkAndRestartTimelapseProcess: proc. World doOneCycle]! ! !PictureCompare methodsFor: 'initialize-release' stamp: 'hk 7/24/2015 21:07'! initRectanglesWorld rectanglesWorld := rectangles collect: [:rect| |p1 p2| p1 := rect origin. p2 := rect corner. p1 corner: p2] ! ! !PictureCompare methodsFor: 'initialize-release' stamp: 'hk 7/24/2015 21:06'! initResultArraysQuarter "can only be done after the first picture loaded" |x y maxx maxy stepx stepy| maxx := 1296. maxy := 972. stepx := rectSize x. stepy := rectSize y. rectangles := OrderedCollection new: 72 * 54. "Quarter size x*y /18 / 18" x := 0. y := 0. [y < maxy] whileTrue: [|xy "x1y" rect "rect1"| [x < maxx] whileTrue: [ xy := x@y. rect := xy extent: rectSize. rectangles add: rect. x:= x + stepx]. y := y + stepy. x := 0]. rectangles := rectangles asArray. compareResults := Array new: rectangles size withAll: 0. compareAveraged := Array new: rectangles size withAll: 500.0. oldAveraged := compareAveraged copy. longAverages := Array new: rectangles size withAll: 100.0. savedAverages ifNil: [savedAverages := Dictionary new]. pict1DominantColors := Array new: rectangles size. pict2DominantColors := Array new: rectangles size. emptyGardens := OrderedCollection new. quotients := Array new: rectangles size withAll: 10.0. changeTallys := Array new: rectangles size withAll: 2.5. self initRectanglesWorld.! ! !PictureCompare methodsFor: 'initialize-release' stamp: 'hk 7/24/2015 21:12'! initialize pict1 := Form extent: 1296@972. pict2 := pict1 deepCopy. darkLight := #dark. rectSize := 18@18. numAverages := 18. numLongAverages := 500. threshold := 4.4. state := #starting. self initResultArraysQuarter! ! From tim at rowledge.org Fri Jul 24 20:23:01 2015 From: tim at rowledge.org (tim Rowledge) Date: Fri Jul 24 20:23:07 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: <55B29707.5080401@gmx.net> References: <55B12FB1.8080005@gmx.net> <55B13BD1.9050500@gmx.net> <55B29707.5080401@gmx.net> Message-ID: On 24-07-2015, at 12:50 PM, Herbert K?nig wrote: > In that inspector click on "all inst vars". Maybe I have too many too big arrays but it hasn't returned from 96% CPU since a quarter of an hour. One of the things that can really damage performance on the Pi is letting memory grow so big it starts virtual memory thrashing. Generating the entire list of entries for an inspector can really blow things up very effectively. On a 4.5 based system you might try adding ?-memory 128M? as a vm option. For the 5.0 spur system the best equivalent is ?-maxoldspace 128M?. I found this helped keep memroy from growing too much and that helps gcs and assorted scanning code work better. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Oxymorons: Found missing From eliot.miranda at gmail.com Fri Jul 24 20:46:01 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri Jul 24 20:46:06 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: <55B12FB1.8080005@gmx.net> References: <55B12FB1.8080005@gmx.net> Message-ID: Hi Herbert, first., apologies fror being unresponsive. I've had things to do for the last few days. On Thu, Jul 23, 2015 at 11:17 AM, Herbert K?nig wrote: > Hey, great! > > downloaded it on the Pi A+ installed my trusty 24/7 cat surveillance app > and it worked. > CPU usage went down from 50 to 40%. It exercises BitBlt, Collections, > file I/O incl. GPIO, OSProcess and CommandShell > Memory went up from 52M to 75M which is critical as I use the PiNoir > Camera. > So there's two things going on here. One is that the object format is indeed less compact tan the previous one and Spur image files are about 15% larger, so a 57Mb image file should result in something around 65Mb. Another is that right now I've chosen to have the memory manager allocate a chunk of free space at startup that defaults to the growHeadroom, which defaults to 16Mb. You can see what the free old space is via vm parameter 54, e.g. Smalltalk vmParameterAt: 54 22689208 You can change this by the command line switch -maxoldspace. Really I think there needs to be a way of a) specifying a free headroom on the command line, and b) setting a grow size in the image header, rather than from Smalltalk code. Basically Spur is very green and we need to evolve its facilities for management of memory management. So please feel free to make suggestions and requests for functionality here, but especially on vm-dev. We could do with careful discussions here as I don't want to hack, but I'm not pretending to have the right answers. > I'll watch what comes out of Tim's (Rowledge) recent post. > > And I'll watch if it runs as stable as 4.5. > > Thanks, > > Herbert > > > > Am 23.07.2015 um 17:55 schrieb Chris Muller: > >> I managed to successfully incorporate the ARM platform into the 5.0 >> All-In-One -- so Squeak 5 will now start up with one-click on FOUR >> platforms, OOTB..!! >> >> > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150724/5b15f0de/attachment.htm From saijanai at gmail.com Sat Jul 25 15:51:00 2015 From: saijanai at gmail.com (saijanai) Date: Sat Jul 25 15:51:31 2015 Subject: [squeak-dev] Just a test Message-ID: <55B3B064.3000602@gmail.com> My subscriptions are "off" so I'm trying to make sure that I can still write to this forum L -- Squeak from the very start (introduction to Squeak and Pharo Smalltalk for the (almost) complete and compleate beginner). https://www.youtube.com/playlist?list=PL6601A198DF14788D&feature=view_all "Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it." - Brian Kernighan From herbertkoenig at gmx.net Sat Jul 25 16:17:58 2015 From: herbertkoenig at gmx.net (=?UTF-8?Q?Herbert_K=c3=b6nig?=) Date: Sat Jul 25 16:18:03 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: <55B12FB1.8080005@gmx.net> Message-ID: <55B3B6B6.6020707@gmx.net> Hi Eliot, I tried with -maxoldspace 60M (after I tied 128M and 64M). I learned that I have to put some parameters into "" but have to add -maxoldspace without "" otherwise the VM complains it doesn't understand that parameter. Maybe there is still something wrong because now "Abut this System" shows two VM parameters, maxoldspace and 64M. Also the high CPU usage in the Inspector on all inst vars does not go away. Anyway the main problem is me running the A+ were I could have used my B+ with twice as much RAM but a bit less power consumption. All was fine until I switched from 640x480 camera resolution to 1296x972. But the new VM allowed to keep the framerate at a slightly higher CPU load. We had a very windy day and night so the motion detection was very busy. But it runs stable for over 24 hours now under heaviest load ever so I'm really happy with it. If I have suggestions for the VM I'll go to VM dev. Thanks, Herbert Am 24.07.2015 um 22:46 schrieb Eliot Miranda: > Hi Herbert, > > first., apologies fror being unresponsive. I've had things to do > for the last few days. > > On Thu, Jul 23, 2015 at 11:17 AM, Herbert K?nig > wrote: > > Hey, great! > > downloaded it on the Pi A+ installed my trusty 24/7 cat > surveillance app and it worked. > CPU usage went down from 50 to 40%. It exercises BitBlt, > Collections, file I/O incl. GPIO, OSProcess and CommandShell > Memory went up from 52M to 75M which is critical as I use the > PiNoir Camera. > > > So there's two things going on here. One is that the object format is > indeed less compact tan the previous one and Spur image files are > about 15% larger, so a 57Mb image file should result in something > around 65Mb. Another is that right now I've chosen to have the memory > manager allocate a chunk of free space at startup that defaults to the > growHeadroom, which defaults to 16Mb. You can see what the free old > space is via vm parameter 54, e.g. > > Smalltalk vmParameterAt: 54 22689208 > > You can change this by the command line switch -maxoldspace. Really I > think there needs to be a way of a) specifying a free headroom on the > command line, and b) setting a grow size in the image header, rather > than from Smalltalk code. > > > Basically Spur is very green and we need to evolve its facilities for > management of memory management. So please feel free to make > suggestions and requests for functionality here, but especially on > vm-dev. We could do with careful discussions here as I don't want to > hack, but I'm not pretending to have the right answers. > > > I'll watch what comes out of Tim's (Rowledge) recent post. > > And I'll watch if it runs as stable as 4.5. > > Thanks, > > Herbert > > > > Am 23.07.2015 um 17:55 schrieb Chris Muller: > > I managed to successfully incorporate the ARM platform into > the 5.0 > All-In-One -- so Squeak 5 will now start up with one-click on FOUR > platforms, OOTB..!! > > > > > > > -- > _,,,^..^,,,_ > best, Eliot > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150725/fd90a21a/attachment.htm From tim at rowledge.org Mon Jul 27 02:31:32 2015 From: tim at rowledge.org (tim Rowledge) Date: Mon Jul 27 02:31:35 2015 Subject: [squeak-dev] rgb565 bitmap exporter? Message-ID: <6FA6C16B-F53B-4FEA-BEF3-42AA158C2726@rowledge.org> I don?t suppose anyone has already written (or knows where one is hidden in the image) a bitmap exporter that can write rgb565 ? Pretty daft for me to faff around doing it if there is already one around. I?ve spotted assorted kinda-sorta related code but not (yet) what I need. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim No program done by an undergrad will work after she graduates. From bert at freudenbergs.de Mon Jul 27 15:10:06 2015 From: bert at freudenbergs.de (Bert Freudenberg) Date: Mon Jul 27 15:10:10 2015 Subject: [squeak-dev] rgb565 bitmap exporter? In-Reply-To: <6FA6C16B-F53B-4FEA-BEF3-42AA158C2726@rowledge.org> References: <6FA6C16B-F53B-4FEA-BEF3-42AA158C2726@rowledge.org> Message-ID: <2042FAEA-F1B8-454F-BAF4-6BC0881B0DFF@freudenbergs.de> On 27.07.2015, at 04:31, tim Rowledge wrote: > > I don?t suppose anyone has already written (or knows where one is hidden in the image) a bitmap exporter that can write rgb565 ? Pretty daft for me to faff around doing it if there is already one around. I?ve spotted assorted kinda-sorta related code but not (yet) what I need. So what *do* you need? Which file format? Why 565? (Windows BMP supports both 555 and 565) - Bert - -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 4115 bytes Desc: not available Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150727/bc9450e3/smime.bin From tim at rowledge.org Mon Jul 27 19:06:38 2015 From: tim at rowledge.org (tim Rowledge) Date: Mon Jul 27 19:06:45 2015 Subject: [squeak-dev] rgb565 bitmap exporter? In-Reply-To: <2042FAEA-F1B8-454F-BAF4-6BC0881B0DFF@freudenbergs.de> References: <6FA6C16B-F53B-4FEA-BEF3-42AA158C2726@rowledge.org> <2042FAEA-F1B8-454F-BAF4-6BC0881B0DFF@freudenbergs.de> Message-ID: On 27-07-2015, at 8:10 AM, Bert Freudenberg wrote: > On 27.07.2015, at 04:31, tim Rowledge wrote: >> >> I don?t suppose anyone has already written (or knows where one is hidden in the image) a bitmap exporter that can write rgb565 ? Pretty daft for me to faff around doing it if there is already one around. I?ve spotted assorted kinda-sorta related code but not (yet) what I need. > > So what *do* you need? Which file format? Why 565? (Windows BMP supports both 555 and 565) I need to write rgb565 to /dev/fb1 on my AstroPi :-) How else will astronauts be able to play with Scratch in orbit? tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Computer possessed? Try DEVICE=C:\EXOR.SYS From bert at freudenbergs.de Tue Jul 28 12:24:35 2015 From: bert at freudenbergs.de (Bert Freudenberg) Date: Tue Jul 28 12:24:38 2015 Subject: [squeak-dev] rgb565 bitmap exporter? In-Reply-To: References: <6FA6C16B-F53B-4FEA-BEF3-42AA158C2726@rowledge.org> <2042FAEA-F1B8-454F-BAF4-6BC0881B0DFF@freudenbergs.de> Message-ID: <2C838C63-F18A-4DC1-B941-D64AF6B8FE14@freudenbergs.de> > On 27.07.2015, at 21:06, tim Rowledge wrote: > > > On 27-07-2015, at 8:10 AM, Bert Freudenberg wrote: > >> On 27.07.2015, at 04:31, tim Rowledge wrote: >>> >>> I don?t suppose anyone has already written (or knows where one is hidden in the image) a bitmap exporter that can write rgb565 ? Pretty daft for me to faff around doing it if there is already one around. I?ve spotted assorted kinda-sorta related code but not (yet) what I need. >> >> So what *do* you need? Which file format? Why 565? (Windows BMP supports both 555 and 565) > I need to write rgb565 to /dev/fb1 on my AstroPi :-) How else will astronauts be able to play with Scratch in orbit? sqUnixX11.c: copyImage16To16() should do it. If you replace the stRNMask/stRShift variables with constants it might even be reasonably efficient. ARM SIMD code would be better, obviously. Or are you talking about Smalltalk code? A single bitblt copy with a suitable color map should do it. - Bert - -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 4115 bytes Desc: not available Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150728/46eaf320/smime.bin From bert at freudenbergs.de Tue Jul 28 13:35:18 2015 From: bert at freudenbergs.de (Bert Freudenberg) Date: Tue Jul 28 13:35:22 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: Skipped content of type multipart/alternative-------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 4115 bytes Desc: not available Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150728/ae306c81/smime.bin From bert at freudenbergs.de Tue Jul 28 13:43:38 2015 From: bert at freudenbergs.de (Bert Freudenberg) Date: Tue Jul 28 13:43:40 2015 Subject: [squeak-dev] Compiling a 64-big virtual machine In-Reply-To: References: <2D697BB6-02CE-4D18-B357-B06AC8046D4E@gmail.com> Message-ID: <871F268B-DD5E-49AA-8780-AFD360287AE6@freudenbergs.de> On 24.07.2015, at 20:26, tim Rowledge wrote: > > > On 24-07-2015, at 11:20 AM, Chris Cunnington wrote: >> >> I?m more of an Eminem guy myself. > > I prefer Smarties myself, the original UK ones. Less sugar in the chocolate ObSqueak: In the German Etoys community, the halo handles are called ?Smarties?. - Bert - -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 4115 bytes Desc: not available Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150728/1fa09ad7/smime-0001.bin From asqueaker at gmail.com Tue Jul 28 15:51:29 2015 From: asqueaker at gmail.com (Chris Muller) Date: Tue Jul 28 15:51:33 2015 Subject: [squeak-dev] Squeak 5 will run on Rasberry Pi OOTB In-Reply-To: References: Message-ID: Skipped content of type multipart/alternative-------------- next part -------------- A non-text attachment was scrubbed... Name: PastedGraphic-1.png Type: image/png Size: 45243 bytes Desc: not available Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150728/5d836620/PastedGraphic-1.png From tim at rowledge.org Tue Jul 28 17:11:09 2015 From: tim at rowledge.org (tim Rowledge) Date: Tue Jul 28 17:11:13 2015 Subject: [squeak-dev] rgb565 bitmap exporter? In-Reply-To: <2C838C63-F18A-4DC1-B941-D64AF6B8FE14@freudenbergs.de> References: <6FA6C16B-F53B-4FEA-BEF3-42AA158C2726@rowledge.org> <2042FAEA-F1B8-454F-BAF4-6BC0881B0DFF@freudenbergs.de> <2C838C63-F18A-4DC1-B941-D64AF6B8FE14@freudenbergs.de> Message-ID: <95B87259-73EC-4124-8AAC-A0E7E2506DB7@rowledge.org> On 28-07-2015, at 5:24 AM, Bert Freudenberg wrote: > sqUnixX11.c: copyImage16To16() should do it. If you replace the stRNMask/stRShift variables with constants it might even be reasonably efficient. ARM SIMD code would be better, obviously. Oh, it certainly would - indeed it does since some devious ARM simd code is hooked up on ARM platforms. > > Or are you talking about Smalltalk code? A single bitblt copy with a suitable color map should do it. Since it?s only an 8x8 array of ws28-something LEDs that has to be written by opening /dev/fb*, then writing to the ?file?, then closing the file to make it actually display, performance of the conversion is not a huge problem. Right now I can display scrolling paragraphs, arbitrary screen-grabs, whatever, and it?s now a case of deciding what people want to display rather than how to display. I did discover to my surprise that some font glyphs are 16bpp with antialiasing that makes for really surprising displays on a physically large 8x8 display. It took a while to work out what was going on there... tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim "How many Carlos Wus does it take to change a lightbulb?? "With an unlimited breeding licence, who needs lightbulbs?" From juanlists at jvuletich.org Wed Jul 29 02:04:02 2015 From: juanlists at jvuletich.org (J. Vuletich (mail lists)) Date: Wed Jul 29 02:06:46 2015 Subject: [squeak-dev] rgb565 bitmap exporter? In-Reply-To: <95B87259-73EC-4124-8AAC-A0E7E2506DB7@rowledge.org> References: <6FA6C16B-F53B-4FEA-BEF3-42AA158C2726@rowledge.org> <2042FAEA-F1B8-454F-BAF4-6BC0881B0DFF@freudenbergs.de> <2C838C63-F18A-4DC1-B941-D64AF6B8FE14@freudenbergs.de> <95B87259-73EC-4124-8AAC-A0E7E2506DB7@rowledge.org> Message-ID: <20150729020402.Horde.cJjh9HsSAvZKof5Mu15Xng2@gator3294.hostgator.com> Quoting tim Rowledge : > ... > I did discover to my surprise that some font glyphs are 16bpp with > antialiasing that makes for really surprising displays on a > physically large 8x8 display. It took a while to work out what was > going on there... Can you post a photograph? I would like to see that! > tim > -- > tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim > "How many Carlos Wus does it take to change a lightbulb?? > "With an unlimited breeding licence, who needs lightbulbs?" Cheers, Juan Vuletich From bert at freudenbergs.de Wed Jul 29 10:30:34 2015 From: bert at freudenbergs.de (Bert Freudenberg) Date: Wed Jul 29 10:30:38 2015 Subject: [squeak-dev] rgb565 bitmap exporter? In-Reply-To: <20150729020402.Horde.cJjh9HsSAvZKof5Mu15Xng2@gator3294.hostgator.com> References: <6FA6C16B-F53B-4FEA-BEF3-42AA158C2726@rowledge.org> <2042FAEA-F1B8-454F-BAF4-6BC0881B0DFF@freudenbergs.de> <2C838C63-F18A-4DC1-B941-D64AF6B8FE14@freudenbergs.de> <95B87259-73EC-4124-8AAC-A0E7E2506DB7@rowledge.org> <20150729020402.Horde.cJjh9HsSAvZKof5Mu15Xng2@gator3294.hostgator.com> Message-ID: On 29.07.2015, at 04:04, J. Vuletich (mail lists) wrote: > > Quoting tim Rowledge : > >> ... >> I did discover to my surprise that some font glyphs are 16bpp with antialiasing that makes for really surprising displays on a physically large 8x8 display. It took a while to work out what was going on there... > > Can you post a photograph? I would like to see that! http://astro-pi.org/ - Bert - -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 4115 bytes Desc: not available Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150729/22faac15/smime.bin From tim at rowledge.org Wed Jul 29 17:14:36 2015 From: tim at rowledge.org (tim Rowledge) Date: Wed Jul 29 17:14:43 2015 Subject: [squeak-dev] rgb565 bitmap exporter? In-Reply-To: <20150729020402.Horde.cJjh9HsSAvZKof5Mu15Xng2@gator3294.hostgator.com> References: <6FA6C16B-F53B-4FEA-BEF3-42AA158C2726@rowledge.org> <2042FAEA-F1B8-454F-BAF4-6BC0881B0DFF@freudenbergs.de> <2C838C63-F18A-4DC1-B941-D64AF6B8FE14@freudenbergs.de> <95B87259-73EC-4124-8AAC-A0E7E2506DB7@rowledge.org> <20150729020402.Horde.cJjh9HsSAvZKof5Mu15Xng2@gator3294.hostgator.com> Message-ID: <3E026829-D2A9-4E47-8BE7-57263618E9DC@rowledge.org> On 28-07-2015, at 7:04 PM, J. Vuletich (mail lists) wrote: > > Quoting tim Rowledge : > >> ... >> I did discover to my surprise that some font glyphs are 16bpp with antialiasing that makes for really surprising displays on a physically large 8x8 display. It took a while to work out what was going on there... > > Can you post a photograph? I would like to see that! This is part of the glyph form for Deja Vu Sans 7 - You can probably imagine how strange that looked scrolling by at 45mm high 8 pixels when I was expecting a black and white image. It looks like - out of the fonts in my image by default - only the Deja Vu fonts are 16bpp. Of course they are the default that I got when doing experiments on the astropi board, just to add some confusion to the day. tim -- tim Rowledge; tim@rowledge.org; http://www.rowledge.org/tim Oxymorons: Taped live -------------- next part -------------- Skipped content of type multipart/related From eliot.miranda at gmail.com Thu Jul 30 12:57:38 2015 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu Jul 30 12:57:47 2015 Subject: [squeak-dev] Interview with Stonebraker on future of "big data" Message-ID: <029C044E-A44B-4843-8C98-6C6D04A1B8EF@gmail.com> Hi, I found an interesting nugget at the end of http://www.forbes.com/sites/gilpress/2015/07/29/turing-award-winner-stonebraker-on-the-future-of-taming-big-data which is the need to integrate data models in different databases. ?If your application is managing what you want to think of as a single database which is in fact spread over multiple engines,? says Stonebraker, ?with different data models, different transaction systems, different everything, than you want a next-generation federation mechanism to make it as simple as possible to program.? This would seem to play to Smalltalk's strengths. Sent from my iPhone From craig at netjam.org Thu Jul 30 13:24:48 2015 From: craig at netjam.org (Craig Latta) Date: Thu Jul 30 13:25:04 2015 Subject: [squeak-dev] re: Interview with Stonebraker on future of "big data" In-Reply-To: <029C044E-A44B-4843-8C98-6C6D04A1B8EF@gmail.com> References: <029C044E-A44B-4843-8C98-6C6D04A1B8EF@gmail.com> Message-ID: Eliot writes: > I found an interesting nugget at the end of [1] which is the need to > integrate data models in different databases. ?If your application is > managing what you want to think of as a single database which is in > fact spread over multiple engines,? says Stonebraker, ?with different > data models, different transaction systems, different everything, > than you want a next-generation federation mechanism to make it as > simple as possible to program.? > > This would seem to play to Smalltalk's strengths. Yes indeed! -C [1] https://tinyurl.com/o7nmvnv (forbes.com) -- Craig Latta netjam.org +31 6 2757 7177 (SMS ok) + 1 415 287 3547 (no SMS) From hannes.hirzel at gmail.com Thu Jul 30 14:27:06 2015 From: hannes.hirzel at gmail.com (H. Hirzel) Date: Thu Jul 30 14:27:08 2015 Subject: [squeak-dev] re: Interview with Stonebraker on future of "big data" In-Reply-To: References: <029C044E-A44B-4843-8C98-6C6D04A1B8EF@gmail.com> Message-ID: Yes, integrating data from different models and systems a major strength of Smalltalk. And what Phil described on Cuis list on the 24th of July He uses Smalltalk for 1. data processing Lots of importers and exporters. The data I need is all over the place both on my local filesystem/network as well as from various Internet sources in just about every format .... 2. visualization/simulation Visualization/simulation: often I'm not just doing a simple data conversion, so once the data is in Cuis I might need to do some analysis to see what I'm dealing with, generate some charts/graphs, visualize relationships within a data set or the results of a simulation, etc. ...... 3. prototyping. Prototyping: most of the 'production' code I'm dealing with is in other languages (Java for Android apps as an example). However, I find non-dynamic languages unpleasant to prototype in. So I find myself quite often playing around with my ideas in Cuis even though the implementation target might be a different language/environment..... --Hannes On 7/30/15, Craig Latta wrote: > > Eliot writes: > >> I found an interesting nugget at the end of [1] which is the need to >> integrate data models in different databases. ?If your application is >> managing what you want to think of as a single database which is in >> fact spread over multiple engines,? says Stonebraker, ?with different >> data models, different transaction systems, different everything, >> than you want a next-generation federation mechanism to make it as >> simple as possible to program.? >> >> This would seem to play to Smalltalk's strengths. > > Yes indeed! > > > -C > > [1] https://tinyurl.com/o7nmvnv (forbes.com) > > -- > Craig Latta > netjam.org > +31 6 2757 7177 (SMS ok) > + 1 415 287 3547 (no SMS) > > > From hannes.hirzel at gmail.com Thu Jul 30 14:31:14 2015 From: hannes.hirzel at gmail.com (H. Hirzel) Date: Thu Jul 30 14:31:17 2015 Subject: [squeak-dev] re: Interview with Stonebraker on future of "big data" In-Reply-To: References: <029C044E-A44B-4843-8C98-6C6D04A1B8EF@gmail.com> Message-ID: Also note the "Stonebraker Formula for Making a Difference" 1. Identify new solution to a data management problem; 2. Lead research project to develop a prototype; 3. Publish paper(s); 4. Publish software code on a public website; 5. Launch startup; 6. Repeat. http://www.forbes.com/sites/gilpress/2015/07/29/turing-award-winner-stonebraker-on-the-future-of-taming-big-data/2/ On 7/30/15, H. Hirzel wrote: > Yes, integrating data from different models and systems a major > strength of Smalltalk. > > And what Phil described on Cuis list on the 24th of July > > He uses Smalltalk for > > 1. data processing > Lots of importers and exporters. The data I need is > all over the place both on my local filesystem/network as well as from > various Internet sources in just about every format .... > > > 2. visualization/simulation > Visualization/simulation: often I'm not just doing a simple data > conversion, so once the data is in Cuis I might need to do some analysis > to see what I'm dealing with, generate some charts/graphs, visualize > relationships within a data set or the results of a simulation, etc. ...... > > 3. prototyping. > Prototyping: most of the 'production' code I'm dealing with is in > other languages (Java for Android apps as an example). However, I find > non-dynamic languages unpleasant to prototype in. So I find myself > quite often playing around with my ideas in Cuis even though the > implementation target might be a different language/environment..... > > --Hannes > > On 7/30/15, Craig Latta wrote: >> >> Eliot writes: >> >>> I found an interesting nugget at the end of [1] which is the need to >>> integrate data models in different databases. ?If your application is >>> managing what you want to think of as a single database which is in >>> fact spread over multiple engines,? says Stonebraker, ?with different >>> data models, different transaction systems, different everything, >>> than you want a next-generation federation mechanism to make it as >>> simple as possible to program.? >>> >>> This would seem to play to Smalltalk's strengths. >> >> Yes indeed! >> >> >> -C >> >> [1] https://tinyurl.com/o7nmvnv (forbes.com) >> >> -- >> Craig Latta >> netjam.org >> +31 6 2757 7177 (SMS ok) >> + 1 415 287 3547 (no SMS) >> >> >> >