Hi guys,
Imagine the debugger prints "8. [] in DpQuuveProductionWalkbackErrorHandler(WAExceptionHandler)>>handleExceptionsDuring: @7 line 8" I manage to get to do doing some hack like this: (self instVarNamed: 'continuation' ) _reportAt: 8 I understand 7 is the step pointer and 8 is the line number. The debugger knows where to start and where to stop that part of the step. See attached picture. See the blue text? how can I ask that to the GsContext ? Thanks in advance, _______________________________________________ Glass mailing list [hidden email] http://lists.gemtalksystems.com/mailman/listinfo/glass Screen Shot 2017-11-03 at 6.17.43 PM.png (1M) Download Attachment |
Mariano, Take a look at TDStackFrame>>calculateSelectionRange ...You can easily look at the implementation of the debugger ... in the text pane that has the highlighted source from the debugger, use the `Window > inspect builder` menu item to bring up the code that implements that pane ... you'll get an inspector on something like this: Inspect aTDStackFrameMethodElementBuilder/ -------------------- . -> aTDStackFrameMethodElementBuilder (class)@ -> TDStackFrameMethodElementBuilder (oop)@ -> 204640769 formatOnAccept@ -> nil formatOnDisplay@ -> nil object@ -> SmallInteger(Object)>>_doesNotUnderstand:args:envId:reason: @7 line 12 objectBlock@ -> nil theEditorSpec@ -> aTDEditorSpec theWindowLocation@ -> nil theWindowName@ -> nil and then clicking on the `object` field, you'll find what I think your are looking for: Inspect aTDStackFrameMethodElementBuilder/SmallInteger(Object)>>_doesNotUnderstand:args:envId:reason: @7 line 12/ -------------------- . -> SmallInteger(Object)>>_doesNotUnderstand:args:envId:reason: @7 line 12 .. -> aTDStackFrameMethodElementBuilder (class)@ -> TDStackFrame (oop)@ -> 197204737 argAndTempNames@ -> anArray( 'aSymbol', 'anArray', 'aSmallInt', 'dnuKind', '.t1', '.t2') frameContents@ -> anArray( aGsNMethod, 144, nil, nil, nil, nil, nil, 2, anArray( #'aSymbol', #'anArray', #'aSmallInt', #'dnuKind', '.t1', '.t2'), 2, #'foo'... frameIndex@ -> 5 next@ -> Executed Code previous@ -> SmallInteger(Object)>>doesNotUnderstand: @10 line 10 selectionRange@ -> anInterval( 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, ... stack@ -> error printing You will see that the object behind the text pane is a TDStackFrame with an instance variable selectionRange ... and that should lead you to TDStackFrame>>calculateSelectionRange.... Most of the raw information you will need is in the frameContents that you can get from the continuation instance ... Hope this helps, Dale On 11/3/17 2:22 PM, Mariano Martinez
Peck via Glass wrote:
_______________________________________________ Glass mailing list [hidden email] http://lists.gemtalksystems.com/mailman/listinfo/glass |
Cool. It did work. Now my web debugger is way cooler. See attached screenshot. BTW, wouldn't this be nice additions to add directly to GsContext? I added this standalone methods and they seem to work: Below method is a simplified version of tODE one assuming the data we have in the GsContext and to avoid calling other methods we do not have here. calculateSelectionRange | stepPoint begin end frameContents | frameContents := continuation _frameContentsAt: level. (method respondsTo: #'_stepPointForIp:level:isNative:') ifTrue: [ stepPoint := method perform: #'_stepPointForIp:level:isNative:' withArguments: {(frameContents at: 2). level. (continuation _nativeStack)} ] ifFalse: [ "v3.3" stepPoint := method perform: #'_stepPointForIp:level:useNext:' withArguments: {(frameContents at: 2). level. (continuation _nativeStack)} ]. begin := method _sourceOffsetsAt: stepPoint. end := self calculateSourceRangeEnd: begin in: method sourceString. ^ begin to: end Below one is exact copy from tODE one. calculateSourceRangeEnd: start in: string | scan i char characterStack beginners enders | i := start. (string at: i) = $^ ifTrue: [ ^ string size - 1 ]. (char := string at: i) isCompilerSpecial ifTrue: [ ^ (i < string size and: [ (char := string at: i + 1) isCompilerSpecial ]) ifTrue: [ i + 1 ] ifFalse: [ i ] ]. scan := true. [ scan ] whileTrue: [ [ i <= string size and: [ (string at: i) isSeparator ] ] whileTrue: [ i := i + 1 ]. [ i <= string size and: [ (char := string at: i) isAlphaNumeric or: [ char = $_ ] ] ] whileTrue: [ i := i + 1 ]. char = $: ifFalse: [ ^ i - 1 ]. scan := start == 1. scan ifTrue: [ i := i + 1 ] ]. characterStack := OrderedCollection new. beginners := String with: $' with: $" with: $( with: $[. enders := String with: $) with: $]. [ i := i + 1. i < string size ] whileTrue: [ char := string at: i. characterStack isEmpty ifTrue: [ (char = $. or: [ char = $; ]) ifTrue: [ ^ i - 1 ]. (beginners includes: char) ifTrue: [ characterStack addLast: char ] ifFalse: [ (enders includes: char) ifTrue: [ ^ i - 1 ] ] ] ifFalse: [ (characterStack last = $' or: [ characterStack last = $" ]) ifTrue: [ char = characterStack last ifTrue: [ characterStack removeLast ] ] ifFalse: [ (beginners includes: char) ifTrue: [ characterStack addLast: char ] ifFalse: [ (characterStack last = $( and: [ char = $) ]) ifTrue: [ characterStack removeLast ] ifFalse: [ (characterStack last = $[ and: [ char = $] ]) ifTrue: [ characterStack removeLast ] ] ] ] ] ]. ^ i - 1 On Fri, Nov 3, 2017 at 7:15 PM, Dale Henrichs via Glass <[hidden email]> wrote:
_______________________________________________ Glass mailing list [hidden email] http://lists.gemtalksystems.com/mailman/listinfo/glass Screen Shot 2017-11-04 at 1.11.56 AM.png (365K) Download Attachment |
Yeah I think that would make a lot of sense ... On 11/3/17 9:14 PM, Mariano Martinez
Peck wrote:
_______________________________________________ Glass mailing list [hidden email] http://lists.gemtalksystems.com/mailman/listinfo/glass |
Free forum by Nabble | Edit this page |