[squeak-dev] The Inbox: Tools-ct.987.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Sep 3 12:45:39 UTC 2020
Christoph Thiede uploaded a new version of Tools to project The Inbox:
http://source.squeak.org/inbox/Tools-ct.987.mcz
==================== Summary ====================
Name: Tools-ct.987
Author: ct
Time: 3 September 2020, 2:45:32.786083 pm
UUID: e07c870e-186e-f54a-9dbc-b766b1cb2bbb
Ancestors: Tools-ct.985
Fixes several issues with accepting source in debuggers. Applies overall refactoring to Debugger>>#contents:notifying:.
With this version, two concrete regressions are fixed that were introduced with the SistaV1 bytecode set (see [1]):
- When compiling a method from a block context and answering subsequent parser notifications, make sure the source code is not lost. A variant of this issue was filed by Eliot (emm) in [2].
- When removing a method from a block context, make sure the stack is unwinded correctly.
Further adjustments:
- Don't restart the current context if a different selector is changed.
- Update contentsSelection correctly without morphic hack. Works now in MVC, again.
[1] http://forum.world.st/The-Inbox-Kernel-dtl-1310-mcz-td5113032.html
[2] http://forum.world.st/tedious-programming-in-the-debugger-error-needs-fixing-td5109568.html
=============== Diff against Tools-ct.985 ===============
Item was changed:
----- Method: Debugger>>contents:notifying: (in category 'accessing') -----
contents: aText notifying: aController
+ "Accept new method source of the selected context."
- "The retrieved information has changed and its source must now be updated.
- In this case, the retrieved information is the method of the selected context."
- | result selector classOfMethod category h ctxt newMethod |
- contextStackIndex = 0 ifTrue:
- [^false].
- self selectedContext isExecutingBlock ifTrue:
- [h := self selectedContext activeHome.
- h ifNil:
- [self inform: 'Method for block not found on stack, can''t edit and continue'.
- ^false].
- (self confirm: 'I will have to revert to the method from\which this block originated. Is that OK?' withCRs) ifFalse:
- [^false].
- self resetContext: h changeContents: false.
- "N.B. Only reset the contents if the compilation succeeds. If contents are reset
- when compilation fails both compiler error message and modifications are lost."
- (result := self contents: aText notifying: aController) ifTrue:
- [self contentsChanged].
- ^result].
+ | selector classOfMethod category ctxt newMethod |
+ contextStackIndex = 0 ifTrue: [^ false].
+
+ "First, handle some edge cases"
+ selector := self selectedClass newParser parseSelector: aText.
+ "selector isDoIt ifTrue: [
+ currentCompiledMethod := self compileDoIt: aText]."
+ self flag: #todo. "ct: Recompile doIt method *without* creating method litters!! See Compiler>>#evaluateCue:ifFail:."
+ selector = self selectedMessageName ifFalse: [
+ "Different message compiled, delegating to super"
+ ^ super contents: aText notifying: aController].
+
+ self selectedContext isExecutingBlock ifTrue: [
+ "If we are in a block context, we need to rewind the stack before ."
+ | home |
+ home := self selectedContext activeHome.
+ home ifNil: [
+ self inform: 'Method for block not found on stack, can''t edit and continue' translated.
+ ^ false].
+ (self confirm: 'I will have to revert to the method from\which this block originated. Is that OK?' withCRs translated) ifFalse: [
+ ^ false].
+
+ self resetContext: home changeContents: false.
+ "N.B. Only reset the contents if the compilation succeeds. If contents would be reset when compilation fails, both compiler error message and modifications were lost."
+ ^ (self contents: aText notifying: aController)
+ ifTrue: [self contentsChanged];
+ yourself].
+
classOfMethod := self selectedClass.
category := self selectedMessageCategoryName.
+
+ "Do the actual compilation"
- selector := self selectedClass newParser parseSelector: aText.
- (selector == self selectedMessageName
- or: [(self selectedMessageName beginsWith: 'DoIt')
- and: [selector numArgs = self selectedMessageName numArgs]]) ifFalse:
- [self inform: 'can''t change selector'.
- ^false].
selector := classOfMethod
+ compile: aText
+ classified: category
+ notifying: aController.
+ selector ifNil: [^ false]. "compilation cancelled"
+
+ "Update views"
- compile: aText
- classified: category
- notifying: aController.
- selector ifNil: [^false]. "compile cancelled"
contents := aText.
newMethod := classOfMethod compiledMethodAt: selector.
+ newMethod isQuick ifTrue: [
+ self cutBackExecutionToSenderContext].
- newMethod isQuick ifTrue:
- [self cutBackExecutionToSenderContext].
ctxt := interruptedProcess popTo: self selectedContext.
ctxt == self selectedContext
+ ifFalse: [self inform: 'Method saved, but current context unchanged\because of unwind error. Click OK to see error' withCRs translated]
+ ifTrue: [
+ newMethod isQuick ifFalse: [
+ interruptedProcess restartTopWith: newMethod.
+ self stepToStatement].
- ifFalse:
- [self inform: 'Method saved, but current context unchanged\because of unwind error. Click OK to see error' withCRs]
- ifTrue:
- [newMethod isQuick ifFalse:
- [interruptedProcess
- restartTopWith: newMethod;
- stepToSendOrReturn].
contextVariablesInspector object: nil].
self resetContext: ctxt.
+
+ Project current addDeferredUIMessage: [
+ self changed: #contentsSelection].
+ ^ true!
- Smalltalk isMorphic ifTrue:
- [Project current world
- addAlarm: #changed:
- withArguments: #(contentsSelection)
- for: self
- at: (Time millisecondClockValue + 200)].
- ^true!
Item was changed:
----- Method: Debugger>>contextStackIndex:oldContextWas: (in category 'private') -----
contextStackIndex: anInteger oldContextWas: oldContext
"Change the context stack index to anInteger, perhaps in response to user selection."
| isNewMethod |
self saveReceiverInspectorState.
self saveContextVariablesInspectorState.
contextStackIndex := anInteger.
anInteger = 0 ifTrue:
[currentCompiledMethod := contents := nil.
self changed: #contextStackIndex.
self decorateButtons.
self contentsChanged.
contextVariablesInspector object: nil.
receiverInspector context: nil; inspect: self receiver.
^self].
isNewMethod := oldContext isNil
+ or: [oldContext home method ~= (currentCompiledMethod := self selectedContext home method)].
- or: [oldContext method ~~ (currentCompiledMethod := self selectedContext method)].
isNewMethod ifTrue:
[contents := self selectedMessage.
self contentsChanged.
self pcRange].
self changed: #contextStackIndex.
self decorateButtons.
contextVariablesInspector object: self selectedContext.
self restoreContextVariablesInspectorState.
receiverInspector context: self selectedContext; inspect: self receiver.
self restoreReceiverInspectorState.
isNewMethod ifFalse:
[self changed: #contentsSelection]!
Item was changed:
----- Method: Debugger>>findCleanHomeBelow: (in category 'context stack (message list)') -----
findCleanHomeBelow: method
| dirtyIndex |
dirtyIndex := contextStack size + 1.
contextStack reverse detect: [:context |
dirtyIndex := dirtyIndex - 1.
+ context home method = method homeMethod].
- context method = method].
^ dirtyIndex + 1!
Item was added:
+ ----- Method: Debugger>>tallyMenu: (in category 'controls') -----
+ tallyMenu: aMenu
+
+ ^ aMenu
+ "title: 'Tally' translated;" flag: #todo; "ct: Implement on PluggableMenuSpec"
+ addTranslatedList: #(
+ ('Tally selection' tallyIt 'evaluate current selection and measure the time')
+ ('Record send' doRecord 'record next message send'));
+ yourself!
More information about the Squeak-dev
mailing list
|