home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / online / source / c / compilers / Tickle-4.0.sit.hqx / Tickle-4.0 / library / ndebug.tcl < prev    next >
Text File  |  1993-10-26  |  4KB  |  148 lines

  1. #@package: experimental_debugger trace_step bp bc tp
  2. #
  3. # ndebug.tcl
  4. #
  5.  
  6. # trace_step is the Tcl procedure called when tracing is done with
  7. # "traceproc"
  8. #
  9. # This is one possible implementation.  We can "step in" and "continue"
  10. # by playing games with the depth, as demonstrated here.
  11. #
  12. # it could do much more, like get and eval input lines, poke into
  13. # variables, and so forth.
  14. #
  15. #
  16. # future
  17. #
  18. # g, print globals
  19. # l, print local vars
  20. #
  21. # have a way to show the argv
  22. # have a way to toggle between command and argv
  23.  
  24. proc trace_step {depth command argv} {
  25.  
  26.     # fix up depth (if condition is true, we were stepping into a procedure
  27.     # and we now need to decrease the depth so we won't step into the
  28.     # next procedure unless commanded to do so
  29.     if {$depth < [tracecon depth]} {
  30.     tracecon depth $depth
  31.     }
  32.  
  33.     echo [replicate "  " [expr {$depth - [tracecon depthfloor]}]]$command
  34.  
  35.     while {1} {
  36.         puts stdout "nsca!? " nonewline
  37.     
  38.         set line [gets stdin]
  39.  
  40.         set command [string index $line 0]
  41.  
  42.         if {$command == "" || $command == "n"} {
  43.         return
  44.         }
  45.  
  46.         if {$command == "s"} {
  47.         tracecon depth [expr {[tracecon depth] + 1}]
  48.         return
  49.         }
  50.  
  51.         if {$command == "c"} {
  52.         tracecon depth [expr {[tracecon depth] - 1}]
  53.         return
  54.         }
  55.  
  56.         if {$command == "!"} {
  57.         if {[string length $line] <= 1} {
  58.             echo "Now in command loop at same level as proc being debugged."
  59.             echo "Enter Control-D to return to the debugger."
  60.             uplevel 1 {commandloop {return "debug> "} {return "debug=> "}}
  61.         } else {
  62.         uplevel 1 [string range $line 1 end]
  63.         }
  64.         continue
  65.         }
  66.  
  67.         if {$command == "a"} {
  68.         echo $argv
  69.         continue
  70.         }
  71.  
  72.  
  73.     if {$command == "?"} {
  74.         echo "a    show the command as it will execute (subordinate expressions evaluated)"
  75.         echo "c    continuous, execute remainder of proc continuously"
  76.         echo "n    next, execute next statement at this depth"
  77.         echo "s    step in, step into next procedure"
  78.         echo "!    push to an interactive command loop"
  79.         echo "!command   execute tcl command"
  80.         continue
  81.     }
  82.     echo "unrecognized command"
  83.     }
  84. }
  85.  
  86. #
  87. # exec_breakpoint
  88. #
  89. # support routine for breakpoints.  We do it by renaming the procedure
  90. # being breakpointed, then create a procedure that calls exec_breakpoint,
  91. # which calls traceproc on the breakpointed procedure.  uplevel magic
  92. # is used to get the variable context from the correct level.
  93. #
  94. proc exec_breakpoint {procedure argv} {
  95.     echo "breakpoint in $procedure"
  96.     uplevel 2 "traceproc ${procedure}_bp $argv"
  97. }
  98.  
  99. #
  100. # bp - breakpoint, turn on breakpoints for one or more named
  101. # procedures, or list procedures with breakpoints defined
  102. # if no procnames are specified
  103. #
  104. proc bp {args} {
  105.  
  106.     foreach procedure $args {
  107.         if {[info procs $procedure] == ""} {
  108.         error "$procedure: no such procedure"
  109.         }
  110.         rename $procedure ${procedure}_bp
  111.  
  112.         proc $procedure {args} "exec_breakpoint $procedure \$args"
  113.     }
  114.  
  115.     if {$args == ""} {
  116.     echo [info procs "*_bp"]
  117.     }
  118. }
  119.  
  120. #
  121. # bc - breakpoint clear, turn off breakpoints for one or more named
  122. # procedures, or all if none are specified
  123. #
  124. #
  125. proc bc {args} {
  126.     if {$args == ""} {
  127.     foreach procedure [info procs "*_bp"] {
  128.         set oldName [string range $procedure 0 [expr {[string length $procedure] - 4}]]
  129.         rename $oldName ""
  130.         rename $procedure $oldName
  131.     }
  132.     echo "all breakpoints cleared"
  133.     return
  134.     }
  135.  
  136.     foreach procedure $args {
  137.         if {[info procs ${procedure}_bp] == ""} continue
  138.         rename $procedure ""
  139.         rename ${procedure}_bp $procedure
  140.     }
  141. }
  142.  
  143. #
  144. # a convenient shorthand for traceproc
  145. #
  146. proc tp {procName} {uplevel "traceproc $procName"}
  147.