How can I get the start/end of a step in a GsContext?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

How can I get the start/end of a step in a GsContext?

GLASS mailing list
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
Reply | Threaded
Open this post in threaded view
|

Re: How can I get the start/end of a step in a GsContext?

GLASS mailing list

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:
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


_______________________________________________
Glass mailing list
[hidden email]
http://lists.gemtalksystems.com/mailman/listinfo/glass
Reply | Threaded
Open this post in threaded view
|

Re: How can I get the start/end of a step in a GsContext?

GLASS mailing list
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:

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:
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


_______________________________________________
Glass mailing list
[hidden email]
http://lists.gemtalksystems.com/mailman/listinfo/glass




--

_______________________________________________
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
Reply | Threaded
Open this post in threaded view
|

Re: How can I get the start/end of a step in a GsContext?

GLASS mailing list

Yeah I think that would make a lot of sense ...


On 11/3/17 9:14 PM, Mariano Martinez Peck wrote:
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:

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:
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


_______________________________________________
Glass mailing list
[hidden email]
http://lists.gemtalksystems.com/mailman/listinfo/glass




--


_______________________________________________
Glass mailing list
[hidden email]
http://lists.gemtalksystems.com/mailman/listinfo/glass