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

Mariano Martinez Peck via Glass glass at lists.gemtalksystems.com
Fri Nov 3 21:14:31 PDT 2017


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 <
glass at lists.gemtalksystems.com> 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,
>
> --
> Mariano
> http://marianopeck.wordpress.com
>
>
> _______________________________________________
> Glass mailing listGlass at lists.gemtalksystems.comhttp://lists.gemtalksystems.com/mailman/listinfo/glass
>
>
>
> _______________________________________________
> Glass mailing list
> Glass at lists.gemtalksystems.com
> http://lists.gemtalksystems.com/mailman/listinfo/glass
>
>


-- 
Mariano
http://marianopeck.wordpress.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gemtalksystems.com/mailman/private/glass/attachments/20171104/e0e40852/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Screen Shot 2017-11-04 at 1.11.56 AM.png
Type: image/png
Size: 273832 bytes
Desc: not available
URL: <http://lists.gemtalksystems.com/mailman/private/glass/attachments/20171104/e0e40852/attachment-0001.png>


More information about the Glass mailing list