byebug 9.0.5 → 11.1.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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +399 -264
- data/CONTRIBUTING.md +12 -19
- data/GUIDE.md +40 -26
- data/LICENSE +18 -18
- data/README.md +103 -74
- data/exe/byebug +6 -0
- data/ext/byebug/breakpoint.c +2 -2
- data/ext/byebug/byebug.c +26 -31
- data/ext/byebug/byebug.h +44 -28
- data/ext/byebug/context.c +45 -32
- data/ext/byebug/extconf.rb +7 -5
- data/ext/byebug/locker.c +4 -4
- data/ext/byebug/threads.c +12 -12
- data/lib/byebug/attacher.rb +18 -4
- data/lib/byebug/breakpoint.rb +26 -6
- data/lib/byebug/command.rb +20 -14
- data/lib/byebug/command_list.rb +3 -1
- data/lib/byebug/commands/break.rb +36 -22
- data/lib/byebug/commands/catch.rb +16 -18
- data/lib/byebug/commands/condition.rb +11 -11
- data/lib/byebug/commands/continue.rb +32 -12
- data/lib/byebug/commands/debug.rb +7 -5
- data/lib/byebug/commands/delete.rb +13 -11
- data/lib/byebug/commands/disable/breakpoints.rb +7 -5
- data/lib/byebug/commands/disable/display.rb +7 -5
- data/lib/byebug/commands/disable.rb +8 -6
- data/lib/byebug/commands/display.rb +11 -9
- data/lib/byebug/commands/down.rb +10 -8
- data/lib/byebug/commands/edit.rb +11 -8
- data/lib/byebug/commands/enable/breakpoints.rb +7 -5
- data/lib/byebug/commands/enable/display.rb +7 -5
- data/lib/byebug/commands/enable.rb +8 -6
- data/lib/byebug/commands/finish.rb +9 -7
- data/lib/byebug/commands/frame.rb +11 -9
- data/lib/byebug/commands/help.rb +7 -5
- data/lib/byebug/commands/history.rb +7 -5
- data/lib/byebug/commands/info/breakpoints.rb +18 -14
- data/lib/byebug/commands/info/display.rb +16 -9
- data/lib/byebug/commands/info/file.rb +13 -14
- data/lib/byebug/commands/info/line.rb +5 -3
- data/lib/byebug/commands/info/program.rb +8 -6
- data/lib/byebug/commands/info.rb +11 -9
- data/lib/byebug/commands/interrupt.rb +8 -4
- data/lib/byebug/commands/irb.rb +13 -12
- data/lib/byebug/commands/kill.rb +11 -11
- data/lib/byebug/commands/list.rb +41 -46
- data/lib/byebug/commands/method.rb +10 -8
- data/lib/byebug/commands/next.rb +8 -6
- data/lib/byebug/commands/pry.rb +10 -10
- data/lib/byebug/commands/quit.rb +10 -8
- data/lib/byebug/commands/restart.rb +30 -11
- data/lib/byebug/commands/save.rb +10 -8
- data/lib/byebug/commands/set.rb +13 -11
- data/lib/byebug/commands/show.rb +7 -5
- data/lib/byebug/commands/skip.rb +85 -0
- data/lib/byebug/commands/source.rb +7 -7
- data/lib/byebug/commands/step.rb +8 -6
- data/lib/byebug/commands/thread/current.rb +6 -4
- data/lib/byebug/commands/thread/list.rb +7 -5
- data/lib/byebug/commands/thread/resume.rb +7 -7
- data/lib/byebug/commands/thread/stop.rb +6 -4
- data/lib/byebug/commands/thread/switch.rb +6 -4
- data/lib/byebug/commands/thread.rb +11 -9
- data/lib/byebug/commands/tracevar.rb +10 -11
- data/lib/byebug/commands/undisplay.rb +12 -11
- data/lib/byebug/commands/untracevar.rb +8 -6
- data/lib/byebug/commands/up.rb +10 -8
- data/lib/byebug/commands/var/all.rb +7 -5
- data/lib/byebug/commands/var/args.rb +6 -4
- data/lib/byebug/commands/var/const.rb +9 -9
- data/lib/byebug/commands/var/global.rb +5 -3
- data/lib/byebug/commands/var/instance.rb +6 -4
- data/lib/byebug/commands/var/local.rb +6 -4
- data/lib/byebug/commands/var.rb +12 -10
- data/lib/byebug/commands/where.rb +9 -7
- data/lib/byebug/commands.rb +40 -37
- data/lib/byebug/context.rb +7 -5
- data/lib/byebug/core.rb +26 -25
- data/lib/byebug/errors.rb +4 -2
- data/lib/byebug/frame.rb +19 -22
- data/lib/byebug/helpers/bin.rb +47 -0
- data/lib/byebug/helpers/eval.rb +15 -13
- data/lib/byebug/helpers/file.rb +6 -4
- data/lib/byebug/helpers/frame.rb +7 -5
- data/lib/byebug/helpers/parse.rb +5 -5
- data/lib/byebug/helpers/path.rb +9 -11
- data/lib/byebug/helpers/reflection.rb +2 -0
- data/lib/byebug/helpers/string.rb +11 -2
- data/lib/byebug/helpers/thread.rb +10 -8
- data/lib/byebug/helpers/toggle.rb +28 -27
- data/lib/byebug/helpers/var.rb +9 -7
- data/lib/byebug/history.rb +20 -11
- data/lib/byebug/interface.rb +13 -11
- data/lib/byebug/interfaces/local_interface.rb +25 -7
- data/lib/byebug/interfaces/remote_interface.rb +21 -9
- data/lib/byebug/interfaces/script_interface.rb +4 -1
- data/lib/byebug/interfaces/test_interface.rb +5 -3
- data/lib/byebug/option_setter.rb +14 -12
- data/lib/byebug/printers/base.rb +10 -10
- data/lib/byebug/printers/plain.rb +9 -8
- data/lib/byebug/printers/texts/base.yml +7 -3
- data/lib/byebug/printers/texts/plain.yml +1 -1
- data/lib/byebug/processors/command_processor.rb +11 -12
- data/lib/byebug/processors/control_processor.rb +4 -6
- data/lib/byebug/processors/post_mortem_processor.rb +4 -2
- data/lib/byebug/processors/script_processor.rb +7 -3
- data/lib/byebug/remote/client.rb +57 -0
- data/lib/byebug/remote/server.rb +47 -0
- data/lib/byebug/remote.rb +46 -66
- data/lib/byebug/runner.rb +43 -49
- data/lib/byebug/setting.rb +11 -5
- data/lib/byebug/settings/autoirb.rb +7 -5
- data/lib/byebug/settings/autolist.rb +7 -5
- data/lib/byebug/settings/autopry.rb +7 -5
- data/lib/byebug/settings/autosave.rb +4 -2
- data/lib/byebug/settings/basename.rb +4 -2
- data/lib/byebug/settings/callstyle.rb +4 -3
- data/lib/byebug/settings/fullpath.rb +4 -2
- data/lib/byebug/settings/histfile.rb +5 -3
- data/lib/byebug/settings/histsize.rb +4 -2
- data/lib/byebug/settings/linetrace.rb +6 -4
- data/lib/byebug/settings/listsize.rb +4 -2
- data/lib/byebug/settings/post_mortem.rb +6 -4
- data/lib/byebug/settings/savefile.rb +4 -2
- data/lib/byebug/settings/stack_on_error.rb +4 -2
- data/lib/byebug/settings/width.rb +3 -1
- data/lib/byebug/source_file_formatter.rb +71 -0
- data/lib/byebug/subcommands.rb +6 -4
- data/lib/byebug/version.rb +2 -1
- data/lib/byebug.rb +3 -1
- metadata +22 -20
- data/bin/byebug +0 -7
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../helpers/file"
|
2
4
|
|
3
5
|
module Byebug
|
4
6
|
#
|
@@ -10,6 +12,7 @@ module Byebug
|
|
10
12
|
#
|
11
13
|
class FileCommand < Command
|
12
14
|
include Helpers::FileHelper
|
15
|
+
include Helpers::StringHelper
|
13
16
|
|
14
17
|
self.allow_in_post_mortem = true
|
15
18
|
|
@@ -18,28 +21,25 @@ module Byebug
|
|
18
21
|
end
|
19
22
|
|
20
23
|
def self.description
|
21
|
-
<<-
|
24
|
+
<<-DESCRIPTION
|
22
25
|
inf[o] f[ile]
|
23
26
|
|
24
27
|
#{short_description}
|
25
28
|
|
26
29
|
It informs about file name, number of lines, possible breakpoints in
|
27
30
|
the file, last modification time and sha1 digest.
|
28
|
-
|
31
|
+
DESCRIPTION
|
29
32
|
end
|
30
33
|
|
31
34
|
def self.short_description
|
32
|
-
|
35
|
+
"Information about a particular source file."
|
33
36
|
end
|
34
37
|
|
35
38
|
def execute
|
36
39
|
file = @match[1] || frame.file
|
37
|
-
unless File.exist?(file)
|
38
|
-
return errmsg(pr('info.errors.undefined_file', file: file))
|
39
|
-
end
|
40
|
-
|
41
|
-
puts <<-EOC.gsub(/^ {6}/, '')
|
40
|
+
return errmsg(pr("info.errors.undefined_file", file: file)) unless File.exist?(file)
|
42
41
|
|
42
|
+
puts prettify <<-RUBY
|
43
43
|
File #{info_file_basic(file)}
|
44
44
|
|
45
45
|
Breakpoint line numbers: #{info_file_breakpoints(file)}
|
@@ -47,8 +47,7 @@ module Byebug
|
|
47
47
|
Modification time: #{info_file_mtime(file)}
|
48
48
|
|
49
49
|
Sha1 Signature: #{info_file_sha1(file)}
|
50
|
-
|
51
|
-
EOC
|
50
|
+
RUBY
|
52
51
|
end
|
53
52
|
|
54
53
|
private
|
@@ -57,7 +56,7 @@ module Byebug
|
|
57
56
|
path = File.expand_path(file)
|
58
57
|
return unless File.exist?(path)
|
59
58
|
|
60
|
-
s = n_lines(path) == 1 ?
|
59
|
+
s = n_lines(path) == 1 ? "" : "s"
|
61
60
|
"#{path} (#{n_lines(path)} line#{s})"
|
62
61
|
end
|
63
62
|
|
@@ -65,7 +64,7 @@ module Byebug
|
|
65
64
|
breakpoints = Breakpoint.potential_lines(file)
|
66
65
|
return unless breakpoints
|
67
66
|
|
68
|
-
breakpoints.to_a.sort.join(
|
67
|
+
breakpoints.to_a.sort.join(" ")
|
69
68
|
end
|
70
69
|
|
71
70
|
def info_file_mtime(file)
|
@@ -73,7 +72,7 @@ module Byebug
|
|
73
72
|
end
|
74
73
|
|
75
74
|
def info_file_sha1(file)
|
76
|
-
require
|
75
|
+
require "digest/sha1"
|
77
76
|
Digest::SHA1.hexdigest(file)
|
78
77
|
end
|
79
78
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Byebug
|
2
4
|
#
|
3
5
|
# Reopens the +info+ command to define the +line+ subcommand
|
@@ -14,15 +16,15 @@ module Byebug
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def self.description
|
17
|
-
<<-
|
19
|
+
<<-DESCRIPTION
|
18
20
|
inf[o] l[ine]
|
19
21
|
|
20
22
|
#{short_description}
|
21
|
-
|
23
|
+
DESCRIPTION
|
22
24
|
end
|
23
25
|
|
24
26
|
def self.short_description
|
25
|
-
|
27
|
+
"Line number and file name of current position in source file."
|
26
28
|
end
|
27
29
|
|
28
30
|
def execute
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Byebug
|
2
4
|
#
|
3
5
|
# Reopens the +info+ command to define the +args+ subcommand
|
@@ -14,19 +16,19 @@ module Byebug
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def self.description
|
17
|
-
<<-
|
19
|
+
<<-DESCRIPTION
|
18
20
|
inf[o] p[rogram]
|
19
21
|
|
20
22
|
#{short_description}
|
21
|
-
|
23
|
+
DESCRIPTION
|
22
24
|
end
|
23
25
|
|
24
26
|
def self.short_description
|
25
|
-
|
27
|
+
"Information about the current status of the debugged program."
|
26
28
|
end
|
27
29
|
|
28
30
|
def execute
|
29
|
-
puts
|
31
|
+
puts "Program stopped. "
|
30
32
|
format_stop_reason context.stop_reason
|
31
33
|
end
|
32
34
|
|
@@ -37,9 +39,9 @@ module Byebug
|
|
37
39
|
when :step
|
38
40
|
puts "It stopped after stepping, next'ing or initial start."
|
39
41
|
when :breakpoint
|
40
|
-
puts
|
42
|
+
puts "It stopped at a breakpoint."
|
41
43
|
when :catchpoint
|
42
|
-
puts
|
44
|
+
puts "It stopped at a catchpoint."
|
43
45
|
end
|
44
46
|
end
|
45
47
|
end
|
data/lib/byebug/commands/info.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
require_relative "../subcommands"
|
4
|
+
|
5
|
+
require_relative "../commands/info/breakpoints"
|
6
|
+
require_relative "../commands/info/display"
|
7
|
+
require_relative "../commands/info/file"
|
8
|
+
require_relative "../commands/info/line"
|
9
|
+
require_relative "../commands/info/program"
|
8
10
|
|
9
11
|
module Byebug
|
10
12
|
#
|
@@ -21,15 +23,15 @@ module Byebug
|
|
21
23
|
end
|
22
24
|
|
23
25
|
def self.description
|
24
|
-
<<-
|
26
|
+
<<-DESCRIPTION
|
25
27
|
info[ subcommand]
|
26
28
|
|
27
29
|
#{short_description}
|
28
|
-
|
30
|
+
DESCRIPTION
|
29
31
|
end
|
30
32
|
|
31
33
|
def self.short_description
|
32
|
-
|
34
|
+
"Shows several informations about the program being debugged"
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../command"
|
2
4
|
|
3
5
|
module Byebug
|
4
6
|
#
|
@@ -12,18 +14,20 @@ module Byebug
|
|
12
14
|
end
|
13
15
|
|
14
16
|
def self.description
|
15
|
-
<<-
|
17
|
+
<<-DESCRIPTION
|
16
18
|
int[errupt]
|
17
19
|
|
18
20
|
#{short_description}
|
19
|
-
|
21
|
+
DESCRIPTION
|
20
22
|
end
|
21
23
|
|
22
24
|
def self.short_description
|
23
|
-
|
25
|
+
"Interrupts the program"
|
24
26
|
end
|
25
27
|
|
26
28
|
def execute
|
29
|
+
Byebug.start
|
30
|
+
|
27
31
|
Byebug.thread_context(Thread.main).interrupt
|
28
32
|
end
|
29
33
|
end
|
data/lib/byebug/commands/irb.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../command"
|
4
|
+
require "irb"
|
5
|
+
require "English"
|
3
6
|
|
4
7
|
module Byebug
|
5
8
|
#
|
@@ -13,23 +16,21 @@ module Byebug
|
|
13
16
|
end
|
14
17
|
|
15
18
|
def self.description
|
16
|
-
<<-
|
19
|
+
<<-DESCRIPTION
|
17
20
|
irb
|
18
21
|
|
19
22
|
#{short_description}
|
20
|
-
|
23
|
+
DESCRIPTION
|
21
24
|
end
|
22
25
|
|
23
26
|
def self.short_description
|
24
|
-
|
27
|
+
"Starts an IRB session"
|
25
28
|
end
|
26
29
|
|
27
30
|
def execute
|
28
|
-
unless processor.interface.instance_of?(LocalInterface)
|
29
|
-
return errmsg(pr('base.errors.only_local'))
|
30
|
-
end
|
31
|
+
return errmsg(pr("base.errors.only_local")) unless processor.interface.instance_of?(LocalInterface)
|
31
32
|
|
32
|
-
# @todo IRB tries to parse ARGV so we must clear it (see #197). Add a
|
33
|
+
# @todo IRB tries to parse $ARGV so we must clear it (see #197). Add a
|
33
34
|
# test case for it so we can remove this comment.
|
34
35
|
with_clean_argv { IRB.start }
|
35
36
|
end
|
@@ -37,12 +38,12 @@ module Byebug
|
|
37
38
|
private
|
38
39
|
|
39
40
|
def with_clean_argv
|
40
|
-
saved_argv = ARGV.dup
|
41
|
-
ARGV.clear
|
41
|
+
saved_argv = $ARGV.dup
|
42
|
+
$ARGV.clear
|
42
43
|
begin
|
43
44
|
yield
|
44
45
|
ensure
|
45
|
-
ARGV.concat(saved_argv)
|
46
|
+
$ARGV.concat(saved_argv)
|
46
47
|
end
|
47
48
|
end
|
48
49
|
end
|
data/lib/byebug/commands/kill.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../command"
|
2
4
|
|
3
5
|
module Byebug
|
4
6
|
#
|
@@ -8,37 +10,35 @@ module Byebug
|
|
8
10
|
self.allow_in_control = true
|
9
11
|
|
10
12
|
def self.regexp
|
11
|
-
/^\s*
|
13
|
+
/^\s* kill \s* (?:\s+(\S+))? \s*$/x
|
12
14
|
end
|
13
15
|
|
14
16
|
def self.description
|
15
|
-
<<-
|
17
|
+
<<-DESCRIPTION
|
16
18
|
kill[ signal]
|
17
19
|
|
18
20
|
#{short_description}
|
19
21
|
|
20
22
|
Equivalent of Process.kill(Process.pid)
|
21
|
-
|
23
|
+
DESCRIPTION
|
22
24
|
end
|
23
25
|
|
24
26
|
def self.short_description
|
25
|
-
|
27
|
+
"Sends a signal to the current process"
|
26
28
|
end
|
27
29
|
|
28
30
|
def execute
|
29
31
|
if @match[1]
|
30
32
|
signame = @match[1]
|
31
33
|
|
32
|
-
unless Signal.list.member?(signame)
|
33
|
-
return errmsg("signal name #{signame} is not a signal I know about\n")
|
34
|
-
end
|
34
|
+
return errmsg("signal name #{signame} is not a signal I know about\n") unless Signal.list.member?(signame)
|
35
35
|
else
|
36
|
-
return unless confirm(
|
36
|
+
return unless confirm("Really kill? (y/n) ")
|
37
37
|
|
38
|
-
signame =
|
38
|
+
signame = "KILL"
|
39
39
|
end
|
40
40
|
|
41
|
-
processor.interface.close if
|
41
|
+
processor.interface.close if signame == "KILL"
|
42
42
|
Process.kill(signame, Process.pid)
|
43
43
|
end
|
44
44
|
end
|
data/lib/byebug/commands/list.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../command"
|
4
|
+
require_relative "../source_file_formatter"
|
5
|
+
require_relative "../helpers/file"
|
6
|
+
require_relative "../helpers/parse"
|
4
7
|
|
5
8
|
module Byebug
|
6
9
|
#
|
@@ -17,7 +20,7 @@ module Byebug
|
|
17
20
|
end
|
18
21
|
|
19
22
|
def self.description
|
20
|
-
<<-
|
23
|
+
<<-DESCRIPTION
|
21
24
|
l[ist][[-=]][ nn-mm]
|
22
25
|
|
23
26
|
#{short_description}
|
@@ -27,20 +30,18 @@ module Byebug
|
|
27
30
|
"list=" is specified, lists from current line regardless of where code
|
28
31
|
was last listed. A line range can also be specified to list specific
|
29
32
|
sections of code.
|
30
|
-
|
33
|
+
DESCRIPTION
|
31
34
|
end
|
32
35
|
|
33
36
|
def self.short_description
|
34
|
-
|
37
|
+
"Lists lines of source code"
|
35
38
|
end
|
36
39
|
|
37
40
|
def execute
|
38
41
|
msg = "No sourcefile available for #{frame.file}"
|
39
42
|
raise(msg) unless File.exist?(frame.file)
|
40
43
|
|
41
|
-
|
42
|
-
b, e = range(@match[2], max_lines)
|
43
|
-
raise('Invalid line range') unless valid_range?(b, e, max_lines)
|
44
|
+
b, e = range(@match[2])
|
44
45
|
|
45
46
|
display_lines(b, e)
|
46
47
|
|
@@ -56,42 +57,44 @@ module Byebug
|
|
56
57
|
#
|
57
58
|
# Otherwise it's automatically chosen.
|
58
59
|
#
|
59
|
-
def range(input
|
60
|
-
|
60
|
+
def range(input)
|
61
|
+
return auto_range(@match[1] || "+") unless input
|
61
62
|
|
62
|
-
|
63
|
+
b, e = parse_range(input)
|
64
|
+
raise("Invalid line range") unless valid_range?(b, e)
|
63
65
|
|
64
|
-
|
66
|
+
[b, e]
|
65
67
|
end
|
66
68
|
|
67
|
-
def valid_range?(first, last
|
68
|
-
first <= last && (1..
|
69
|
+
def valid_range?(first, last)
|
70
|
+
first <= last && (1..max_line).cover?(first) && (1..max_line).cover?(last)
|
69
71
|
end
|
70
72
|
|
71
73
|
#
|
72
74
|
# Set line range to be printed by list
|
73
75
|
#
|
74
|
-
# @param size - number of lines to be printed
|
75
|
-
# @param max_line - max line number that can be printed
|
76
|
-
#
|
77
76
|
# @return first line number to list
|
78
77
|
# @return last line number to list
|
79
78
|
#
|
80
|
-
def
|
81
|
-
|
79
|
+
def auto_range(direction)
|
80
|
+
prev_line = processor.prev_line
|
82
81
|
|
83
|
-
|
82
|
+
if direction == "=" || prev_line.nil?
|
83
|
+
source_file_formatter.range_around(frame.line)
|
84
|
+
else
|
85
|
+
source_file_formatter.range_from(move(prev_line, size, direction))
|
86
|
+
end
|
84
87
|
end
|
85
88
|
|
86
|
-
def parse_range(input
|
87
|
-
first, err = get_int(lower_bound(input),
|
89
|
+
def parse_range(input)
|
90
|
+
first, err = get_int(lower_bound(input), "List", 1, max_line)
|
88
91
|
raise(err) unless first
|
89
92
|
|
90
93
|
if upper_bound(input)
|
91
|
-
last, err = get_int(upper_bound(input),
|
94
|
+
last, err = get_int(upper_bound(input), "List", 1, max_line)
|
92
95
|
raise(err) unless last
|
93
96
|
|
94
|
-
last =
|
97
|
+
last = amend_final(last)
|
95
98
|
else
|
96
99
|
first -= (size / 2)
|
97
100
|
end
|
@@ -99,20 +102,7 @@ module Byebug
|
|
99
102
|
[first, last || move(first, size - 1)]
|
100
103
|
end
|
101
104
|
|
102
|
-
def
|
103
|
-
return 1 if line < 1
|
104
|
-
|
105
|
-
[max_line, line].min
|
106
|
-
end
|
107
|
-
|
108
|
-
def lower(size, direction = '+')
|
109
|
-
prev_line = processor.prev_line
|
110
|
-
return frame.line - size / 2 if direction == '=' || prev_line.nil?
|
111
|
-
|
112
|
-
move(prev_line, size, direction)
|
113
|
-
end
|
114
|
-
|
115
|
-
def move(line, size, direction = '+')
|
105
|
+
def move(line, size, direction = "+")
|
116
106
|
line.send(direction, size)
|
117
107
|
end
|
118
108
|
|
@@ -125,13 +115,7 @@ module Byebug
|
|
125
115
|
def display_lines(min, max)
|
126
116
|
puts "\n[#{min}, #{max}] in #{frame.file}"
|
127
117
|
|
128
|
-
|
129
|
-
break if lineno + 1 > max
|
130
|
-
next unless (min..max).cover?(lineno + 1)
|
131
|
-
|
132
|
-
mark = lineno + 1 == frame.line ? '=> ' : ' '
|
133
|
-
puts format("#{mark}%#{max.to_s.size}d: %s", lineno + 1, line)
|
134
|
-
end
|
118
|
+
puts source_file_formatter.lines(min, max).join
|
135
119
|
end
|
136
120
|
|
137
121
|
#
|
@@ -160,5 +144,16 @@ module Byebug
|
|
160
144
|
def split_range(str)
|
161
145
|
str.split(/[-,]/)
|
162
146
|
end
|
147
|
+
|
148
|
+
extend Forwardable
|
149
|
+
|
150
|
+
def_delegators :source_file_formatter, :amend_final, :size, :max_line
|
151
|
+
|
152
|
+
def source_file_formatter
|
153
|
+
@source_file_formatter ||= SourceFileFormatter.new(
|
154
|
+
frame.file,
|
155
|
+
->(n) { n == frame.line ? "=>" : " " }
|
156
|
+
)
|
157
|
+
end
|
163
158
|
end
|
164
159
|
end
|
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../command"
|
4
|
+
require_relative "../helpers/eval"
|
3
5
|
|
4
6
|
module Byebug
|
5
7
|
#
|
@@ -15,7 +17,7 @@ module Byebug
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def self.description
|
18
|
-
<<-
|
20
|
+
<<-DESCRIPTION
|
19
21
|
m[ethod] (i[nstance][ <obj>]|<class|module>)
|
20
22
|
|
21
23
|
#{short_description}
|
@@ -25,11 +27,11 @@ module Byebug
|
|
25
27
|
|
26
28
|
When invoked only with a class or module, shows class methods of the
|
27
29
|
class or module specified as argument.
|
28
|
-
|
30
|
+
DESCRIPTION
|
29
31
|
end
|
30
32
|
|
31
33
|
def self.short_description
|
32
|
-
|
34
|
+
"Shows methods of an object, class or module"
|
33
35
|
end
|
34
36
|
|
35
37
|
def execute
|
@@ -37,11 +39,11 @@ module Byebug
|
|
37
39
|
|
38
40
|
result =
|
39
41
|
if @match[1]
|
40
|
-
prc(
|
42
|
+
prc("method.methods", obj.methods.sort) { |item, _| { name: item } }
|
41
43
|
elsif !obj.is_a?(Module)
|
42
|
-
pr(
|
44
|
+
pr("variable.errors.not_module", object: @match.post_match)
|
43
45
|
else
|
44
|
-
prc(
|
46
|
+
prc("method.methods", obj.instance_methods(false).sort) do |item, _|
|
45
47
|
{ name: item }
|
46
48
|
end
|
47
49
|
end
|
data/lib/byebug/commands/next.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../command"
|
4
|
+
require_relative "../helpers/parse"
|
3
5
|
|
4
6
|
module Byebug
|
5
7
|
#
|
@@ -16,19 +18,19 @@ module Byebug
|
|
16
18
|
end
|
17
19
|
|
18
20
|
def self.description
|
19
|
-
<<-
|
21
|
+
<<-DESCRIPTION
|
20
22
|
n[ext][ nnn]
|
21
23
|
|
22
24
|
#{short_description}
|
23
|
-
|
25
|
+
DESCRIPTION
|
24
26
|
end
|
25
27
|
|
26
28
|
def self.short_description
|
27
|
-
|
29
|
+
"Runs one or more lines of code"
|
28
30
|
end
|
29
31
|
|
30
32
|
def execute
|
31
|
-
steps, err = parse_steps(@match[1],
|
33
|
+
steps, err = parse_steps(@match[1], "Next")
|
32
34
|
return errmsg(err) unless steps
|
33
35
|
|
34
36
|
context.step_over(steps, context.frame.pos)
|
data/lib/byebug/commands/pry.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../command"
|
4
|
+
require_relative "../helpers/eval"
|
3
5
|
|
4
6
|
module Byebug
|
5
7
|
#
|
@@ -13,26 +15,24 @@ module Byebug
|
|
13
15
|
end
|
14
16
|
|
15
17
|
def self.description
|
16
|
-
<<-
|
18
|
+
<<-DESCRIPTION
|
17
19
|
pry
|
18
20
|
|
19
21
|
#{short_description}
|
20
|
-
|
22
|
+
DESCRIPTION
|
21
23
|
end
|
22
24
|
|
23
25
|
def self.short_description
|
24
|
-
|
26
|
+
"Starts a Pry session"
|
25
27
|
end
|
26
28
|
|
27
29
|
def execute
|
28
|
-
unless processor.interface.instance_of?(LocalInterface)
|
29
|
-
return errmsg(pr('base.errors.only_local'))
|
30
|
-
end
|
30
|
+
return errmsg(pr("base.errors.only_local")) unless processor.interface.instance_of?(LocalInterface)
|
31
31
|
|
32
32
|
begin
|
33
|
-
require
|
33
|
+
require "pry"
|
34
34
|
rescue LoadError
|
35
|
-
return errmsg(pr(
|
35
|
+
return errmsg(pr("pry.errors.not_installed"))
|
36
36
|
end
|
37
37
|
|
38
38
|
Pry.start(context.frame._binding)
|
data/lib/byebug/commands/quit.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../command"
|
2
4
|
|
3
5
|
module Byebug
|
4
6
|
#
|
@@ -13,23 +15,23 @@ module Byebug
|
|
13
15
|
end
|
14
16
|
|
15
17
|
def self.description
|
16
|
-
<<-
|
17
|
-
q[uit]
|
18
|
+
<<-DESCRIPTION
|
19
|
+
q[uit][!| unconditionally]
|
18
20
|
|
19
21
|
#{short_description}
|
20
22
|
|
21
|
-
Normally we prompt before exiting. However if the parameter
|
22
|
-
"unconditionally" is given or command is suffixed with
|
23
|
+
Normally we prompt before exiting. However, if the parameter
|
24
|
+
"unconditionally" is given or command is suffixed with "!", we exit
|
23
25
|
without asking further questions.
|
24
|
-
|
26
|
+
DESCRIPTION
|
25
27
|
end
|
26
28
|
|
27
29
|
def self.short_description
|
28
|
-
|
30
|
+
"Exits byebug"
|
29
31
|
end
|
30
32
|
|
31
33
|
def execute
|
32
|
-
return unless @match[1] || confirm(pr(
|
34
|
+
return unless @match[1] || confirm(pr("quit.confirmations.really"))
|
33
35
|
|
34
36
|
processor.interface.autosave
|
35
37
|
processor.interface.close
|