home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 16 / CD_ASCQ_16_0994.iso / news / 4611 / fw16d.ins / IDE / SOURCE / STACK.PRG < prev    next >
Text File  |  1994-05-31  |  5KB  |  150 lines

  1. // FiveWin IDE - Stack Inspector MDIChild Window
  2.  
  3. #include "FiveWin.ch"
  4.  
  5. static aObjBmps
  6.  
  7. //----------------------------------------------------------------------------//
  8.  
  9. function StackInspect()
  10.  
  11.    local oWndIns, oBrwVars, oBrwStk
  12.    local nStkItem   := 1
  13.    local nVarItem   := 1
  14.    local aStackInfo := StackInfo() // {}
  15.    local aVarInfo   := VarInfo( aStackInfo[ nStkItem ] ) // {}
  16.  
  17.    DEFAULT aObjBmps := GetObjBmps()
  18.  
  19.    DEFINE DIALOG oWndIns RESOURCE "FWSTACK"
  20.  
  21.    REDEFINE LISTBOX oBrwVars FIELDS ""  ID 101 ;
  22.             HEADERS  "  ", "Scope", "VarName", "Type", "Value" ;
  23.             FIELDSIZES 16,     70,         80,     35,     200 ;
  24.             OF oWndIns ;
  25.             ON DBLCLICK ObjInspect( DbgSetGet( aVarInfo[ nVarItem ][ 3 ] ),;
  26.                                     aVarInfo[ nVarItem ][ 2 ] )
  27.  
  28.        oBrwVars:bLine = { || aVarLine( aVarInfo[ nVarItem ] ) }
  29.  
  30.        // Browsing an Array using FiveWin TWBrowse Object !
  31.  
  32.        oBrwVars:bGoTop    = { || nVarItem := 1 }
  33.        oBrwVars:bGoBottom = { || nVarItem := Eval( oBrwVars:bLogicLen ) }
  34.  
  35.        oBrwVars:bSkip     = { | nWant, nOld | nOld := nVarItem, nVarItem += nWant,;
  36.                             nVarItem := Max( 1, Min( nVarItem, Eval( oBrwVars:bLogicLen ) ) ),;
  37.                             nVarItem - nOld }
  38.  
  39.        oBrwVars:bLogicLen = { || Len( aVarInfo ) }
  40.  
  41.        oBrwVars:cAlias    = "Array"  // We need a non empty cAlias !
  42.  
  43.    REDEFINE LISTBOX oBrwStk FIELDS "" ID 102 ;
  44.             HEADERS  "  ", "Deep", "Proc/Func", "Line", "Module" ;
  45.             FIELDSIZES 16,     35,         145,     35,      120 ;
  46.             ON CHANGE ( aVarInfo   := VarInfo( aStackInfo[ nStkItem ] ), ;
  47.                         oBrwVars:GoTop() ,;
  48.                         oBrwVars:Refresh( .t. ) ) ;
  49.             OF oWndIns
  50.  
  51.    oBrwStk:bLine = { || aStkLine( aStackInfo, nStkItem ) }
  52.  
  53.    // Browsing an Array using FiveWin a TWBrowse Object !
  54.  
  55.    oBrwStk:bGoTop    = { || nStkItem := 1 }
  56.    oBrwStk:bGoBottom = { || nStkItem := Eval( oBrwStk:bLogicLen ) }
  57.  
  58.    oBrwStk:bSkip     = { | nWant, nOld | nOld := nStkItem, nStkItem += nWant,;
  59.                         nStkItem := Max( 1, Min( nStkItem, Eval( oBrwStk:bLogicLen ) ) ),;
  60.                         nStkItem - nOld }
  61.  
  62.    oBrwStk:bLogicLen = { || Len( aStackInfo ) }
  63.  
  64.    oBrwStk:cAlias    = "Array"  // We need a non empty cAlias !
  65.  
  66.    REDEFINE BUTTON ID 103 OF oWndIns ;
  67.       ACTION ObjInspect( DbgSetGet( aVarInfo[ nVarItem ][ 3 ] ),;
  68.                          aVarInfo[ nVarItem ][ 2 ] )
  69.  
  70.    ACTIVATE DIALOG oWndIns CENTERED ;
  71.             ON INIT ( aStackInfo := StackInfo(),;
  72.                       aVarInfo   := VarInfo( aStackInfo[ nStkItem ] ), .t. )
  73. return nil
  74.  
  75. //---------------------------------------------------------------------------//
  76.  
  77. static function StackInfo()
  78.  
  79.     local aInfo := {}
  80.     local aItem
  81.     local cProc
  82.     local i     := 0
  83.     local nStkDeep
  84.  
  85.     while ! empty( cProc := ProcName( ++i ) ) .and. cProc != "STACKINSPE"
  86.     end
  87.     nStkDeep = i
  88.  
  89.     while ! Empty( cProc := ProcName( ++i ) )
  90.         aItem := DbgAct( i )
  91.         AAdd( aInfo, { i - nStkDeep, cProc, str( ProcLine( i ), 4 ),;
  92.              If( Empty( aItem ), "", aItem[ 2 ] ) } )
  93.     end
  94.  
  95. return aInfo
  96.  
  97. //----------------------------------------------------------------------------//
  98.  
  99. static function aStkLine( aStkInfo, nItem )
  100.  
  101.    local aInfo := aStkInfo[ nItem ]
  102.    local n     := Len( aObjBmps )
  103.  
  104. return { If( !empty( aInfo[ 4 ] ), aObjBmps[ n - 1 ], aObjBmps[ n ] ),;
  105.          Str( Len( aStkInfo ) - aInfo[ 1 ] + 1, 4 ), ;
  106.          aInfo[ 2 ], xPadL( aInfo[ 3 ], 40 ), aInfo[ 4 ]  }
  107.  
  108. //----------------------------------------------------------------------------//
  109.  
  110. static function VarInfo( aStkPosInfo )
  111.  
  112.     local cProc
  113.     local nStkDeep := 0
  114.  
  115.     while ! Empty( cProc := ProcName( ++nStkDeep ) ) ;
  116.           .and. cProc != "STACKINSPE"
  117.     end
  118.  
  119. return DbgVarInfo( aStkPosInfo[ 1 ] + nStkDeep, 31 )
  120.  
  121. //---------------------------------------------------------------------------//
  122.  
  123. static function aVarLine( aVarInfo )
  124.  
  125.     local cScope := ""
  126.     local cType  := DbgValType( aVarInfo[ 3 ] )
  127.  
  128.     do case
  129.         case aVarInfo[ 1 ] == 1
  130.             cScope = "BlockLocal"
  131.  
  132.         case aVarInfo[ 1 ] == 2
  133.             cScope = "Local"
  134.  
  135.         case aVarInfo[ 1 ] == 4
  136.             cScope = "Static"
  137.  
  138.         case aVarInfo[ 1 ] == 8
  139.             cScope = "Private"
  140.  
  141.         case aVarInfo[ 1 ] == 16
  142.             cScope = "Public"
  143.     endcase
  144.  
  145. return { aObjBmps[ At( cType, "ABCDLNMOU" ) ], cScope,;
  146.          cChr2Data( aVarInfo[ 2 ] ), "< " + cType + " >",;
  147.          DbgValToStr( aVarInfo[ 3 ] ) }
  148.  
  149. //---------------------------------------------------------------------------//
  150.