[squeak-dev] renaming a class causes invalid super pointer
CompiledMethod..!
Eliot Miranda
eliot.miranda at gmail.com
Wed Jan 21 19:07:28 UTC 2015
Hi Tobias,
On Wed, Jan 21, 2015 at 10:24 AM, Tobias Pape <Das.Linux at gmx.de> wrote:
> 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.
>
Yes, well found. Whereas if we used
| theClass |
theClass := aContext ifNil: [receiver class] ifFalse: [aContext
methodClass]
we would get the behaviour Chris is (rightly) expecting.
>
> @Bert, Eliot: Which one do you think would be correct? the Stack is down
> below[1].
>
So neither :-). I think the correct code is as I wrote above, the
receiver's class if no context, otherwise the context's methodClass (which
of course is derived from the context's method).
>
>
>
> 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
>
>
>
>
>
--
best,
Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150121/d89f0675/attachment.htm
More information about the Squeak-dev
mailing list
|