[squeak-dev] renaming a class causes invalid super pointer
CompiledMethod..!
Tobias Pape
Das.Linux at gmx.de
Wed Jan 21 18:24:40 UTC 2015
Hi Chris
On 21.01.2015, at 17:39, Chris Muller <asqueaker at gmail.com> wrote:
> Okay, I found the invalid super-pointer behavior.
>
> It's a lot better with Bert & Tobias' fix, but still there to a smaller degree..
>
> Object compile: 'test ^''Hello from Object'''.
> (Object subclass: #MyClass instanceVariableNames: ''
> classVariableNames: '' poolDictionaries: '' category: 'Test') compile:
> 'test self halt. ^ super test, ''my super call lands on myself!'''.
> (Smalltalk classNamed: #MyClass) rename: 'MyNewAbstraction'.
> ((Smalltalk classNamed: #MyNewAbstraction) subclass: #MyClass
> instanceVariableNames: '' classVariableNames: '' poolDictionaries: ''
> category: 'Test').
> (Smalltalk classNamed: #MyClass) new test
>
> Do-it on the above. When the debugger appears, simply highlight the
> code "super test" in the debugger and press "Print It".
>
> I expected to see 'Hello from Object' but it seems to be calculating
> super from the receiver class rather than the method's home class...
>
> WITHOUT Bert and Tobias' fix, the above results in the super call
> truly landing on itself, and if you take the halt out, the
> tight-recursion I mentioned from teh first paragraph of this thread.
> WITH their fix, the problem only manifests in the debugger as
> demonstrated.
If you hit step-into, you actually end up in the Superclass.
_Only_ if you select 'super test' and PrintIt (or DoIt), the
apparent “recursion” is triggered.
This is due to the way DoIt work, they compile an anonymous class
that are “homed” in the receivers class, in this case MyClass. Hence,
super ends up in MyNewAbstraction[1].
Yes, this is a bit surprising, but I don't know whether it is wrong.
Compiler>>evaluate:in:to:notifying:ifFail:logged:
calculates the home class of the DoIt via this:
| theClass |
theClass := ((aContext == nil ifTrue: [receiver] ifFalse: [aContext receiver]) class).
that is, the _Receiver_ of the context, not the home class of the context's method.
@Bert, Eliot: Which one do you think would be correct? the Stack is down below[1].
Best
-Tobias
[1]:
Compiler>>evaluateCue:ifFail:
Receiver: a Compiler
Arguments and temporary variables:
aCue: a CompilationCue
failBlock: [closure] in Compiler>>evaluateCue:ifFail:logged:
methodNode: DoItIn: ThisContext
^ super test
method: (MyClass>>#DoItIn: "a CompiledMethod(374)")
value: nil
Receiver's instance variables:
parser: a Parser
cue: a CompilationCue
Compiler>>evaluateCue:ifFail:logged:
Receiver: a Compiler
Arguments and temporary variables:
aCue: a CompilationCue
failBlock: [closure] in [] in SmalltalkEditor(TextEditor)>>evaluateSelectionAnd...etc...
logFlag: true
value: nil
Receiver's instance variables:
parser: a Parser
cue: a CompilationCue
Compiler>>evaluate:in:to:notifying:ifFail:logged:
Receiver: a Compiler
Arguments and temporary variables:
textOrStream: a ReadStream
aContext: MyClass(MyNewAbstraction)>>test
receiver: a MyClass
aRequestor: a SmalltalkEditor
failBlock: [closure] in [] in SmalltalkEditor(TextEditor)>>evaluateSelectionAnd...etc...
logFlag: true
theClass: MyClass
Receiver's instance variables:
parser: a Parser
cue: a CompilationCue
[] in SmalltalkEditor(TextEditor)>>evaluateSelectionAndDo:
Receiver: a SmalltalkEditor
Arguments and temporary variables:
<<error during printing>
Receiver's instance variables:
morph: a TextMorphForEditView(3464)
selectionShowing: false
model: a Debugger
paragraph: a NewParagraph
markBlock: a CharacterBlock with index 21 and character $s and rectangle 110 at 0 ...etc...
pointBlock: a CharacterBlock with index 31 and character $, and rectangle 174 at 0...etc...
beginTypeInIndex: nil
emphasisHere: {a TextColor code: (Color r: 0.0 g: 0.0 b: 0.5)}
lastParenLocation: nil
otherInterval: (20 to: 19)
oldInterval: (20 to: 19)
typeAhead: nil
styler: nil
BlockClosure>>on:do:
Receiver: [closure] in SmalltalkEditor(TextEditor)>>evaluateSelectionAndDo:
Arguments and temporary variables:
exception: OutOfScopeNotification
handlerAction: [closure] in SmalltalkEditor(TextEditor)>>evaluateSelectionAndDo...etc...
handlerActive: true
Receiver's instance variables:
outerContext: SmalltalkEditor(TextEditor)>>evaluateSelectionAndDo:
startpc: 97
numArgs: 0
SmalltalkEditor(TextEditor)>>evaluateSelectionAndDo:
Receiver: a SmalltalkEditor
Arguments and temporary variables:
aBlock: [closure] in [] in PluggableTextMorphPlus(PluggableTextMorph)>>printIt
result: nil
rcvr: a MyClass
ctxt: MyClass(MyNewAbstraction)>>test
Receiver's instance variables:
morph: a TextMorphForEditView(3464)
selectionShowing: false
model: a Debugger
paragraph: a NewParagraph
markBlock: a CharacterBlock with index 21 and character $s and rectangle 110 at 0 ...etc...
pointBlock: a CharacterBlock with index 31 and character $, and rectangle 174 at 0...etc...
beginTypeInIndex: nil
emphasisHere: {a TextColor code: (Color r: 0.0 g: 0.0 b: 0.5)}
lastParenLocation: nil
otherInterval: (20 to: 19)
oldInterval: (20 to: 19)
typeAhead: nil
styler: nil
[] in PluggableTextMorphPlus(PluggableTextMorph)>>printIt
Receiver: a PluggableTextMorphPlus(473)
Arguments and temporary variables:
oldEditor: {a SmalltalkEditor}
Receiver's instance variables:
bounds: 36 at 380 corner: 740 at 592
owner: a PluggablePanelMorph(3130)
submorphs: {a ScrollBar(1013) . a TransformMorph(3047)}
fullBounds: 36 at 380 corner: 740 at 592
color: Color white
extension: a MorphExtension (3891) [other: (layoutFrame -> a LayoutFrame) (vSc...etc...
borderWidth: 1
borderColor: Color lightGray
model: a Debugger
slotName: nil
open: false
scrollBar: a ScrollBar(1013)
scroller: a TransformMorph(3047)
retractableScrollBar: false
scrollBarOnLeft: false
getMenuSelector: #codePaneMenu:shifted:
getMenuTitleSelector: nil
scrollBarHidden: nil
hasFocus: false
hScrollBar: a ScrollBar(2030)
textMorph: a TextMorphForEditView(3464)
getTextSelector: #contents
setTextSelector: #contents:notifying:
getSelectionSelector: #contentsSelection
hasUnacceptedEdits: false
askBeforeDiscardingEdits: true
selectionInterval: (21 to: 30)
hasEditingConflicts: false
getColorSelector: nil
acceptAction: nil
unstyledAcceptText: nil
styler: a SHTextStylerST80
TextMorphForEditView(TextMorph)>>handleEdit:
Receiver: a TextMorphForEditView(3464)
Arguments and temporary variables:
editBlock: [closure] in PluggableTextMorphPlus(PluggableTextMorph)>>printIt
result: nil
Receiver's instance variables:
bounds: 0 at 0 corner: 683 at 18
owner: a TransformMorph(3047)
submorphs: #()
fullBounds: 0 at 0 corner: 683 at 18
color: Color black
extension: a MorphExtension (3814) [other: (blinkStart -> 1091554)]
borderWidth: 0
borderColor: Color black
textStyle: a TextStyle Bitmap DejaVu Sans 9
text: a Text for 'test self halt. ^ super test, ''my super call lands on myse...etc...
wrapFlag: true
paragraph: a NewParagraph
editor: a SmalltalkEditor
container: nil
predecessor: nil
successor: nil
backgroundColor: nil
margins: nil
editHistory: nil
editView: a PluggableTextMorphPlus(473)
acceptOnCR: false
PluggableTextMorphPlus(PluggableTextMorph)>>printIt
Receiver: a PluggableTextMorphPlus(473)
Arguments and temporary variables:
oldEditor: {a SmalltalkEditor}
Receiver's instance variables:
bounds: 36 at 380 corner: 740 at 592
owner: a PluggablePanelMorph(3130)
submorphs: {a ScrollBar(1013) . a TransformMorph(3047)}
fullBounds: 36 at 380 corner: 740 at 592
color: Color white
extension: a MorphExtension (3891) [other: (layoutFrame -> a LayoutFrame) (vSc...etc...
borderWidth: 1
borderColor: Color lightGray
model: a Debugger
slotName: nil
open: false
scrollBar: a ScrollBar(1013)
scroller: a TransformMorph(3047)
retractableScrollBar: false
scrollBarOnLeft: false
getMenuSelector: #codePaneMenu:shifted:
getMenuTitleSelector: nil
scrollBarHidden: nil
hasFocus: false
hScrollBar: a ScrollBar(2030)
textMorph: a TextMorphForEditView(3464)
getTextSelector: #contents
setTextSelector: #contents:notifying:
getSelectionSelector: #contentsSelection
hasUnacceptedEdits: false
askBeforeDiscardingEdits: true
selectionInterval: (21 to: 30)
hasEditingConflicts: false
getColorSelector: nil
acceptAction: nil
unstyledAcceptText: nil
styler: a SHTextStylerST80
Debugger(StringHolder)>>perform:orSendTo:
Receiver: a Debugger
Arguments and temporary variables:
selector: #printIt
otherTarget: a PluggableTextMorphPlus(473)
Receiver's instance variables:
dependents: a DependentsArray(a PluggableSystemWindow(1857) a PluggableListMorp...etc...
contents: a Text for 'test self halt. ^ super test, ''my super call lands on ...etc...
currentCompiledMethod: nil
contentsSymbol: #source
multiWindowState: nil
interruptedProcess: a Process in Debugger class>>morphicOpenOn:context:label:co...etc...
interruptedController: nil
contextStack: an OrderedCollection(MyClass(Object)>>halt MyClass(MyNewAbstracti...etc...
contextStackIndex: 2
contextStackList: an OrderedCollection('MyClass(Object)>>halt' 'MyClass(MyNewAb...etc...
receiverInspector: an Inspector
contextVariablesInspector: a ContextVariablesInspector
externalInterrupt: false
proceedValue: nil
selectingPC: true
savedCursor: ((CursorWithMask
extent: 16 at 16
depth: 1
fromArray: #(
2r0
2...etc...
isolationHead: nil
failedProject: nil
errorWasInUIProcess: true
labelString: nil
message: nil
untilExpression: nil
Debugger>>perform:orSendTo:
Receiver: a Debugger
Arguments and temporary variables:
selector: #printIt
otherTarget: a PluggableTextMorphPlus(473)
result: nil
Receiver's instance variables:
dependents: a DependentsArray(a PluggableSystemWindow(1857) a PluggableListMorp...etc...
contents: a Text for 'test self halt. ^ super test, ''my super call lands on ...etc...
currentCompiledMethod: nil
contentsSymbol: #source
multiWindowState: nil
interruptedProcess: a Process in Debugger class>>morphicOpenOn:context:label:co...etc...
interruptedController: nil
contextStack: an OrderedCollection(MyClass(Object)>>halt MyClass(MyNewAbstracti...etc...
contextStackIndex: 2
contextStackList: an OrderedCollection('MyClass(Object)>>halt' 'MyClass(MyNewAb...etc...
receiverInspector: an Inspector
contextVariablesInspector: a ContextVariablesInspector
externalInterrupt: false
proceedValue: nil
selectingPC: true
savedCursor: ((CursorWithMask
extent: 16 at 16
depth: 1
fromArray: #(
2r0
2...etc...
isolationHead: nil
failedProject: nil
errorWasInUIProcess: true
labelString: nil
message: nil
untilExpression: nil
MenuItemMorph>>DoIt
Receiver: a MenuItemMorph(77)'print it (p)'
Arguments and temporary variables:
Receiver's instance variables:
bounds: 216 at 558 corner: 359 at 576
owner: a MenuMorph(2209)
submorphs: #()
fullBounds: 216 at 558 corner: 359 at 576
color: Color black
extension: a MorphExtension (264) [other: (layoutProperties -> a LayoutPropert...etc...
font: a StrikeFont(Bitmap DejaVu Sans 9 14)
emphasis: 0
contents: 'print it (p)'
hasFocus: false
isEnabled: true
subMenu: nil
isSelected: false
target: a Debugger
selector: #perform:orSendTo:
arguments: {#printIt . a PluggableTextMorphPlus(473)}
icon: Form(16x16x32)
lastMousePosition: nil
CompiledMethod>>valueWithReceiver:arguments:
Receiver: (MenuItemMorph>>#DoIt "a CompiledMethod(1420)")
Arguments and temporary variables:
aReceiver: a MenuItemMorph(77)'print it (p)'
anArray: #()
Receiver's instance variables:
(MenuItemMorph>>#DoIt "a CompiledMethod(1420)")
[] in SmalltalkEditor(TextEditor)>>debug:receiver:in:
Receiver: a SmalltalkEditor
Arguments and temporary variables:
<<error during printing>
Receiver's instance variables:
morph: a TextMorphForEditView(4064)
selectionShowing: false
model: an ObjectExplorer
paragraph: a NewParagraph
markBlock: a CharacterBlock with index 1 and character $s and rectangle 0 at 0 cor...etc...
pointBlock: a CharacterBlock with index 62 and rectangle 366 at 0 corner: 366 at 16
...etc...
beginTypeInIndex: nil
emphasisHere: {a TextFontChange font: 2}
lastParenLocation: nil
otherInterval: (61 to: 61)
oldInterval: (55 to: 54)
typeAhead: a WriteStream
styler: nil
[] in BlockClosure>>newProcess
Receiver: [closure] in SmalltalkEditor(TextEditor)>>debug:receiver:in:
Arguments and temporary variables:
Receiver's instance variables:
outerContext: SmalltalkEditor(TextEditor)>>debug:receiver:in:
startpc: 112
numArgs: 0
--- The full stack ---
Compiler>>evaluateCue:ifFail:
Compiler>>evaluateCue:ifFail:logged:
Compiler>>evaluate:in:to:notifying:ifFail:logged:
[] in SmalltalkEditor(TextEditor)>>evaluateSelectionAndDo:
BlockClosure>>on:do:
SmalltalkEditor(TextEditor)>>evaluateSelectionAndDo:
[] in PluggableTextMorphPlus(PluggableTextMorph)>>printIt
TextMorphForEditView(TextMorph)>>handleEdit:
PluggableTextMorphPlus(PluggableTextMorph)>>printIt
Debugger(StringHolder)>>perform:orSendTo:
Debugger>>perform:orSendTo:
MenuItemMorph>>DoIt
CompiledMethod>>valueWithReceiver:arguments:
[] in SmalltalkEditor(TextEditor)>>debug:receiver:in:
[] in BlockClosure>>newProcess
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 1625 bytes
Desc: Message signed with OpenPGP using GPGMail
Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150121/38cb7961/signature-0001.pgp
More information about the Squeak-dev
mailing list
|