rb8-trepanning 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGES +34 -0
  3. data/ChangeLog +875 -0
  4. data/README.textile +59 -0
  5. data/Rakefile +215 -0
  6. data/app/.gitignore +1 -0
  7. data/app/cmd_parse.kpeg +241 -0
  8. data/app/cmd_parse.rb +212 -0
  9. data/app/cmd_parser.rb +1948 -0
  10. data/app/complete.rb +79 -0
  11. data/app/default.rb +90 -0
  12. data/app/display.rb +148 -0
  13. data/app/eventbuffer.rb +147 -0
  14. data/app/frame.rb +166 -0
  15. data/app/irb.rb +114 -0
  16. data/app/options.rb +200 -0
  17. data/app/run.rb +74 -0
  18. data/app/util.rb +65 -0
  19. data/bin/.gitignore +1 -0
  20. data/bin/trepan8 +115 -0
  21. data/data/.gitignore +1 -0
  22. data/data/irbrc +41 -0
  23. data/interface/.gitignore +1 -0
  24. data/interface/base_intf.rb +109 -0
  25. data/interface/client.rb +82 -0
  26. data/interface/comcodes.rb +20 -0
  27. data/interface/script.rb +110 -0
  28. data/interface/server.rb +147 -0
  29. data/interface/user.rb +165 -0
  30. data/io/base_io.rb +148 -0
  31. data/io/input.rb +158 -0
  32. data/io/null_output.rb +46 -0
  33. data/io/string_array.rb +156 -0
  34. data/io/tcpclient.rb +129 -0
  35. data/io/tcpfns.rb +33 -0
  36. data/io/tcpserver.rb +141 -0
  37. data/lib/debugger.rb +8 -0
  38. data/lib/trepanning.rb +283 -0
  39. data/processor/.gitignore +1 -0
  40. data/processor/command-ruby-debug/breakpoints.rb +155 -0
  41. data/processor/command-ruby-debug/catchpoint.rb +55 -0
  42. data/processor/command-ruby-debug/condition.rb +49 -0
  43. data/processor/command-ruby-debug/control.rb +31 -0
  44. data/processor/command-ruby-debug/display.rb +120 -0
  45. data/processor/command-ruby-debug/enable.rb +202 -0
  46. data/processor/command-ruby-debug/frame.rb +199 -0
  47. data/processor/command-ruby-debug/help.rb +63 -0
  48. data/processor/command-ruby-debug/info.rb +359 -0
  49. data/processor/command-ruby-debug/method.rb +84 -0
  50. data/processor/command-ruby-debug/reload.rb +40 -0
  51. data/processor/command-ruby-debug/save.rb +90 -0
  52. data/processor/command-ruby-debug/set.rb +237 -0
  53. data/processor/command-ruby-debug/show.rb +251 -0
  54. data/processor/command-ruby-debug/source.rb +36 -0
  55. data/processor/command-ruby-debug/threads.rb +189 -0
  56. data/processor/command-ruby-debug/trace.rb +57 -0
  57. data/processor/command-ruby-debug/variables.rb +199 -0
  58. data/processor/command.rb +270 -0
  59. data/processor/command/.gitignore +1 -0
  60. data/processor/command/alias.rb +54 -0
  61. data/processor/command/backtrace.rb +123 -0
  62. data/processor/command/base/cmd.rb +177 -0
  63. data/processor/command/base/subcmd.rb +230 -0
  64. data/processor/command/base/submgr.rb +188 -0
  65. data/processor/command/base/subsubcmd.rb +128 -0
  66. data/processor/command/base/subsubmgr.rb +199 -0
  67. data/processor/command/break.rb +114 -0
  68. data/processor/command/catch.rb +71 -0
  69. data/processor/command/complete.rb +39 -0
  70. data/processor/command/continue.rb +57 -0
  71. data/processor/command/directory.rb +50 -0
  72. data/processor/command/disable.rb +85 -0
  73. data/processor/command/display.rb +78 -0
  74. data/processor/command/down.rb +54 -0
  75. data/processor/command/edit.rb +79 -0
  76. data/processor/command/enable.rb +48 -0
  77. data/processor/command/eval.rb +90 -0
  78. data/processor/command/exit.rb +66 -0
  79. data/processor/command/finish.rb +59 -0
  80. data/processor/command/frame.rb +97 -0
  81. data/processor/command/help.rb +230 -0
  82. data/processor/command/help/.gitignore +1 -0
  83. data/processor/command/help/README +10 -0
  84. data/processor/command/help/command.txt +58 -0
  85. data/processor/command/help/examples.txt +16 -0
  86. data/processor/command/help/filename.txt +40 -0
  87. data/processor/command/help/location.txt +37 -0
  88. data/processor/command/help/suffixes.txt +17 -0
  89. data/processor/command/info.rb +28 -0
  90. data/processor/command/info_subcmd/.gitignore +1 -0
  91. data/processor/command/info_subcmd/args.rb +39 -0
  92. data/processor/command/info_subcmd/breakpoints.rb +80 -0
  93. data/processor/command/info_subcmd/catch.rb +36 -0
  94. data/processor/command/info_subcmd/files.rb +39 -0
  95. data/processor/command/info_subcmd/globals.rb +64 -0
  96. data/processor/command/info_subcmd/line.rb +30 -0
  97. data/processor/command/info_subcmd/locals.rb +69 -0
  98. data/processor/command/info_subcmd/macro.rb +62 -0
  99. data/processor/command/info_subcmd/program.rb +51 -0
  100. data/processor/command/info_subcmd/ruby.rb +57 -0
  101. data/processor/command/info_subcmd/source.rb +74 -0
  102. data/processor/command/info_subcmd/stack.rb +25 -0
  103. data/processor/command/info_subcmd/threads.rb +75 -0
  104. data/processor/command/kill.rb +78 -0
  105. data/processor/command/list.rb +117 -0
  106. data/processor/command/macro.rb +68 -0
  107. data/processor/command/next.rb +79 -0
  108. data/processor/command/parsetree.rb +56 -0
  109. data/processor/command/pp.rb +40 -0
  110. data/processor/command/pr.rb +37 -0
  111. data/processor/command/ps.rb +40 -0
  112. data/processor/command/restart.rb +86 -0
  113. data/processor/command/save.rb +58 -0
  114. data/processor/command/set.rb +47 -0
  115. data/processor/command/set_subcmd/.gitignore +1 -0
  116. data/processor/command/set_subcmd/abbrev.rb +25 -0
  117. data/processor/command/set_subcmd/auto.rb +27 -0
  118. data/processor/command/set_subcmd/auto_subcmd/.gitignore +1 -0
  119. data/processor/command/set_subcmd/auto_subcmd/eval.rb +53 -0
  120. data/processor/command/set_subcmd/auto_subcmd/irb.rb +33 -0
  121. data/processor/command/set_subcmd/auto_subcmd/list.rb +33 -0
  122. data/processor/command/set_subcmd/basename.rb +25 -0
  123. data/processor/command/set_subcmd/callstyle.rb +46 -0
  124. data/processor/command/set_subcmd/confirm.rb +24 -0
  125. data/processor/command/set_subcmd/debug.rb +47 -0
  126. data/processor/command/set_subcmd/different.rb +61 -0
  127. data/processor/command/set_subcmd/highlight.rb +43 -0
  128. data/processor/command/set_subcmd/max.rb +26 -0
  129. data/processor/command/set_subcmd/max_subcmd/list.rb +49 -0
  130. data/processor/command/set_subcmd/max_subcmd/stack.rb +50 -0
  131. data/processor/command/set_subcmd/max_subcmd/string.rb +76 -0
  132. data/processor/command/set_subcmd/max_subcmd/width.rb +49 -0
  133. data/processor/command/set_subcmd/reload.rb +42 -0
  134. data/processor/command/set_subcmd/timer.rb +58 -0
  135. data/processor/command/set_subcmd/trace.rb +37 -0
  136. data/processor/command/set_subcmd/trace_subcmd/buffer.rb +42 -0
  137. data/processor/command/set_subcmd/trace_subcmd/print.rb +41 -0
  138. data/processor/command/shell.rb +139 -0
  139. data/processor/command/show.rb +39 -0
  140. data/processor/command/show_subcmd/.gitignore +1 -0
  141. data/processor/command/show_subcmd/abbrev.rb +20 -0
  142. data/processor/command/show_subcmd/alias.rb +46 -0
  143. data/processor/command/show_subcmd/args.rb +34 -0
  144. data/processor/command/show_subcmd/auto.rb +28 -0
  145. data/processor/command/show_subcmd/auto_subcmd/eval.rb +27 -0
  146. data/processor/command/show_subcmd/auto_subcmd/irb.rb +23 -0
  147. data/processor/command/show_subcmd/auto_subcmd/list.rb +22 -0
  148. data/processor/command/show_subcmd/basename.rb +20 -0
  149. data/processor/command/show_subcmd/callstyle.rb +22 -0
  150. data/processor/command/show_subcmd/confirm.rb +18 -0
  151. data/processor/command/show_subcmd/debug.rb +26 -0
  152. data/processor/command/show_subcmd/debug_subcmd/dbgr.rb +21 -0
  153. data/processor/command/show_subcmd/debug_subcmd/skip.rb +22 -0
  154. data/processor/command/show_subcmd/debug_subcmd/step.rb +22 -0
  155. data/processor/command/show_subcmd/different.rb +26 -0
  156. data/processor/command/show_subcmd/directories.rb +22 -0
  157. data/processor/command/show_subcmd/highlight.rb +24 -0
  158. data/processor/command/show_subcmd/max.rb +27 -0
  159. data/processor/command/show_subcmd/max_subcmd/list.rb +38 -0
  160. data/processor/command/show_subcmd/max_subcmd/stack.rb +36 -0
  161. data/processor/command/show_subcmd/max_subcmd/string.rb +42 -0
  162. data/processor/command/show_subcmd/max_subcmd/width.rb +37 -0
  163. data/processor/command/show_subcmd/reload.rb +18 -0
  164. data/processor/command/show_subcmd/timer.rb +18 -0
  165. data/processor/command/show_subcmd/trace.rb +29 -0
  166. data/processor/command/show_subcmd/trace_subcmd/buffer.rb +65 -0
  167. data/processor/command/show_subcmd/trace_subcmd/print.rb +23 -0
  168. data/processor/command/show_subcmd/version.rb +23 -0
  169. data/processor/command/source.rb +134 -0
  170. data/processor/command/step.rb +81 -0
  171. data/processor/command/tbreak.rb +19 -0
  172. data/processor/command/unalias.rb +44 -0
  173. data/processor/command/undisplay.rb +59 -0
  174. data/processor/command/up.rb +72 -0
  175. data/processor/default.rb +56 -0
  176. data/processor/display.rb +17 -0
  177. data/processor/eval.rb +113 -0
  178. data/processor/eventbuf.rb +105 -0
  179. data/processor/frame.rb +172 -0
  180. data/processor/help.rb +92 -0
  181. data/processor/helper.rb +76 -0
  182. data/processor/hook.rb +134 -0
  183. data/processor/load_cmds.rb +258 -0
  184. data/processor/location.rb +174 -0
  185. data/processor/main.rb +455 -0
  186. data/processor/mock.rb +136 -0
  187. data/processor/msg.rb +61 -0
  188. data/processor/processor.rb +674 -0
  189. data/processor/running.rb +168 -0
  190. data/processor/stepping.rb +18 -0
  191. data/processor/subcmd.rb +161 -0
  192. data/processor/validate.rb +355 -0
  193. data/processor/virtual.rb +34 -0
  194. data/test/data/.gitignore +1 -0
  195. data/test/data/break_bad.cmd +19 -0
  196. data/test/data/break_bad.right +29 -0
  197. data/test/data/break_loop_bug.cmd +5 -0
  198. data/test/data/break_loop_bug.right +15 -0
  199. data/test/data/dollar-0.right +2 -0
  200. data/test/data/dollar-0a.right +2 -0
  201. data/test/data/dollar-0b.right +2 -0
  202. data/test/data/edit.cmd +14 -0
  203. data/test/data/edit.right +24 -0
  204. data/test/data/file-with-space.cmd +6 -0
  205. data/test/data/file-with-space.right +4 -0
  206. data/test/data/printvar.cmd +17 -0
  207. data/test/data/printvar.right +31 -0
  208. data/test/data/raise.cmd +11 -0
  209. data/test/data/raise.right +19 -0
  210. data/test/data/source.cmd +5 -0
  211. data/test/data/source.right +18 -0
  212. data/test/data/stepping-1.9.right +50 -0
  213. data/test/data/stepping.cmd +21 -0
  214. data/test/data/stepping.right +48 -0
  215. data/test/data/trepan8-save.1 +6 -0
  216. data/test/example/bp_loop_issue.rb +3 -0
  217. data/test/example/break-bug.rb +7 -0
  218. data/test/example/brkpt-class-bug.rb +8 -0
  219. data/test/example/classes.rb +11 -0
  220. data/test/example/dollar-0.rb +5 -0
  221. data/test/example/except-bug1.rb +4 -0
  222. data/test/example/except-bug2.rb +7 -0
  223. data/test/example/file with space.rb +1 -0
  224. data/test/example/gcd.rb +18 -0
  225. data/test/example/info-var-bug.rb +47 -0
  226. data/test/example/info-var-bug2.rb +2 -0
  227. data/test/example/null.rb +1 -0
  228. data/test/example/pm-bug.rb +3 -0
  229. data/test/example/pm.rb +11 -0
  230. data/test/example/raise.rb +3 -0
  231. data/test/integration/.gitignore +4 -0
  232. data/test/integration/config.yaml +8 -0
  233. data/test/integration/helper.rb +154 -0
  234. data/test/integration/test-break_bad.rb +26 -0
  235. data/test/integration/test-dollar-0.rb +31 -0
  236. data/test/integration/test-edit.rb +17 -0
  237. data/test/integration/test-file-with-space.rb +26 -0
  238. data/test/integration/test-printvar.rb +17 -0
  239. data/test/integration/test-raise.rb +21 -0
  240. data/test/integration/test-source.rb +16 -0
  241. data/test/integration/test-stepping.rb +24 -0
  242. data/test/unit/.gitignore +1 -0
  243. data/test/unit/cmd-helper.rb +52 -0
  244. data/test/unit/mock-helper.rb +12 -0
  245. data/test/unit/test-app-cmd_parse.rb +97 -0
  246. data/test/unit/test-app-cmd_parser.rb +23 -0
  247. data/test/unit/test-app-complete.rb +39 -0
  248. data/test/unit/test-app-frame.rb +32 -0
  249. data/test/unit/test-app-options.rb +92 -0
  250. data/test/unit/test-app-run.rb +14 -0
  251. data/test/unit/test-app-util.rb +44 -0
  252. data/test/unit/test-base-cmd.rb +45 -0
  253. data/test/unit/test-base-subcmd.rb +57 -0
  254. data/test/unit/test-base-submgr.rb +23 -0
  255. data/test/unit/test-base-subsubcmd.rb +17 -0
  256. data/test/unit/test-cmd-alias.rb +48 -0
  257. data/test/unit/test-cmd-exit.rb +27 -0
  258. data/test/unit/test-cmd-help.rb +104 -0
  259. data/test/unit/test-cmd-kill.rb +46 -0
  260. data/test/unit/test-cmd-source.rb +34 -0
  261. data/test/unit/test-completion.rb +42 -0
  262. data/test/unit/test-intf-user.rb +46 -0
  263. data/test/unit/test-io-input.rb +27 -0
  264. data/test/unit/test-io-tcp.rb +33 -0
  265. data/test/unit/test-io-tcpclient.rb +54 -0
  266. data/test/unit/test-io-tcpfns.rb +17 -0
  267. data/test/unit/test-io-tcpserver.rb +50 -0
  268. data/test/unit/test-proc-eval.rb +36 -0
  269. data/test/unit/test-proc-hook.rb +30 -0
  270. data/test/unit/test-proc-load_cmds.rb +50 -0
  271. data/test/unit/test-proc-location.rb +79 -0
  272. data/test/unit/test-subcmd-help.rb +44 -0
  273. data/trepan8.gemspec +52 -0
  274. metadata +391 -0
@@ -0,0 +1,56 @@
1
+ require 'rubygems'; require 'require_relative'
2
+ require_relative '../app/default' # for Trepan::HOME_DIR etc.
3
+ require_relative 'virtual'
4
+ class Trepan::CmdProcessor < Trepan::VirtualCmdProcessor
5
+
6
+ DEFAULT_SETTINGS = {
7
+ :abbrev => true, # Allow abbreviations of debugger commands?
8
+ :autoeval => true, # Ruby eval non-debugger commands
9
+ :autoirb => false, # Go into IRB in debugger command loop
10
+ :autolist => false, # Run 'list'
11
+
12
+ :basename => false, # Show basename of filenames only
13
+ :callstyle => :last, #
14
+ :confirm => true, # Confirm potentially dangerous operations?
15
+ :different => 'nostack', # stop *only* when different position?
16
+
17
+ :debugdbgr => false, # Debugging the debugger
18
+ :debugexcept => true, # Internal debugging of command exceptions
19
+ :debugmacro => false, # debugging macros
20
+ :debugskip => false, # Internal debugging of step/next skipping
21
+ :directory => # last-resort path-search for files
22
+ '$cdir:$cwd', # that are not fully qualified.
23
+
24
+ :hidestack => nil, # Fixnum. How many hidden outer
25
+ # debugger stack frames to hide?
26
+ # nil or -1 means compute value. 0
27
+ # means hide none. Less than 0 means show
28
+ # all stack entries.
29
+ :hightlight => false, # Use terminal highlight?
30
+
31
+ :maxlist => 10, # Number of source lines to list
32
+ :maxstack => 10, # backtrace limit
33
+ :maxstring => 150, # Strings which are larger than this
34
+ # will be truncated to this length when
35
+ # printed
36
+ :maxwidth => (ENV['COLUMNS'] || '80').to_i,
37
+ :prompt => 'trepan8', # core part of prompt. Additional info like
38
+ # debug nesting and thread name is fixed
39
+ # and added on.
40
+ :reload => false, # Reread source file if we determine
41
+ # it has changed?
42
+ :save_cmdfile => nil, # If set, debugger command file to be
43
+ # used on restart
44
+ :timer => false, # show elapsed time between events
45
+ :traceprint => false, # event tracing printing
46
+ :tracebuffer => false, # save events to a trace buffer.
47
+ :user_cmd_dir => File.join(Trepan::HOME_DIR, 'trepan8', 'command'),
48
+ # User command directory
49
+ } unless defined? DEFAULT_SETTINGS
50
+ end
51
+
52
+ if __FILE__ == $0
53
+ # Show it:
54
+ require 'pp'
55
+ PP.pp(Trepan::CmdProcessor::DEFAULT_SETTINGS)
56
+ end
@@ -0,0 +1,17 @@
1
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
+ require 'rubygems'; require 'require_relative'
3
+ require_relative '../app/display'
4
+ require_relative 'virtual'
5
+ class Trepan::CmdProcessor < Trepan::VirtualCmdProcessor
6
+ attr_reader :displays
7
+
8
+ def display_initialize
9
+ @displays = DisplayMgr.new
10
+ end
11
+
12
+ def run_eval_display(args={})
13
+ for line in @displays.display(@frame) do
14
+ msg(line)
15
+ end
16
+ end
17
+ end
data/processor/eval.rb ADDED
@@ -0,0 +1,113 @@
1
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
+ require 'rubygems'
3
+ require 'require_relative'
4
+ require_relative 'virtual'
5
+ class Trepan::CmdProcessor < Trepan::VirtualCmdProcessor
6
+
7
+ def debug_eval(str, max_fake_filename=15)
8
+ begin
9
+ debug_eval_with_exception(str, max_fake_filename)
10
+ rescue SyntaxError, StandardError, ScriptError => e
11
+ exception_dump(e, @settings[:stack_trace_on_error], $!.backtrace)
12
+ nil
13
+ end
14
+ end
15
+
16
+ def debug_eval_with_exception(str, max_fake_filename=15)
17
+ filename, b = get_binding_and_filename(str, max_fake_filename)
18
+ eval(str, b, filename)
19
+ end
20
+
21
+ def debug_eval_no_errmsg(str, max_fake_filename=15)
22
+ begin
23
+ debug_eval_with_exception(str, max_fake_filename)
24
+ rescue SyntaxError, StandardError, ScriptError => e
25
+ nil
26
+ end
27
+ end
28
+
29
+ def eval_code(str, max_fake_filename=nil)
30
+ obj = debug_eval(str, max_fake_filename)
31
+
32
+ # idx = @user_variables
33
+ # @user_variables += 1
34
+
35
+ # str = "$d#{idx}"
36
+ # Rubinius::Globals[str.to_sym] = obj
37
+ # msg "#{str} = #{obj.inspect}"
38
+ msg "#{obj.inspect}"
39
+ obj
40
+ end
41
+
42
+ def exception_dump(e, stack_trace, backtrace)
43
+ str = "#{e.class} Exception:\n\t#{e.message}"
44
+ if stack_trace
45
+ str += "\n" + backtrace.map{|l| "\t#{l}"}.join("\n") rescue nil
46
+ end
47
+ msg str
48
+ # throw :debug_error
49
+ end
50
+
51
+ def fake_eval_filename(str, maxlen = 15)
52
+ fake_filename =
53
+ if maxlen < str.size
54
+ # FIXME: Guard against \" in positions 13..15?
55
+ str.inspect[0..maxlen-1] + '"...'
56
+ else
57
+ str.inspect
58
+ end
59
+ "(eval #{fake_filename})"
60
+ end
61
+
62
+ def get_binding_and_filename(str, maxlen)
63
+ b =
64
+ begin
65
+ @frame.binding
66
+ rescue
67
+ TOPLEVEL_BINDING
68
+ end
69
+ filename = fake_eval_filename(str, maxlen)
70
+ return [filename, b]
71
+ end
72
+
73
+ end
74
+
75
+ if __FILE__ == $0
76
+ # Demo it.
77
+ cmdp = Trepan::CmdProcessor.new([])
78
+ puts cmdp.fake_eval_filename('x = 1; y = 2')
79
+ puts cmdp.fake_eval_filename('x = 1; y = 2', 7)
80
+
81
+ def cmdp.errmsg(msg)
82
+ puts "** #{msg}"
83
+ end
84
+ def cmdp.msg(msg)
85
+ puts "** #{msg}"
86
+ end
87
+ begin
88
+ 1/0
89
+ rescue Exception => exc
90
+ cmdp.exception_dump(exc, true, $!.backtrace)
91
+ puts '=' * 40
92
+ end
93
+
94
+ x = 10
95
+
96
+ require 'rubygems'; require 'require_relative'
97
+ puts "To be continued..."
98
+ exit
99
+ require_relative '../app/frame'
100
+ frame = Trepan::Frame.new(context)
101
+ cmdp.instance_variable_set('@frame', frame)
102
+ cmdp.instance_variable_set('@settings', {:stack_trace_on_error => true})
103
+ def cmdp.errmsg(mess) ; puts mess end
104
+ # require_relative '../lib/trepanning'
105
+ # Trepan.start
106
+ puts cmdp.debug_eval('x = "#{x}"')
107
+ puts '=' * 40
108
+ puts cmdp.debug_eval('x+')
109
+ puts cmdp.debug_eval_no_errmsg('y+')
110
+ puts '=' * 40
111
+ puts cmdp.debug_eval('x+')
112
+ puts cmdp.debug_eval('y = 1; x+', 4)
113
+ end
@@ -0,0 +1,105 @@
1
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
+ # For recording hook events in a buffer for review later. Make use of
3
+ # Trace::Buffer for this prupose.
4
+
5
+ require 'rubygems'; require 'require_relative'
6
+ begin
7
+ require 'linecache'
8
+ rescue LoadError
9
+ require 'linecache19'
10
+ end
11
+ require_relative '../app/eventbuffer'
12
+ require_relative 'virtual'
13
+
14
+ class Trepan::CmdProcessor < Trepan::VirtualCmdProcessor
15
+
16
+ attr_reader :eventbuf
17
+ attr_reader :event_tracefilter
18
+
19
+ def eventbuf_initialize(size=100)
20
+ @eventbuf = Trace::EventBuffer.new(size)
21
+ # @event_tracefilter = Trace::Filter.new
22
+ end
23
+
24
+ # def event_processor(event, frame, arg=nil)
25
+ # @eventbuf.append(event, frame, arg)
26
+ # end
27
+
28
+ # Print event buffer entries from FROM up to TO try to stay within
29
+ # WIDTH. We show source lines only the first time they are
30
+ # encountered. Also we use separators to indicate points that the
31
+ # debugger has stopped at.
32
+ def eventbuf_print(from=nil, to=nil, width=80)
33
+ sep = '-' * ((width - 7) / 2)
34
+ last_container, last_location = nil, nil
35
+ if from == nil || !@eventbuf.marks[-1]
36
+ mark_index = 0
37
+ else
38
+ mark_index = @eventbuf.marks.size-1
39
+ translated_from = @eventbuf.zero_pos + from
40
+ @eventbuf.marks.each_with_index do
41
+ |m, i|
42
+ if m > translated_from
43
+ mark_index = [0, i-1].max
44
+ break
45
+ elsif m == translated_from
46
+ mark_index = i
47
+ break
48
+ end
49
+ end
50
+ end
51
+
52
+ nextmark = @eventbuf.marks[mark_index]
53
+ @eventbuf.each_with_index(from, to) do |e, i|
54
+ if nextmark
55
+ if nextmark == i
56
+ msg "#{sep} %5d #{sep}" % (mark_index - @eventbuf.marks.size)
57
+ mark_index += 1 if mark_index < @eventbuf.marks.size - 1
58
+ nextmark = @eventbuf.marks[mark_index]
59
+ elsif nextmark < i
60
+ mark_index += 1 if mark_index < @eventbuf.marks.size - 1
61
+ nextmark = @eventbuf.marks[mark_index]
62
+ end
63
+ end
64
+ last_container, last_location, mess =
65
+ format_eventbuf_entry(e, last_container, last_location) if e
66
+ msg mess
67
+ end
68
+ end
69
+
70
+ # Show event buffer entry. If the location is the same as the previous
71
+ # location we don't show the duplicated location information.
72
+ def format_eventbuf_entry(item, last_container, last_location)
73
+ mess = format_location(item.event, item.frame, 0)
74
+ return nil, nil, mess
75
+ end
76
+
77
+ # FIXME: multiple hook mechanism needs work.
78
+ # def start_capture
79
+ # @event_tracefilter.add_trace_func(method(:event_processor).to_proc,
80
+ # Trace::DEFAULT_EVENT_MASK)
81
+ # end
82
+
83
+ # def stop_capture
84
+ # @event_tracefilter.set_trace_func(nil)
85
+ # end
86
+
87
+ end
88
+
89
+ if __FILE__ == $0
90
+ # Demo it.
91
+ cmdproc = Trepan::CmdProcessor.new([])
92
+ cmdproc.eventbuf_initialize(5)
93
+
94
+ def cmdproc.msg(mess)
95
+ puts mess
96
+ end
97
+ # cmdproc.start_capture
98
+ # z=5
99
+ # z.times do |i|
100
+ # x = i
101
+ # y = x+2
102
+ # end
103
+ # cmdproc.stop_capture
104
+ cmdproc.eventbuf_print
105
+ end
@@ -0,0 +1,172 @@
1
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
+ require 'rubygems'; require 'require_relative'
3
+ require_relative '../app/complete'
4
+ require_relative '../app/frame'
5
+ require_relative '../app/util'
6
+ require_relative 'virtual'
7
+ class Trepan::CmdProcessor < Trepan::VirtualCmdProcessor
8
+
9
+ include Trepan::Util
10
+ attr_reader :current_thread
11
+
12
+ # ThreadFrame, current frame
13
+ attr_accessor :frame
14
+
15
+ # frame index in a "backtrace" command
16
+ attr_accessor :frame_index
17
+ attr_reader :hide_level
18
+
19
+ # Hash[thread_id] -> FixNum, the level of the last frame to
20
+ # show. If we called the debugger directly, then there is
21
+ # generally a portion of a backtrace we don't want to show. We
22
+ # don't need to store this for all threads, just those we want to
23
+ # hide frame on. A value of 1 means to hide just the oldest
24
+ # level. The default or showing all levels is 0.
25
+ attr_accessor :hidelevels
26
+
27
+ # Hash[container] -> file container. This gives us a way to map non-file
28
+ # container objects to a file container for display.
29
+ attr_accessor :remap_container
30
+
31
+ attr_accessor :stack_size
32
+
33
+ # top frame of current thread.
34
+ attr_accessor :top_frame
35
+ # attr_reader :threads2frames # Hash[thread_id] -> top_frame
36
+
37
+
38
+ def adjust_frame(frame_num, absolute_pos)
39
+ frame, frame_num = get_frame(frame_num, absolute_pos)
40
+ if frame
41
+ @frame = frame
42
+ @frame.index = frame_num
43
+ prefix = "--> ##{frame_num} "
44
+ unless @settings[:traceprint]
45
+ msg("#{prefix}%s" %
46
+ @frame.describe(:basename => settings[:basename],
47
+ :maxwidth => settings[:maxwidth] - prefix.size,
48
+ :callstyle => settings[:callstyle]))
49
+ end
50
+ @line_no = @frame.line
51
+ @frame
52
+ else
53
+ nil
54
+ end
55
+ end
56
+
57
+ def frame_low_high(direction)
58
+ if direction
59
+ low, high = [ @frame.index * -direction,
60
+ (@stack_size - 1 - @frame.index) * direction ]
61
+ low, high = [high, low] if direction < 0
62
+ [low, high]
63
+ else
64
+ [-@stack_size, @stack_size-1]
65
+ end
66
+ end
67
+
68
+ def frame_complete(prefix, direction)
69
+ low, high = frame_low_high(direction)
70
+ ary = (low..high).map{|i| i.to_s}
71
+ Trepan::Complete.complete_token(ary, prefix)
72
+ end
73
+
74
+ # Initializes the thread and frame variables: @frame, @top_frame,
75
+ # @frame_index, @current_thread, and @threads2frames
76
+ def frame_setup(context, state)
77
+ @frame = @top_frame = Trepan::Frame.new(context)
78
+ @frame.index = 0
79
+ @current_thread = @frame.thread
80
+ @context = context
81
+ @state = state
82
+ @line_no = @frame.line
83
+
84
+ @threads2frames ||= {}
85
+ @threads2frames[@current_thread] = @top_frame
86
+ @stack_size = @frame.stack_size
87
+ ## FIXME: reinstate
88
+ ## set_hide_level
89
+ end
90
+
91
+ # Remove access to thread and frame variables
92
+ def frame_teardown
93
+ @top_frame = @frame = @current_thread = nil
94
+ @threads2frames = {}
95
+ end
96
+
97
+ def frame_initialize
98
+ @remap_container = {}
99
+ @remap_iseq = {}
100
+ @hidelevels = Hash.new(nil)
101
+ @hide_level = 0
102
+ end
103
+
104
+ def get_frame(frame_num, absolute_pos)
105
+ if absolute_pos
106
+ frame_num += @frame.stack_size if frame_num < 0
107
+ else
108
+ frame_num += @frame.index
109
+ end
110
+
111
+ if frame_num < 0
112
+ errmsg('Adjusting would put us beyond the newest frame.')
113
+ return [nil, nil]
114
+ elsif frame_num >= @stack_size
115
+ errmsg('Adjusting would put us beyond the oldest frame.')
116
+ return [nil, nil]
117
+ end
118
+
119
+ @frame.index = frame_num
120
+ [@frame, frame_num]
121
+ end
122
+
123
+ def parent_frame
124
+ unless @frame.index + 1 < @frame.stack_size
125
+ errmsg "Unable to find parent frame at level #{@frame.index+1}"
126
+ return nil
127
+ end
128
+ @frame.index += 1
129
+ @frame
130
+ end
131
+
132
+ def set_hide_level
133
+ max_stack_size = @frame.stack_size
134
+ @hide_level =
135
+ if !@settings[:hidelevel] || @settings[:hidelevel] < 0
136
+ @settings[:hidelevel] = @hidelevels[@current_thread] =
137
+ find_main_script(@frame) || max_stack_size
138
+ else
139
+ @settings[:hidelevel]
140
+ end
141
+ @stack_size = if @hide_level >= max_stack_size
142
+ max_stack_size else max_stack_size - @hide_level
143
+ end
144
+ end
145
+ end
146
+
147
+ if __FILE__ == $0
148
+ # Demo it.
149
+ class Trepan::CmdProcessor
150
+ def print_location
151
+ puts "frame location: #{frame.file} #{frame.line}"
152
+ end
153
+ end
154
+
155
+ require_relative './mock'
156
+ puts "To be continued..."
157
+ exit
158
+ dbgr, cmd = MockDebugger::setup('exit', false)
159
+ # require_relative '../lib/trepanning'
160
+ # Trepan.start(:set_restart => true)
161
+ proc = cmd.proc
162
+ 0.upto(proc.stack_size-1) { |i| proc.adjust_frame(i, true) }
163
+ puts '*' * 10
164
+ proc.adjust_frame(-1, true)
165
+ proc.adjust_frame(0, true)
166
+ puts '*' * 10
167
+ proc.stack_size.times { proc.adjust_frame(1, false) }
168
+ puts '*' * 10
169
+ proc.adjust_frame(proc.stack_size-1, true)
170
+ proc.stack_size.times { proc.adjust_frame(-1, false) }
171
+
172
+ end