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
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'pathname'
4
2
  require 'byebug/command'
5
3
  require 'byebug/helpers/frame'
@@ -13,27 +11,33 @@ module Byebug
13
11
  include Helpers::FrameHelper
14
12
  include Helpers::ParseHelper
15
13
 
16
- def regexp
17
- /^\s* down (?:\s+(\S+))? \s*$/x
18
- end
14
+ self.allow_in_post_mortem = true
19
15
 
20
- def execute
21
- pos, err = parse_steps(@match[1], 'Down')
22
- return errmsg(err) unless pos
23
-
24
- adjust_frame(-pos, false)
25
-
26
- ListCommand.new(@state).execute if Setting[:autolist]
16
+ def self.regexp
17
+ /^\s* down (?:\s+(\S+))? \s*$/x
27
18
  end
28
19
 
29
- def description
20
+ def self.description
30
21
  <<-EOD
31
22
  down[ count]
32
23
 
33
- Move to a lower frame in the stack trace.
24
+ #{short_description}
34
25
 
35
26
  Use the "bt" command to find out where you want to go.
36
27
  EOD
37
28
  end
29
+
30
+ def self.short_description
31
+ 'Moves to a lower frame in the stack trace'
32
+ end
33
+
34
+ def execute
35
+ pos, err = parse_steps(@match[1], 'Down')
36
+ return errmsg(err) unless pos
37
+
38
+ jump_frames(-pos)
39
+
40
+ ListCommand.new(processor).execute if Setting[:autolist]
41
+ end
38
42
  end
39
43
  end
@@ -6,45 +6,61 @@ module Byebug
6
6
  #
7
7
  class EditCommand < Command
8
8
  self.allow_in_control = true
9
+ self.allow_in_post_mortem = true
9
10
 
10
- def regexp
11
+ def self.regexp
11
12
  /^\s* ed(?:it)? (?:\s+(\S+))? \s*$/x
12
13
  end
13
14
 
14
- def execute
15
- if !@match[1]
16
- return errmsg(pr('edit.errors.state')) unless @state.file
17
- file = @state.file
18
- line = @state.line if @state.line
19
- elsif (@pos_match = /([^:]+)[:]([0-9]+)/.match(@match[1]))
20
- file, line = @pos_match.captures
21
- else
22
- file = @match[1]
23
- end
15
+ def self.description
16
+ <<-EOD
17
+ edit[ file:lineno]
24
18
 
25
- editor = ENV['EDITOR'] || 'vim'
26
- file = File.expand_path(file)
19
+ #{short_description}
27
20
 
28
- unless File.exist?(file)
29
- return errmsg(pr('edit.errors.not_exist', file: file))
30
- end
31
- unless File.readable?(file)
32
- return errmsg(pr('edit.errors.not_readable', file: file))
33
- end
21
+ With no argumnt, edits file containing most re line listed. Editing
22
+ targets can also be specified to start editing at a specific line in a
23
+ specific file
24
+ EOD
25
+ end
26
+
27
+ def self.short_description
28
+ 'Edits source files'
29
+ end
30
+
31
+ def execute
32
+ file, line = location(@match[1])
33
+ return edit_error('not_exist', file) unless File.exist?(file)
34
+ return edit_error('not_readable', file) unless File.readable?(file)
34
35
 
35
36
  cmd = line ? "#{editor} +#{line} #{file}" : "#{editor} #{file}"
36
37
 
37
38
  system(cmd)
38
39
  end
39
40
 
40
- def description
41
- <<-EOD
42
- edit[ file:lineno] Edit specified files.
41
+ private
43
42
 
44
- With no argument, edits file containing most recent line listed. Editing
45
- targets can also be specified to start editing at a specific line in a
46
- specific file.
47
- EOD
43
+ def location(matched)
44
+ if matched.nil?
45
+ file = frame.file
46
+ return errmsg(pr('edit.errors.state')) unless file
47
+ line = frame.line
48
+ elsif (@pos_match = /([^:]+)[:]([0-9]+)/.match(matched))
49
+ file, line = @pos_match.captures
50
+ else
51
+ file = matched
52
+ line = nil
53
+ end
54
+
55
+ [File.expand_path(file), line]
56
+ end
57
+
58
+ def editor
59
+ ENV['EDITOR'] || 'vim'
60
+ end
61
+
62
+ def edit_error(type, file)
63
+ errmsg(pr("edit.errors.#{type}", file: file))
48
64
  end
49
65
  end
50
66
  end
@@ -10,16 +10,22 @@ module Byebug
10
10
  class EnableCommand < Command
11
11
  include Subcommands
12
12
 
13
- def regexp
13
+ self.allow_in_post_mortem = true
14
+
15
+ def self.regexp
14
16
  /^\s* en(?:able)? (?:\s+ (.+))? \s*$/x
15
17
  end
16
18
 
17
- def description
19
+ def self.description
18
20
  <<-EOD
19
21
  en[able][[ b[reakpoints]| d[isplay])][ n1[ n2[ ...[ nn]]]]]
20
22
 
21
- Enables breakpoints or displays.
23
+ #{short_description}
22
24
  EOD
23
25
  end
26
+
27
+ def self.short_description
28
+ 'Enables breakpoints or displays'
29
+ end
24
30
  end
25
31
  end
@@ -8,22 +8,16 @@ module Byebug
8
8
  #
9
9
  # Enables all or specific breakpoints
10
10
  #
11
- class BreakpointsSubcommand < Command
11
+ class BreakpointsCommand < Command
12
12
  include Helpers::ToggleHelper
13
13
 
14
- def regexp
15
- /^\s* b(?:reakpoints)? (?:\s+ (.+))? \s*$/x
16
- end
17
-
18
- def execute
19
- enable_disable_breakpoints('enable', @match[1])
20
- end
14
+ self.allow_in_post_mortem = true
21
15
 
22
- def short_description
23
- 'Disable all or specific breakpoints'
16
+ def self.regexp
17
+ /^\s* b(?:reakpoints)? (?:\s+ (.+))? \s*$/x
24
18
  end
25
19
 
26
- def description
20
+ def self.description
27
21
  <<-EOD
28
22
  en[able] b[reakpoints][ <ids>]
29
23
 
@@ -33,6 +27,14 @@ module Byebug
33
27
  argument at all if you want to enable every breakpoint.
34
28
  EOD
35
29
  end
30
+
31
+ def self.short_description
32
+ 'Disable all or specific breakpoints'
33
+ end
34
+
35
+ def execute
36
+ enable_disable_breakpoints('enable', @match[1])
37
+ end
36
38
  end
37
39
  end
38
40
  end
@@ -8,22 +8,16 @@ module Byebug
8
8
  #
9
9
  # Enables all or specific displays
10
10
  #
11
- class DisplaySubcommand < Command
11
+ class DisplayCommand < Command
12
12
  include Helpers::ToggleHelper
13
13
 
14
- def regexp
15
- /^\s* d(?:isplay)? (?:\s+ (.+))? \s*$/x
16
- end
17
-
18
- def execute
19
- enable_disable_display('enable', @match[1])
20
- end
14
+ self.allow_in_post_mortem = true
21
15
 
22
- def short_description
23
- 'Enables expressions to be displayed when program stops.'
16
+ def self.regexp
17
+ /^\s* d(?:isplay)? (?:\s+ (.+))? \s*$/x
24
18
  end
25
19
 
26
- def description
20
+ def self.description
27
21
  <<-EOD
28
22
  en[able] d[isplay][ <id1> <id2> .. <idn>]
29
23
 
@@ -34,6 +28,14 @@ module Byebug
34
28
  specified, all displays are enabled.
35
29
  EOD
36
30
  end
31
+
32
+ def self.short_description
33
+ 'Enables expressions to be displayed when program stops.'
34
+ end
35
+
36
+ def execute
37
+ enable_disable_display('enable', @match[1])
38
+ end
37
39
  end
38
40
  end
39
41
  end
@@ -12,12 +12,27 @@ module Byebug
12
12
 
13
13
  self.allow_in_post_mortem = false
14
14
 
15
- def regexp
15
+ def self.regexp
16
16
  /^\s* fin(?:ish)? (?:\s+(\S+))? \s*$/x
17
17
  end
18
18
 
19
+ def self.description
20
+ <<-EOD
21
+ fin[ish][ n_frames]
22
+
23
+ #{short_description}
24
+
25
+ If no number is given, we run until the current frame returns. If a
26
+ number of frames `n_frames` is given, then we run until `n_frames`
27
+ return from the current position.
28
+ EOD
29
+ end
30
+
31
+ def self.short_description
32
+ 'Runs the program until frame returns'
33
+ end
34
+
19
35
  def execute
20
- max_frames = @state.context.stack_size - @state.frame
21
36
  if @match[1]
22
37
  n_frames, err = get_int(@match[1], 'finish', 0, max_frames - 1)
23
38
  return errmsg(err) unless n_frames
@@ -26,21 +41,15 @@ module Byebug
26
41
  end
27
42
 
28
43
  force = n_frames == 0 ? true : false
29
- @state.context.step_out(@state.frame + n_frames, force)
30
- @state.frame = 0
31
- @state.proceed
44
+ context.step_out(context.frame.pos + n_frames, force)
45
+ context.frame = 0
46
+ processor.proceed!
32
47
  end
33
48
 
34
- def description
35
- <<-EOD
36
- fin[ish][ n_frames]
37
-
38
- Execute until frame returns.
49
+ private
39
50
 
40
- If no number is given, we run until the current frame returns. If a
41
- number of frames `n_frames` is given, then we run until `n_frames`
42
- return from the current position.
43
- EOD
51
+ def max_frames
52
+ context.stack_size - context.frame.pos
44
53
  end
45
54
  end
46
55
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'pathname'
4
2
  require 'byebug/command'
5
3
  require 'byebug/helpers/frame'
@@ -13,28 +11,20 @@ module Byebug
13
11
  include Helpers::FrameHelper
14
12
  include Helpers::ParseHelper
15
13
 
16
- def regexp
17
- /^\s* f(?:rame)? (?:\s+(\S+))? \s*$/x
18
- end
19
-
20
- def execute
21
- unless @match[1]
22
- print(pr('frame.line', get_pr_arguments(@state.frame)))
23
- return
24
- end
25
-
26
- pos, err = get_int(@match[1], 'Frame')
27
- return errmsg(err) unless pos
14
+ self.allow_in_post_mortem = true
28
15
 
29
- adjust_frame(pos, true)
16
+ def self.regexp
17
+ /^\s* f(?:rame)? (?:\s+(\S+))? \s*$/x
30
18
  end
31
19
 
32
- def description
20
+ def self.description
33
21
  <<-EOD
34
22
  f[rame][ frame-number]
35
23
 
36
- Move the current frame to the specified frame number, or the 0 if no
37
- frame-number has been given.
24
+ #{short_description}
25
+
26
+ If a frame number has been specified, to moves to that frame. Otherwise
27
+ it moves to the newest frame.
38
28
 
39
29
  A negative number indicates position from the other end, so "frame -1"
40
30
  moves to the oldest frame, and "frame 0" moves to the newest frame.
@@ -46,5 +36,18 @@ module Byebug
46
36
  Use the "bt" command to find out where you want to go.
47
37
  EOD
48
38
  end
39
+
40
+ def self.short_description
41
+ 'Moves to a frame in the call stack'
42
+ end
43
+
44
+ def execute
45
+ return print(pr('frame.line', context.frame.to_hash)) unless @match[1]
46
+
47
+ pos, err = get_int(@match[1], 'Frame')
48
+ return errmsg(err) unless pos
49
+
50
+ switch_to_frame(pos)
51
+ end
49
52
  end
50
53
  end
@@ -1,4 +1,5 @@
1
1
  require 'byebug/command'
2
+ require 'byebug/errors'
2
3
 
3
4
  module Byebug
4
5
  #
@@ -6,34 +7,56 @@ module Byebug
6
7
  #
7
8
  class HelpCommand < Command
8
9
  self.allow_in_control = true
10
+ self.allow_in_post_mortem = true
9
11
 
10
- def regexp
12
+ def self.regexp
11
13
  /^\s* h(?:elp)? (?:\s+(\S+))? (?:\s+(\S+))? \s*$/x
12
14
  end
13
15
 
16
+ def self.description
17
+ <<-EOD
18
+ h[elp][ <cmd>[ <subcmd>]]
19
+
20
+ #{short_description}
21
+
22
+ help -- prints a summary of all commands
23
+ help <cmd> -- prints help on command <cmd>
24
+ help <cmd> <subcmd> -- prints help on <cmd>'s subcommand <subcmd>
25
+ EOD
26
+ end
27
+
28
+ def self.short_description
29
+ 'Helps you using byebug'
30
+ end
31
+
14
32
  def execute
15
- return puts(help) unless @match[1]
33
+ return help_for_all unless @match[1]
16
34
 
17
- cmd = Byebug.commands.find { |c| c.to_name == @match[1] }
18
- return errmsg(pr('help.errors.undefined', cmd: @match[1])) unless cmd
35
+ return help_for(@match[1], command) unless @match[2]
19
36
 
20
- cmd = cmd.new(@state)
21
- return puts(cmd.help) unless @match[2]
37
+ help_for(@match[2], subcommand)
38
+ end
22
39
 
23
- subcmd = cmd.subcommands.find(@match[2])
24
- return errmsg(pr('help.errors.undefined', cmd: @match[2])) unless subcmd
40
+ private
25
41
 
26
- puts(subcmd.help)
42
+ def help_for_all
43
+ puts(processor.command_list.to_s)
27
44
  end
28
45
 
29
- def description
30
- <<-EOD
31
- h[elp][ <cmd>[ <subcmd>]]
46
+ def help_for(input, cmd)
47
+ fail CommandNotFound.new(input, command) unless cmd
32
48
 
33
- help -- prints this help.
34
- help <cmd> -- prints help on command <cmd>.
35
- help <cmd> <subcmd> -- prints help on <cmd>'s subcommand <subcmd>.
36
- EOD
49
+ puts(cmd.help)
50
+ end
51
+
52
+ def command
53
+ @command ||= processor.command_list.match(@match[1])
54
+ end
55
+
56
+ def subcommand
57
+ return unless command
58
+
59
+ @subcommand ||= command.subcommand_list.match(@match[2])
37
60
  end
38
61
  end
39
62
  end