<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from text --><style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
</head>
<body>
<meta content="text/html; charset=UTF-8">
<style type="text/css" style="">
<!--
p
        {margin-top:0;
        margin-bottom:0}
-->
</style>
<div dir="ltr">
<div id="x_divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:#000000; font-family:Calibri,Helvetica,sans-serif">
<p>Great, thanks for merge & review, Nicolas! :-)</p>
<p><br>
</p>
<p>Best,</p>
<p>Christoph</p>
<div id="x_Signature">
<div id="x_divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="x_divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="x__rp_T4" id="x_Item.MessagePartBody">
<div class="x__rp_U4 x_ms-font-weight-regular x_ms-font-color-neutralDark x_rpHighlightAllClass x_rpHighlightBodyClass" id="x_Item.MessageUniqueBody" style="font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont">
<div dir="ltr">
<div id="x_divtagdefaultwrapper"><font face="Calibri,Helvetica,sans-serif,EmojiFont,Apple Color Emoji,Segoe UI Emoji,NotoColorEmoji,Segoe UI Symbol,Android Emoji,EmojiSymbols">
<div id="x_Signature">
<div style="margin:0px"><font style="font-family:Calibri,Arial,Helvetica,sans-serif,serif,EmojiFont">
<div><font size="3" color="black"><span style="font-size:12pt"><a href="http://www.hpi.de/" target="_blank" rel="noopener noreferrer" id="LPNoLP"><font size="2"><span id="LPlnk909538"><font color="#757B80"></font></span></font></a></span></font></div>
</font></div>
</div>
</font></div>
</div>
</div>
</div>
</div>
<div><font size="2" color="#808080"></font></div>
</div>
</div>
</div>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>Von:</b> Squeak-dev <squeak-dev-bounces@lists.squeakfoundation.org> im Auftrag von commits@source.squeak.org <commits@source.squeak.org><br>
<b>Gesendet:</b> Donnerstag, 5. März 2020 13:31:12<br>
<b>An:</b> squeak-dev@lists.squeakfoundation.org; packages@lists.squeakfoundation.org<br>
<b>Betreff:</b> [squeak-dev] The Trunk: Tools-nice.953.mcz</font>
<div> </div>
</div>
</div>
<font size="2"><span style="font-size:10pt;">
<div class="PlainText">Nicolas Cellier uploaded a new version of Tools to project The Trunk:<br>
<a href="http://source.squeak.org/trunk/Tools-nice.953.mcz">http://source.squeak.org/trunk/Tools-nice.953.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: Tools-nice.953<br>
Author: nice<br>
Time: 5 March 2020, 1:31:09.307169 pm<br>
UUID: b3f8cb2d-289f-47e4-a9d0-a5b051a4c8bc<br>
Ancestors: Tools-mt.942, Tools-ct.945, Tools-ct.941, Tools-ct.952, Tools-kfr.930, Tools-nice.725, Tools-jr.930<br>
<br>
Merge several tool improvments from the inbox<br>
<br>
Tools-ct.945, Tools-ct.941, Tools-ct.952, Tools-kfr.930, Tools-nice.725, Tools-jr.930<br>
<br>
Tools-mt.942:<br>
        Prepare 5.3rc3 --- All those "----" entries (SNAPSHOT, QUIT, etc.) in the changes file should not be of type #doIt, because that can cause Compiler/Parser errors. Change it to #misc instead. We might want to remove any other " if begins with ----" checks
 later, too.<br>
<br>
Tools-ct.945:<br>
        Fixes a bug/unnecessary limitation in VersionsBrowser class >> #browseMethod: that raised an error when browsing a method that had been removed from the system.<br>
<br>
You can also reproduce it via: thisContext method browse "on a fresh image".<br>
<br>
This commit replaces Tools-ct.944, which has been refactored again to reuse the return carat according to Kent Beck ("Format conditionals so their value is used where it clearly expresses the intent of the method"). Thanks to Chris for the reminder!<br>
<br>
Tools-ct.941:<br>
        Fixes a small bug when reusing a MessageNames window.<br>
<br>
To reproduce:<br>
<br>
        Preferences setFlag: #(SystemWindow >> reuseWindows) join asSymbol toValue: true during: [<br>
                ToolSet<br>
                        browseMessageNames: 'someFictiveMessageName';<br>
                        browseMessageNames: 'someOtherFictiveMessageName'].<br>
<br>
Tools-ct.952:<br>
        Fixes an invalidation bug in the debugger's stack list display optimization<br>
<br>
For the full bug report, see <a href="http://forum.world.st/BUG-in-Debugger-gt-gt-newStack-optimization-td5112726.html">
http://forum.world.st/BUG-in-Debugger-gt-gt-newStack-optimization-td5112726.html</a>. Please review!<br>
<br>
Tools-kfr.930:<br>
        Form preview was displaying wrong colors. Convert preview form to screen depth to make colors display correctly<br>
<br>
Tools-nice.725:<br>
        Recognize Cuis #classDefinition: when scanning a cuis change file.<br>
<br>
Tools-jr.930:<br>
        Speed up removing of messages from MessageTrace.<br>
<br>
In an existing MessageTrace, try "senders of at:put:", then remove them again with "remove from this browser (d)". Took several seconds before, finishes in an instant now.<br>
<br>
Replaces autoSelectStrings and messageSelections with new OrderedCollections. The other method deleteFromMessageList: removes one element from the existing collections instead.<br>
<br>
=============== Diff against Tools-mt.942 ===============<br>
<br>
Item was changed:<br>
  ----- Method: Browser>>defaultBrowserTitle (in category 'initialize-release') -----<br>
  defaultBrowserTitle<br>
+        | title |<br>
+        title := 'System Browser'.<br>
+        ^ environment = self class environment<br>
+                ifTrue: [title]<br>
+                ifFalse: [title, ' on environment ', environment asString]!<br>
-        ^ 'System Browser'!<br>
<br>
Item was changed:<br>
  ----- Method: ChangeList>>scanCategory (in category 'scanning') -----<br>
  scanCategory  <br>
         "Scan anything that involves more than one chunk; method name is historical only"<br>
  <br>
+        | itemPosition item tokens stamp anIndex class meta |<br>
-        | itemPosition item tokens stamp anIndex |<br>
         itemPosition := file position.<br>
         item := file nextChunk.<br>
  <br>
         ((item includesSubstring: 'commentStamp:')<br>
         or: [(item includesSubstring: 'methodsFor:')<br>
+        or: [(item includesSubstring: 'classDefinition:')<br>
+        or: [item endsWith: 'reorganize']]]) ifFalse:<br>
-        or: [item endsWith: 'reorganize']]) ifFalse:<br>
                 ["Maybe a preamble, but not one we recognize; bail out with the preamble trick"<br>
                 ^ self addItem: (ChangeRecord new file: file position: itemPosition type: #preamble)<br>
                                  text: ('preamble: ' , item contractTo: 50)].<br>
  <br>
         tokens := Scanner new scanTokens: item.<br>
         tokens size >= 3 ifTrue:<br>
                 [stamp := ''.<br>
                 anIndex := tokens indexOf: #stamp: ifAbsent: [nil].<br>
                 anIndex ifNotNil: [stamp := tokens at: (anIndex + 1)].<br>
  <br>
                 tokens second == #methodsFor:<br>
                         ifTrue: [^ self scanCategory: tokens third class: tokens first<br>
                                                         meta: false stamp: stamp].<br>
                 tokens third == #methodsFor:<br>
                         ifTrue: [^ self scanCategory: tokens fourth class: tokens first<br>
                                                         meta: true stamp: stamp]].<br>
  <br>
         tokens second == #commentStamp:<br>
                 ifTrue:<br>
                         [stamp := tokens third.<br>
                         self addItem:<br>
                                         (ChangeRecord new file: file position: file position type: #classComment<br>
                                                                         class: tokens first category: nil meta: false stamp: stamp)<br>
                                         text: 'class comment for ' , tokens first,
<br>
                                                   (stamp isEmpty ifTrue: [''] ifFalse: ['; ' , stamp]).<br>
                         file nextChunk.<br>
                         ^ file skipStyleChunk].<br>
+                <br>
+        tokens first == #classDefinition:<br>
+                ifTrue:<br>
+                        [class := tokens second.<br>
+                        meta := tokens size >= 3 and: [tokens third = 'class'].<br>
+                        stamp := ''.<br>
+                        self addItem:<br>
+                                        (ChangeRecord new file: file position: file position type: #classDefinition<br>
+                                                                        class: class category: nil meta: meta stamp: stamp)<br>
+                                        text: 'class definition for ' , class, <br>
+                                                  (stamp isEmpty ifTrue: [''] ifFalse: ['; ' , stamp]).<br>
+                        file nextChunk.<br>
+                        ^ file skipStyleChunk].<br>
  <br>
         self assert: tokens last == #reorganize.<br>
         self addItem:<br>
                 (ChangeRecord new<br>
                         file: file position: file position type: #reorganize<br>
                         class: tokens first category: nil meta: false stamp: stamp)<br>
                 text: 'organization for ' , tokens first, (tokens second == #class ifTrue: [' class'] ifFalse: ['']).<br>
         file nextChunk!<br>
<br>
Item was changed:<br>
  ----- Method: Debugger>>newStack: (in category 'private') -----<br>
  newStack: stack<br>
         | oldStack diff |<br>
         oldStack := contextStack.<br>
         contextStack := stack.<br>
         (oldStack == nil or: [oldStack last ~~ stack last])<br>
                 ifTrue: [contextStackList := contextStack collect: [:ctx | ctx printString].<br>
                                 ^ self].<br>
         "May be able to re-use some of previous list"<br>
         diff := stack size - oldStack size.<br>
         contextStackList := diff <= 0<br>
                 ifTrue: [contextStackList copyFrom: 1-diff to: oldStack size]<br>
+                ifFalse: [(diff = 1 and: [stack second == oldStack first])<br>
+                        ifTrue: [contextStackList copyWithFirst: stack first printString]<br>
+                        ifFalse: [contextStack collect: [:ctx | ctx printString]]]!<br>
-                ifFalse: [diff > 1<br>
-                                ifTrue: [contextStack collect: [:ctx | ctx printString]]<br>
-                                ifFalse: [(Array with: stack first printString) , contextStackList]]!<br>
<br>
Item was changed:<br>
  ----- Method: FileList>>readGraphicContents (in category 'private') -----<br>
  readGraphicContents<br>
         | form maxExtent ext |<br>
+        form := (Form fromFileNamed: self fullName) asFormOfDepth: Display depth.<br>
-        form := Form fromFileNamed: self fullName.<br>
         maxExtent := lastGraphicsExtent := self availableGraphicsExtent.<br>
         ext := form extent.<br>
         (maxExtent notNil and: [form extent <= maxExtent]) ifFalse: [<br>
                 form := form magnify: form boundingBox by: (maxExtent x / form width min: maxExtent y / form height) asPoint smoothing: 3].<br>
         contents :=  ('Image extent: ', ext printString) asText,<br>
                                 (String with: Character cr),<br>
                                 (Text string: ' '<br>
                                         attribute: (TextFontReference toFont: <br>
                                                 (FormSetFont new<br>
                                                         fromFormArray: (Array with: form)<br>
                                                         asciiStart: Character space asInteger<br>
                                                         ascent: form height))).<br>
         brevityState := #graphic.<br>
         ^contents!<br>
<br>
Item was added:<br>
+ ----- Method: MessageNames>>postAcceptBrowseFor: (in category 'morphic ui') -----<br>
+ postAcceptBrowseFor: anotherModel<br>
+ <br>
+        self searchString: anotherModel searchString.!<br>
<br>
Item was added:<br>
+ ----- Method: MessageSet>>deleteAllFromMessageList: (in category 'message functions') -----<br>
+ deleteAllFromMessageList: aCollection<br>
+        "Delete the given messages from the receiver's message list"<br>
+        | currIdx |<br>
+        currIdx := self messageListIndex.<br>
+        messageList := messageList copyWithoutAll: aCollection.<br>
+        messageList ifNotEmpty: [self messageListIndex: {currIdx. messageList size.} min]!<br>
<br>
Item was added:<br>
+ ----- Method: MessageTrace>>deleteAllFromMessageList: (in category 'building') -----<br>
+ deleteAllFromMessageList: aCollection<br>
+        "Delete the given messages from the receiver's message list"<br>
+ <br>
+        | newAutoSelectStrings newMessageSelections newSize set |<br>
+        newSize := self messageList size - aCollection size.<br>
+        newAutoSelectStrings := OrderedCollection new: newSize.<br>
+        newMessageSelections := OrderedCollection new: newSize.<br>
+        set := aCollection asSet.<br>
+        self messageList withIndexDo: [:each :index |<br>
+                (set includes: each) ifFalse:<br>
+                        [newAutoSelectStrings add: (autoSelectStrings at: index).<br>
+                        newMessageSelections add: (messageSelections at: index)]].<br>
+        super deleteAllFromMessageList: aCollection.<br>
+        autoSelectStrings := newAutoSelectStrings.<br>
+        messageSelections := newMessageSelections.<br>
+        anchorIndex ifNotNil:<br>
+                [ anchorIndex := anchorIndex min: messageList size ]!<br>
<br>
Item was changed:<br>
  ----- Method: MessageTrace>>removeMessageFromBrowser (in category 'building') -----<br>
  removeMessageFromBrowser<br>
         | indexToSelect |<br>
         "Try to keep the same selection index."<br>
         indexToSelect := (messageSelections indexOf: true) max: 1.<br>
+        self deleteAllFromMessageList: self selectedMessages.<br>
-        self selectedMessages do: [ :eachMethodReference | self deleteFromMessageList: eachMethodReference ].<br>
         self deselectAll.<br>
         messageSelections ifNotEmpty:<br>
                 [ messageSelections <br>
                         at: (indexToSelect min: messageSelections size)  "safety"<br>
                         put: true ].<br>
         anchorIndex := indexToSelect min: messageSelections size.<br>
         self <br>
                 messageListIndex: anchorIndex ; <br>
                 reformulateList!<br>
<br>
Item was changed:<br>
  ----- Method: VersionsBrowser class>>browseMethod: (in category 'instance creation') -----<br>
  browseMethod: aCompiledMethod<br>
  <br>
+        ^ (self browseVersionsOf: aCompiledMethod)<br>
+                ifNotNil: [:browser |<br>
+                        browser selectMethod: aCompiledMethod];<br>
-        ^ (self browseVersionsForClass: aCompiledMethod methodClass selector: aCompiledMethod selector)<br>
-                selectMethod: aCompiledMethod;<br>
                 yourself!<br>
<br>
Item was added:<br>
+ ----- Method: VersionsBrowser class>>browseVersionsOf: (in category 'instance creation') -----<br>
+ browseVersionsOf: aCompiledMethod<br>
+ <br>
+        | methodClass methodSelector |<br>
+        methodClass := aCompiledMethod methodClass.<br>
+        methodSelector := aCompiledMethod selector.<br>
+        ^ self<br>
+                browseVersionsOf: aCompiledMethod<br>
+                class: methodClass<br>
+                meta: methodClass isMeta<br>
+                category: (methodClass organization categoryOfElement: methodSelector)<br>
+                selector: methodSelector!<br>
<br>
<br>
</div>
</span></font>
</body>
</html>