A new version of Tools was added to project The Inbox:
http://source.squeak.org/inbox/Tools-fbs.286.mcz ==================== Summary ==================== Name: Tools-fbs.286 Author: fbs Time: 11 December 2010, 3:40:05.096 pm UUID: 3dc7c1d7-ed5f-1d4f-ba84-6a9d7cd687b0 Ancestors: Tools-laza.285 Remove the contextStackTop instvar, replacing its calls with an indirection through "self contextStackTop", which just calls the top/first element of contextStack. =============== Diff against Tools-laza.285 =============== Item was changed: CodeHolder subclass: #Debugger + instanceVariableNames: 'interruptedProcess interruptedController contextStack contextStackIndex contextStackList receiverInspector contextVariablesInspector externalInterrupt proceedValue selectingPC savedCursor isolationHead failedProject errorWasInUIProcess labelString message' - instanceVariableNames: 'interruptedProcess interruptedController contextStack contextStackTop contextStackIndex contextStackList receiverInspector contextVariablesInspector externalInterrupt proceedValue selectingPC savedCursor isolationHead failedProject errorWasInUIProcess labelString message' classVariableNames: 'ContextStackKeystrokes ErrorRecursion InterruptUIProcessIfBlockedOnErrorInBackgroundProcess' poolDictionaries: '' category: 'Tools-Debugger'! !Debugger commentStamp: '<historical>' prior: 0! I represent the machine state at the time of an interrupted process. I 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. Special note on recursive errors: Some errors affect Squeak's ability to present a debugger. This is normally an unrecoverable situation. However, if such an error occurs in an isolation layer, Squeak will attempt to exit from the isolation layer and then present a debugger. Here is the chain of events in such a recovery. * A recursive error is detected. * The current project is queried for an isolationHead * Changes in the isolationHead are revoked * The parent project of isolated project is returned to * The debugger is opened there and execution resumes. If the user closes that debugger, execution continues in the outer project and layer. If, after repairing some damage, the user proceeds from the debugger, then the isolationHead is re-invoked, the failed project is re-entered, and execution resumes in that world. ! Item was added: + ----- Method: Debugger>>contextStackTop (in category 'accessing') ----- + contextStackTop + ^ contextStack first.! Item was changed: ----- Method: Debugger>>createMethod (in category 'private') ----- createMethod "Should only be called when this Debugger was created in response to a MessageNotUnderstood exception. Create a stub for the method that was missing and proceed into it." | msg chosenClass | + msg := self contextStackTop tempAt: 1. - msg := contextStackTop tempAt: 1. chosenClass := self + askForSuperclassOf: self contextStackTop receiver class - askForSuperclassOf: contextStackTop receiver class toImplement: msg selector ifCancel: [^self]. self implement: msg inClass: chosenClass. ! Item was changed: ----- Method: Debugger>>expandStack (in category 'context stack (message list)') ----- expandStack "A Notifier is being turned into a full debugger. Show a substantial amount of stack in the context pane." + self newStack: (self contextStackTop stackOfSize: 20). - self newStack: (contextStackTop stackOfSize: 20). contextStackIndex := 0. receiverInspector := Inspector inspect: nil. contextVariablesInspector := ContextVariablesInspector inspect: nil. proceedValue := nil! Item was changed: ----- Method: Debugger>>fullyExpandStack (in category 'context stack (message list)') ----- fullyExpandStack "Expand the stack to include all of it, rather than the first four or five contexts. Well, almost all of it, we better maintain sane limits too." self okToChange ifFalse: [^ self]. + self newStack: (self contextStackTop stackOfSize: contextStack size + 100000). - self newStack: (contextStackTop stackOfSize: contextStack size + 100000). self changed: #contextStackList! Item was changed: ----- Method: Debugger>>interruptedContext (in category 'accessing') ----- interruptedContext "Answer the suspended context of the interrupted process." + ^self contextStackTop.! - ^contextStackTop! Item was changed: ----- Method: Debugger>>process:controller:context: (in category 'private') ----- process: aProcess controller: aController context: aContext super initialize. Smalltalk at: #MessageTally ifPresentAndInMemory: [ :tally | tally terminateTimerProcess]. contents := nil. interruptedProcess := aProcess. interruptedController := aController. + self newStack: (aContext stackOfSize: 1). - contextStackTop := aContext. - self newStack: (contextStackTop stackOfSize: 1). contextStackIndex := 1. externalInterrupt := false. selectingPC := true. Smalltalk isMorphic ifTrue: [errorWasInUIProcess := false]! Item was changed: ----- Method: Debugger>>resetContext: (in category 'private') ----- resetContext: aContext "Used when a new context becomes top-of-stack, for instance when the method of the selected context is re-compiled, or the simulator steps or returns to a new method. There is room for much optimization here, first to save recomputing the whole stack list (and text), and secondly to avoid recomposing all that text (by editing the paragraph instead of recreating it)." | oldContext | oldContext := self selectedContext. + self newStack: aContext contextStack. - contextStackTop := aContext. - self newStack: contextStackTop contextStack. self changed: #contextStackList. self contextStackIndex: 1 oldContextWas: oldContext. self contentsChanged. ! Item was changed: ----- Method: Debugger>>selectedContext (in category 'private') ----- selectedContext contextStackIndex = 0 + ifTrue: [^contextStack first] - ifTrue: [^contextStackTop] ifFalse: [^contextStack at: contextStackIndex]! Item was changed: ----- Method: Debugger>>storeLog (in category 'notifier menu') ----- storeLog | logFileName | logFileName := Preferences debugLogTimestamp ifTrue: ['SqueakDebug-' , Time totalSeconds printString , '.log'] ifFalse: ['SqueakDebug.log']. + Smalltalk logError: labelString printString inContext: self contextStackTop to: logFileName - Smalltalk logError: labelString printString inContext: contextStackTop to: logFileName ! Item was changed: ----- Method: Debugger>>windowIsClosing (in category 'initialize') ----- windowIsClosing "My window is being closed; clean up. Restart the low space watcher." interruptedProcess == nil ifTrue: [^ self]. interruptedProcess terminate. interruptedProcess := nil. interruptedController := nil. contextStack := nil. - contextStackTop := nil. receiverInspector := nil. contextVariablesInspector := nil. Smalltalk installLowSpaceWatcher. "restart low space handler" ! |
On 2010/12/11 15:40, [hidden email] wrote:
> A new version of Tools was added to project The Inbox: > http://source.squeak.org/inbox/Tools-fbs.286.mcz > > ==================== Summary ==================== > > Name: Tools-fbs.286 > Author: fbs > Time: 11 December 2010, 3:40:05.096 pm > UUID: 3dc7c1d7-ed5f-1d4f-ba84-6a9d7cd687b0 > Ancestors: Tools-laza.285 > > Remove the contextStackTop instvar, replacing its calls with an indirection through "self contextStackTop", which just calls the top/first element of contextStack. > This doesn't directly address http://bugs.squeak.org/view.php?id=7569 but is intended as a stepping stone. Again, since Debugger's such an important tool, I'd appreciate experienced eyes telling me what mistakes I've made! frank |
Free forum by Nabble | Edit this page |