rbx-linecache 0.43

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.
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module TraceLineNumbers
4
+ # Get line numbers for CompiledMethod.method#lines
5
+ # format is: ip line ip line ...
6
+ # Odd numbers then are the line numbers
7
+ def lnums_for_lines(lines)
8
+ odds = (0...lines.size/2).map{|i| i*2+1}
9
+ lines.to_a.values_at(*odds).sort
10
+ end
11
+ module_function :lnums_for_lines
12
+
13
+ def compiled_methods(cm)
14
+ result = [cm]
15
+ result += cm.child_methods.map{|child| compiled_methods(child)}.flatten
16
+ result
17
+ end
18
+ module_function :compiled_methods
19
+
20
+ def lnums_for_compiled_methods(compiled_method)
21
+ compiled_methods = compiled_methods(compiled_method)
22
+ compiled_methods.map { |cm| lnums_for_lines(cm.lines) }.flatten.sort
23
+ end
24
+ module_function :lnums_for_compiled_methods
25
+
26
+ # Return an array of lines numbers that could be
27
+ # stopped at given a file name of a Ruby program.
28
+ def lnums_for_file(file)
29
+ lnums_for_compiled_methods(Rubinius::Compiler.compile_file(file))
30
+ end
31
+ module_function :lnums_for_file
32
+
33
+ # Return an array of lines numbers that could be
34
+ # stopped at given a file name of a Ruby program.
35
+ # We assume the each line has \n at the end. If not
36
+ # set the newline parameters to \n.
37
+ def lnums_for_str_array(string_array, newline='')
38
+ str = string_array.join(newline)
39
+ lnums_for_str(str)
40
+ end
41
+ module_function :lnums_for_str_array
42
+
43
+ def lnums_for_str(str)
44
+ lnums_for_compiled_methods(Rubinius::Compiler.compile_string(str))
45
+ end
46
+
47
+ module_function :lnums_for_str
48
+ end
49
+
50
+ if __FILE__ == $0
51
+ # test_file = '../test/rcov-bug.rb'
52
+ test_file = File.join %W(#{File.dirname(__FILE__)}
53
+ ../test/data/begin1.rb)
54
+ puts TraceLineNumbers.lnums_for_file(test_file).inspect
55
+ test_file = File.join %W(#{File.dirname(__FILE__)}
56
+ ../test/data/def1.rb)
57
+ puts TraceLineNumbers.lnums_for_file(test_file).inspect
58
+ end
@@ -0,0 +1,3 @@
1
+ # [ 2 ]
2
+ begin
3
+ end
@@ -0,0 +1,3 @@
1
+ # [ 2 ]
2
+ begin begin end end
3
+
@@ -0,0 +1,6 @@
1
+ # [ 3 ]
2
+ begin
3
+ begin
4
+ end
5
+ end
6
+
@@ -0,0 +1,7 @@
1
+ # [2, 2, 3, 4, 6]
2
+ if true
3
+ puts '3'
4
+ puts '4'
5
+ end
6
+ if true
7
+ end
@@ -0,0 +1,4 @@
1
+ # [2, 2, 3, 4, 4]
2
+ def foo(&block)
3
+ end
4
+ foo{4}
@@ -0,0 +1,6 @@
1
+ # [ 2, 2, 3, 4, 6, 6 ]
2
+ case 2
3
+ when 3
4
+ when 4
5
+ else
6
+ end
@@ -0,0 +1,5 @@
1
+ # [ 3, 4, 5, 5, 5 ]
2
+ case
3
+ when 3 != 3
4
+ when 4 != 4
5
+ end
@@ -0,0 +1,5 @@
1
+ # [2, 2, 3, 4, 5, 5]
2
+ case "2"
3
+ when Array
4
+ when Fixnum
5
+ end
@@ -0,0 +1,4 @@
1
+ # [2, 2, 3, 4]
2
+ case "2"
3
+ when Array, Fixnum
4
+ end
@@ -0,0 +1,10 @@
1
+ # [3, 4, 5, 6, 7, 9]
2
+ # Note: lines 5 and 7 won't appear in a trace.
3
+ case '3'
4
+ when '4'
5
+ x = 5
6
+ when '6'
7
+ x = 7
8
+ else
9
+ x = 9
10
+ end
@@ -0,0 +1,5 @@
1
+ # [3, 4]
2
+ class
3
+ A
4
+ class B ;
5
+ end end
@@ -0,0 +1,6 @@
1
+ # [ 1 ]
2
+
3
+ # space here and in next line
4
+
5
+
6
+
@@ -0,0 +1,9 @@
1
+ # [3, 3, 4, 4, 5, 7, 8, 8, 8, 9]
2
+ def
3
+ a ; end
4
+ def b
5
+ end
6
+ def c(
7
+ a=7,
8
+ b=8)
9
+ end
@@ -0,0 +1,3 @@
1
+ # [ 2, 2 ]
2
+ [2].each { }
3
+
@@ -0,0 +1,3 @@
1
+ # [ 3, 3 ]
2
+ # POSTEXE
3
+ END { }
@@ -0,0 +1,4 @@
1
+ # [ 2, 2, 3 ]
2
+ for i in [2]
3
+ i
4
+ end
@@ -0,0 +1,4 @@
1
+ # [ 2 ]
2
+ x = true ? 1 : 2
3
+
4
+
@@ -0,0 +1,4 @@
1
+ # [ 2 ]
2
+ x = 2 if false
3
+
4
+
@@ -0,0 +1,9 @@
1
+ # [ 2, 3, 4, 4, 5, 6]
2
+ lines = ''
3
+ opts = {:print_source => true}
4
+ if opts[:print_source]
5
+ puts 5
6
+ puts lines
7
+ end
8
+
9
+
@@ -0,0 +1,14 @@
1
+ # [ 6, 6, 7, 8, 10]
2
+
3
+ # Running through Tracer will not give the line numbers in the same
4
+ # order. Also note 9 before 7. This is because in the parse tree
5
+ # != has been turned into == with the branches switched.
6
+ [true, false].each do |t|
7
+ if t != true
8
+ 8
9
+ else
10
+ 10
11
+ end
12
+ end
13
+
14
+
@@ -0,0 +1,7 @@
1
+ # [2, 3, 3, 4, 4]
2
+ x=2
3
+ x=3 if x='a' or
4
+ false
5
+ # What's weird here is we get two stops on line 4 and both times x is
6
+ # 4. In Ruby 1.9 we don't get *any* line traces.
7
+
@@ -0,0 +1,4 @@
1
+ # [ 2 ]
2
+ x = 2 if x=3
3
+
4
+
@@ -0,0 +1,8 @@
1
+ # [ 2, 2, 3, 4, 6 ]
2
+ def f()
3
+ y=1
4
+ true
5
+ end
6
+ x = 2 if f()
7
+
8
+
@@ -0,0 +1,3 @@
1
+ # [ 3 ]
2
+ # MATCH -- FIXME we are not getting a match token.
3
+ /.*/
@@ -0,0 +1,5 @@
1
+ # [ 3, 5, 5 ]
2
+ # MATCH3
3
+ 3 =~ /
4
+ x*
5
+ /
@@ -0,0 +1,6 @@
1
+ # [ 3, 4, 5 ]
2
+ # MATCH3
3
+ y = 3
4
+ 4 =~ /
5
+ #{y}*
6
+ /
@@ -0,0 +1,6 @@
1
+ # [ 3, 4, 6 ]
2
+ # not and lit
3
+ 3
4
+ not 4
5
+ not
6
+ 6
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # begin require 'rubygems' rescue LoadError end
4
+ # require 'ruby-debug' ; Debugger.start
5
+
6
+ TEST_DIR = File.expand_path(File.dirname(__FILE__))
7
+ TOP_SRC_DIR = File.join(TEST_DIR, '..')
8
+ require File.join(TOP_SRC_DIR, 'lib', 'tracelines.rb')
9
+
10
+ def dump_file(file, opts)
11
+ puts file
12
+ begin
13
+ fp = File.open(file, 'r')
14
+ rescue Errno::ENOENT
15
+ puts "File #{file} is not readable."
16
+ return
17
+ end
18
+ lines = fp.read
19
+ if opts[:print_source]
20
+ puts '=' * 80
21
+ puts lines
22
+ end
23
+ if opts[:print_parse]
24
+ puts '=' * 80
25
+ cmd = "#{File.join(TEST_DIR, 'parse-show.rb')} #{file}"
26
+ system(cmd)
27
+ end
28
+ if opts[:print_trace]
29
+ require 'tracer'
30
+ puts '=' * 80
31
+ tracer = Tracer.new
32
+ tracer.add_filter lambda {|event, f, line, id, binding, klass|
33
+ __FILE__ != f && event == 'line'
34
+ }
35
+ tracer.on{load(file)}
36
+ end
37
+ expected_lnums = nil
38
+ if opts[:expect_line]
39
+ fp.rewind
40
+ first_line = fp.readline.chomp
41
+ expected_str = first_line[1..-1]
42
+ begin
43
+ expected_lnums = eval(expected_str, binding, __FILE__, __LINE__)
44
+ rescue SyntaxError
45
+ puts '=' * 80
46
+ puts "Failed reading expected values from #{file}"
47
+ end
48
+ end
49
+ fp.close()
50
+ got_lnums = TraceLineNumbers.lnums_for_str(lines)
51
+ if expected_lnums
52
+ puts "expecting: #{expected_lnums.inspect}"
53
+ puts '-' * 80
54
+ if expected_lnums
55
+ if got_lnums != expected_lnums
56
+ puts "mismatch: #{got_lnums.inspect}"
57
+ else
58
+ puts 'Got what was expected.'
59
+ end
60
+ else
61
+ puts got_lnums.inspect
62
+ end
63
+ else
64
+ puts got_lnums.inspect
65
+ end
66
+ end
67
+
68
+ require 'getoptlong'
69
+ program = File.basename($0)
70
+ opts = {
71
+ :print_source => true, # Print source file?
72
+ :print_trace => true, # Run Tracer over file?
73
+ :expect_line => true, # Source file has expected (correct) list of lines?
74
+ :print_parse => true, # Show ParseTree output?
75
+ }
76
+
77
+ getopts = GetoptLong.new(
78
+ [ '--expect', '-e', GetoptLong::NO_ARGUMENT ],
79
+ [ '--no-expect', '-E', GetoptLong::NO_ARGUMENT ],
80
+ [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
81
+ [ '--parse', '-p', GetoptLong::NO_ARGUMENT ],
82
+ [ '--no-parse', '-P', GetoptLong::NO_ARGUMENT ],
83
+ [ '--source', '-s', GetoptLong::NO_ARGUMENT ],
84
+ [ '--no-source', '-S', GetoptLong::NO_ARGUMENT ],
85
+ [ '--trace', '-t', GetoptLong::NO_ARGUMENT ],
86
+ [ '--no-trace', '-T', GetoptLong::NO_ARGUMENT ])
87
+
88
+ getopts.each do |opt, arg|
89
+ case opt
90
+ when '--help'
91
+ puts "usage
92
+ Usage: #{$program} [options] file1 file2 ...
93
+
94
+ Diagnostic program to make see what TraceLineNumbers does and compare
95
+ against other output.
96
+
97
+ options:
98
+ -e --expect Read source file expected comment (default)
99
+ -E --no-expect Don't look for source file expected comment
100
+ -p --parse Show ParseTree Output (default)
101
+ -P --no-parse Don't show ParseTree output
102
+ -s --source Show source file (default)
103
+ -S --no-source Don't print source
104
+ -t --trace Show Tracer output (default)
105
+ -T --no-trace Don't show Tracer output
106
+ "
107
+ when '--expect'
108
+ opts[:expect_line] = true
109
+ when '--no-expect'
110
+ opts[:expect_line] = false
111
+ when '--parse'
112
+ opts[:print_parse] = true
113
+ when '--no-parse'
114
+ opts[:print_parse] = false
115
+ when '--source'
116
+ opts[:print_source] = true
117
+ when '--no-source'
118
+ opts[:print_source] = false
119
+ when '--trace'
120
+ opts[:print_trace] = true
121
+ when '--no-trace'
122
+ opts[:print_trace] = false
123
+ else
124
+ puts "Unknown and ignored option #{opt}"
125
+ end
126
+ end
127
+
128
+ ARGV.each do |file|
129
+ dump_file(file, opts)
130
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'pp'
4
+ begin require 'rubygems' rescue LoadError end
5
+ require 'parse_tree'
6
+
7
+ ARGV.push "-" if ARGV.empty?
8
+
9
+ parse_tree = ParseTree.new(true)
10
+
11
+ ARGV.each do |file|
12
+ ruby = file == "-" ? $stdin.read : File.read(file)
13
+ pp parse_tree.parse_tree_for_string(ruby, file).first
14
+ end
@@ -0,0 +1,10 @@
1
+ # [3, 10]
2
+ # Some rcov bugs.
3
+ z = "
4
+ Now is the time
5
+ "
6
+
7
+ z =~
8
+ /
9
+ 5
10
+ /ix
@@ -0,0 +1,2 @@
1
+ # This is a small test file.
2
+
File without changes
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env ruby
2
+ require 'test/unit'
3
+ require 'fileutils'
4
+ require 'tempfile'
5
+ require 'set'
6
+
7
+ # Test LineCache module
8
+ class TestLineCache < Test::Unit::TestCase
9
+ @@TEST_DIR = File.expand_path(File.dirname(__FILE__))
10
+ @@TOP_SRC_DIR = File.join(@@TEST_DIR, '..', 'lib')
11
+ require File.join(@@TOP_SRC_DIR, 'linecache.rb')
12
+
13
+ def setup
14
+ LineCache::clear_file_cache
15
+ end
16
+
17
+ def test_basic
18
+ fp = File.open(__FILE__, 'r')
19
+ compare_lines = fp.readlines()
20
+ fp.close
21
+
22
+ # Test getlines to read this file.
23
+ lines = LineCache::getlines(__FILE__)
24
+ assert_equal(compare_lines, lines,
25
+ 'We should get exactly the same lines as reading this file.')
26
+
27
+ # Test getline to read this file. The file should now be cached,
28
+ # so internally a different set of routines are used.
29
+ test_line = 1
30
+ line = LineCache::getline(__FILE__, test_line)
31
+ assert_equal(compare_lines[test_line-1], line,
32
+ 'We should get exactly the same line as reading this file.')
33
+
34
+ # Test getting the line via a relative file name
35
+ Dir.chdir(File.dirname(__FILE__)) do
36
+ short_file = File.basename(__FILE__)
37
+ test_line = 10
38
+ line = LineCache::getline(short_file, test_line)
39
+ assert_equal(compare_lines[test_line-1], line,
40
+ 'Short filename lookup should work')
41
+ end
42
+
43
+ # Write a temporary file; read contents, rewrite it and check that
44
+ # we get a change when calling getline.
45
+ tf = Tempfile.new("testing")
46
+ test_string = "Now is the time.\n"
47
+ tf.puts(test_string)
48
+ tf.close
49
+ line = LineCache::getline(tf.path, 1)
50
+ assert_equal(test_string, line,
51
+ "C'mon - a simple line test like this worked before.")
52
+ tf.open
53
+ test_string = "Now is another time.\n"
54
+ tf.puts(test_string)
55
+ tf.close
56
+ LineCache::checkcache
57
+ line = LineCache::getline(tf.path, 1)
58
+ assert_equal(test_string, line,
59
+ "checkcache should have reread the temporary file.")
60
+ FileUtils.rm tf.path
61
+
62
+ LineCache::update_cache(__FILE__)
63
+ LineCache::clear_file_cache
64
+ end
65
+
66
+ def test_cached
67
+ assert_equal(false, LineCache::cached?(__FILE__),
68
+ "file #{__FILE__} shouldn't be cached - just cleared cache.")
69
+ line = LineCache::getline(__FILE__, 1)
70
+ assert line
71
+ assert_equal(true, LineCache::cached?(__FILE__),
72
+ "file #{__FILE__} should now be cached")
73
+ assert_equal(false, LineCache::cached_script?('./short-file'),
74
+ "Should not find './short-file' in SCRIPT_LINES__")
75
+ assert_equal(true, 78 < LineCache.size(__FILE__))
76
+ # Dir.chdir(File.dirname(__FILE__)) do
77
+ # load('./short-file', 0)
78
+ # assert_equal(true, LineCache::cached_script?('./short-file'),
79
+ # "Should be able to find './short-file' in SCRIPT_LINES__")
80
+ # end
81
+ end
82
+
83
+ def test_remap
84
+ LineCache::remap_file(__FILE__, 'another-name')
85
+ line1 = LineCache::getline('another-name', 1)
86
+ line2 = LineCache::getline(__FILE__, 1)
87
+ assert_equal(line1, line2, 'Both lines should be the same via remap_file')
88
+ end
89
+
90
+ def test_remap_lines
91
+ LineCache::remap_file_lines(__FILE__, 'test2', (10..11), 6)
92
+
93
+ line5 = LineCache::getline(__FILE__, 5)
94
+ LineCache::remap_file_lines(__FILE__, 'test2', 9, 5)
95
+ rline9 = LineCache::getline('test2', 9)
96
+ assert_equal(line5, rline9,
97
+ 'lines should be the same via remap_file_line - remap integer')
98
+
99
+ line6 = LineCache::getline(__FILE__, 6)
100
+ rline10 = LineCache::getline('test2', 10)
101
+ assert_equal(line6, rline10,
102
+ 'lines should be the same via remap_file_line - range')
103
+
104
+ line7 = LineCache::getline(__FILE__, 7)
105
+ rline11 = LineCache::getline('test2', 11)
106
+ assert_equal(line7, rline11,
107
+ 'lines should be the same via remap_file_line - range')
108
+
109
+ line8 = LineCache::getline(__FILE__, 8)
110
+ LineCache::remap_file_lines(__FILE__, nil, 20, 8)
111
+ rline20 = LineCache::getline(__FILE__, 20)
112
+ assert_equal(line8, rline20,
113
+ 'lines should be the same via remap_file_line - nil file')
114
+ end
115
+
116
+ def test_stat
117
+ assert_equal(nil, LineCache::stat(__FILE__),
118
+ "stat for #{__FILE__} shouldn't be nil - just cleared cache.")
119
+ line = LineCache::getline(__FILE__, 1)
120
+ assert line
121
+ assert(LineCache::stat(__FILE__),
122
+ "file #{__FILE__} should now have a stat")
123
+ end
124
+
125
+ def test_path
126
+ assert_equal(nil, LineCache::path(__FILE__),
127
+ "path for #{__FILE__} should be nil - just cleared cache.")
128
+ path = LineCache::cache(__FILE__)
129
+ assert path
130
+ assert_equal(path, LineCache::path(__FILE__),
131
+ "path of #{__FILE__} should be the same as we got before")
132
+ end
133
+
134
+ def test_trace_line_numbers
135
+ test_file = File.join(@@TEST_DIR, 'short-file')
136
+ ## ?? Not sure if this is correct.
137
+ assert_equal([1], LineCache::trace_line_numbers(test_file))
138
+ test_file = File.join(@@TEST_DIR, 'short-file2')
139
+ assert_equal([1], LineCache::trace_line_numbers(test_file))
140
+ test_file = File.join(@@TEST_DIR, 'rcov-bug.rb')
141
+ assert_equal([3, 5, 7, 10], LineCache::trace_line_numbers(test_file))
142
+ end
143
+
144
+ def test_sha1
145
+ test_file = File.join(@@TEST_DIR, 'short-file')
146
+ LineCache::cache(test_file)
147
+ assert_equal('1134f95ea84a3dcc67d7d1bf41390ee1a03af6d2',
148
+ LineCache::sha1(test_file))
149
+ end
150
+
151
+ end