Skip to content

Commit ce8c70e

Browse files
committed
Use RubyVM.script_lines if available.
1 parent a21742d commit ce8c70e

File tree

1 file changed

+86
-51
lines changed

1 file changed

+86
-51
lines changed

lib/debug/source_repository.rb

Lines changed: 86 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,72 +4,107 @@
44

55
module DEBUGGER__
66
class SourceRepository
7-
SrcInfo = Struct.new(:src, :colored)
7+
include Color
88

9-
def initialize
10-
@files = {} # filename => SrcInfo
11-
end
9+
if RubyVM.respond_to? :keep_script_lines
10+
# Ruby 3.1 and later
11+
RubyVM.keep_script_lines = true
12+
require 'objspace'
1213

13-
def add iseq, src
14-
if (path = iseq.absolute_path) && File.exist?(path)
15-
add_path path
16-
elsif src
17-
add_iseq iseq, src
14+
def initialize
15+
# cache
16+
@cmap = ObjectSpace::WeakMap.new
1817
end
19-
end
2018

21-
def all_iseq iseq, rs = []
22-
rs << iseq
23-
iseq.each_child{|ci|
24-
all_iseq(ci, rs)
25-
}
26-
rs
27-
end
19+
def add iseq, src
20+
# do nothing
21+
end
22+
23+
def get iseq
24+
if lines = iseq.script_lines.map(&:chomp)
25+
lines.join("\n")
26+
else
27+
nil
28+
end
29+
end
2830

29-
private def add_iseq iseq, src
30-
line = iseq.first_line
31-
if line > 1
32-
src = ("\n" * (line - 1)) + src
31+
def get_colored iseq
32+
if lines = @cmap[iseq]
33+
lines
34+
else
35+
if src = get(iseq)
36+
@cmap[iseq] = colorize_code(src).lines
37+
else
38+
nil
39+
end
40+
end
3341
end
34-
si = SrcInfo.new(src.lines)
42+
else
43+
# ruby 3.0 or erlier
44+
SrcInfo = Struct.new(:src, :colored)
3545

36-
all_iseq(iseq).each{|e|
37-
e.instance_variable_set(:@debugger_si, si)
38-
e.freeze
39-
}
40-
end
46+
def initialize
47+
@files = {} # filename => SrcInfo
48+
end
4149

42-
private def add_path path
43-
src = File.read(path)
44-
src = src.gsub("\r\n", "\n") # CRLF -> LF
45-
@files[path] = SrcInfo.new(src.lines)
46-
rescue SystemCallError
47-
end
50+
def add iseq, src
51+
if (path = iseq.absolute_path) && File.exist?(path)
52+
add_path path
53+
elsif src
54+
add_iseq iseq, src
55+
end
56+
end
4857

49-
private def get_si iseq
50-
return unless iseq
58+
private def all_iseq iseq, rs = []
59+
rs << iseq
60+
iseq.each_child{|ci|
61+
all_iseq(ci, rs)
62+
}
63+
rs
64+
end
5165

52-
if iseq.instance_variable_defined?(:@debugger_si)
53-
iseq.instance_variable_get(:@debugger_si)
54-
elsif @files.has_key?(path = iseq.absolute_path)
55-
@files[path]
56-
elsif path
57-
add_path(path)
66+
private def add_iseq iseq, src
67+
line = iseq.first_line
68+
if line > 1
69+
src = ("\n" * (line - 1)) + src
70+
end
71+
si = SrcInfo.new(src.lines)
72+
all_iseq(iseq).each{|e|
73+
e.instance_variable_set(:@debugger_si, si)
74+
e.freeze
75+
}
5876
end
59-
end
6077

61-
def get iseq
62-
if si = get_si(iseq)
63-
si.src
78+
private def add_path path
79+
src = File.read(path)
80+
src = src.gsub("\r\n", "\n") # CRLF -> LF
81+
@files[path] = SrcInfo.new(src.lines)
82+
rescue SystemCallError
6483
end
65-
end
6684

67-
include Color
85+
private def get_si iseq
86+
return unless iseq
87+
88+
if iseq.instance_variable_defined?(:@debugger_si)
89+
iseq.instance_variable_get(:@debugger_si)
90+
elsif @files.has_key?(path = iseq.absolute_path)
91+
@files[path]
92+
elsif path
93+
add_path(path)
94+
end
95+
end
96+
97+
def get iseq
98+
if si = get_si(iseq)
99+
si.src
100+
end
101+
end
68102

69-
def get_colored iseq
70-
if si = get_si(iseq)
71-
si.colored || begin
72-
si.colored = colorize_code(si.src.join).lines
103+
def get_colored iseq
104+
if si = get_si(iseq)
105+
si.colored || begin
106+
si.colored = colorize_code(si.src.join).lines
107+
end
73108
end
74109
end
75110
end

0 commit comments

Comments
 (0)