trepanning 0.1.0 → 0.1.1

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 (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