[squeak-dev] The Trunk: Tools-mt.989.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Sep 29 08:06:09 UTC 2020


Marcel Taeumel uploaded a new version of Tools to project The Trunk:
http://source.squeak.org/trunk/Tools-mt.989.mcz

==================== Summary ====================

Name: Tools-mt.989
Author: mt
Time: 29 September 2020, 10:06:06.429444 am
UUID: 5730f8ac-96c7-6c41-be31-f2c51310ad53
Ancestors: Tools-ct.988

In debuggers, unify run-until/to logic, which also skips unnecessary UI updates to speed up "run to here" again.

=============== Diff against Tools-ct.988 ===============

Item was added:
+ ----- Method: Debugger>>doStepUntil: (in category 'context stack menu') -----
+ doStepUntil: condition
+ 	"Step until the given condition evaluates to other than false, reporting an error it if does not evaluate to true.
+ 	
+ 	If shift is pressed when the expression is supplied, don't update the UI. If shift is pressed while stepping, stop stepping. Using a user interrupt to break out would be more natural but Squeak currently doesn't provide a UserInterrupt exception. It should do."
+ 	
+ 	| currentContext newContext value lastUpdate updateUI breakOnShift |
+ 	self okToChange ifFalse: [^ self].
+ 	self checkContextSelection.
+ 	currentContext := newContext := self selectedContext.
+ 	lastUpdate := Time millisecondClockValue.
+ 	updateUI := breakOnShift := Sensor shiftPressed not.
+ 	
+ 	Cursor execute showWhile: [[
+ 		newContext == currentContext
+ 			and: [currentContext willReturn not
+ 			and: [(value := condition value) == false]] ] whileTrue: [
+ 	
+ 				self
+ 					handleLabelUpdatesIn: [newContext := interruptedProcess completeStep: currentContext]
+ 					whenExecuting: currentContext.
+ 				newContext == currentContext ifTrue: [
+ 					newContext := interruptedProcess stepToSendOrReturn.
+ 					self resetContext: newContext changeContents: false].
+ 	
+ 				Time millisecondClockValue - lastUpdate > 250 "ms" ifTrue: [
+ 					updateUI ifTrue: [
+ 						self changed: #contentsSelection.
+ 						Project current world displayWorldSafely].
+ 					breakOnShift 
+ 						ifTrue: [Sensor shiftPressed ifTrue: [
+ 							self changed: #contentsSelection.
+ 							self updateInspectors.
+ 							^self]]
+ 						ifFalse: [Sensor shiftPressed ifFalse: [breakOnShift := true]].
+ 					 lastUpdate := Time millisecondClockValue] ]].
+ 	
+ 	self contextStackIndex > 1
+ 		ifTrue: [self resetContext: newContext]
+ 		ifFalse:
+ 			[newContext == currentContext
+ 				ifTrue: [self changed: #contentsSelection; updateInspectors]
+ 				ifFalse: [self resetContext: newContext]].
+ 			
+ 	^ value
+ !

Item was changed:
  ----- Method: Debugger>>runToSelection: (in category 'code pane menu') -----
  runToSelection: selectionInterval
+ 
- 	| currentContext |
  	self pc first >= selectionInterval first ifTrue: [ ^self ].
+ 	self doStepUntil: [ self pc first >= selectionInterval first ].!
- 	currentContext := self selectedContext.
- 	[ currentContext == self selectedContext and: [ self pc first < selectionInterval first ] ] whileTrue: [ self doStep ].!

Item was changed:
  ----- Method: Debugger>>runUntil (in category 'code pane menu') -----
  runUntil
+ 	"Step until an expression evaluates to other than false, reporting an error if it doesn't evaluate to true. Remember the expression in an inst var."
+ 
+ 	| expression receiver context method value |
- 	"Step until an expression evaluates to other than false, reporting an error if it doesn't evaluate to true.
- 	 Remember the expression in an inst var.  If shift is pressed when the expression is supplied, don't update the UI.
- 	 If shift is pressed while stepping, stop stepping.  Using a user interrupt to break out would be more natural
- 	 but Squeak currently doesn't provide a UserInterrupt expection.  It should do."
- 	| expression receiver context method value lastUpdate updateUI breakOnShift |
  	expression := UIManager default 
  					request: 'run until expression is true (shift to disable ui update; shift to break).'
  					initialAnswer: (untilExpression ifNil: 'boolean expression').
  	(expression isNil or: [expression isEmpty]) ifTrue:
  		[^self].
- 	updateUI := breakOnShift := Sensor shiftPressed not.
  	untilExpression := expression.
  	context := self selectedContext.
  	receiver := context receiver.
  	method := receiver class evaluatorClass new 
  				compiledMethodFor: untilExpression
  				in: context
  				to: receiver
  				notifying: nil
  				ifFail: [^ #failedDoit].
  
+ 	value := self doStepUntil: [method valueWithReceiver: receiver arguments: {context}].
+ 		
- 	lastUpdate := Time millisecondClockValue.
- 	Cursor execute showWhile:
- 		[[self selectedContext == context
- 		  and: [context willReturn not
- 		  and: [(value := method valueWithReceiver: receiver arguments: {context}) == false]]] whileTrue:
- 			[interruptedProcess completeStep: self selectedContext.
- 			 self selectedContext == context ifTrue:
- 				[self resetContext: interruptedProcess stepToSendOrReturn changeContents: false].
- 			 Time millisecondClockValue - lastUpdate > 50 ifTrue:
- 				[updateUI ifTrue:
- 					[self changed: #contentsSelection.
- 					 Project current world displayWorldSafely].
- 				 breakOnShift
- 					ifTrue: [Sensor shiftPressed ifTrue:
- 								[self changed: #contentsSelection.
- 								 self updateInspectors.
- 								 ^self]]
- 					ifFalse: [Sensor shiftPressed ifFalse: [breakOnShift := true]].
- 				 lastUpdate := Time millisecondClockValue]]].
- 	self changed: #contentsSelection.
- 	self updateInspectors.
  	(value ~~ false and: [value ~~ true]) ifTrue:
  		[UIManager default inform: 'expression ', (untilExpression contractTo: 40), ' answered ', (value printString contractTo: 20), '!!!!']!



More information about the Squeak-dev mailing list