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
@@ -9,11 +9,34 @@ module Byebug
9
9
  include Helpers::ParseHelper
10
10
 
11
11
  self.allow_in_control = true
12
+ self.allow_in_post_mortem = true
12
13
 
13
- def regexp
14
+ def self.regexp
14
15
  /^\s* set (?:\s+(?<setting>\w+))? (?:\s+(?<value>\S+))? \s*$/x
15
16
  end
16
17
 
18
+ def self.description
19
+ <<-EOD
20
+ set <setting> <value>
21
+
22
+ #{short_description}
23
+
24
+ Boolean values take "on", "off", "true", "false", "1" or "0". If you
25
+ don't specify a value, the boolean setting will be enabled. Conversely,
26
+ you can use "set no<setting>" to disable them.
27
+
28
+ You can see these environment settings with the "show" command.
29
+ EOD
30
+ end
31
+
32
+ def self.short_description
33
+ 'Modifies byebug settings'
34
+ end
35
+
36
+ def self.help
37
+ super + Setting.help_all
38
+ end
39
+
17
40
  def execute
18
41
  key = @match[:setting]
19
42
  value = @match[:value]
@@ -36,6 +59,8 @@ module Byebug
36
59
  puts setting.to_s
37
60
  end
38
61
 
62
+ private
63
+
39
64
  def get_onoff(arg, default)
40
65
  return default if arg.nil?
41
66
 
@@ -48,23 +73,5 @@ module Byebug
48
73
  [nil, pr('set.errors.on_off', arg: arg)]
49
74
  end
50
75
  end
51
-
52
- def help
53
- description + Setting.help_all
54
- end
55
-
56
- def description
57
- <<-EOD
58
- set <setting> <value>
59
-
60
- Modifies parts of byebug environment.
61
-
62
- Boolean values take "on", "off", "true", "false", "1" or "0". If you
63
- don't specify a value, the boolean setting will be enabled. Conversely,
64
- you can use "set no<setting>" to disable them.
65
-
66
- You can see these environment settings with the "show" command.
67
- EOD
68
- end
69
76
  end
70
77
  end
@@ -6,11 +6,30 @@ module Byebug
6
6
  #
7
7
  class ShowCommand < 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* show (?:\s+(?<setting>\w+))? \s*$/x
12
13
  end
13
14
 
15
+ def self.description
16
+ <<-EOD
17
+ show <setting> <value>
18
+
19
+ #{short_description}
20
+
21
+ You can change them with the "set" command.
22
+ EOD
23
+ end
24
+
25
+ def self.short_description
26
+ 'Shows byebug settings'
27
+ end
28
+
29
+ def self.help
30
+ super + Setting.help_all
31
+ end
32
+
14
33
  def execute
15
34
  key = @match[:setting]
16
35
  return puts(help) unless key
@@ -20,18 +39,5 @@ module Byebug
20
39
 
21
40
  puts Setting.settings[setting.to_sym]
22
41
  end
23
-
24
- def help
25
- description + Setting.help_all
26
- end
27
-
28
- def description
29
- <<-EOD
30
- show <setting> <value>
31
-
32
- Generic command for showing byebug settings. You can change them with
33
- the "set" command.
34
- EOD
35
- end
36
42
  end
37
43
  end
@@ -8,32 +8,33 @@ module Byebug
8
8
  #
9
9
  class SourceCommand < Command
10
10
  self.allow_in_control = true
11
+ self.allow_in_post_mortem = true
11
12
 
12
- def regexp
13
+ def self.regexp
13
14
  /^\s* so(?:urce)? (?:\s+(\S+))? \s*$/x
14
15
  end
15
16
 
17
+ def self.description
18
+ <<-EOD
19
+ source <file>
20
+
21
+ #{short_description}
22
+ EOD
23
+ end
24
+
25
+ def self.short_description
26
+ 'Restores a previously saved byebug session'
27
+ end
28
+
16
29
  def execute
17
30
  return puts(help) unless @match[1]
18
31
 
19
- unless @state && @state.interface
20
- return errmsg(pr('source.errors.not_available'))
21
- end
22
-
23
32
  file = File.expand_path(@match[1]).strip
24
33
  unless File.exist?(file)
25
34
  return errmsg(pr('source.errors.not_found', file: file))
26
35
  end
27
36
 
28
- @state.interface.read_file(file)
29
- end
30
-
31
- def description
32
- <<-EOD
33
- source <file>
34
-
35
- Executes file <file> containing byebug commands.
36
- EOD
37
+ processor.interface.read_file(file)
37
38
  end
38
39
  end
39
40
  end
@@ -11,26 +11,28 @@ module Byebug
11
11
  class StepCommand < Command
12
12
  include Helpers::ParseHelper
13
13
 
14
- self.allow_in_post_mortem = false
15
-
16
- def regexp
14
+ def self.regexp
17
15
  /^\s* s(?:tep)? (?:\s+(\S+))? \s*$/x
18
16
  end
19
17
 
20
- def execute
21
- steps, err = parse_steps(@match[1], 'Steps')
22
- return errmsg(err) unless steps
18
+ def self.description
19
+ <<-EOD
20
+ s[tep][ times]
23
21
 
24
- @state.context.step_into(steps, @state.frame)
25
- @state.proceed
22
+ #{short_description}
23
+ EOD
26
24
  end
27
25
 
28
- def description
29
- <<-EOD
30
- s[tep][ nnn]
26
+ def self.short_description
27
+ 'Steps into blocks or methods one or more times'
28
+ end
31
29
 
32
- Steps (into methods) once or nnn times.
33
- EOD
30
+ def execute
31
+ steps, err = parse_steps(@match[1], 'Steps')
32
+ return errmsg(err) unless steps
33
+
34
+ context.step_into(steps, context.frame.pos)
35
+ processor.proceed!
34
36
  end
35
37
  end
36
38
  end
@@ -13,16 +13,20 @@ module Byebug
13
13
  class ThreadCommand < Command
14
14
  include Subcommands
15
15
 
16
- def regexp
16
+ def self.regexp
17
17
  /^\s* th(?:read)? (?:\s+ (.+))? \s*$/x
18
18
  end
19
19
 
20
- def description
20
+ def self.description
21
21
  <<-EOD
22
- th]read <subcommand>
22
+ th[read] <subcommand>
23
23
 
24
- Commands to manipulate threads.
24
+ #{short_description}
25
25
  EOD
26
26
  end
27
+
28
+ def self.short_description
29
+ 'Commands to manipulate threads'
30
+ end
27
31
  end
28
32
  end
@@ -8,28 +8,28 @@ module Byebug
8
8
  #
9
9
  # Information about the current thread
10
10
  #
11
- class CurrentSubcommand < Command
11
+ class CurrentCommand < Command
12
12
  include Helpers::ThreadHelper
13
13
 
14
- def regexp
14
+ def self.regexp
15
15
  /^\s* c(?:urrent)? \s*$/x
16
16
  end
17
17
 
18
- def execute
19
- display_context(@state.context)
20
- end
21
-
22
- def short_description
23
- 'Shows current thread information'
24
- end
25
-
26
- def description
18
+ def self.description
27
19
  <<-EOD
28
20
  th[read] c[urrent]
29
21
 
30
22
  #{short_description}
31
23
  EOD
32
24
  end
25
+
26
+ def self.short_description
27
+ 'Shows current thread information'
28
+ end
29
+
30
+ def execute
31
+ display_context(context)
32
+ end
33
33
  end
34
34
  end
35
35
  end
@@ -8,13 +8,25 @@ module Byebug
8
8
  #
9
9
  # Information about threads
10
10
  #
11
- class ListSubcommand < Command
11
+ class ListCommand < Command
12
12
  include Helpers::ThreadHelper
13
13
 
14
- def regexp
14
+ def self.regexp
15
15
  /^\s* l(?:ist)? \s*$/x
16
16
  end
17
17
 
18
+ def self.description
19
+ <<-EOD
20
+ th[read] l[ist] <thnum>
21
+
22
+ #{short_description}
23
+ EOD
24
+ end
25
+
26
+ def self.short_description
27
+ 'Lists all threads'
28
+ end
29
+
18
30
  def execute
19
31
  contexts = Byebug.contexts.sort_by(&:thnum)
20
32
 
@@ -24,18 +36,6 @@ module Byebug
24
36
 
25
37
  print(thread_list)
26
38
  end
27
-
28
- def short_description
29
- 'Lists all threads'
30
- end
31
-
32
- def description
33
- <<-EOD
34
- th[read] l[ist] <thnum>
35
-
36
- #{short_description}
37
- EOD
38
- end
39
39
  end
40
40
  end
41
41
  end
@@ -8,13 +8,25 @@ module Byebug
8
8
  #
9
9
  # Resumes the specified thread
10
10
  #
11
- class ResumeSubcommand < Command
11
+ class ResumeCommand < Command
12
12
  include Helpers::ThreadHelper
13
13
 
14
- def regexp
14
+ def self.regexp
15
15
  /^\s* r(?:esume)? (?: \s* (\d+))? \s*$/x
16
16
  end
17
17
 
18
+ def self.description
19
+ <<-EOD
20
+ th[read] r[esume] <thnum>
21
+
22
+ #{short_description}
23
+ EOD
24
+ end
25
+
26
+ def self.short_description
27
+ 'Resumes execution of the specified thread'
28
+ end
29
+
18
30
  def execute
19
31
  return puts(help) unless @match[1]
20
32
 
@@ -28,18 +40,6 @@ module Byebug
28
40
  context.resume
29
41
  display_context(context)
30
42
  end
31
-
32
- def short_description
33
- 'Resumes execution of the specified thread'
34
- end
35
-
36
- def description
37
- <<-EOD
38
- th[read] r[esume] <thnum>
39
-
40
- #{short_description}
41
- EOD
42
- end
43
43
  end
44
44
  end
45
45
  end
@@ -8,13 +8,25 @@ module Byebug
8
8
  #
9
9
  # Stops the specified thread
10
10
  #
11
- class StopSubcommand < Command
11
+ class StopCommand < Command
12
12
  include Helpers::ThreadHelper
13
13
 
14
- def regexp
14
+ def self.regexp
15
15
  /^\s* st(?:op)? (?: \s* (\d+))? \s*$/x
16
16
  end
17
17
 
18
+ def self.description
19
+ <<-EOD
20
+ th[read] st[op] <thnum>
21
+
22
+ #{short_description}
23
+ EOD
24
+ end
25
+
26
+ def self.short_description
27
+ 'Stops the execution of the specified thread'
28
+ end
29
+
18
30
  def execute
19
31
  return puts(help) unless @match[1]
20
32
 
@@ -24,18 +36,6 @@ module Byebug
24
36
  context.suspend
25
37
  display_context(context)
26
38
  end
27
-
28
- def short_description
29
- 'Stops the execution of the specified thread'
30
- end
31
-
32
- def description
33
- <<-EOD
34
- th[read] st[op] <thnum>
35
-
36
- #{short_description}
37
- EOD
38
- end
39
39
  end
40
40
  end
41
41
  end
@@ -8,13 +8,25 @@ module Byebug
8
8
  #
9
9
  # Switches to the specified thread
10
10
  #
11
- class SwitchSubcommand < Command
11
+ class SwitchCommand < Command
12
12
  include Helpers::ThreadHelper
13
13
 
14
- def regexp
14
+ def self.regexp
15
15
  /^\s* sw(?:itch)? (?: \s* (\d+))? \s*$/x
16
16
  end
17
17
 
18
+ def self.description
19
+ <<-EOD
20
+ th[read] sw[itch] <thnum>
21
+
22
+ #{short_description}
23
+ EOD
24
+ end
25
+
26
+ def self.short_description
27
+ 'Switches execution to the specified thread'
28
+ end
29
+
18
30
  def execute
19
31
  return puts(help) unless @match[1]
20
32
 
@@ -24,19 +36,8 @@ module Byebug
24
36
  display_context(context)
25
37
 
26
38
  context.switch
27
- @state.proceed
28
- end
29
39
 
30
- def short_description
31
- 'Switches execution to the specified thread'
32
- end
33
-
34
- def description
35
- <<-EOD
36
- th[read] sw[itch] <thnum>
37
-
38
- #{short_description}
39
- EOD
40
+ processor.proceed!
40
41
  end
41
42
  end
42
43
  end