byebug 5.0.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -1
  3. data/CONTRIBUTING.md +35 -13
  4. data/GUIDE.md +256 -198
  5. data/README.md +5 -11
  6. data/ext/byebug/byebug.c +5 -43
  7. data/ext/byebug/byebug.h +6 -1
  8. data/ext/byebug/context.c +4 -5
  9. data/lib/byebug/command.rb +64 -64
  10. data/lib/byebug/command_list.rb +32 -0
  11. data/lib/byebug/commands.rb +37 -0
  12. data/lib/byebug/commands/break.rb +45 -37
  13. data/lib/byebug/commands/catch.rb +52 -28
  14. data/lib/byebug/commands/condition.rb +19 -13
  15. data/lib/byebug/commands/continue.rb +15 -11
  16. data/lib/byebug/commands/delete.rb +18 -12
  17. data/lib/byebug/commands/disable.rb +9 -10
  18. data/lib/byebug/commands/disable/breakpoints.rb +13 -11
  19. data/lib/byebug/commands/disable/display.rb +13 -11
  20. data/lib/byebug/commands/display.rb +32 -24
  21. data/lib/byebug/commands/down.rb +18 -14
  22. data/lib/byebug/commands/edit.rb +42 -26
  23. data/lib/byebug/commands/enable.rb +9 -3
  24. data/lib/byebug/commands/enable/breakpoints.rb +13 -11
  25. data/lib/byebug/commands/enable/display.rb +13 -11
  26. data/lib/byebug/commands/finish.rb +23 -14
  27. data/lib/byebug/commands/frame.rb +21 -18
  28. data/lib/byebug/commands/help.rb +39 -16
  29. data/lib/byebug/commands/history.rb +16 -10
  30. data/lib/byebug/commands/info.rb +8 -5
  31. data/lib/byebug/commands/info/breakpoints.rb +16 -14
  32. data/lib/byebug/commands/info/display.rb +18 -18
  33. data/lib/byebug/commands/info/file.rb +22 -22
  34. data/lib/byebug/commands/info/line.rb +13 -11
  35. data/lib/byebug/commands/info/program.rb +13 -17
  36. data/lib/byebug/commands/interrupt.rb +13 -11
  37. data/lib/byebug/commands/irb.rb +16 -10
  38. data/lib/byebug/commands/kill.rb +19 -13
  39. data/lib/byebug/commands/list.rb +35 -24
  40. data/lib/byebug/commands/method.rb +25 -15
  41. data/lib/byebug/commands/next.rb +15 -13
  42. data/lib/byebug/commands/pry.rb +18 -11
  43. data/lib/byebug/commands/ps.rb +21 -23
  44. data/lib/byebug/commands/quit.rb +17 -11
  45. data/lib/byebug/commands/restart.rb +28 -24
  46. data/lib/byebug/commands/save.rb +23 -15
  47. data/lib/byebug/commands/set.rb +26 -19
  48. data/lib/byebug/commands/show.rb +20 -14
  49. data/lib/byebug/commands/source.rb +15 -14
  50. data/lib/byebug/commands/step.rb +15 -13
  51. data/lib/byebug/commands/thread.rb +8 -4
  52. data/lib/byebug/commands/thread/current.rb +11 -11
  53. data/lib/byebug/commands/thread/list.rb +14 -14
  54. data/lib/byebug/commands/thread/resume.rb +14 -14
  55. data/lib/byebug/commands/thread/stop.rb +14 -14
  56. data/lib/byebug/commands/thread/switch.rb +15 -14
  57. data/lib/byebug/commands/tracevar.rb +20 -16
  58. data/lib/byebug/commands/undisplay.rb +22 -18
  59. data/lib/byebug/commands/untracevar.rb +13 -11
  60. data/lib/byebug/commands/up.rb +18 -14
  61. data/lib/byebug/commands/var.rb +10 -3
  62. data/lib/byebug/commands/var/all.rb +15 -13
  63. data/lib/byebug/commands/var/args.rb +37 -0
  64. data/lib/byebug/commands/var/const.rb +25 -14
  65. data/lib/byebug/commands/var/global.rb +13 -11
  66. data/lib/byebug/commands/var/instance.rb +13 -11
  67. data/lib/byebug/commands/var/local.rb +13 -11
  68. data/lib/byebug/commands/where.rb +15 -11
  69. data/lib/byebug/context.rb +71 -73
  70. data/lib/byebug/core.rb +45 -26
  71. data/lib/byebug/errors.rb +27 -0
  72. data/lib/byebug/frame.rb +181 -0
  73. data/lib/byebug/helpers/eval.rb +67 -26
  74. data/lib/byebug/helpers/file.rb +18 -3
  75. data/lib/byebug/helpers/frame.rb +36 -39
  76. data/lib/byebug/helpers/parse.rb +15 -13
  77. data/lib/byebug/helpers/path.rb +21 -0
  78. data/lib/byebug/helpers/reflection.rb +17 -0
  79. data/lib/byebug/helpers/thread.rb +20 -14
  80. data/lib/byebug/helpers/toggle.rb +10 -5
  81. data/lib/byebug/helpers/var.rb +36 -15
  82. data/lib/byebug/interface.rb +27 -9
  83. data/lib/byebug/option_setter.rb +93 -0
  84. data/lib/byebug/printers/base.rb +3 -0
  85. data/lib/byebug/printers/plain.rb +4 -14
  86. data/lib/byebug/printers/texts/base.yml +2 -7
  87. data/lib/byebug/processors/command_processor.rb +101 -102
  88. data/lib/byebug/processors/control_processor.rb +20 -0
  89. data/lib/byebug/processors/post_mortem_processor.rb +16 -0
  90. data/lib/byebug/processors/script_processor.rb +49 -0
  91. data/lib/byebug/remote.rb +13 -7
  92. data/lib/byebug/runner.rb +39 -65
  93. data/lib/byebug/setting.rb +4 -1
  94. data/lib/byebug/settings/post_mortem.rb +0 -16
  95. data/lib/byebug/settings/savefile.rb +1 -4
  96. data/lib/byebug/subcommands.rb +27 -29
  97. data/lib/byebug/version.rb +4 -1
  98. metadata +14 -29
  99. data/lib/byebug/commands/eval.rb +0 -43
  100. data/lib/byebug/commands/info/args.rb +0 -39
  101. data/lib/byebug/commands/info/catch.rb +0 -39
  102. data/lib/byebug/commands/pp.rb +0 -41
  103. data/lib/byebug/commands/putl.rb +0 -43
  104. data/lib/byebug/processor.rb +0 -43
  105. data/lib/byebug/processors/control_command_processor.rb +0 -48
  106. data/lib/byebug/settings/verbose.rb +0 -20
  107. data/lib/byebug/state.rb +0 -12
  108. data/lib/byebug/states/control_state.rb +0 -26
  109. data/lib/byebug/states/regular_state.rb +0 -187
  110. data/lib/byebug/subcommand_list.rb +0 -33
@@ -8,12 +8,26 @@ module Byebug
8
8
  class HistoryCommand < Command
9
9
  include Helpers::ParseHelper
10
10
 
11
- def regexp
11
+ self.allow_in_post_mortem = true
12
+
13
+ def self.regexp
12
14
  /^\s* hist(?:ory)? (?:\s+(?<num_cmds>.+))? \s*$/x
13
15
  end
14
16
 
17
+ def self.description
18
+ <<-EOD
19
+ hist[ory] [num_cmds]
20
+
21
+ #{short_description}
22
+ EOD
23
+ end
24
+
25
+ def self.short_description
26
+ "Shows byebug's history of commands"
27
+ end
28
+
15
29
  def execute
16
- history = @state.interface.history
30
+ history = processor.interface.history
17
31
 
18
32
  if @match[:num_cmds]
19
33
  size, = get_int(@match[:num_cmds], 'history', 1, history.size)
@@ -22,13 +36,5 @@ module Byebug
22
36
 
23
37
  puts history.to_s(size)
24
38
  end
25
-
26
- def description
27
- <<-EOD
28
- hist[ory] [num_cmds]
29
-
30
- Show byebug's command history.
31
- EOD
32
- end
33
39
  end
34
40
  end
@@ -1,8 +1,6 @@
1
1
  require 'byebug/subcommands'
2
2
 
3
- require 'byebug/commands/info/args'
4
3
  require 'byebug/commands/info/breakpoints'
5
- require 'byebug/commands/info/catch'
6
4
  require 'byebug/commands/info/display'
7
5
  require 'byebug/commands/info/file'
8
6
  require 'byebug/commands/info/line'
@@ -16,17 +14,22 @@ module Byebug
16
14
  include Subcommands
17
15
 
18
16
  self.allow_in_control = true
17
+ self.allow_in_post_mortem = true
19
18
 
20
- def regexp
19
+ def self.regexp
21
20
  /^\s* i(?:nfo)? (?:\s+ (.+))? \s*$/x
22
21
  end
23
22
 
24
- def description
23
+ def self.description
25
24
  <<-EOD
26
25
  info[ subcommand]
27
26
 
28
- Generic command for showing things about the program being debugged.
27
+ #{short_description}
29
28
  EOD
30
29
  end
30
+
31
+ def self.short_description
32
+ 'Shows several informations about the program being debugged'
33
+ end
31
34
  end
32
35
  end
@@ -6,11 +6,25 @@ module Byebug
6
6
  #
7
7
  # Information about current breakpoints
8
8
  #
9
- class BreakpointsSubcommand < Command
10
- def regexp
9
+ class BreakpointsCommand < Command
10
+ self.allow_in_post_mortem = true
11
+
12
+ def self.regexp
11
13
  /^\s* b(?:reakpoints)? (?:\s+ (.+))? \s*$/x
12
14
  end
13
15
 
16
+ def self.description
17
+ <<-EOD
18
+ inf[o] b[reakpoints]
19
+
20
+ #{short_description}
21
+ EOD
22
+ end
23
+
24
+ def self.short_description
25
+ 'Status of user settable breakpoints'
26
+ end
27
+
14
28
  def execute
15
29
  return puts('No breakpoints.') if Byebug.breakpoints.empty?
16
30
 
@@ -28,18 +42,6 @@ module Byebug
28
42
  breakpoints.each { |b| info_breakpoint(b) }
29
43
  end
30
44
 
31
- def short_description
32
- 'Status of user settable breakpoints.'
33
- end
34
-
35
- def description
36
- <<-EOD
37
- inf[o] b[reakpoints]
38
-
39
- #{short_description}
40
- EOD
41
- end
42
-
43
45
  private
44
46
 
45
47
  def info_breakpoint(brkpt)
@@ -6,37 +6,37 @@ module Byebug
6
6
  #
7
7
  # Information about display expressions
8
8
  #
9
- class DisplaySubcommand < Command
10
- def regexp
9
+ class DisplayCommand < Command
10
+ self.allow_in_post_mortem = true
11
+
12
+ def self.regexp
11
13
  /^\s* d(?:isplay)? \s*$/x
12
14
  end
13
15
 
14
- def execute
15
- display = @state.display
16
+ def self.description
17
+ <<-EOD
18
+ inf[o] d[display]
19
+
20
+ #{short_description}
21
+ EOD
22
+ end
23
+
24
+ def self.short_description
25
+ 'List of expressions to display when program stops'
26
+ end
16
27
 
17
- unless display.find { |d| d[0] }
28
+ def execute
29
+ unless Byebug.displays.find { |d| d[0] }
18
30
  return puts('There are no auto-display expressions now.')
19
31
  end
20
32
 
21
33
  puts 'Auto-display expressions now in effect:'
22
34
  puts 'Num Enb Expression'
23
35
 
24
- display.each_with_index do |d, i|
36
+ Byebug.displays.each_with_index do |d, i|
25
37
  puts(format('%3d: %s %s', i + 1, d[0] ? 'y' : 'n', d[1]))
26
38
  end
27
39
  end
28
-
29
- def short_description
30
- 'List of expressions to display when program stops'
31
- end
32
-
33
- def description
34
- <<-EOD
35
- inf[o] d[display]
36
-
37
- #{short_description}
38
- EOD
39
- end
40
40
  end
41
41
  end
42
42
  end
@@ -8,15 +8,32 @@ module Byebug
8
8
  #
9
9
  # Information about a particular source file
10
10
  #
11
- class FileSubcommand < Command
11
+ class FileCommand < Command
12
12
  include Helpers::FileHelper
13
13
 
14
- def regexp
14
+ self.allow_in_post_mortem = true
15
+
16
+ def self.regexp
15
17
  /^\s* f(?:ile)? (?:\s+ (\S+))? \s*$/x
16
18
  end
17
19
 
20
+ def self.description
21
+ <<-EOD
22
+ inf[o] f[ile]
23
+
24
+ #{short_description}
25
+
26
+ It informs about file name, number of lines, possible breakpoints in
27
+ the file, last modification time and sha1 digest.
28
+ EOD
29
+ end
30
+
31
+ def self.short_description
32
+ 'Information about a particular source file.'
33
+ end
34
+
18
35
  def execute
19
- file = @match[1] || @state.file
36
+ file = @match[1] || frame.file
20
37
  unless File.exist?(file)
21
38
  return errmsg(pr('info.errors.undefined_file', file: file))
22
39
  end
@@ -25,8 +42,7 @@ module Byebug
25
42
 
26
43
  File #{info_file_basic(file)}
27
44
 
28
- Breakpoint line numbers:
29
- #{info_file_breakpoints(file)}
45
+ Breakpoint line numbers: #{info_file_breakpoints(file)}
30
46
 
31
47
  Modification time: #{info_file_mtime(file)}
32
48
 
@@ -35,21 +51,6 @@ module Byebug
35
51
  EOC
36
52
  end
37
53
 
38
- def short_description
39
- 'Information about a particular source file.'
40
- end
41
-
42
- def description
43
- <<-EOD
44
- inf[o] f[ile]
45
-
46
- #{short_description}
47
-
48
- It informs about file name, number of lines, possible breakpoints in
49
- the file, last modification time and sha1 digest.
50
- EOD
51
- end
52
-
53
54
  private
54
55
 
55
56
  def info_file_basic(file)
@@ -64,8 +65,7 @@ module Byebug
64
65
  breakpoints = Breakpoint.potential_lines(file)
65
66
  return unless breakpoints
66
67
 
67
- breakpoints.to_a.sort.columnize(line_prefix: ' ',
68
- displaywidth: Setting[:width])
68
+ breakpoints.to_a.sort.join(' ')
69
69
  end
70
70
 
71
71
  def info_file_mtime(file)
@@ -6,26 +6,28 @@ module Byebug
6
6
  #
7
7
  # Information about current location
8
8
  #
9
- class LineSubcommand < Command
10
- def regexp
11
- /^\s* l(?:ine)? \s*$/x
12
- end
9
+ class LineCommand < Command
10
+ self.allow_in_post_mortem = true
13
11
 
14
- def execute
15
- puts "Line #{@state.line} of \"#{@state.file}\""
16
- end
17
-
18
- def short_description
19
- 'Line number and file name of current position in source file.'
12
+ def self.regexp
13
+ /^\s* l(?:ine)? \s*$/x
20
14
  end
21
15
 
22
- def description
16
+ def self.description
23
17
  <<-EOD
24
18
  inf[o] l[ine]
25
19
 
26
20
  #{short_description}
27
21
  EOD
28
22
  end
23
+
24
+ def self.short_description
25
+ 'Line number and file name of current position in source file.'
26
+ end
27
+
28
+ def execute
29
+ puts "Line #{frame.line} of \"#{frame.file}\""
30
+ end
29
31
  end
30
32
  end
31
33
  end
@@ -6,32 +6,28 @@ module Byebug
6
6
  #
7
7
  # Information about arguments of the current method/block
8
8
  #
9
- class ProgramSubcommand < Command
10
- def regexp
9
+ class ProgramCommand < Command
10
+ self.allow_in_post_mortem = true
11
+
12
+ def self.regexp
11
13
  /^\s* p(?:rogram)? \s*$/x
12
14
  end
13
15
 
14
- def execute
15
- if @state.context.dead?
16
- puts 'The program crashed.'
17
- excpt = Byebug.last_exception
18
- return puts("Exception: #{excpt.inspect}") if excpt
19
- end
16
+ def self.description
17
+ <<-EOD
18
+ inf[o] p[rogram]
20
19
 
21
- puts 'Program stopped. '
22
- format_stop_reason @state.context.stop_reason
20
+ #{short_description}
21
+ EOD
23
22
  end
24
23
 
25
- def short_description
24
+ def self.short_description
26
25
  'Information about the current status of the debugged program.'
27
26
  end
28
27
 
29
- def description
30
- <<-EOD
31
- inf[o] p[rogram]
32
-
33
- #{short_description}
34
- EOD
28
+ def execute
29
+ puts 'Program stopped. '
30
+ format_stop_reason context.stop_reason
35
31
  end
36
32
 
37
33
  private
@@ -6,23 +6,25 @@ module Byebug
6
6
  #
7
7
  class InterruptCommand < Command
8
8
  self.allow_in_control = true
9
- self.allow_in_post_mortem = false
10
9
 
11
- def regexp
12
- /^\s*i(?:nterrupt)?\s*$/
10
+ def self.regexp
11
+ /^\s*int(?:errupt)?\s*$/
13
12
  end
14
13
 
15
- def execute
16
- context = Byebug.thread_context(Thread.main)
17
- context.interrupt
18
- end
19
-
20
- def description
14
+ def self.description
21
15
  <<-EOD
22
- i[nterrupt]
16
+ int[errupt]
23
17
 
24
- Interrupts the program.
18
+ #{short_description}
25
19
  EOD
26
20
  end
21
+
22
+ def self.short_description
23
+ 'Interrupts the program'
24
+ end
25
+
26
+ def execute
27
+ Byebug.thread_context(Thread.main).interrupt
28
+ end
27
29
  end
28
30
  end
@@ -6,24 +6,30 @@ module Byebug
6
6
  # Enter IRB from byebug's prompt
7
7
  #
8
8
  class IrbCommand < Command
9
- def regexp
9
+ self.allow_in_post_mortem = true
10
+
11
+ def self.regexp
10
12
  /^\s* irb \s*$/x
11
13
  end
12
14
 
15
+ def self.description
16
+ <<-EOD
17
+ irb
18
+
19
+ #{short_description}
20
+ EOD
21
+ end
22
+
23
+ def self.short_description
24
+ 'Starts an IRB session'
25
+ end
26
+
13
27
  def execute
14
- unless @state.interface.is_a?(LocalInterface)
28
+ unless processor.interface.is_a?(LocalInterface)
15
29
  return errmsg(pr('base.errors.only_local'))
16
30
  end
17
31
 
18
32
  IRB.start(__FILE__)
19
33
  end
20
-
21
- def description
22
- <<-EOD
23
- irb
24
-
25
- Starts an Interactive Ruby (IRB) session.
26
- EOD
27
- end
28
34
  end
29
35
  end
@@ -7,33 +7,39 @@ module Byebug
7
7
  class KillCommand < Command
8
8
  self.allow_in_control = true
9
9
 
10
- def regexp
10
+ def self.regexp
11
11
  /^\s* (?:kill) \s* (?:\s+(\S+))? \s*$/x
12
12
  end
13
13
 
14
+ def self.description
15
+ <<-EOD
16
+ kill[ signal]
17
+
18
+ #{short_description}
19
+
20
+ Equivalent of Process.kill(Process.pid)
21
+ EOD
22
+ end
23
+
24
+ def self.short_description
25
+ 'Sends a signal to the current process'
26
+ end
27
+
14
28
  def execute
15
29
  if @match[1]
16
30
  signame = @match[1]
31
+
17
32
  unless Signal.list.member?(signame)
18
- errmsg("signal name #{signame} is not a signal I know about\n")
19
- return false
33
+ return errmsg("signal name #{signame} is not a signal I know about\n")
20
34
  end
21
- @state.interface.close if 'KILL' == signame
22
35
  else
23
36
  return unless confirm('Really kill? (y/n) ')
37
+
24
38
  signame = 'KILL'
25
39
  end
26
40
 
41
+ processor.interface.close if 'KILL' == signame
27
42
  Process.kill(signame, Process.pid)
28
43
  end
29
-
30
- def description
31
- <<-EOD
32
- kill[ signal]
33
-
34
- Send [signal] to Process.pid
35
- Equivalent of Process.kill(Process.pid)
36
- EOD
37
- end
38
44
  end
39
45
  end