trepanning 0.0.6 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/ChangeLog +214 -0
  2. data/NEWS +12 -0
  3. data/README.textile +1 -7
  4. data/Rakefile +13 -0
  5. data/app/default.rb +5 -4
  6. data/app/disassemble.rb +25 -3
  7. data/app/run.rb +0 -18
  8. data/bin/trepan +4 -6
  9. data/data/irbrc +3 -17
  10. data/io/base_io.rb +3 -1
  11. data/io/null_output.rb +41 -0
  12. data/lib/trepanning.rb +10 -13
  13. data/processor/command/backtrace.rb +7 -6
  14. data/processor/command/base/subcmd.rb +4 -0
  15. data/processor/command/base/submgr.rb +1 -1
  16. data/processor/command/base/subsubmgr.rb +1 -1
  17. data/processor/command/break.rb +12 -4
  18. data/processor/command/continue.rb +2 -2
  19. data/processor/command/delete.rb +1 -1
  20. data/processor/command/disable.rb +1 -1
  21. data/processor/command/disassemble.rb +1 -1
  22. data/processor/command/finish.rb +3 -3
  23. data/processor/command/info_subcmd/iseq.rb +9 -0
  24. data/processor/command/info_subcmd/registers_subcmd/dfp.rb +7 -16
  25. data/processor/command/info_subcmd/registers_subcmd/lfp.rb +5 -17
  26. data/processor/command/info_subcmd/registers_subcmd/pc.rb +6 -19
  27. data/processor/command/info_subcmd/registers_subcmd/sp.rb +14 -24
  28. data/processor/command/list.rb +34 -19
  29. data/processor/command/reload.rb +1 -1
  30. data/processor/command/restart.rb +8 -9
  31. data/processor/command/set_subcmd/auto.rb +1 -2
  32. data/processor/command/set_subcmd/auto_subcmd/eval.rb +6 -19
  33. data/processor/command/set_subcmd/auto_subcmd/irb.rb +7 -23
  34. data/processor/command/set_subcmd/auto_subcmd/list.rb +5 -22
  35. data/processor/command/set_subcmd/basename.rb +6 -20
  36. data/processor/command/set_subcmd/debug.rb +1 -1
  37. data/processor/command/set_subcmd/debug_subcmd/dbgr.rb +9 -22
  38. data/processor/command/set_subcmd/debug_subcmd/except.rb +8 -20
  39. data/processor/command/set_subcmd/debug_subcmd/macro.rb +7 -19
  40. data/processor/command/set_subcmd/debug_subcmd/skip.rb +5 -18
  41. data/processor/command/set_subcmd/debug_subcmd/stack.rb +5 -18
  42. data/processor/command/set_subcmd/hidelevel.rb +60 -0
  43. data/processor/command/set_subcmd/max.rb +1 -1
  44. data/processor/command/set_subcmd/max_subcmd/list.rb +12 -23
  45. data/processor/command/set_subcmd/max_subcmd/stack.rb +8 -31
  46. data/processor/command/set_subcmd/substitute.rb +1 -1
  47. data/processor/command/set_subcmd/substitute_subcmd/eval.rb +1 -1
  48. data/processor/command/set_subcmd/substitute_subcmd/path.rb +1 -1
  49. data/processor/command/set_subcmd/substitute_subcmd/string.rb +6 -18
  50. data/processor/command/set_subcmd/timer.rb +1 -1
  51. data/processor/command/set_subcmd/trace.rb +1 -1
  52. data/processor/command/set_subcmd/trace_subcmd/buffer.rb +1 -1
  53. data/processor/command/set_subcmd/trace_subcmd/print.rb +5 -21
  54. data/processor/command/set_subcmd/trace_subcmd/var.rb +1 -1
  55. data/processor/command/show_subcmd/args.rb +9 -27
  56. data/processor/command/show_subcmd/auto_subcmd/eval.rb +3 -15
  57. data/processor/command/show_subcmd/auto_subcmd/irb.rb +3 -15
  58. data/processor/command/show_subcmd/auto_subcmd/list.rb +3 -18
  59. data/processor/command/show_subcmd/basename.rb +3 -1
  60. data/processor/command/show_subcmd/hidelevel.rb +41 -0
  61. data/processor/command/show_subcmd/max.rb +1 -1
  62. data/processor/command/show_subcmd/trace_subcmd/buffer.rb +1 -1
  63. data/processor/command/show_subcmd/trace_subcmd/print.rb +1 -1
  64. data/processor/command/source.rb +6 -5
  65. data/processor/command/undisplay.rb +0 -1
  66. data/processor/default.rb +6 -2
  67. data/processor/frame.rb +2 -21
  68. data/processor/location.rb +44 -18
  69. data/processor/main.rb +0 -11
  70. data/processor/mock.rb +25 -0
  71. data/processor/validate.rb +34 -18
  72. data/test/functional/fn_helper.rb +14 -4
  73. data/test/functional/test-break.rb +35 -73
  74. data/test/functional/test-condition.rb +9 -10
  75. data/test/functional/test-delete.rb +5 -3
  76. data/test/unit/test-app-disassemble.rb +15 -3
  77. data/test/unit/test-app-run.rb +0 -4
  78. data/test/unit/test-cmd-break.rb +3 -0
  79. metadata +15 -11
data/io/null_output.rb ADDED
@@ -0,0 +1,41 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
3
+
4
+ # Nukes output. Used for example in sourcing where you don't want
5
+ # to see output.
6
+ #
7
+
8
+ require_relative 'base_io'
9
+
10
+ class Trepan
11
+ class OutputNull < Trepan::OutputBase
12
+ def initialize(out, opts={})
13
+ super
14
+ end
15
+
16
+ def close
17
+ end
18
+
19
+ def flush
20
+ end
21
+
22
+ # Use this to set where to write to. output can be a
23
+ # file object or a string. This code raises IOError on error.
24
+ def write(*args)
25
+ end
26
+
27
+ # used to write to a debugger that is connected to this
28
+ # `str' written will have a newline added to it
29
+ #
30
+ def writeline( msg)
31
+ end
32
+ end
33
+ end
34
+
35
+ # Demo it
36
+ if __FILE__ == $0
37
+ output = Trepan::OutputNull.new(nil)
38
+ p output
39
+ output.write("Invisible")
40
+ output.writeline("Invisible")
41
+ end
data/lib/trepanning.rb CHANGED
@@ -20,7 +20,7 @@ ISEQS__ = {} unless
20
20
  defined?(ISEQS__) && ISEQS__.is_a?(Hash)
21
21
 
22
22
  class Trepan
23
- VERSION = '0.0.6'
23
+ VERSION = '0.0.8'
24
24
 
25
25
  attr_accessor :core # access to Trepan::Core instance
26
26
  attr_accessor :intf # Array. The way the outside world
@@ -91,8 +91,6 @@ class Trepan
91
91
  # needs to be done first:
92
92
  # require 'trepanning'
93
93
  # mydbg = Trepan.new()
94
- # or if you haven't mucked around with $0 and ARGV, you might try:
95
- # mydbg = Trepan.new(:set_restart=>true))
96
94
  # which will tell the debugger how to "restart" the program.
97
95
  #
98
96
  # If you want a synchronous stop in your program call to the
@@ -136,8 +134,7 @@ class Trepan
136
134
  th = Thread.current
137
135
  if block
138
136
  start
139
- # I don't think yield or block.call is quite right.
140
- ret = yield # Not: block.call(self) ?
137
+ ret = block.call
141
138
  stop
142
139
  return ret
143
140
  elsif opts[:immediate]
@@ -154,7 +151,7 @@ class Trepan
154
151
  Trace.event_masks[0] |= @core.step_events
155
152
 
156
153
  # Set to stop on the next event after this returns.
157
- @core.step_count = 0
154
+ @core.step_count = opts[:step_count] || 0
158
155
  end
159
156
  end
160
157
 
@@ -217,7 +214,7 @@ class Trepan
217
214
  # Likewise for mydbg.debugger{ ... }
218
215
 
219
216
  def self.debug(opts={}, &block)
220
- opts = {:hide_stack => true}.merge(opts)
217
+ opts = {:hide_stack => false}.merge(opts)
221
218
  unless defined?($trepanning) && $trepanning.is_a?(Trepan)
222
219
  $trepanning = Trepan.new(opts)
223
220
  $trepanning.trace_filter << self.method(:debug)
@@ -237,13 +234,13 @@ end
237
234
  module Kernel
238
235
  # Same as Trepan.debug.
239
236
  # FIXME figure out a way to remove duplication.
240
- def trepan(opts={}, &block)
241
- opts = {:hide_stack => true}.merge(opts)
237
+ def debugger(opts={}, &block)
238
+ opts = {:hide_stack => false}.merge(opts)
242
239
  unless defined?($trepanning) && $trepanning.is_a?(Trepan)
243
- $trepanning = Trepan.new
244
- $trepanning.trace_filter << self.method(:trepan)
240
+ $trepanning = Trepan.new(opts)
241
+ $trepanning.trace_filter << self.method(:debugger)
245
242
  end
246
- $trepanning.debugger(opts, &block)
243
+ $trepanning.debugger(opts)
247
244
  end
248
245
  end
249
246
 
@@ -254,7 +251,7 @@ if __FILE__ == $0
254
251
  puts 'block debugging...'
255
252
  # It is imagined that there are all sorts of command-line options here.
256
253
  # (I have a good imagination.)
257
- Trepan.debug(:set_restart=>true) {
254
+ Trepan.debug {
258
255
  a = 2
259
256
  b = square(a)
260
257
  p "square of #{a} is #{b}"
@@ -39,17 +39,18 @@ Examples:
39
39
  return false
40
40
  end
41
41
  hide_level =
42
- if !settings[:debugstack] && @proc.hidelevels[Thread.current]
42
+ if (!settings[:hidelevel] || settings[:hidelevel] < 0) &&
43
+ @proc.hidelevels[Thread.current]
43
44
  @proc.hidelevels[Thread.current]
44
- else 0
45
+ else settings[:hidelevel]
45
46
  end
46
47
  stack_size = @proc.top_frame.stack_size - hide_level
47
48
  opts = {
48
- :basename => @proc.settings[:basename],
49
+ :basename => settings[:basename],
49
50
  :current_pos => @proc.frame_index,
50
- :maxstack => @proc.settings[:maxstack],
51
- :maxwidth => @proc.settings[:maxwidth],
52
- :show_pc => @proc.settings[:show_pc]
51
+ :maxstack => settings[:maxstack],
52
+ :maxwidth => settings[:maxwidth],
53
+ :show_pc => settings[:show_pc]
53
54
  }
54
55
  opts[:count] =
55
56
  if args.size > 1
@@ -60,6 +60,10 @@ class Trepan
60
60
  return(@proc.confirm(msg, default))
61
61
  end
62
62
 
63
+ def prefix
64
+ my_const('PREFIX')
65
+ end
66
+
63
67
  # Set a Boolean-valued debugger setting.
64
68
  def run_set_bool(args, default=true)
65
69
  onoff_arg = args.size < 3 ? 'on' : args[2]
@@ -180,7 +180,7 @@ if __FILE__ == $0
180
180
  puts cmd.help(%w(help set))
181
181
  puts '=' * 40
182
182
  # require_relative '../../../lib/trepanning)
183
- # Trepan.debug(:set_restart => true)
183
+ # Trepan.debug
184
184
  puts cmd.help(%w(help set *))
185
185
  puts '=' * 40
186
186
  puts cmd.help(%w(help set d.*))
@@ -177,6 +177,6 @@ if __FILE__ == $0
177
177
  puts '=' * 40
178
178
  # FIXME
179
179
  # require_relative '../../lib/trepanning'
180
- # Trepan.debug(:set_restart => true)
180
+ # Trepan.debug
181
181
  # puts cmd.help(%w(help info registers p.*))
182
182
  end
@@ -7,16 +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]
10
+ #{NAME} [LINE-NUMBER|OFFSET]
11
+ #{NAME} METHOD [LINE-NUMBER|OFFSET]
11
12
 
12
- With a line number argument, set a break there in the current
13
- instruction sequence. With an offset (a number prefaced with an "O")
14
- set a breakpoint at that instruction offset.
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.
15
22
 
16
23
  Examples:
17
24
  #{NAME}
18
25
  #{NAME} 10 # set breakpoint on line 10
19
26
  #{NAME} o20 # set breakpoint VM Instruction Sequence offset 20
27
+ #{NAME} Kernel.pp # Set a breakpoint at the beginning of Kernel.pp
20
28
  HELP
21
29
 
22
30
  ALIASES = %w(b)
@@ -14,7 +14,7 @@ the debugger however may occur via breakpoints or explicit calls, or
14
14
  exceptions.
15
15
 
16
16
  If a parameter is given, a temporary breakpoint is set at that position
17
- before continuing. Offset are numbers preficed with an "O" otherwise
17
+ before continuing. Offset are numbers prefixed with an "O" otherwise
18
18
  the parameter is taken as a line number.
19
19
 
20
20
  Examples:
@@ -23,7 +23,7 @@ Examples:
23
23
  #{NAME} o20 # continue to VM Instruction Sequence offset 20
24
24
  HELP
25
25
 
26
- ALIASES = %w(c)
26
+ ALIASES = %w(c cont)
27
27
  CATEGORY = 'running'
28
28
  MAX_ARGS = 1 # Need at most this many
29
29
  NEED_RUNNING = true
@@ -50,6 +50,6 @@ if __FILE__ == $0
50
50
  break_cmd = cmds['break']
51
51
  break_cmd.run(['break', cmdproc.frame.source_location[0].to_s])
52
52
  # require_relative '../../lib/trepanning'
53
- # Trepan.debug(:set_restart => true)
53
+ # Trepan.debug
54
54
  cmd.run([cmd.name, '1'])
55
55
  end
@@ -59,6 +59,6 @@ if __FILE__ == $0
59
59
  break_cmd = cmds['break']
60
60
  break_cmd.run(['break', cmdproc.frame.source_location[0].to_s])
61
61
  # require_relative '../../lib/trepanning'
62
- # Trepan.debug(:set_restart => true)
62
+ # Trepan.debug
63
63
  cmd.run([cmd.name, '1'])
64
64
  end
@@ -44,7 +44,7 @@ Examples:
44
44
  ary = mark_disassembly(iseq.disasm_nochildren,
45
45
  @proc.frame.iseq.equal?(iseq),
46
46
  @proc.frame.pc_offset,
47
- iseq.brkpts)
47
+ iseq.brkpts, settings[:maxwidth])
48
48
  msg ary
49
49
  end
50
50
  end
@@ -18,7 +18,7 @@ reduce the number of stack frames. Also, if a thread is switched, we
18
18
  stop ignoring levels.
19
19
 
20
20
  'next>' is similar in that it stops at a return, but it doesn't
21
- guarentee the stack level is the same as or less than the current
21
+ guarantee the stack level is the same as or less than the current
22
22
  one.
23
23
 
24
24
  See the break command if you want to stop at a particular point in a
@@ -32,7 +32,7 @@ while 'break' will have less overhead.
32
32
  # Need at most this many.
33
33
  MAX_ARGS = 1
34
34
  NEED_STACK = true
35
- SHORT_HELP = 'Step program without entering called functions'
35
+ SHORT_HELP = 'Step to end of current method (step out)'
36
36
  end
37
37
 
38
38
  # This method runs the command
@@ -45,7 +45,7 @@ while 'break' will have less overhead.
45
45
  count_str = args[1]
46
46
  opts = {
47
47
  :msg_on_error =>
48
- "The 'next' command argument must eval to an integer. Got: %s" %
48
+ "The '#{NAME}' command argument must eval to an integer. Got: %s" %
49
49
  count_str,
50
50
  :min_value => 1
51
51
  }
@@ -1,6 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
3
3
  require_relative '../base/subcmd'
4
+ require 'pp'
4
5
 
5
6
  class Trepan::Subcommand::InfoIseq < Trepan::Subcommand
6
7
  unless defined?(HELP)
@@ -54,6 +55,14 @@ Examples:
54
55
  else
55
56
  msg("Breakpoints have not been allocated.")
56
57
  end
58
+ if iseq.compile_options
59
+ msg "\nCompile options:"
60
+ msg iseq.compile_options.pretty_inspect
61
+ end
62
+ if iseq.source
63
+ msg "Source string:"
64
+ msg @proc.safe_rep(iseq.source.inspect)
65
+ end
57
66
  else
58
67
  mess = "Can't find instruction sequence"
59
68
  mess += " for #{args.join(' ')}" unless args.empty?
@@ -6,10 +6,10 @@ require_relative 'helper'
6
6
  class Trepan::Subcommand::InfoRegistersDfp < Trepan::SubSubcommand
7
7
  unless defined?(HELP)
8
8
  HELP = 'Show the value of the VM dynamic frame pointer (DFP)'
9
- MIN_ABBREV = 'lf'.size
9
+ MIN_ABBREV = 'df'.size
10
10
  NAME = File.basename(__FILE__, '.rb')
11
11
  NEED_STACK = true
12
- PREFIX = %w(info registers dfp)
12
+ PREFIX = %W(info registers #{NAME})
13
13
  end
14
14
 
15
15
  include Registers
@@ -21,18 +21,9 @@ end
21
21
  if __FILE__ == $0
22
22
  # Demo it.
23
23
  require_relative '../../../mock'
24
- require_relative '../../../subcmd'
25
- name = File.basename(__FILE__, '.rb')
26
-
27
- # FIXME: DRY the below code
28
- dbgr, info_cmd = MockDebugger::setup('info')
29
- testcmdMgr = Trepan::Subcmd.new(info_cmd)
30
- cmd_name = Trepan::SubSubcommand::InfoRegistersDfp::PREFIX.join('')
31
- infox_cmd = Trepan::SubSubcommand::InfoRegistersDfp.new(info_cmd.proc,
32
- info_cmd,
33
- cmd_name)
34
- infox_cmd.run([])
35
-
36
- # name = File.basename(__FILE__, '.rb')
37
- # subcommand.summary_help(name)
24
+ require_relative '../registers'
25
+ cmd = MockDebugger::subsub_setup(Trepan::SubSubcommand::InfoRegisters,
26
+ Trepan::SubSubcommand::InfoRegistersDfp,
27
+ false)
28
+ cmd.run(['0'])
38
29
  end
@@ -34,21 +34,9 @@ end
34
34
  if __FILE__ == $0
35
35
  # Demo it.
36
36
  require_relative '../../../mock'
37
- require_relative '../../../subcmd'
38
- name = File.basename(__FILE__, '.rb')
39
-
40
- # FIXME: DRY the below code
41
- dbgr, info_cmd = MockDebugger::setup('info')
42
- testcmdMgr = Trepan::Subcmd.new(info_cmd)
43
- cmd_name = Trepan::SubSubcommand::InfoRegistersSp::PREFIX.join('')
44
- infox_cmd = Trepan::SubSubcommand::InfoRegistersSp.new(info_cmd.proc,
45
- info_cmd,
46
- cmd_name)
47
- # require_relative '../../../../lib/trepanning'
48
- # dbgr = Trepan.new(:set_restart => true)
49
- # dbgr.debugger
50
- infox_cmd.run([])
51
-
52
- # name = File.basename(__FILE__, '.rb')
53
- # subcommand.summary_help(name)
37
+ require_relative '../registers'
38
+ cmd = MockDebugger::subsub_setup(Trepan::SubSubcommand::InfoRegisters,
39
+ Trepan::SubSubcommand::InfoRegistersLfp,
40
+ false)
41
+ cmd.run([])
54
42
  end
@@ -13,7 +13,7 @@ See also "info disassemble" and "info registers".'
13
13
  MIN_ABBREV = 'pc'.size
14
14
  NAME = File.basename(__FILE__, '.rb')
15
15
  NEED_STACK = true
16
- PREFIX = %w(info registers pc)
16
+ PREFIX = %W(info registers #{NAME})
17
17
  end
18
18
 
19
19
  def run(args)
@@ -22,23 +22,10 @@ See also "info disassemble" and "info registers".'
22
22
  end
23
23
 
24
24
  if __FILE__ == $0
25
- # Demo it.
26
25
  require_relative '../../../mock'
27
- require_relative '../../../subcmd'
28
- name = File.basename(__FILE__, '.rb')
29
-
30
- # FIXME: DRY the below code
31
- dbgr, info_cmd = MockDebugger::setup('info')
32
- testcmdMgr = Trepan::Subcmd.new(info_cmd)
33
- cmd_name = Trepan::SubSubcommand::InfoRegistersPc::PREFIX.join('')
34
- infox_cmd = Trepan::SubSubcommand::InfoRegistersPc.new(info_cmd.proc,
35
- info_cmd,
36
- cmd_name)
37
- # require_relative '../../../../trepanning'
38
- # dbgr = Trepan.new(:set_restart => true)
39
- # dbgr.debugger
40
- infox_cmd.run([])
41
-
42
- # name = File.basename(__FILE__, '.rb')
43
- # subcommand.summary_help(name)
26
+ require_relative '../registers'
27
+ cmd = MockDebugger::subsub_setup(Trepan::SubSubcommand::InfoRegisters,
28
+ Trepan::SubSubcommand::InfoRegistersPc,
29
+ false)
30
+ cmd.run([])
44
31
  end
@@ -5,10 +5,10 @@ require_relative 'helper'
5
5
 
6
6
  class Trepan::Subcommand::InfoRegistersSp < Trepan::SubSubcommand
7
7
  unless defined?(HELP)
8
- HELP = 'Show information about the VM stack pointer (SP).
9
-
8
+ NAME = File.basename(__FILE__, '.rb')
9
+ HELP = <<EOH
10
10
  usage:
11
- info register sp [NUMBER NUMBER ...|size]
11
+ info register #{NAME} [NUMBER NUMBER ...|size]
12
12
 
13
13
  With no arguments, all SP values for the current frame of the debugged
14
14
  program are shown. If a number is given, then the entry at that
@@ -21,12 +21,12 @@ a stack pointed to by SP. Just before the addition is perofrmed, sp(1)
21
21
  will have the value "a" contians and sp(2) will contain the value of
22
22
  "b"
23
23
 
24
- See also "info register LFP"'
24
+ See also "info register LFP"
25
+ EOH
25
26
 
26
27
  MIN_ABBREV = 'sp'.size
27
- NAME = File.basename(__FILE__, '.rb')
28
28
  NEED_STACK = true
29
- PREFIX = %w(info registers sp)
29
+ PREFIX = %W(info registers #{NAME})
30
30
  end
31
31
 
32
32
  include Registers
@@ -48,28 +48,18 @@ end
48
48
  if __FILE__ == $0
49
49
  # Demo it.
50
50
  require_relative '../../../mock'
51
- require_relative '../../../subcmd'
52
- name = File.basename(__FILE__, '.rb')
53
-
54
- # FIXME: DRY the below code
55
- dbgr, info_cmd = MockDebugger::setup('info')
56
- testcmdMgr = Trepan::Subcmd.new(info_cmd)
57
- cmd_name = Trepan::SubSubcommand::InfoRegistersSp::PREFIX.join('')
58
- infox_cmd = Trepan::SubSubcommand::InfoRegistersSp.new(info_cmd.proc,
59
- info_cmd,
60
- cmd_name)
61
- infox_cmd.summary_help(name)
62
- puts
51
+ require_relative '../registers'
52
+ cmd = MockDebugger::subsub_setup(Trepan::SubSubcommand::InfoRegisters,
53
+ Trepan::SubSubcommand::InfoRegistersSp,
54
+ false)
63
55
  # require_relative '../../../../lib/trepanning'
64
- # dbgr = Trepan.new(:set_restart => true)
56
+ # dbgr = Trepan.new
65
57
  # dbgr.debugger
66
- infox_cmd.run([])
58
+ cmd.run([])
67
59
  puts
68
60
  %w(0 1 10).each do |val|
69
- infox_cmd.run([val])
61
+ cmd.run([val])
70
62
  puts '-' * 40
71
63
  end
72
- infox_cmd.run(['size'])
73
-
74
- name = File.basename(__FILE__, '.rb')
64
+ cmd.run(['size'])
75
65
  end