trepanning 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. data/.gitignore +4 -0
  2. data/ChangeLog +1279 -235
  3. data/Makefile +13 -0
  4. data/NEWS +30 -0
  5. data/Rakefile +50 -14
  6. data/app/.gitignore +1 -0
  7. data/app/breakpoint.rb +7 -2
  8. data/app/brkptmgr.rb +12 -0
  9. data/app/cmd_parse.citrus +167 -0
  10. data/app/cmd_parse.kpeg +221 -0
  11. data/app/cmd_parse.rb +201 -0
  12. data/app/cmd_parser.rb +1914 -0
  13. data/app/complete.rb +79 -0
  14. data/app/condition.rb +1 -1
  15. data/app/core.rb +7 -11
  16. data/app/default.rb +1 -1
  17. data/app/disassemble.rb +3 -2
  18. data/app/file.rb +12 -36
  19. data/app/frame.rb +3 -2
  20. data/app/irb.rb +9 -5
  21. data/app/iseq.rb +46 -0
  22. data/app/options.rb +6 -30
  23. data/app/run.rb +5 -2
  24. data/app/util.rb +1 -2
  25. data/app/yarv.rb +11 -1
  26. data/bin/.gitignore +1 -0
  27. data/bin/trepan +6 -6
  28. data/data/.gitignore +1 -0
  29. data/interface/.gitignore +1 -0
  30. data/interface/base_intf.rb +9 -5
  31. data/interface/comcodes.rb +10 -8
  32. data/interface/user.rb +76 -17
  33. data/io/.gitignore +1 -0
  34. data/io/input.rb +39 -15
  35. data/io/tcpclient.rb +7 -1
  36. data/io/tcpfns.rb +5 -3
  37. data/io/tcpserver.rb +13 -10
  38. data/lib/.gitignore +1 -0
  39. data/lib/trepanning.rb +50 -13
  40. data/processor/.gitignore +1 -0
  41. data/processor/Makefile +7 -0
  42. data/processor/breakpoint.rb +7 -2
  43. data/processor/command/.gitignore +1 -0
  44. data/processor/command/Makefile +7 -0
  45. data/processor/command/alias.rb +2 -2
  46. data/processor/command/backtrace.rb +4 -0
  47. data/processor/command/base/cmd.rb +45 -2
  48. data/processor/command/base/subcmd.rb +4 -2
  49. data/processor/command/base/submgr.rb +23 -19
  50. data/processor/command/base/subsubcmd.rb +23 -1
  51. data/processor/command/base/subsubmgr.rb +13 -0
  52. data/processor/command/break.rb +34 -29
  53. data/processor/command/complete.rb +37 -0
  54. data/processor/command/condition.rb +2 -0
  55. data/processor/command/continue.rb +15 -18
  56. data/processor/command/disassemble.rb +5 -0
  57. data/processor/command/down.rb +1 -1
  58. data/processor/command/eval.rb +70 -0
  59. data/processor/command/exit.rb +4 -1
  60. data/processor/command/finish.rb +6 -4
  61. data/processor/command/frame.rb +6 -3
  62. data/processor/command/help.rb +97 -54
  63. data/processor/command/help/.gitignore +1 -0
  64. data/processor/command/help/README +10 -0
  65. data/processor/command/help/command.txt +48 -0
  66. data/processor/command/help/filename.txt +40 -0
  67. data/processor/command/help/location.txt +37 -0
  68. data/processor/command/info_subcmd/.gitignore +1 -0
  69. data/processor/command/info_subcmd/breakpoints.rb +9 -9
  70. data/processor/command/info_subcmd/{file.rb → files.rb} +92 -27
  71. data/processor/command/info_subcmd/frame.rb +41 -15
  72. data/processor/command/info_subcmd/iseq.rb +39 -17
  73. data/processor/command/info_subcmd/program.rb +2 -8
  74. data/processor/command/info_subcmd/registers.rb +12 -10
  75. data/processor/command/info_subcmd/registers_subcmd/.gitignore +1 -0
  76. data/processor/command/info_subcmd/ruby.rb +60 -0
  77. data/processor/command/irb.rb +26 -3
  78. data/processor/command/kill.rb +21 -10
  79. data/processor/command/list.rb +1 -1
  80. data/processor/command/macro.rb +37 -23
  81. data/processor/command/pr.rb +1 -1
  82. data/processor/command/reload.rb +4 -0
  83. data/processor/command/reload_subcmd/.gitignore +1 -0
  84. data/processor/command/restart.rb +9 -9
  85. data/processor/command/save.rb +29 -36
  86. data/processor/command/set_subcmd/.gitignore +1 -0
  87. data/processor/command/set_subcmd/auto_subcmd/.gitignore +1 -0
  88. data/processor/command/set_subcmd/confirm.rb +23 -0
  89. data/processor/command/set_subcmd/debug_subcmd/.gitignore +1 -0
  90. data/processor/command/set_subcmd/different.rb +2 -0
  91. data/processor/command/set_subcmd/events.rb +2 -0
  92. data/processor/command/set_subcmd/max.rb +9 -12
  93. data/processor/command/set_subcmd/max_subcmd/.gitignore +1 -0
  94. data/processor/command/set_subcmd/substitute_subcmd/.gitignore +1 -0
  95. data/processor/command/set_subcmd/trace.rb +7 -13
  96. data/processor/command/set_subcmd/trace_subcmd/.gitignore +1 -0
  97. data/processor/command/set_subcmd/trace_subcmd/buffer.rb +12 -27
  98. data/processor/command/set_subcmd/trace_subcmd/print.rb +10 -8
  99. data/processor/command/set_subcmd/trace_subcmd/var.rb +6 -10
  100. data/processor/command/show.rb +12 -1
  101. data/processor/command/show_subcmd/.gitignore +1 -0
  102. data/processor/command/show_subcmd/alias.rb +11 -15
  103. data/processor/command/show_subcmd/auto_subcmd/.gitignore +1 -0
  104. data/processor/command/show_subcmd/basename.rb +1 -9
  105. data/processor/command/show_subcmd/confirm.rb +25 -0
  106. data/processor/command/show_subcmd/debug_subcmd/.gitignore +1 -0
  107. data/processor/command/show_subcmd/macro.rb +32 -14
  108. data/processor/command/show_subcmd/max_subcmd/.gitignore +1 -0
  109. data/processor/command/show_subcmd/trace_subcmd/.gitignore +1 -0
  110. data/processor/command/show_subcmd/trace_subcmd/buffer.rb +11 -31
  111. data/processor/command/show_subcmd/trace_subcmd/print.rb +4 -20
  112. data/processor/command/source.rb +7 -1
  113. data/processor/command/up.rb +7 -4
  114. data/processor/default.rb +3 -1
  115. data/processor/eval.rb +13 -0
  116. data/processor/eventbuf.rb +3 -2
  117. data/processor/frame.rb +19 -0
  118. data/processor/help.rb +20 -0
  119. data/processor/load_cmds.rb +143 -24
  120. data/processor/location.rb +61 -10
  121. data/processor/main.rb +30 -11
  122. data/processor/mock.rb +5 -3
  123. data/processor/msg.rb +17 -0
  124. data/processor/running.rb +1 -1
  125. data/processor/subcmd.rb +3 -2
  126. data/processor/validate.rb +173 -185
  127. data/sample/.gitignore +1 -0
  128. data/sample/list-terminal-colors.rb +139 -0
  129. data/sample/rocky-dot-trepanrc +14 -0
  130. data/sample/rocky-trepan-colors.rb +47 -0
  131. data/test/Makefile +7 -0
  132. data/test/data/.gitignore +1 -0
  133. data/test/data/debugger-stop.cmd +3 -0
  134. data/test/data/debugger-stop.right +5 -0
  135. data/test/data/fname-with-blank.right +0 -3
  136. data/test/data/quit.right +0 -1
  137. data/test/data/quit2.cmd +6 -0
  138. data/test/data/quit2.right +3 -0
  139. data/test/data/testing.cmd +1 -0
  140. data/test/example/.gitignore +1 -0
  141. data/test/example/debugger-stop.rb +14 -0
  142. data/test/functional/.gitignore +2 -0
  143. data/test/functional/fn_helper.rb +7 -9
  144. data/test/functional/test-break-long.rb +7 -7
  145. data/test/functional/test-break.rb +7 -7
  146. data/test/functional/test-condition.rb +4 -4
  147. data/test/functional/test-delete.rb +6 -5
  148. data/test/functional/test-eval.rb +115 -0
  149. data/test/functional/test-raise.rb +1 -1
  150. data/test/functional/test-return.rb +1 -1
  151. data/test/integration/.gitignore +2 -0
  152. data/test/integration/helper.rb +6 -3
  153. data/test/integration/test-debugger-stop.rb +22 -0
  154. data/test/integration/test-quit.rb +8 -0
  155. data/test/unit/.gitignore +1 -0
  156. data/test/unit/Makefile +7 -0
  157. data/test/unit/test-app-brkpt.rb +0 -1
  158. data/test/unit/test-app-cmd_parse.rb +107 -0
  159. data/test/unit/test-app-cmd_parser.rb +22 -0
  160. data/test/unit/test-app-complete.rb +38 -0
  161. data/test/unit/test-app-condition.rb +20 -0
  162. data/test/unit/test-app-iseq.rb +31 -0
  163. data/test/unit/test-app-options.rb +9 -1
  164. data/test/unit/test-app-util.rb +0 -1
  165. data/test/unit/test-base-cmd.rb +46 -0
  166. data/test/unit/test-base-subcmd.rb +11 -2
  167. data/test/unit/test-base-submgr.rb +23 -0
  168. data/test/unit/test-base-subsubcmd.rb +20 -0
  169. data/test/unit/test-cmd-break.rb +22 -23
  170. data/test/unit/test-cmd-help.rb +4 -0
  171. data/test/unit/test-completion.rb +43 -0
  172. data/test/unit/test-io-tcpclient.rb +3 -2
  173. data/test/unit/test-proc-load_cmds.rb +10 -1
  174. data/test/unit/test-proc-location.rb +39 -0
  175. data/test/unit/test-proc-main.rb +1 -1
  176. data/test/unit/test-proc-validate.rb +47 -31
  177. data/trepanning.gemspec +45 -0
  178. metadata +247 -179
  179. data/app/core.rb-consider +0 -198
  180. data/test/functional/tmp/b3.rb +0 -5
  181. data/test/functional/tmp/immediate-bug1.rb +0 -9
@@ -0,0 +1 @@
1
+ /*~
@@ -0,0 +1,7 @@
1
+ # Whatever it is you want to do, it should be forwarded to the
2
+ # to top-level irectories
3
+ PHONY=check
4
+ check:
5
+
6
+ %:
7
+ $(MAKE) -C .. $@
@@ -17,6 +17,10 @@ class Trepan
17
17
  @brkpt = nil
18
18
  end
19
19
 
20
+ def breakpoint_finalize
21
+ @brkpts.finalize
22
+ end
23
+
20
24
  def breakpoint?
21
25
  @brkpt = @brkpts.find(@frame.iseq, @frame.pc_offset, @frame.binding)
22
26
  @brkpts.delete_by_brkpt(@brkpt) if @brkpt && @brkpt.temp?
@@ -71,13 +75,14 @@ class Trepan
71
75
  @brkpts.add(found_iseq, offset, :temp => temp)
72
76
  end
73
77
 
74
- def breakpoint_offset(offset, iseq, temp=false)
78
+ def breakpoint_offset(offset, iseq, condition, negate, temp=false)
75
79
  # FIXME: handle breakpoint conditions.
76
80
  unless iseq.offsetlines.keys.member?(offset)
77
81
  errmsg("Offset #{offset} not found in #{iseq.name} for breakpoint.")
78
82
  return nil
79
83
  end
80
- @brkpts.add(iseq, offset, :temp => temp, :type => 'offset')
84
+ @brkpts.add(iseq, offset, :temp => temp, :condition => condition,
85
+ :negate => negate, :type => 'offset')
81
86
  end
82
87
 
83
88
  # Delete a breakpoint given its breakpoint number.
@@ -0,0 +1 @@
1
+ /*~
@@ -0,0 +1,7 @@
1
+ # Whatever it is you want to do, it should be forwarded to the
2
+ # to top-level irectories
3
+ PHONY=check all
4
+ all: check
5
+
6
+ %:
7
+ $(MAKE) -C ../.. $@
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
1
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
2
  require_relative 'base/cmd'
3
3
 
4
4
  class Trepan::Command::AliasCommand < Trepan::Command
@@ -10,7 +10,7 @@ class Trepan::Command::AliasCommand < Trepan::Command
10
10
 
11
11
  Add an alias for a COMMAND
12
12
 
13
- See also 'unalias'.
13
+ See also 'unalias' and 'show #{NAME}'.
14
14
  HELP
15
15
 
16
16
  CATEGORY = 'support'
@@ -32,6 +32,10 @@ Examples:
32
32
  require_relative '../../app/frame'
33
33
  include Trepan::Frame
34
34
 
35
+ def complete(prefix)
36
+ @proc.frame_complete(prefix, nil)
37
+ end
38
+
35
39
  # This method runs the command
36
40
  def run(args)
37
41
  unless @proc.frame
@@ -4,6 +4,7 @@
4
4
  # Note: don't end classname with Command (capital C) since main
5
5
  # will think this a command name like QuitCommand
6
6
  require 'columnize'
7
+ require_relative '../../../app/complete'
7
8
 
8
9
  class Trepan
9
10
  class Command
@@ -59,8 +60,8 @@ class Trepan
59
60
  end
60
61
 
61
62
  # Convenience short-hand for @dbgr.intf[-1].msg_nocr
62
- def msg_nocr(msg)
63
- @proc.msg_nocr(msg, opts={})
63
+ def msg_nocr(msg, opts={})
64
+ @proc.msg_nocr(msg, opts)
64
65
  end
65
66
 
66
67
  def my_const(name)
@@ -101,5 +102,47 @@ class Trepan
101
102
  end
102
103
  my_const(help_constant_sym)
103
104
  end
105
+
106
+ # Define a method called 'complete' on the singleton class.
107
+ def self.completion(ary)
108
+ self.send(:define_method,
109
+ :complete,
110
+ Proc.new {|prefix|
111
+ Trepan::Complete.complete_token(ary, prefix) })
112
+ end
113
+ end
114
+ end
115
+ if __FILE__ == $0
116
+ class Trepan
117
+ class CmdProcessor
118
+ def initialize(dbgr)
119
+ end
120
+ def confirm(message, default)
121
+ p ['confirm: ', message, default]
122
+ end
123
+ def errmsg(message, opts)
124
+ p ['err:', message, opts]
125
+ end
126
+ def msg(message, opts)
127
+ p [message, opts]
128
+ end
129
+ def msg_nocr(message, opts)
130
+ p ['nocr: ', message, opts]
131
+ end
132
+ def section(message, opts)
133
+ p ['section: ', message, opts]
134
+ end
135
+ end
136
+ class Command::Test < Trepan::Command
137
+ NAME = 'test'
138
+ CATEGORY = 'testcategory'
139
+ completion %w(a aa ab ba aac)
140
+ end
141
+ end
142
+ proc = Trepan::CmdProcessor.new(nil)
143
+ cmd = Trepan::Command::Test.new(proc)
144
+ %w(confirm errmsg msg msg_nocr section).each do |meth|
145
+ cmd.send(meth, 'test', nil)
104
146
  end
147
+ p cmd.complete('aa')
105
148
  end
@@ -159,10 +159,11 @@ class Trepan
159
159
  def summary_help(subcmd_name)
160
160
  msg_nocr("%-12s: %s" % [subcmd_name, my_const(:SHORT_HELP)])
161
161
  end
162
-
163
162
  end
164
163
 
165
164
  class SetBoolSubcommand < Subcommand
165
+ completion %w(on off)
166
+
166
167
  def run(args)
167
168
  run_set_bool(args)
168
169
  end
@@ -200,7 +201,8 @@ module Trepanning
200
201
  dirname = File.basename(File.dirname(File.expand_path(__file__)))
201
202
  name = File.basename(__file__, '.rb')
202
203
  klass.const_set('NAME', name)
203
- klass.const_set('PREFIX', %W(#{dirname[0...-'_subcmd'.size]} #{name}))
204
+ prefix = klass.const_set('PREFIX', %W(#{dirname[0...-'_subcmd'.size]} #{name}))
205
+ klass.const_set('CMD', prefix.join(' '))
204
206
  end
205
207
  end
206
208
  end
@@ -1,8 +1,9 @@
1
1
  # -*- coding: utf-8 -*-
2
- # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
2
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  require_relative 'cmd'
4
4
  require_relative '../../subcmd'
5
5
  require_relative '../../help'
6
+ require_relative '../../../app/complete'
6
7
 
7
8
  class Trepan::SubcommandMgr < Trepan::Command
8
9
 
@@ -17,7 +18,7 @@ class Trepan::SubcommandMgr < Trepan::Command
17
18
  NEED_STACK = false
18
19
  end
19
20
 
20
- attr_accessor :subcmds # Array of instaniated Trepan::Subcommand objects
21
+ attr_accessor :subcmds # Trepan::Subcmd
21
22
  attr_reader :name # Name of command
22
23
  attr_reader :last_args # Last arguments seen
23
24
 
@@ -75,13 +76,12 @@ class Trepan::SubcommandMgr < Trepan::Command
75
76
  end
76
77
  subcmd_names.each do |name|
77
78
  next unless Trepan::SubSubcommand.constants.member?(name.to_sym)
78
- subcmd_class = "Trepan::SubSubcommand::#{name}.new(self, parent)"
79
+ subcmd_class = Trepan::SubSubcommand.const_get(name)
79
80
  begin
80
- cmd = self.instance_eval(subcmd_class)
81
- rescue
82
- puts "Subcmd #{name} is bad"
81
+ cmd = subcmd_class.send(:new, self, parent)
82
+ rescue Exception => exc
83
+ puts "Subcmd #{name} in #{parent.name.inspect} is bad: #{exc}"
83
84
  end
84
- cmd_name = cmd.name
85
85
  @subcmds.add(cmd)
86
86
  end
87
87
  end
@@ -151,7 +151,18 @@ class Trepan::SubcommandMgr < Trepan::Command
151
151
  end
152
152
  end
153
153
 
154
- def run(args)
154
+ # Return an Array of subcommands that can start with +arg+. If none
155
+ # found we just return +arg+.
156
+ # FIXME: Not used any more?
157
+ def complete(prefix)
158
+ Trepan::Complete.complete_token(@subcmds.subcmds.keys, prefix)
159
+ end
160
+
161
+ def complete_token_with_next(prefix)
162
+ Trepan::Complete.complete_token_with_next(@subcmds.subcmds, prefix)
163
+ end
164
+
165
+ def run(args) # nodoc
155
166
  @last_args = args
156
167
  if args.size < 2 || args.size == 2 && args[-1] == '*'
157
168
  summary_list(obj_const(self, :NAME), @subcmds)
@@ -173,15 +184,8 @@ end
173
184
  if __FILE__ == $0
174
185
  # Demo it.
175
186
  require_relative '../../mock'
176
- dbgr = MockDebugger::MockDebugger.new
177
- cmds = dbgr.core.processor.commands
178
- cmd = cmds['set']
179
- Trepan::SubcommandMgr.new(dbgr.core.processor)
180
- puts cmd.help(%w(help set))
181
- puts '=' * 40
182
- # require_relative '../../../lib/trepanning)
183
- # Trepan.debug
184
- puts cmd.help(%w(help set *))
185
- puts '=' * 40
186
- puts cmd.help(%w(help set d.*))
187
+ dbgr, cmd = MockDebugger::setup('show')
188
+ p cmd.complete('d')
189
+ p cmd.subcmds.lookup('ar').prefix
190
+ p cmd.subcmds.lookup('a')
187
191
  end
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
- # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
2
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  # A base class for debugger subcommands of subcommands.
4
4
  #
5
5
  # Note: don't end classname with Command (capital C as in SubCommand),
@@ -62,6 +62,7 @@ class Trepan
62
62
  end
63
63
 
64
64
  class SetBoolSubSubcommand < SubSubcommand
65
+ completion %w(on off)
65
66
  def run(args)
66
67
  run_set_bool(args)
67
68
  end
@@ -85,6 +86,27 @@ class Trepan
85
86
  end
86
87
  end
87
88
 
89
+ module Trepanning
90
+ module SubSubcommand
91
+ module_function
92
+ def set_name_prefix(__file__, klass)
93
+ full_dirname = File.dirname(File.expand_path(__file__))
94
+ full_parent_dirname = File.expand_path(File.join(full_dirname, '..'))
95
+ dirname = File.basename(full_dirname)
96
+ parent_dirname = File.basename(full_parent_dirname)
97
+ name = File.basename(__file__, '.rb')
98
+ klass.const_set('NAME', name)
99
+
100
+ short_dirname = dirname[0...-'_subcmd'.size]
101
+ short_parent_dirname = parent_dirname[0...-'_subcmd'.size]
102
+ prefix = klass.const_set('PREFIX', %W(#{short_parent_dirname}
103
+ #{short_dirname} #{name}))
104
+ klass.const_set('CMD', prefix.join(' '))
105
+ end
106
+ end
107
+ end
108
+
109
+
88
110
  if __FILE__ == $0
89
111
  # Demo it.
90
112
  require_relative '../../mock'
@@ -144,6 +144,19 @@ class Trepan::SubSubcommandMgr < Trepan::Subcommand
144
144
  end
145
145
  end
146
146
 
147
+ # Return an Array of subcommands that can start with +arg+. If none
148
+ # found we just return +arg+.
149
+ def complete(prefix)
150
+ prior = self.prefix.join('').size
151
+ last_args = @subcmds.list.map{|str| str[prior..-1]}
152
+ Trepan::Complete.complete_token(last_args, prefix)
153
+ end
154
+
155
+ def complete_token_with_next(prefix)
156
+ Trepan::Complete.complete_token_with_next(@subcmds.subcmds, prefix,
157
+ self.prefix.join(''))
158
+ end
159
+
147
160
  def run(args)
148
161
  args = @parent.last_args if args.size == 0
149
162
  if args.size < 3 || args.size == 3 && args[-1] == '*'
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
1
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
2
  require_relative 'base/cmd'
3
3
  require_relative '../breakpoint'
4
4
  require_relative '../../app/breakpoint'
@@ -7,24 +7,24 @@ class Trepan::Command::BreakCommand < Trepan::Command
7
7
  unless defined?(HELP)
8
8
  NAME = File.basename(__FILE__, '.rb')
9
9
  HELP = <<-HELP
10
- #{NAME} [LINE-NUMBER|OFFSET]
11
- #{NAME} METHOD [LINE-NUMBER|OFFSET]
10
+ #{NAME}
11
+ #{NAME} LOCATION [ {if|unless} CONDITION ]
12
12
 
13
- Set a breakpoint. If a line number is given, a breakpoint is set in
14
- that line number of the current instruction sequence. If an offset is
15
- given, a number prefaced with an "O", set a breakpoint at that
16
- instruction offset.
17
-
18
- With method name, a breakpoint it set at the beginning of the method.
19
- current instruction sequence. Currently you can add a module name in
20
- front of the method name, like FileUtils.cp, but not a class name like
21
- Dir.pwd.
13
+ Set a breakpoint. In the second form where CONDITIOn is given, the
14
+ condition is evaluated in the context of the position. We stop only If
15
+ CONDITION evalutes to non-false/nil and the "if" form used, or it is
16
+ false and the "unless" form used.\
22
17
 
23
18
  Examples:
24
19
  #{NAME}
25
- #{NAME} 10 # set breakpoint on line 10
26
- #{NAME} o20 # set breakpoint VM Instruction Sequence offset 20
20
+ #{NAME} 10 # set breakpoint on line 10
21
+ #{NAME} 10 if 1 == a # like above but only if a is equal to 1
22
+ #{NAME} 10 unless 1 == a # like above but only if a is equal to 1
23
+ #{NAME} me.rb:10
24
+ #{NAME} @20 # set breakpoint VM Instruction Sequence offset 20
27
25
  #{NAME} Kernel.pp # Set a breakpoint at the beginning of Kernel.pp
26
+
27
+ See also condition, continue and "help location".
28
28
  HELP
29
29
 
30
30
  ALIASES = %w(b)
@@ -40,17 +40,12 @@ Examples:
40
40
  # usage is "break" which means break right here
41
41
  # FIXME: should handle condition
42
42
  bp = @proc.breakpoint_offset(@proc.frame.pc_offset,
43
- @proc.frame.iseq)
43
+ @proc.frame.iseq, 'true', false)
44
44
  else
45
- position, iseq, use_offset, condition, name =
46
- @proc.breakpoint_position(args[1..-1])
47
- return false unless position && iseq
48
- bp =
49
- if use_offset
50
- @proc.breakpoint_offset(position, iseq)
51
- else
52
- @proc.breakpoint_line(position, iseq)
53
- end
45
+ iseq, line_number, vm_offset, condition, negate =
46
+ @proc.breakpoint_position(@proc.cmd_argstr, true)
47
+ return false unless iseq && vm_offset
48
+ bp = @proc.breakpoint_offset(vm_offset, iseq, condition, negate)
54
49
  end
55
50
  if bp
56
51
  bp.condition = condition
@@ -78,15 +73,25 @@ end
78
73
  if __FILE__ == $0
79
74
  require_relative '../mock'
80
75
  dbgr, cmd = MockDebugger::setup
81
- cmd.run([cmd.name])
82
- cmd.run([cmd.name, __LINE__.to_s])
76
+ # require_relative '../../lib/trepanning'
77
+ def run_cmd(cmd, args)
78
+ cmd.proc.instance_variable_set('@cmd_argstr', args[1..-1].join(' '))
79
+ cmd.run(args)
80
+ end
81
+
82
+ run_cmd(cmd, [cmd.name])
83
+ run_cmd(cmd, [cmd.name, __LINE__.to_s])
83
84
  require 'thread_frame'
84
85
  tf = RubyVM::ThreadFrame.current
85
86
  pc_offset = tf.pc_offset
86
- cmd.run([cmd.name, "O#{pc_offset}"])
87
+ run_cmd(cmd, [cmd.name, "@#{pc_offset}"])
87
88
  def foo
88
89
  5
89
90
  end
90
- cmd.run([cmd.name, 'foo', (__LINE__-2).to_s])
91
- cmd.run([cmd.name, 'foo'])
91
+ run_cmd(cmd, [cmd.name, 'foo', (__LINE__-2).to_s])
92
+ run_cmd(cmd, [cmd.name, 'foo'])
93
+ run_cmd(cmd, [cmd.name, "MockDebugger::setup"])
94
+ require 'irb'
95
+ run_cmd(cmd, [cmd.name, "IRB.start"])
96
+ run_cmd(cmd, [cmd.name, 'foo93'])
92
97
  end
@@ -0,0 +1,37 @@
1
+ # Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
+ require_relative 'base/cmd'
3
+ require_relative '../load_cmds'
4
+ class Trepan::Command::CompleteCommand < Trepan::Command
5
+
6
+ unless defined?(HELP)
7
+ NAME = File.basename(__FILE__, '.rb')
8
+ HELP = <<-HELP
9
+ #{NAME} COMMAND-PREFIX
10
+
11
+ List the completions for the rest of the line as a command.
12
+ HELP
13
+ CATEGORY = 'support'
14
+ NEED_STACK = false
15
+ SHORT_HELP = 'List the completions for the rest of the line as a command'
16
+ end
17
+
18
+ # This method runs the command
19
+ def run(args) # :nodoc
20
+ last_arg = @proc.cmd_argstr.end_with?(' ') ? '' : args[-1]
21
+ @proc.complete(@proc.cmd_argstr, last_arg).each do |match|
22
+ msg match
23
+ end
24
+ end
25
+ end
26
+
27
+ if __FILE__ == $0
28
+ # Demo it.
29
+ require_relative '../mock'
30
+ dbgr, cmd = MockDebugger::setup
31
+ %w(d b bt).each do |prefix|
32
+ cmd.run [cmd.name, prefix]
33
+ puts '=' * 40
34
+ end
35
+ cmd.run %w(#{cmd.name} fdafsasfda)
36
+ puts '=' * 40
37
+ end