Tools__BreakpointService.st
changeset 19019 88062aff617b
parent 18844 2556c2dcb567
child 19071 58aedf69e507
--- a/Tools__BreakpointService.st	Fri Aug 23 22:01:33 2019 +0200
+++ b/Tools__BreakpointService.st	Fri Aug 23 22:07:16 2019 +0200
@@ -107,13 +107,28 @@
     breakpoints isEmptyOrNil ifTrue:[^ nil].
 
     pos := textView characterPositionOfLine:line col:1.
-    ^ breakpoints 
-        detect:[:each | each position = pos ] 
-        ifNone:[ 
-            breakpoints 
-                detect:[:each | each line == line and:[each position isNil ]] 
-                ifNone:[ nil ]
-        ]
+    "/ breakpoints are sorted by line 
+    "/ (or even by position within a line, but those are currently not supported by the GUI).
+    "/ We can stop searching early
+    breakpoints do:[:each |
+        |bpLine|
+
+        bpLine := each line.
+        bpLine == line ifTrue:[^ each].
+        bpLine > line ifTrue:[^ nil].
+    ].
+    ^ nil.
+
+"/    ^ breakpoints 
+"/        detect:[:each | each position = pos ] 
+"/        ifNone:[ 
+"/            breakpoints 
+"/                detect:[:each | each line == line and:[each position isNil ]] 
+"/                ifNone:[ 
+"/                    self halt.
+"/                    nil 
+"/                ]
+"/        ]
 
     "Modified: / 17-06-2011 / 13:59:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 16-08-2017 / 08:29:51 / cg"
@@ -504,26 +519,17 @@
 fixupBreakpointPositions
     "computes the character positions of all line breakpoints"
     
-    breakpoints notEmptyOrNil ifTrue:[ 
+    breakpoints notEmptyOrNil ifTrue:[
+        "/ self assert:(breakpoints contains:[:b | b line < 0]) not.
         breakpoints do:[:each |  
             | pos |
 
             pos := textView characterPositionOfLine:(each line) col:1.
             each position:pos line:(each line).  
         ].
+        "/ self assert:(breakpoints contains:[:b | b line < 0]) not.
         breakpoints := breakpoints select:[:b | b line >= 0].
-        breakpoints asOrderedCollection 
-            sort:[:a :b|
-                |pA pB|
-                
-                pA := a position.
-                pB := b position.
-                (pA notNil and:[pB notNil]) ifTrue:[
-                    pA < pB
-                ] ifFalse:[
-                    a line < b line
-                ]    
-            ].
+        self sortBreakpoints.
    ].
 
     "Created: / 08-05-2014 / 14:02:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -532,12 +538,14 @@
 !
 
 moveBreakpointsAfterLine:line by: delta
+    "/ self assert:(breakpoints contains:[:b | b line < 0]) not.
     breakpoints do:[:bpnt|
         bpnt line >= line ifTrue:[
             "/ Note that position will be fixed up in BreakpointService>>breakpoints
             bpnt position:nil line:(bpnt line + delta). 
         ]
     ].
+    "/ self assert:(breakpoints contains:[:b | b line < 0]) not.
     breakpoints := breakpoints reject:[:bpnt | bpnt line <= 0].
 
     "/gutterView redrawLinesFrom: line.
@@ -638,7 +646,7 @@
         "/ this assertion occasionally failed - and lead to wrong breakpoint handling in the compiler.
         "/ for now, as a q&d hack, sort them to make sure.
         "/ self assert:(breakpoints isSortedBy:[:a :b |a position <= b position]).
-        breakpoints sort:[:a :b |a position <= b position]. 
+        self sortBreakpoints.
 
         "/ must update breakpoints BEFORE the following, because it leads to a change
         "/ notification, which may clear the breakpoints collection!!
@@ -654,6 +662,26 @@
     ].
 
     "Created: / 20-02-2019 / 17:26:24 / Claus Gittinger"
+!
+
+sortBreakpoints
+    "breakpoints are sorted by line 
+     (or even by position within a line, but those are currently not supported by the GUI)"
+
+    breakpoints := breakpoints 
+                    asOrderedCollection 
+                        sort:[:a :b|
+                            |pA pB|
+
+                            pA := a position.
+                            pB := b position.
+                            (pA notNil and:[pB notNil]) ifTrue:[
+                                "/ self assert:(pA <= pB) = (a line <= b line).
+                                pA < pB
+                            ] ifFalse:[
+                                a line < b line
+                            ]    
+                        ].
 ! !
 
 !BreakpointService methodsFor:'queries'!