trepanning 0.1.6 → 1.93.32

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 (113) hide show
  1. data/COPYING +57 -0
  2. data/ChangeLog +585 -736
  3. data/NEWS +26 -12
  4. data/README.md +62 -0
  5. data/Rakefile +15 -9
  6. data/app/breakpoint.rb +11 -12
  7. data/app/complete.rb +14 -14
  8. data/app/core.rb +34 -30
  9. data/app/default.rb +8 -7
  10. data/app/markdown.rb +191 -0
  11. data/app/options.rb +104 -99
  12. data/app/run.rb +9 -1
  13. data/app/util.rb +7 -7
  14. data/bin/trepan +7 -7
  15. data/interface.rb +0 -4
  16. data/interface/user.rb +11 -11
  17. data/io/input.rb +13 -13
  18. data/lib/trepanning.rb +30 -29
  19. data/processor.rb +40 -40
  20. data/processor/command.rb +13 -9
  21. data/processor/command/alias.rb +21 -15
  22. data/processor/command/backtrace.rb +27 -19
  23. data/processor/command/break.rb +24 -21
  24. data/processor/command/complete.rb +5 -2
  25. data/processor/command/condition.rb +14 -9
  26. data/processor/command/debug.rb +8 -8
  27. data/processor/command/down.rb +6 -6
  28. data/processor/command/edit.rb +4 -0
  29. data/processor/command/eval.rb +2 -2
  30. data/processor/command/exit.rb +12 -9
  31. data/processor/command/finish.rb +25 -23
  32. data/processor/command/frame.rb +30 -26
  33. data/processor/command/help.rb +203 -185
  34. data/processor/command/help/{command.txt → command.md} +21 -18
  35. data/processor/command/help/examples.md +20 -0
  36. data/processor/command/help/filename.md +46 -0
  37. data/processor/command/help/location.md +34 -0
  38. data/processor/command/help/suffixes.md +19 -0
  39. data/processor/command/info.rb +6 -4
  40. data/processor/command/info_subcmd/breakpoints.rb +13 -13
  41. data/processor/command/info_subcmd/files.rb +35 -31
  42. data/processor/command/info_subcmd/frame.rb +82 -33
  43. data/processor/command/info_subcmd/macro.rb +1 -1
  44. data/processor/command/info_subcmd/program.rb +8 -5
  45. data/processor/command/info_subcmd/registers.rb +15 -13
  46. data/processor/command/kill.rb +23 -17
  47. data/processor/command/list.rb +63 -56
  48. data/processor/command/macro.rb +45 -28
  49. data/processor/command/next.rb +29 -23
  50. data/processor/command/pp.rb +11 -9
  51. data/processor/command/pr.rb +10 -8
  52. data/processor/command/ps.rb +5 -5
  53. data/processor/command/quit.rb +24 -17
  54. data/processor/command/raise.rb +6 -6
  55. data/processor/command/reload.rb +9 -2
  56. data/processor/command/reload_subcmd/command.rb +4 -4
  57. data/processor/command/restart.rb +9 -4
  58. data/processor/command/save.rb +9 -9
  59. data/processor/command/server.rb +18 -17
  60. data/processor/command/set.rb +8 -6
  61. data/processor/command/set_subcmd/confirm.rb +15 -2
  62. data/processor/command/set_subcmd/different.rb +7 -5
  63. data/processor/command/set_subcmd/highlight.rb +14 -3
  64. data/processor/command/set_subcmd/pc.rb +62 -0
  65. data/processor/command/set_subcmd/sp.rb +8 -2
  66. data/processor/command/shell.rb +25 -23
  67. data/processor/command/show.rb +9 -7
  68. data/processor/command/show_subcmd/confirm.rb +12 -1
  69. data/processor/command/show_subcmd/highlight.rb +13 -3
  70. data/processor/command/source.rb +27 -26
  71. data/processor/command/step.rb +52 -43
  72. data/processor/command/tbreak.rb +9 -4
  73. data/processor/command/unalias.rb +9 -7
  74. data/processor/command/undisplay.rb +11 -7
  75. data/processor/command/up.rb +18 -13
  76. data/processor/command/watchg.rb +20 -17
  77. data/processor/complete.rb +120 -0
  78. data/processor/default.rb +47 -43
  79. data/processor/list.rb +23 -6
  80. data/processor/load_cmds.rb +25 -105
  81. data/processor/location.rb +104 -96
  82. data/processor/mock.rb +12 -12
  83. data/processor/msg.rb +61 -52
  84. data/processor/validate.rb +36 -27
  85. data/test/data/fname-with-blank.right +0 -1
  86. data/test/data/trace-mingw.right +28 -0
  87. data/test/data/trace.right +0 -2
  88. data/test/functional/test-raise.rb +3 -0
  89. data/test/integration/helper.rb +16 -16
  90. data/test/integration/test-debugger-stop.rb +8 -2
  91. data/test/integration/test-quit.rb +16 -15
  92. data/test/integration/test-trace.rb +19 -10
  93. data/test/unit/cmd-helper.rb +4 -1
  94. data/test/unit/test-app-complete.rb +3 -1
  95. data/test/unit/test-app-options.rb +7 -1
  96. data/test/unit/test-app-run.rb +9 -1
  97. data/test/unit/test-cmd-alias.rb +1 -1
  98. data/test/unit/test-cmd-edit.rb +2 -0
  99. data/test/unit/test-cmd-help.rb +10 -5
  100. data/test/unit/test-cmd-parse_list_cmd.rb +3 -3
  101. data/test/unit/test-completion.rb +2 -2
  102. data/test/unit/test-proc-default.rb +34 -0
  103. data/trepanning.gemspec +15 -14
  104. metadata +70 -44
  105. data/README.textile +0 -50
  106. data/processor/command/help/examples.txt +0 -16
  107. data/processor/command/help/filename.txt +0 -40
  108. data/processor/command/help/location.txt +0 -37
  109. data/processor/command/help/suffixes.txt +0 -17
  110. data/processor/command/info_subcmd/registers_subcmd/dfp.rb +0 -28
  111. data/processor/command/info_subcmd/registers_subcmd/lfp.rb +0 -47
  112. data/processor/command/nocache.rb +0 -32
  113. data/processor/command/parsetree.rb +0 -56
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
1
+ # Copyright (C) 2010-2011, 2015 Rocky Bernstein <rockyb@rubyforge.net>
2
2
  # Mock setup for commands.
3
3
  require_relative '../processor'
4
4
 
@@ -7,9 +7,9 @@ require_relative '../app/default'
7
7
  require_relative '../app/frame'
8
8
  require_relative '../interface/user' # user interface (includes I/O)
9
9
 
10
- SCRIPT_ISEQS__ = {} unless
10
+ SCRIPT_ISEQS__ = {} unless
11
11
  defined?(SCRIPT_ISEQS__) && SCRIPT_ISEQS__.is_a?(Hash)
12
- ISEQS__ = {} unless
12
+ ISEQS__ = {} unless
13
13
  defined?(ISEQS__) && ISEQS__.is_a?(Hash)
14
14
 
15
15
  module MockDebugger
@@ -21,14 +21,14 @@ module MockDebugger
21
21
  attr_accessor :intf # The way the outside world interfaces with us.
22
22
  attr_reader :initial_dir # String. Current directory when program
23
23
  # started. Used in restart program.
24
- attr_accessor :restart_argv # How to restart us, empty or nil.
24
+ attr_accessor :restart_argv # How to restart us, empty or nil.
25
25
  # Note restart[0] is typically $0.
26
26
  attr_reader :settings # Hash[:symbol] of things you can configure
27
27
  attr_accessor :processor
28
28
 
29
29
  # FIXME: move more stuff of here and into Trepan::CmdProcessor
30
30
  # These below should go into Trepan::CmdProcessor.
31
- attr_reader :cmd_argstr, :cmd_name, :vm_locations, :current_frame,
31
+ attr_reader :cmd_argstr, :cmd_name, :vm_locations, :current_frame,
32
32
  :debugee_thread
33
33
 
34
34
  def initialize(settings={})
@@ -39,7 +39,7 @@ module MockDebugger
39
39
  @trace_filter = []
40
40
 
41
41
  # Don't allow user commands in mocks.
42
- @core.processor.settings[:user_cmd_dir] = nil
42
+ @core.processor.settings[:user_cmd_dir] = nil
43
43
 
44
44
  end
45
45
 
@@ -48,7 +48,7 @@ module MockDebugger
48
48
  end
49
49
  end
50
50
 
51
- # Common Mock debugger setup
51
+ # Common Mock debugger setup
52
52
  def setup(name=nil, show_constants=true)
53
53
  unless name
54
54
  tf = RubyVM::Frame.current.prev
@@ -114,7 +114,7 @@ module MockDebugger
114
114
  def show_special_class_constants(cmd)
115
115
  puts 'ALIASES: %s' % [cmd.class.const_get('ALIASES').inspect] if
116
116
  cmd.class.constants.member?(:ALIASES)
117
- %w(CATEGORY MIN_ARGS MAX_ARGS
117
+ %w(CATEGORY MIN_ARGS MAX_ARGS
118
118
  NAME NEED_STACK SHORT_HELP).each do |name|
119
119
  puts '%s: %s' % [name, cmd.class.const_get(name).inspect]
120
120
  end
@@ -127,8 +127,8 @@ module MockDebugger
127
127
  end
128
128
 
129
129
  if __FILE__ == $0
130
- dbgr = MockDebugger::MockDebugger.new
131
- p dbgr.settings
132
- puts '=' * 10
133
- p dbgr.core.processor.settings
130
+ dbgr = MockDebugger::MockDebugger.new
131
+ p dbgr.settings
132
+ puts '=' * 10
133
+ p dbgr.core.processor.settings
134
134
  end
@@ -1,73 +1,82 @@
1
- # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
1
+ # Copyright (C) 2010-2011, 2015 Rocky Bernstein <rockyb@rubyforge.net>
2
2
  # I/O related command processor methods
3
3
  require_relative '../app/util'
4
+ require_relative '../app/markdown'
4
5
  require_relative 'virtual'
5
6
 
6
7
  begin require 'term/ansicolor'; rescue LoadError; end
7
8
 
8
9
  class Trepan::CmdProcessor < Trepan::VirtualCmdProcessor
9
- attr_accessor :ruby_highlighter
10
+ include Trepan::Markdown
10
11
 
11
- def confirm(msg, default)
12
- @settings[:confirm] ? @dbgr.intf[-1].confirm(msg, default) : true
13
- end
12
+ attr_accessor :ruby_highlighter
14
13
 
15
- def errmsg(message, opts={})
16
- if message.kind_of?(Array)
17
- message.each do |mess|
18
- errmsg(mess, opts)
19
- end
20
- return
21
- else
22
- message = safe_rep(message) unless opts[:unlimited]
14
+ def confirm(msg, default)
15
+ @settings[:confirm] ? @dbgr.intf[-1].confirm(msg, default) : true
23
16
  end
24
- if @settings[:highlight] && defined?(Term::ANSIColor)
25
- message =
26
- Term::ANSIColor.italic + message + Term::ANSIColor.reset
17
+
18
+ def errmsg(message, opts={})
19
+ if message.kind_of?(Array)
20
+ message.each do |mess|
21
+ errmsg(mess, opts)
22
+ end
23
+ return
24
+ else
25
+ message = safe_rep(message) unless opts[:unlimited]
26
+ end
27
+ if @settings[:highlight] && defined?(Term::ANSIColor)
28
+ message =
29
+ Term::ANSIColor.italic + message + Term::ANSIColor.reset
30
+ end
31
+ @dbgr.intf[-1].errmsg(message)
27
32
  end
28
- @dbgr.intf[-1].errmsg(message)
29
- end
30
33
 
31
- def msg(message, opts={})
32
- message = safe_rep(message) unless opts[:unlimited]
33
- message = ruby_format(message) if opts[:code]
34
- @dbgr.intf[-1].msg(message)
35
- end
34
+ def markdown(message, opts={})
35
+ message = render(message, @settings[:maxwidth], @settings[:highlight])
36
+ @dbgr.intf[-1].msg(message)
37
+ end
36
38
 
37
- def msg_nocr(message, opts={})
38
- message = safe_rep(message) unless opts[:unlimited]
39
- @dbgr.intf[-1].msg_nocr(message)
40
- end
39
+ def msg(message, opts={})
40
+ message = safe_rep(message) unless opts[:unlimited]
41
+ message = ruby_format(message) if opts[:code]
42
+ @dbgr.intf[-1].msg(message)
43
+ end
41
44
 
42
- def read_command()
43
- @dbgr.intf[-1].read_command(@prompt)
44
- end
45
+ def msg_nocr(message, opts={})
46
+ message = safe_rep(message) unless opts[:unlimited]
47
+ @dbgr.intf[-1].msg_nocr(message)
48
+ end
45
49
 
46
- def ruby_format(text)
47
- return text unless settings[:highlight]
48
- unless @ruby_highlighter
49
- begin
50
- require 'coderay'
51
- require 'term/ansicolor'
52
- @ruby_highlighter = CodeRay::Duo[:ruby, :term]
53
- rescue LoadError
54
- return text
55
- end
50
+ def read_command()
51
+ @dbgr.intf[-1].read_command(@prompt)
56
52
  end
57
- return @ruby_highlighter.encode(text)
58
- end
59
53
 
60
- def safe_rep(str)
61
- Trepan::Util::safe_repr(str, @settings[:maxstring])
62
- end
54
+ def ruby_format(text)
55
+ return text unless settings[:highlight]
56
+ unless @ruby_highlighter
57
+ begin
58
+ require 'coderay'
59
+ require 'term/ansicolor'
60
+ @ruby_highlighter = CodeRay::Duo[:ruby, :term]
61
+ rescue LoadError
62
+ return text
63
+ end
64
+ end
65
+ return @ruby_highlighter.encode(text)
66
+ end
63
67
 
64
- def section(message, opts={})
65
- message = safe_rep(message) unless opts[:unlimited]
66
- if @settings[:highlight] && defined?(Term::ANSIColor)
67
- message =
68
- Term::ANSIColor.bold + message + Term::ANSIColor.reset
68
+ def safe_rep(str)
69
+ Trepan::Util::safe_repr(str, @settings[:maxstring])
69
70
  end
70
- @dbgr.intf[-1].msg(message)
71
- end
72
71
 
72
+ def section(message, opts={})
73
+ message = safe_rep(message) unless opts[:unlimited]
74
+ message =
75
+ if @settings[:highlight] && defined?(Term::ANSIColor)
76
+ Term::ANSIColor.bold + message + Term::ANSIColor.reset
77
+ else
78
+ message += "\n" + ('-' * message.size)
79
+ end
80
+ @dbgr.intf[-1].msg(message)
81
+ end
73
82
  end
@@ -1,8 +1,9 @@
1
- # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
1
+ # Copyright (C) 2010-2011, 2013 Rocky Bernstein <rockyb@rubyforge.net>
2
2
 
3
3
  # Trepan command input validation routines. A String type is
4
4
  # usually passed in as the argument to validation routines.
5
5
 
6
+ require 'rbconfig'
6
7
  require 'rubygems'
7
8
  require 'linecache'
8
9
 
@@ -62,7 +63,7 @@ class Trepan
62
63
  # error. If there's a stack frame use that for bindings in
63
64
  # evaluation.
64
65
  def get_int(arg, opts={})
65
-
66
+
66
67
  return default unless arg
67
68
  opts = DEFAULT_GET_INT_OPTS.merge(opts)
68
69
  val = arg ? get_int_noerr(arg) : opts[:default]
@@ -75,7 +76,7 @@ class Trepan
75
76
  end
76
77
  return nil
77
78
  end
78
-
79
+
79
80
  if val < opts[:min_value]
80
81
  if opts[:cmdname]
81
82
  errmsg(("Command '%s' expects an integer at least" +
@@ -104,7 +105,7 @@ class Trepan
104
105
  def get_int_list(args, opts={})
105
106
  args.map{|arg| get_an_int(arg, opts)}.compact
106
107
  end
107
-
108
+
108
109
  # Eval arg and it is an integer return the value. Otherwise
109
110
  # return nil
110
111
  def get_int_noerr(arg)
@@ -112,7 +113,7 @@ class Trepan
112
113
  val = Integer(eval(arg, b))
113
114
  rescue SyntaxError
114
115
  nil
115
- rescue
116
+ rescue
116
117
  nil
117
118
  end
118
119
 
@@ -157,13 +158,13 @@ class Trepan
157
158
  vm_offset = ary.size > 1 ? ary[1] : ary[0]
158
159
  line_no = position
159
160
  elsif found_iseq = find_iseqs_with_lineno(filename, position)
160
- return position_to_line_and_offset(found_iseq, filename, position,
161
+ return position_to_line_and_offset(found_iseq, filename, position,
161
162
  offset_type)
162
163
  elsif found_iseq = find_iseq_with_line_from_iseq(iseq, position)
163
- return position_to_line_and_offset(found_iseq, filename, position,
164
+ return position_to_line_and_offset(found_iseq, filename, position,
164
165
  offset_type)
165
166
  else
166
- errmsg("Unable to find offset for line #{position}\n\t" +
167
+ errmsg("Unable to find offset for line #{position}\n\t" +
167
168
  "in #{iseq.name} of file #{filename}")
168
169
  return [nil, nil]
169
170
  end
@@ -200,11 +201,11 @@ class Trepan
200
201
  end
201
202
  return [nil] * 5 unless break_cmd_parse
202
203
  tail = [break_cmd_parse.condition, break_cmd_parse.negate]
203
- meth_or_frame, file, position, offset_type =
204
+ meth_or_frame, file, position, offset_type =
204
205
  parse_position(break_cmd_parse.position)
205
206
  if meth_or_frame
206
207
  if iseq = meth_or_frame.iseq
207
- iseq, line_no, vm_offset =
208
+ iseq, line_no, vm_offset =
208
209
  position_to_line_and_offset(iseq, file, position, offset_type)
209
210
  if vm_offset && line_no
210
211
  return [iseq, line_no, vm_offset] + tail
@@ -216,18 +217,18 @@ class Trepan
216
217
  if :line == offset_type
217
218
  iseq = find_iseqs_with_lineno(file, position)
218
219
  if iseq
219
- junk, line_no, vm_offset =
220
+ junk, line_no, vm_offset =
220
221
  position_to_line_and_offset(iseq, file, position, offset_type)
221
222
  return [@frame.iseq, line_no, vm_offset] + tail
222
223
  else
223
- errmsg("Unable to find instruction sequence for" +
224
+ errmsg("Unable to find instruction sequence for" +
224
225
  " position #{position} in #{file}")
225
226
  end
226
227
  else
227
228
  errmsg "Come back later..."
228
229
  end
229
- elsif @frame.file == file
230
- line_no, vm_offset = position_to_line_and_offset(@frame.iseq, position,
230
+ elsif @frame.respond_to?(:file) and @frame.file == file
231
+ line_no, vm_offset = position_to_line_and_offset(@frame.iseq, position,
231
232
  offset_type)
232
233
  return [@frame.iseq, line_no, vm_offset] + tail
233
234
  else
@@ -260,7 +261,7 @@ class Trepan
260
261
  include CmdParser
261
262
 
262
263
  def get_method(meth)
263
- start_binding =
264
+ start_binding =
264
265
  begin
265
266
  @frame.binding
266
267
  rescue
@@ -278,8 +279,8 @@ class Trepan
278
279
  end
279
280
  end
280
281
 
281
- # FIXME: this is a ? method but we return
282
- # the method value.
282
+ # FIXME: this is a ? method but we return
283
+ # the method value.
283
284
  def method?(meth)
284
285
  get_method(meth)
285
286
  end
@@ -290,22 +291,30 @@ class Trepan
290
291
  # Parse arg as [filename:]lineno | function | module
291
292
  # Make sure it works for C:\foo\bar.py:12
292
293
  def parse_position(info)
294
+ ## FIXME: push into parse
295
+ if RbConfig::CONFIG['target_os'].start_with?('mingw') and
296
+ info =~ /^[A-Za-z]:/
297
+ drive_letter = info[0..1]
298
+ info = info[2..-1]
299
+ else
300
+ drive_leter = nil
301
+ end
293
302
  info = parse_location(info) if info.kind_of?(String)
294
303
  case info.container_type
295
304
  when :fn
296
305
  if (meth = method?(info.container)) && meth.iseq
297
- return [meth, meth.iseq.source_container[1], info.position,
306
+ return [meth, meth.iseq.source_container[1], info.position,
298
307
  info.position_type]
299
308
  else
300
309
  return [nil] * 4
301
310
  end
302
311
  when :file
303
312
  filename = canonic_file(info.container)
304
- # ?? Try to look up method here?
313
+ # ?? Try to look up method here?
305
314
  container = frame_container(@frame, false)
306
315
  try_filename = container[1]
307
316
  frame = (canonic_file(try_filename) == filename) ? @frame : nil
308
- # else
317
+ # else
309
318
  # LineCache.compiled_method(filename)
310
319
  # end
311
320
  return frame, filename, info.position, info.position_type
@@ -336,7 +345,7 @@ class Trepan
336
345
  true
337
346
  else
338
347
  matches = find_scripts(filename)
339
- if matches.size == 1
348
+ if matches.size == 1
340
349
  LineCache.remap_file(filename, matches[0])
341
350
  true
342
351
  else
@@ -353,24 +362,24 @@ if __FILE__ == $0
353
362
  if !(ARGV.size == 1 && ARGV[0] == 'noload')
354
363
  ARGV[0..-1] = ['noload']
355
364
  load(__FILE__)
356
- else
365
+ else
357
366
  require 'thread_frame'
358
367
  require_relative '../app/mock'
359
368
  require_relative './default'
360
369
  require_relative 'frame'
361
370
 
362
371
  # FIXME: Have to include before defining CmdProcessor!
363
- require_relative '../processor'
372
+ require_relative '../processor'
364
373
 
365
374
  cmdproc = Trepan::CmdProcessor.new(Trepan::MockCore.new())
366
375
  cmdproc.frame_initialize
367
- cmdproc.instance_variable_set('@settings',
376
+ cmdproc.instance_variable_set('@settings',
368
377
  Trepan::CmdProcessor::DEFAULT_SETTINGS)
369
378
  cmdproc.frame_setup(RubyVM::Frame.current)
370
379
  onoff = %w(1 0 on off)
371
380
  onoff.each { |val| puts "onoff(#{val}) = #{cmdproc.get_onoff(val)}" }
372
- %w(1 1E bad 1+1 -5).each do |val|
373
- puts "get_int_noerr(#{val}) = #{cmdproc.get_int_noerr(val).inspect}"
381
+ %w(1 1E bad 1+1 -5).each do |val|
382
+ puts "get_int_noerr(#{val}) = #{cmdproc.get_int_noerr(val).inspect}"
374
383
  end
375
384
  def foo; 5 end
376
385
  def cmdproc.errmsg(msg)
@@ -381,7 +390,7 @@ if __FILE__ == $0
381
390
 
382
391
  # puts cmdproc.object_iseq('foo@validate.rb').inspect
383
392
  # puts cmdproc.object_iseq('cmdproc.object_iseq').inspect
384
-
393
+
385
394
  puts cmdproc.parse_position(__FILE__).inspect
386
395
  puts cmdproc.parse_position('@8').inspect
387
396
  puts cmdproc.parse_position('8').inspect
@@ -1,2 +1 @@
1
1
  -> (fname with blank.rb:1 @0)
2
- trepan: That's all, folks...
@@ -0,0 +1,28 @@
1
+ -- (gcd.rb:4 @2)
2
+ def gcd(a, b)
3
+ -- (gcd.rb:18 @2)
4
+ a, b = ARGV[0..1].map {|arg| arg.to_i}
5
+ -- (gcd.rb:19 @45)
6
+ puts "The GCD of %d and %d is %d" % [a, b, gcd(a, b)]
7
+ -- (gcd.rb:6 @4)
8
+ if a > b
9
+ -- (gcd.rb:12 @40)
10
+ if a == 1 or b-a == 0
11
+ METHOD Object#gcd(a, b)
12
+ -> (gcd.rb:4 @2)
13
+ def gcd(a, b)
14
+ -- (gcd.rb:10 @24)
15
+ return nil if a <= 0
16
+ -- (gcd.rb:15 @71)
17
+ return gcd(b-a, a)
18
+ -- (gcd.rb:6 @4)
19
+ if a > b
20
+ -- (gcd.rb:12 @40)
21
+ if a == 1 or b-a == 0
22
+ <- (gcd.rb:13 @68)
23
+ R=> 1
24
+ return a
25
+ <- (gcd.rb:16 @88)
26
+ R=> 1
27
+ end
28
+ The GCD of 3 and 5 is 1
@@ -32,8 +32,6 @@ end
32
32
  <- (gcd.rb:16 @88)
33
33
  R=> 1
34
34
  end
35
- <= (gcd.rb:16 @88)
36
- end
37
35
  The GCD of 3 and 5 is 1
38
36
  <= (gcd.rb:19 @73)
39
37
  puts "The GCD of %d and %d is %d" % [a, b, gcd(a, b)]
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'test/unit'
3
+ require 'rbconfig'
3
4
  require 'trace'
4
5
  require_relative 'fn_helper'
5
6
 
@@ -9,6 +10,8 @@ class TestRaise < Test::Unit::TestCase
9
10
 
10
11
  def test_raise
11
12
 
13
+ skip "FIXME on mingw" if
14
+ RbConfig::CONFIG['target_os'].start_with?('mingw')
12
15
  cmds = [
13
16
  'step',
14
17
  'step',