byebug 1.0.2 → 1.0.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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/README.md +1 -1
  4. data/bin/byebug +1 -2
  5. data/byebug.gemspec +1 -1
  6. data/ext/byebug/byebug.c +50 -35
  7. data/ext/byebug/context.c +99 -45
  8. data/lib/byebug.rb +5 -10
  9. data/lib/byebug/command.rb +20 -12
  10. data/lib/byebug/commands/breakpoints.rb +1 -1
  11. data/lib/byebug/commands/control.rb +14 -21
  12. data/lib/byebug/commands/display.rb +4 -4
  13. data/lib/byebug/commands/enable.rb +20 -19
  14. data/lib/byebug/commands/eval.rb +1 -1
  15. data/lib/byebug/commands/finish.rb +4 -5
  16. data/lib/byebug/commands/info.rb +118 -116
  17. data/lib/byebug/commands/list.rb +72 -48
  18. data/lib/byebug/commands/reload.rb +4 -3
  19. data/lib/byebug/commands/set.rb +7 -16
  20. data/lib/byebug/commands/show.rb +2 -2
  21. data/lib/byebug/commands/threads.rb +7 -6
  22. data/lib/byebug/context.rb +10 -2
  23. data/lib/byebug/helper.rb +3 -3
  24. data/lib/byebug/processor.rb +1 -1
  25. data/lib/byebug/version.rb +1 -1
  26. data/old_doc/byebug.texi +45 -51
  27. data/test/breakpoints_test.rb +180 -195
  28. data/test/display_test.rb +59 -53
  29. data/test/eval_test.rb +0 -2
  30. data/test/examples/info.rb +5 -5
  31. data/test/examples/info_threads.rb +1 -1
  32. data/test/finish_test.rb +16 -15
  33. data/test/info_test.rb +9 -10
  34. data/test/irb_test.rb +64 -65
  35. data/test/list_test.rb +76 -50
  36. data/test/method_test.rb +10 -5
  37. data/test/post_mortem_test.rb +27 -25
  38. data/test/reload_test.rb +31 -31
  39. data/test/restart_test.rb +106 -110
  40. data/test/show_test.rb +8 -16
  41. data/test/stepping_test.rb +4 -2
  42. data/test/support/test_dsl.rb +37 -76
  43. data/test/test_helper.rb +0 -1
  44. data/test/variables_test.rb +9 -12
  45. metadata +4 -4
@@ -18,37 +18,19 @@ module Byebug
18
18
  end
19
19
 
20
20
  def execute
21
- listsize = Command.settings[:listsize]
22
- if !@match || !(@match[1] || @match[2])
23
- b = @state.previous_line ?
24
- @state.previous_line + listsize : @state.line - (listsize/2)
25
- e = b + listsize - 1
26
- elsif @match[1] == '-'
27
- b = if @state.previous_line
28
- if @state.previous_line > 0
29
- @state.previous_line - listsize
30
- else
31
- @state.previous_line
32
- end
33
- else
34
- @state.line - (listsize/2)
35
- end
36
- e = b + listsize - 1
37
- elsif @match[1] == '='
38
- @state.previous_line = nil
39
- b = @state.line - (listsize/2)
40
- e = b + listsize -1
41
- else
42
- b, e = @match[2].split(/[-,]/)
43
- if e
44
- b = b.to_i
45
- e = e.to_i
46
- else
47
- b = b.to_i - (listsize/2)
48
- e = b + listsize - 1
49
- end
21
+ Byebug.source_reload if Command.settings[:reload_source_on_change]
22
+ lines = LineCache::getlines(@state.file,
23
+ Command.settings[:reload_source_on_change])
24
+ if !lines
25
+ errmsg "No sourcefile available for #{@state.file}\n"
26
+ return @state.previous_line
50
27
  end
51
- @state.previous_line = display_list(b, e, @state.file, @state.line)
28
+
29
+ b, e = set_line_range(Command.settings[:listsize], lines.size)
30
+ return @state.previous_line if b < 0
31
+
32
+ print "[#{b}, #{e}] in #{@state.file}\n"
33
+ @state.previous_line = display_list(b, e, lines, @state.line)
52
34
  end
53
35
 
54
36
  class << self
@@ -69,28 +51,70 @@ module Byebug
69
51
 
70
52
  private
71
53
 
72
- # Show FILE from line B to E where CURRENT is the current line number.
73
- # If we can show from B to E then we return B, otherwise we return the
74
- # previous line @state.previous_line.
75
- def display_list(b, e, file, current)
76
- print "[%d, %d] in %s\n", b, e, file
77
- lines = LineCache::getlines(file,
78
- Command.settings[:reload_source_on_change])
79
- if lines
80
- return @state.previous_line if b >= lines.size
81
- e = lines.size if lines.size < e
82
- [b, 1].max.upto(e) do |n|
83
- if n > 0 && lines[n-1]
84
- if n == current
85
- print "=> %d %s\n", n, lines[n-1].chomp
54
+ ##
55
+ # Set line range to be printed by list
56
+ #
57
+ # @param listsize - number of lines to be printed
58
+ # @param maxline - max line number that can be printed
59
+ #
60
+ def set_line_range(listsize, maxline)
61
+ if !@match || !(@match[1] || @match[2])
62
+ b = @state.previous_line ?
63
+ @state.previous_line + listsize : @state.line - (listsize/2)
64
+ elsif @match[1] == '-'
65
+ b = if @state.previous_line
66
+ if @state.previous_line > 0
67
+ @state.previous_line - listsize
68
+ else
69
+ @state.previous_line
70
+ end
86
71
  else
87
- print " %d %s\n", n, lines[n-1].chomp
72
+ @state.line - (listsize/2)
88
73
  end
74
+ elsif @match[1] == '='
75
+ @state.previous_line = nil
76
+ b = @state.line - (listsize/2)
77
+ else
78
+ b, e = @match[2].split(/[-,]/)
79
+ if e
80
+ b = b.to_i
81
+ e = e.to_i
82
+ else
83
+ b = b.to_i - (listsize/2)
84
+ end
85
+ end
86
+
87
+ if b > maxline
88
+ errmsg "Invalid line range"
89
+ return [ -1, -1 ]
90
+ end
91
+
92
+ b = [1, b].max
93
+ e ||= b + listsize - 1
94
+
95
+ if e > maxline
96
+ e = maxline
97
+ b = e - listsize + 1
98
+ b = [1, b].max
99
+ end
100
+
101
+ return [ b, e ]
102
+ end
103
+
104
+ ##
105
+ # Show file lines in LINES from line B to line E where CURRENT is the
106
+ # current line number. If we can show from B to E then we return B,
107
+ # otherwise we return the previous line @state.previous_line.
108
+ #
109
+ def display_list(b, e, lines, current)
110
+ b.upto(e) do |n|
111
+ if n > 0 && lines[n-1]
112
+ if n == current
113
+ print "=> %d %s\n", n, lines[n-1].chomp
114
+ else
115
+ print " %d %s\n", n, lines[n-1].chomp
89
116
  end
90
117
  end
91
- else
92
- errmsg "No sourcefile available for %s\n", file
93
- return @state.previous_line
94
118
  end
95
119
  return e == lines.size ? @state.previous_line : b
96
120
  end
@@ -5,12 +5,13 @@ module Byebug
5
5
  self.allow_in_control = true
6
6
 
7
7
  register_setting_get(:reload_source_on_change) do
8
- Byebug.reload_source_on_change
8
+ Byebug.class_variable_get(:@@reload_source_on_change)
9
9
  end
10
10
 
11
11
  register_setting_set(:reload_source_on_change) do |value|
12
- Byebug.reload_source_on_change = value
12
+ Byebug.class_variable_set(:@@reload_source_on_change, value)
13
13
  end
14
+ Command.settings[:reload_source_on_change] = true
14
15
 
15
16
  def regexp
16
17
  /^\s*r(?:eload)?$/
@@ -24,7 +25,7 @@ module Byebug
24
25
  private
25
26
 
26
27
  def source_reloading
27
- Byebug.reload_source_on_change ? 'on' : 'off'
28
+ Command.settings[:reload_source_on_change] ? 'on' : 'off'
28
29
  end
29
30
 
30
31
  class << self
@@ -74,15 +74,12 @@ module Byebug
74
74
  else
75
75
  return
76
76
  end
77
- if defined?(Byebug::RDEBUG_SCRIPT)
78
- # byebug was called initially. 1st arg is script name.
77
+ when /^args$/
78
+ if defined?(Byebug::BYEBUG_SCRIPT)
79
79
  Command.settings[:argv][1..-1] = args
80
80
  else
81
- # byebug wasn't called initially. 1st arg is not script name.
82
81
  Command.settings[:argv] = args
83
82
  end
84
- when /^args$/
85
- Command.settings[:argv][1..-1] = args
86
83
  when /^autolist$/
87
84
  Command.settings[:autolist] = (set_on ? 1 : 0)
88
85
  when /^autoeval$/
@@ -142,19 +139,13 @@ module Byebug
142
139
  Command.settings[:tracing] = set_on
143
140
  when /^listsize$/
144
141
  listsize = get_int(args[0], "Set listsize", 1, nil, 10)
145
- if listsize
146
- self.class.settings[:listsize] = listsize
147
- else
148
- return
149
- end
142
+ return unless listsize
143
+ self.class.settings[:listsize] = listsize
150
144
  when /^width$/
151
145
  width = get_int(args[0], "Set width", 10, nil, 80)
152
- if width
153
- self.class.settings[:width] = width
154
- ENV['COLUMNS'] = width.to_s
155
- else
156
- return
157
- end
146
+ return unless width
147
+ self.class.settings[:width] = width
148
+ ENV['COLUMNS'] = width.to_s
158
149
  else
159
150
  return print "Unknown setting #{@match[1]}.\n"
160
151
  end
@@ -10,7 +10,7 @@ module Byebug
10
10
  return ("Annotation level is #{Byebug.annotate}")
11
11
  when /^args$/
12
12
  if Command.settings[:argv] and Command.settings[:argv].size > 0
13
- if defined?(Byebug::RDEBUG_SCRIPT)
13
+ if defined?(Byebug::BYEBUG_SCRIPT)
14
14
  # byebug was called initially. 1st arg is script name.
15
15
  args = Command.settings[:argv][1..-1].join(' ')
16
16
  else
@@ -129,7 +129,7 @@ module Byebug
129
129
  end
130
130
  when /^listsize$/
131
131
  listlines = Command.settings[:listsize]
132
- return "Number of source lines to list by default is #{listlines}."
132
+ return "Number of source lines to list is #{listlines}."
133
133
  when /^port$/
134
134
  return "server port is #{Byebug::PORT}."
135
135
  when /^trace$/
@@ -1,5 +1,6 @@
1
1
  module Byebug
2
- module ThreadFunctions # :nodoc:
2
+
3
+ module ThreadFunctions
3
4
  def display_context(c, show_top_frame=true)
4
5
  c_flag = c.thread == Thread.current ? '+' : ' '
5
6
  c_flag = '$' if c.suspended?
@@ -41,7 +42,7 @@ module Byebug
41
42
  end
42
43
  end
43
44
 
44
- class ThreadListCommand < Command # :nodoc:
45
+ class ThreadListCommand < Command
45
46
  self.allow_in_control = true
46
47
 
47
48
  def regexp
@@ -67,7 +68,7 @@ module Byebug
67
68
  end
68
69
  end
69
70
 
70
- class ThreadStopCommand < Command # :nodoc:
71
+ class ThreadStopCommand < Command
71
72
  self.allow_in_control = true
72
73
  self.allow_in_post_mortem = false
73
74
  self.need_context = true
@@ -96,7 +97,7 @@ module Byebug
96
97
  end
97
98
  end
98
99
 
99
- class ThreadResumeCommand < Command # :nodoc:
100
+ class ThreadResumeCommand < Command
100
101
  self.allow_in_post_mortem = false
101
102
  self.allow_in_control = true
102
103
  self.need_context = true
@@ -132,7 +133,7 @@ module Byebug
132
133
  # Thread switch Must come after "Thread resume" because "switch" is
133
134
  # optional
134
135
 
135
- class ThreadSwitchCommand < Command # :nodoc:
136
+ class ThreadSwitchCommand < Command
136
137
  self.allow_in_control = true
137
138
  self.allow_in_post_mortem = false
138
139
  self.need_context = true
@@ -163,7 +164,7 @@ module Byebug
163
164
  end
164
165
  end
165
166
 
166
- class ThreadCurrentCommand < Command # :nodoc:
167
+ class ThreadCurrentCommand < Command
167
168
  self.need_context = true
168
169
 
169
170
  def regexp
@@ -8,8 +8,16 @@ module Byebug
8
8
  end
9
9
 
10
10
  class Context
11
- def frame_class(frame_no=0)
12
- frame_self(frame_no).class
11
+ def frame_args(frame_no=0)
12
+ bind = frame_binding(frame_no)
13
+ return [] unless eval "__method__", bind
14
+ begin
15
+ eval "self.method(__method__).parameters.map{|(attr, mid)| mid}", bind
16
+ rescue NameError => e
17
+ print "(WARNING: retreving args from frame #{frame_no} => " \
18
+ "#{e.class} Exception: #{e.message})\n "
19
+ return []
20
+ end
13
21
  end
14
22
 
15
23
  def interrupt
@@ -11,15 +11,15 @@ module Byebug
11
11
  begin
12
12
  int = Integer(str)
13
13
  if min and int < min
14
- print "%s argument '%s' needs to at least %s.\n" % [cmd, str, min]
14
+ print "#{cmd} argument \"#{str}\" needs to be at least #{min}.\n"
15
15
  return nil
16
16
  elsif max and int > max
17
- print "%s argument '%s' needs to at most %s.\n" % [cmd, str, max]
17
+ print "#{cmd} argument \"#{str}\" needs to be at most #{max}.\n"
18
18
  return nil
19
19
  end
20
20
  return int
21
21
  rescue
22
- print "%s argument '%s' needs to be a number.\n" % [cmd, str]
22
+ print "#{cmd} argument \"#{str}\" needs to be a number.\n"
23
23
  return nil
24
24
  end
25
25
  end
@@ -147,7 +147,7 @@ module Byebug
147
147
 
148
148
  def at_tracing(context, file, line)
149
149
  # Don't trace ourselves
150
- return if defined?(Byebug::BYEBUG_BIN) && Byebug::BYEBUG_BIN == file
150
+ return if defined?(Byebug::BYEBUG_SCRIPT) && Byebug::BYEBUG_SCRIPT == file
151
151
 
152
152
  file = CommandProcessor.canonic_file(file)
153
153
  tracing_plus = Command.settings[:tracing_plus]
@@ -1,4 +1,4 @@
1
1
  module Byebug
2
2
  # Current version of the gem
3
- VERSION = '1.0.2'
3
+ VERSION = '1.0.3'
4
4
  end
@@ -314,14 +314,13 @@ mark, e.g.\@code{q!}.
314
314
  @node Second Sample Session
315
315
  @section Sample Session 2: Delving Deeper (@code{where}, @code{frame}, @code{restart}, @code{autoeval}, @code{break}, @code{ps})
316
316
 
317
- In this section we'll introduce breakpoints, the call stack and
318
- restarting. So far we've been doing pretty good in that we've not
319
- encountered a bug to fix. Let's try another simple example. Okay
320
- here's the program.
317
+ In this section we'll introduce breakpoints, the call stack and restarting. So
318
+ far we've been doing pretty good in that we've not encountered a bug to fix.
319
+ Let's try another simple example. Okay here's the program.
321
320
 
322
- Below we will debug a simple Ruby program to solve the classic Towers
323
- of Hanoi puzzle. It is augmented by the bane of programming: some
324
- command-parameter processing with error checking.
321
+ Below we will debug a simple Ruby program to solve the classic Towers of Hanoi
322
+ puzzle. It is augmented by the bane of programming: some command-parameter
323
+ processing with error checking.
325
324
 
326
325
  @smallexample
327
326
  $ @b{byebug hanoi.rb}
@@ -1115,9 +1114,9 @@ Restart byebug when your program terminates normally.
1115
1114
 
1116
1115
  @item --no-rewrite-program
1117
1116
  @cindex @option{--no-rewrite-program}
1118
- Normally @code{byebug} will reset the program name @code{$0} from its
1119
- name to the debugged program, and set the its name in variable
1120
- @code{$RDEBUG_0}. In the unlikely even you don't want this use this option.
1117
+ Normally @code{byebug} will reset the program name @code{$0} from its name to
1118
+ the debugged program, and set the its name in variable @code{$BYEBUG_SCRIPT}. In
1119
+ the unlikely even you don't want this use this option.
1121
1120
 
1122
1121
  @item --no-stop
1123
1122
  @cindex @option{--no-stop}
@@ -2074,19 +2073,18 @@ frames in @value{DBG} commands.
2074
2073
  @cindex backtraces
2075
2074
  @cindex tracebacks
2076
2075
  @cindex stack traces
2077
- A backtrace is essentially the same as the call stack: a summary of
2078
- how your script got where it is. It shows one line per frame, for
2079
- many frames, starting with the place that you are stopped at (frame
2080
- zero), followed by its caller (frame one), and on up the stack.
2076
+ A backtrace is essentially the same as the call stack: a summary of how your
2077
+ script got where it is. It shows one line per frame, for many frames, starting
2078
+ with the place that you are stopped at (frame zero), followed by its caller
2079
+ (frame one), and on up the stack.
2081
2080
 
2082
2081
  @table @code
2083
2082
  @kindex where
2084
2083
  @kindex w @r{(@code{where})}
2085
2084
  @itemx where
2086
2085
  Print the entire stack frame; @code{info stack} is an alias for this command.
2087
- Each frame is numbered and can be referred to in the @code{frame}
2088
- command; @code{up} and @code{down} add or subtract respectively to
2089
- frame numbers shown. The position of the current frame is marked with
2086
+ Each frame is numbered and can be referred to in the @code{frame} command;
2087
+ @code{up} and @code{down} add or subtract respectively to frame numbers shown. The position of the current frame is marked with
2090
2088
  @code{-->}.
2091
2089
 
2092
2090
  @smallexample
@@ -2113,33 +2111,30 @@ Similar, but print only the outermost @var{n} frames.
2113
2111
  @node Selection
2114
2112
  @subsection Selecting a frame (@samp{up}, @samp{down}, @samp{frame})
2115
2113
 
2116
- Commands for listing source code in your script work on whichever
2117
- stack frame is selected at the moment. Here are the commands for
2118
- selecting a stack frame; all of them finish by printing a brief
2119
- description of the stack frame just selected.
2114
+ Commands for listing source code in your script work on whichever stack frame is
2115
+ selected at the moment. Here are the commands for selecting a stack frame; all
2116
+ of them finish by printing a brief description of the stack frame just selected.
2120
2117
 
2121
2118
  @table @code
2122
2119
  @kindex up @ovar{n}
2123
2120
  @item up @ovar{n}
2124
- Move @var{n} frames up the stack. For positive numbers @var{n}, this
2125
- advances toward the outermost frame, to higher frame numbers, to
2126
- frames that have existed longer. Using a negative @var{n} is the same thing
2127
- as issuing a @code{down} command of the absolute value of the @var{n}.
2128
- Using zero for @var{n} does no frame adjustment, but since the current
2129
- position is redisplayed, it may trigger a resynchronization if there is
2130
- a front end also watching over things.
2121
+ Move @var{n} frames up the stack. For positive numbers @var{n}, this advances
2122
+ toward the outermost frame, to higher frame numbers, to frames that have existed
2123
+ longer. Using a negative @var{n} is the same thing as issuing a @code{down}
2124
+ command of the absolute value of the @var{n}. Using zero for @var{n} does no
2125
+ frame adjustment, but since the current position is redisplayed, it may trigger
2126
+ a resynchronization if there is a front end also watching over things.
2131
2127
 
2132
2128
  @var{n} defaults to one. You may abbreviate @code{up} as @code{u}.
2133
2129
 
2134
2130
  @kindex down @ovar{n}
2135
2131
  @item down @ovar{n}
2136
- Move @var{n} frames down the stack. For positive numbers @var{n}, this
2137
- advances toward the innermost frame, to lower frame numbers, to frames
2138
- that were created more recently. Using a negative @var{n} is the same
2139
- as issuing a @code{up} command of the absolute value of the @var{n}.
2140
- Using zero for @var{n} does no frame adjustment, but since the current
2141
- position is redisplayed, it may trigger a resynchronization if there is
2142
- a front end also watching over things.
2132
+ Move @var{n} frames down the stack. For positive numbers @var{n}, this advances
2133
+ toward the innermost frame, to lower frame numbers, to frames that were created
2134
+ more recently. Using a negative @var{n} is the same as issuing a @code{up}
2135
+ command of the absolute value of the @var{n}. Using zero for @var{n} does no
2136
+ frame adjustment, but since the current position is redisplayed, it may trigger
2137
+ a resynchronization if there is a front end also watching over things.
2143
2138
 
2144
2139
  @var{n} defaults to one.
2145
2140
  @end table
@@ -2148,22 +2143,21 @@ a front end also watching over things.
2148
2143
  @kindex frame @r{[}@ovar{n} @r{[}thread @var{thread-num}@r{]}@r{]}
2149
2144
  @cindex current stack frame
2150
2145
  @item frame @ovar{n} @r{[}thread @var{thread-num}@r{]}
2151
- The @code{frame} command allows you to move from one stack frame to
2152
- another, and to print the stack frame you select. @var{n} is the the
2153
- stack frame number or 0 if no frame number is given; @code{frame 0}
2154
- then will always show the current and most recent stack frame.
2155
-
2156
- If a negative number is given, counting is from the other end of the
2157
- stack frame, so @code{frame -1} shows the least-recent, outermost or
2158
- most ``main'' stack frame.
2159
-
2160
- Without an argument, @code{frame} prints the current stack
2161
- frame. Since the current position is redisplayed, it may trigger a
2162
- resynchronization if there is a front end also watching over
2163
- things.
2164
-
2165
- If a thread number is given then we set the context for evaluating
2166
- expressions to that frame of that thread.
2146
+ The @code{frame} command allows you to move from one stack frame to another, and
2147
+ to print the stack frame you select. @var{n} is the the stack frame number or 0
2148
+ if no frame number is given; @code{frame 0} then will always show the current
2149
+ and most recent stack frame.
2150
+
2151
+ If a negative number is given, counting is from the other end of the stack
2152
+ frame, so @code{frame -1} shows the least-recent, outermost or most ``main''
2153
+ stack frame.
2154
+
2155
+ Without an argument, @code{frame} prints the current stack frame. Since the
2156
+ current position is redisplayed, it may trigger a resynchronization if there is
2157
+ a front end also watching over things.
2158
+
2159
+ If a thread number is given then we set the context for evaluating expressions
2160
+ to that frame of that thread.
2167
2161
  @end table
2168
2162
 
2169
2163
  @node Stopping