ruby-prof 1.7.2 → 2.0.1

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.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGES → CHANGELOG.md} +115 -178
  3. data/README.md +5 -5
  4. data/bin/ruby-prof +1 -4
  5. data/bin/ruby-prof-check-trace +45 -45
  6. data/docs/advanced-usage.md +132 -0
  7. data/docs/alternatives.md +98 -0
  8. data/docs/architecture.md +122 -0
  9. data/docs/best-practices.md +27 -0
  10. data/docs/getting-started.md +130 -0
  11. data/docs/history.md +11 -0
  12. data/docs/index.md +45 -0
  13. data/docs/profiling-rails.md +64 -0
  14. data/docs/public/examples/example.rb +33 -0
  15. data/docs/public/examples/generate_reports.rb +92 -0
  16. data/docs/public/examples/reports/call_info.txt +27 -0
  17. data/docs/public/examples/reports/call_stack.html +835 -0
  18. data/docs/public/examples/reports/callgrind.out +150 -0
  19. data/docs/public/examples/reports/flame_graph.html +408 -0
  20. data/docs/public/examples/reports/flat.txt +45 -0
  21. data/docs/public/examples/reports/graph.dot +129 -0
  22. data/docs/public/examples/reports/graph.html +1319 -0
  23. data/docs/public/examples/reports/graph.txt +100 -0
  24. data/docs/public/examples/reports/graphviz_viewer.html +1 -0
  25. data/docs/public/images/call_stack.png +0 -0
  26. data/docs/public/images/class_diagram.png +0 -0
  27. data/docs/public/images/dot_printer.png +0 -0
  28. data/docs/public/images/flame_graph.png +0 -0
  29. data/docs/public/images/flat.png +0 -0
  30. data/docs/public/images/graph.png +0 -0
  31. data/docs/public/images/graph_html.png +0 -0
  32. data/docs/public/images/ruby-prof-logo.svg +1 -0
  33. data/docs/reports.md +150 -0
  34. data/docs/stylesheets/extra.css +80 -0
  35. data/ext/ruby_prof/rp_allocation.c +0 -15
  36. data/ext/ruby_prof/rp_allocation.h +29 -33
  37. data/ext/ruby_prof/rp_call_tree.c +3 -0
  38. data/ext/ruby_prof/rp_call_tree.h +1 -4
  39. data/ext/ruby_prof/rp_call_trees.h +1 -4
  40. data/ext/ruby_prof/rp_measurement.c +0 -5
  41. data/ext/ruby_prof/rp_measurement.h +49 -53
  42. data/ext/ruby_prof/rp_method.c +3 -0
  43. data/ext/ruby_prof/rp_method.h +1 -4
  44. data/ext/ruby_prof/rp_profile.c +1 -1
  45. data/ext/ruby_prof/rp_profile.h +1 -5
  46. data/ext/ruby_prof/rp_stack.h +50 -53
  47. data/ext/ruby_prof/rp_thread.h +1 -4
  48. data/ext/ruby_prof/ruby_prof.h +1 -4
  49. data/ext/ruby_prof/vc/ruby_prof.vcxproj +7 -8
  50. data/lib/ruby-prof/assets/call_stack_printer.html.erb +746 -711
  51. data/lib/ruby-prof/assets/flame_graph_printer.html.erb +412 -0
  52. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -355
  53. data/lib/ruby-prof/call_tree.rb +57 -57
  54. data/lib/ruby-prof/call_tree_visitor.rb +36 -36
  55. data/lib/ruby-prof/measurement.rb +17 -17
  56. data/lib/ruby-prof/printers/abstract_printer.rb +19 -33
  57. data/lib/ruby-prof/printers/call_info_printer.rb +53 -53
  58. data/lib/ruby-prof/printers/call_stack_printer.rb +168 -180
  59. data/lib/ruby-prof/printers/call_tree_printer.rb +132 -145
  60. data/lib/ruby-prof/printers/dot_printer.rb +177 -132
  61. data/lib/ruby-prof/printers/flame_graph_printer.rb +79 -0
  62. data/lib/ruby-prof/printers/flat_printer.rb +52 -52
  63. data/lib/ruby-prof/printers/graph_html_printer.rb +62 -63
  64. data/lib/ruby-prof/printers/graph_printer.rb +112 -113
  65. data/lib/ruby-prof/printers/multi_printer.rb +134 -127
  66. data/lib/ruby-prof/profile.rb +13 -0
  67. data/lib/ruby-prof/rack.rb +114 -105
  68. data/lib/ruby-prof/task.rb +147 -147
  69. data/lib/ruby-prof/thread.rb +20 -20
  70. data/lib/ruby-prof/version.rb +1 -1
  71. data/lib/ruby-prof.rb +50 -52
  72. data/lib/unprof.rb +10 -10
  73. data/ruby-prof.gemspec +66 -66
  74. data/test/abstract_printer_test.rb +25 -27
  75. data/test/alias_test.rb +203 -117
  76. data/test/call_tree_builder.rb +9 -9
  77. data/test/call_tree_visitor_test.rb +27 -27
  78. data/test/call_trees_test.rb +66 -66
  79. data/test/duplicate_names_test.rb +32 -32
  80. data/test/dynamic_method_test.rb +50 -50
  81. data/test/exceptions_test.rb +1 -1
  82. data/test/exclude_threads_test.rb +48 -48
  83. data/test/fiber_test.rb +72 -72
  84. data/test/inverse_call_tree_test.rb +174 -174
  85. data/test/line_number_test.rb +138 -1
  86. data/test/marshal_test.rb +2 -3
  87. data/test/measure_allocations.rb +26 -26
  88. data/test/measure_allocations_test.rb +340 -1
  89. data/test/measure_process_time_test.rb +3098 -3142
  90. data/test/measure_times.rb +56 -56
  91. data/test/measure_wall_time_test.rb +511 -372
  92. data/test/measurement_test.rb +82 -82
  93. data/test/merge_test.rb +48 -48
  94. data/test/multi_printer_test.rb +52 -66
  95. data/test/no_method_class_test.rb +15 -15
  96. data/test/pause_resume_test.rb +171 -171
  97. data/test/prime.rb +54 -54
  98. data/test/prime_script.rb +5 -5
  99. data/test/printer_call_stack_test.rb +4 -3
  100. data/test/printer_call_tree_test.rb +30 -30
  101. data/test/printer_flame_graph_test.rb +82 -0
  102. data/test/printer_flat_test.rb +3 -3
  103. data/test/printer_graph_html_test.rb +12 -9
  104. data/test/printer_graph_test.rb +5 -3
  105. data/test/printers_test.rb +162 -178
  106. data/test/printing_recursive_graph_test.rb +4 -4
  107. data/test/profile_test.rb +2 -2
  108. data/test/rack_test.rb +15 -5
  109. data/test/recursive_test.rb +139 -139
  110. data/test/scheduler.rb +367 -363
  111. data/test/singleton_test.rb +2 -1
  112. data/test/stack_printer_test.rb +61 -61
  113. data/test/start_stop_test.rb +106 -106
  114. data/test/test_helper.rb +4 -0
  115. data/test/thread_test.rb +229 -229
  116. data/test/unique_call_path_test.rb +123 -123
  117. data/test/yarv_test.rb +2 -2
  118. metadata +53 -11
  119. data/ext/ruby_prof/rp_measure_memory.c +0 -46
  120. data/lib/ruby-prof/compatibility.rb +0 -113
  121. data/test/compatibility_test.rb +0 -49
  122. data/test/measure_memory_test.rb +0 -1193
data/lib/unprof.rb CHANGED
@@ -1,10 +1,10 @@
1
- # encoding: utf-8
2
-
3
- require "ruby-prof"
4
-
5
- at_exit {
6
- result = RubyProf.stop
7
- printer = RubyProf::FlatPrinter.new(result)
8
- printer.print(STDOUT)
9
- }
10
- RubyProf.start
1
+ # encoding: utf-8
2
+
3
+ require "ruby-prof"
4
+
5
+ at_exit {
6
+ result = RubyProf.stop
7
+ printer = RubyProf::FlatPrinter.new(result)
8
+ printer.print(STDOUT)
9
+ }
10
+ RubyProf.start
data/ruby-prof.gemspec CHANGED
@@ -1,66 +1,66 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- $:.push File.expand_path("../lib", __FILE__)
4
- require "ruby-prof/version"
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "ruby-prof"
8
-
9
- spec.homepage = "https://github.com/ruby-prof/ruby-prof/"
10
- spec.summary = "Fast Ruby profiler"
11
- spec.description = <<-EOF
12
- ruby-prof is a fast code profiler for Ruby. It is a C extension and
13
- therefore is many times faster than the standard Ruby profiler. It
14
- supports both flat and graph profiles. For each method, graph profiles
15
- show how long the method ran, which methods called it and which
16
- methods it called. RubyProf generate both text and html and can output
17
- it to standard out or to a file.
18
- EOF
19
- spec.license = 'BSD-2-Clause'
20
- spec.version = RubyProf::VERSION
21
-
22
- spec.metadata = {
23
- "bug_tracker_uri" => "https://github.com/ruby-prof/ruby-prof/issues",
24
- "changelog_uri" => "https://github.com/ruby-prof/ruby-prof/blob/master/CHANGES",
25
- "documentation_uri" => "https://ruby-prof.github.io/",
26
- "source_code_uri" => "https://github.com/ruby-prof/ruby-prof/tree/v#{spec.version}",
27
- }
28
-
29
- spec.author = "Shugo Maeda, Charlie Savage, Roger Pack, Stefan Kaes"
30
- spec.email = "shugo@ruby-lang.org, cfis@savagexi.com, rogerdpack@gmail.com, skaes@railsexpress.de"
31
- spec.platform = Gem::Platform::RUBY
32
- spec.require_path = "lib"
33
- spec.bindir = "bin"
34
- spec.executables = ["ruby-prof", "ruby-prof-check-trace"]
35
- spec.extensions = ["ext/ruby_prof/extconf.rb"]
36
- spec.files = Dir['CHANGES',
37
- 'LICENSE',
38
- 'Rakefile',
39
- 'README.md',
40
- 'ruby-prof.gemspec',
41
- 'bin/ruby-prof',
42
- 'bin/ruby-prof-check-trace',
43
- 'doc/**/*',
44
- 'examples/*',
45
- 'ext/ruby_prof/extconf.rb',
46
- 'ext/ruby_prof/*.c',
47
- 'ext/ruby_prof/*.h',
48
- 'ext/ruby_prof/vc/*.sln',
49
- 'ext/ruby_prof/vc/*.vcxproj',
50
- 'lib/ruby-prof.rb',
51
- 'lib/unprof.rb',
52
- 'lib/ruby-prof/*.rb',
53
- 'lib/ruby-prof/assets/*',
54
- 'lib/ruby-prof/profile/*.rb',
55
- 'lib/ruby-prof/printers/*.rb',
56
- 'test/*.rb']
57
-
58
- spec.test_files = Dir["test/test_*.rb"]
59
- spec.required_ruby_version = '>= 3.0.0'
60
- spec.date = Time.now.strftime('%Y-%m-%d')
61
- spec.homepage = 'https://github.com/ruby-prof/ruby-prof'
62
- spec.add_dependency('base64')
63
- spec.add_development_dependency('minitest')
64
- spec.add_development_dependency('rake-compiler')
65
- spec.add_development_dependency('rdoc')
66
- end
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ $:.push File.expand_path("../lib", __FILE__)
4
+ require "ruby-prof/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ruby-prof"
8
+
9
+ spec.homepage = "https://github.com/ruby-prof/ruby-prof/"
10
+ spec.summary = "Fast Ruby profiler"
11
+ spec.description = <<-EOF
12
+ ruby-prof is a fast code profiler for Ruby. It is a C extension and
13
+ therefore is many times faster than the standard Ruby profiler. It
14
+ supports both flat and graph profiles. For each method, graph profiles
15
+ show how long the method ran, which methods called it and which
16
+ methods it called. RubyProf generate both text and html and can output
17
+ it to standard out or to a file.
18
+ EOF
19
+ spec.license = 'BSD-2-Clause'
20
+ spec.version = RubyProf::VERSION
21
+
22
+ spec.metadata = {
23
+ "bug_tracker_uri" => "https://github.com/ruby-prof/ruby-prof/issues",
24
+ "changelog_uri" => "https://github.com/ruby-prof/ruby-prof/blob/master/CHANGELOG.md",
25
+ "documentation_uri" => "https://ruby-prof.github.io/",
26
+ "source_code_uri" => "https://github.com/ruby-prof/ruby-prof/tree/v#{spec.version}",
27
+ }
28
+
29
+ spec.author = "Shugo Maeda, Charlie Savage, Roger Pack, Stefan Kaes"
30
+ spec.email = "shugo@ruby-lang.org, cfis@savagexi.com, rogerdpack@gmail.com, skaes@railsexpress.de"
31
+ spec.platform = Gem::Platform::RUBY
32
+ spec.require_path = "lib"
33
+ spec.bindir = "bin"
34
+ spec.executables = ["ruby-prof", "ruby-prof-check-trace"]
35
+ spec.extensions = ["ext/ruby_prof/extconf.rb"]
36
+ spec.files = Dir['CHANGELOG.md',
37
+ 'LICENSE',
38
+ 'Rakefile',
39
+ 'README.md',
40
+ 'ruby-prof.gemspec',
41
+ 'bin/ruby-prof',
42
+ 'bin/ruby-prof-check-trace',
43
+ 'docs/**/*',
44
+ 'ext/ruby_prof/extconf.rb',
45
+ 'ext/ruby_prof/*.c',
46
+ 'ext/ruby_prof/*.h',
47
+ 'ext/ruby_prof/vc/*.sln',
48
+ 'ext/ruby_prof/vc/*.vcxproj',
49
+ 'lib/ruby-prof.rb',
50
+ 'lib/unprof.rb',
51
+ 'lib/ruby-prof/*.rb',
52
+ 'lib/ruby-prof/assets/*',
53
+ 'lib/ruby-prof/profile/*.rb',
54
+ 'lib/ruby-prof/printers/*.rb',
55
+ 'test/*.rb']
56
+
57
+ spec.test_files = Dir["test/test_*.rb"]
58
+ spec.required_ruby_version = '>= 3.2.0'
59
+ spec.date = Time.now.strftime('%Y-%m-%d')
60
+ spec.homepage = 'https://github.com/ruby-prof/ruby-prof'
61
+ spec.add_dependency('base64')
62
+ spec.add_dependency('ostruct')
63
+ spec.add_development_dependency('minitest')
64
+ spec.add_development_dependency('rake-compiler')
65
+ spec.add_development_dependency('rdoc')
66
+ end
@@ -1,27 +1,25 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- class AbstractPrinterTest < TestCase
7
- def setup
8
- super
9
- @result = {}
10
- @printer = RubyProf::AbstractPrinter.new(@result)
11
- @options = {}
12
- @printer.setup_options(@options)
13
- end
14
-
15
- private
16
-
17
- def with_const_stubbed(name, value)
18
- old_verbose, $VERBOSE = $VERBOSE, nil
19
- old_value = Object.const_get(name)
20
-
21
- Object.const_set(name, value)
22
- yield
23
- Object.const_set(name, old_value)
24
-
25
- $VERBOSE = old_verbose
26
- end
27
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class AbstractPrinterTest < TestCase
7
+ def setup
8
+ super
9
+ @result = {}
10
+ @printer = RubyProf::AbstractPrinter.new(@result)
11
+ end
12
+
13
+ private
14
+
15
+ def with_const_stubbed(name, value)
16
+ old_verbose, $VERBOSE = $VERBOSE, nil
17
+ old_value = Object.const_get(name)
18
+
19
+ Object.const_set(name, value)
20
+ yield
21
+ Object.const_set(name, old_value)
22
+
23
+ $VERBOSE = old_verbose
24
+ end
25
+ end
data/test/alias_test.rb CHANGED
@@ -1,117 +1,203 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path("../test_helper", __FILE__)
5
-
6
- class AliasTest < TestCase
7
- class TestMe
8
- def some_method
9
- sleep(0.1)
10
- end
11
-
12
- alias :some_method_original :some_method
13
- def some_method
14
- some_method_original
15
- end
16
- end
17
-
18
- def test_alias
19
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
20
- TestMe.new.some_method
21
- end
22
-
23
- methods = result.threads.first.methods
24
- assert_equal(6, methods.count)
25
-
26
- # Method 0
27
- method = methods[0]
28
- assert_equal('AliasTest#test_alias', method.full_name)
29
- assert_equal(20, method.line)
30
- refute(method.recursive?)
31
-
32
- assert_equal(0, method.call_trees.callers.count)
33
-
34
- assert_equal(2, method.call_trees.callees.count)
35
- call_tree = method.call_trees.callees[0]
36
- assert_equal('Class#new', call_tree.target.full_name)
37
- assert_equal(20, call_tree.line)
38
-
39
- call_tree = method.call_trees.callees[1]
40
- assert_equal('AliasTest::TestMe#some_method', call_tree.target.full_name)
41
- assert_equal(20, call_tree.line)
42
-
43
- # Method 1
44
- method = methods[1]
45
- assert_equal('Class#new', method.full_name)
46
- assert_equal(0, method.line)
47
- refute(method.recursive?)
48
-
49
- assert_equal(1, method.call_trees.callers.count)
50
- call_tree = method.call_trees.callers[0]
51
- assert_equal('AliasTest#test_alias', call_tree.parent.target.full_name)
52
- assert_equal(20, call_tree.line)
53
-
54
- assert_equal(1, method.call_trees.callees.count)
55
- call_tree = method.call_trees.callees[0]
56
- assert_equal('BasicObject#initialize', call_tree.target.full_name)
57
- assert_equal(0, call_tree.line)
58
-
59
- # Method 2
60
- method = methods[2]
61
- assert_equal('BasicObject#initialize', method.full_name)
62
- assert_equal(0, method.line)
63
- refute(method.recursive?)
64
-
65
- assert_equal(1, method.call_trees.callers.count)
66
- call_tree = method.call_trees.callers[0]
67
- assert_equal('Class#new', call_tree.parent.target.full_name)
68
- assert_equal(0, call_tree.line)
69
-
70
- assert_equal(0, method.call_trees.callees.count)
71
-
72
- # Method 3
73
- method = methods[3]
74
- assert_equal('AliasTest::TestMe#some_method', method.full_name)
75
- assert_equal(13, method.line)
76
- refute(method.recursive?)
77
-
78
- assert_equal(1, method.call_trees.callers.count)
79
- call_tree = method.call_trees.callers[0]
80
- assert_equal('AliasTest#test_alias', call_tree.parent.target.full_name)
81
- assert_equal(20, call_tree.line)
82
-
83
- assert_equal(1, method.call_trees.callees.count)
84
- call_tree = method.call_trees.callees[0]
85
- assert_equal('AliasTest::TestMe#some_method_original', call_tree.target.full_name)
86
- assert_equal(14, call_tree.line)
87
-
88
- # Method 4
89
- method = methods[4]
90
- assert_equal('AliasTest::TestMe#some_method_original', method.full_name)
91
- assert_equal(8, method.line)
92
- refute(method.recursive?)
93
-
94
- assert_equal(1, method.call_trees.callers.count)
95
- call_tree = method.call_trees.callers[0]
96
- assert_equal('AliasTest::TestMe#some_method', call_tree.parent.target.full_name)
97
- assert_equal(14, call_tree.line)
98
-
99
- assert_equal(1, method.call_trees.callees.count)
100
- call_tree = method.call_trees.callees[0]
101
- assert_equal('Kernel#sleep', call_tree.target.full_name)
102
- assert_equal(9, call_tree.line)
103
-
104
- # Method 5
105
- method = methods[5]
106
- assert_equal('Kernel#sleep', method.full_name)
107
- assert_equal(0, method.line)
108
- refute(method.recursive?)
109
-
110
- assert_equal(1, method.call_trees.callers.count)
111
- call_tree = method.call_trees.callers[0]
112
- assert_equal('AliasTest::TestMe#some_method_original', call_tree.parent.target.full_name)
113
- assert_equal(9, call_tree.line)
114
-
115
- assert_equal(0, method.call_trees.callees.count)
116
- end
117
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path("../test_helper", __FILE__)
5
+
6
+ class AliasTest < TestCase
7
+ class TestMe
8
+ def some_method
9
+ sleep(0.1)
10
+ end
11
+
12
+ alias :some_method_original :some_method
13
+ def some_method
14
+ some_method_original
15
+ end
16
+ end
17
+
18
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('4.0')
19
+ def test_alias
20
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
21
+ TestMe.new.some_method
22
+ end
23
+
24
+ methods = result.threads.first.methods
25
+ assert_equal(6, methods.count)
26
+
27
+ # Method 0
28
+ method = methods[0]
29
+ assert_equal('AliasTest#test_alias', method.full_name)
30
+ assert_equal(21, method.line)
31
+ refute(method.recursive?)
32
+
33
+ assert_equal(0, method.call_trees.callers.count)
34
+
35
+ assert_equal(2, method.call_trees.callees.count)
36
+ call_tree = method.call_trees.callees[0]
37
+ assert_equal('Class#new', call_tree.target.full_name)
38
+ assert_equal(21, call_tree.line)
39
+
40
+ call_tree = method.call_trees.callees[1]
41
+ assert_equal('AliasTest::TestMe#some_method', call_tree.target.full_name)
42
+ assert_equal(21, call_tree.line)
43
+
44
+ # Method 1
45
+ method = methods[1]
46
+ assert_equal('Class#new', method.full_name)
47
+ assert_equal(0, method.line)
48
+ refute(method.recursive?)
49
+
50
+ assert_equal(1, method.call_trees.callers.count)
51
+ call_tree = method.call_trees.callers[0]
52
+ assert_equal('AliasTest#test_alias', call_tree.parent.target.full_name)
53
+ assert_equal(21, call_tree.line)
54
+
55
+ assert_equal(1, method.call_trees.callees.count)
56
+ call_tree = method.call_trees.callees[0]
57
+ assert_equal('BasicObject#initialize', call_tree.target.full_name)
58
+ assert_equal(0, call_tree.line)
59
+
60
+ # Method 2
61
+ method = methods[2]
62
+ assert_equal('BasicObject#initialize', method.full_name)
63
+ assert_equal(0, method.line)
64
+ refute(method.recursive?)
65
+
66
+ assert_equal(1, method.call_trees.callers.count)
67
+ call_tree = method.call_trees.callers[0]
68
+ assert_equal('Class#new', call_tree.parent.target.full_name)
69
+ assert_equal(0, call_tree.line)
70
+
71
+ assert_equal(0, method.call_trees.callees.count)
72
+
73
+ # Method 3
74
+ method = methods[3]
75
+ assert_equal('AliasTest::TestMe#some_method', method.full_name)
76
+ assert_equal(13, method.line)
77
+ refute(method.recursive?)
78
+
79
+ assert_equal(1, method.call_trees.callers.count)
80
+ call_tree = method.call_trees.callers[0]
81
+ assert_equal('AliasTest#test_alias', call_tree.parent.target.full_name)
82
+ assert_equal(21, call_tree.line)
83
+
84
+ assert_equal(1, method.call_trees.callees.count)
85
+ call_tree = method.call_trees.callees[0]
86
+ assert_equal('AliasTest::TestMe#some_method_original', call_tree.target.full_name)
87
+ assert_equal(14, call_tree.line)
88
+
89
+ # Method 4
90
+ method = methods[4]
91
+ assert_equal('AliasTest::TestMe#some_method_original', method.full_name)
92
+ assert_equal(8, method.line)
93
+ refute(method.recursive?)
94
+
95
+ assert_equal(1, method.call_trees.callers.count)
96
+ call_tree = method.call_trees.callers[0]
97
+ assert_equal('AliasTest::TestMe#some_method', call_tree.parent.target.full_name)
98
+ assert_equal(14, call_tree.line)
99
+
100
+ assert_equal(1, method.call_trees.callees.count)
101
+ call_tree = method.call_trees.callees[0]
102
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
103
+ assert_equal(9, call_tree.line)
104
+
105
+ # Method 5
106
+ method = methods[5]
107
+ assert_equal('Kernel#sleep', method.full_name)
108
+ assert_equal(0, method.line)
109
+ refute(method.recursive?)
110
+
111
+ assert_equal(1, method.call_trees.callers.count)
112
+ call_tree = method.call_trees.callers[0]
113
+ assert_equal('AliasTest::TestMe#some_method_original', call_tree.parent.target.full_name)
114
+ assert_equal(9, call_tree.line)
115
+
116
+ assert_equal(0, method.call_trees.callees.count)
117
+ end
118
+ else
119
+ def test_alias
120
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
121
+ TestMe.new.some_method
122
+ end
123
+
124
+ methods = result.threads.first.methods
125
+ assert_equal(5, methods.count)
126
+
127
+ # Method 0
128
+ method = methods[0]
129
+ assert_equal('AliasTest#test_alias', method.full_name)
130
+ assert_equal(121, method.line)
131
+ refute(method.recursive?)
132
+
133
+ assert_equal(0, method.call_trees.callers.count)
134
+
135
+ assert_equal(2, method.call_trees.callees.count)
136
+ call_tree = method.call_trees.callees[0]
137
+ assert_equal('BasicObject#initialize', call_tree.target.full_name)
138
+ assert_equal(121, call_tree.line)
139
+
140
+ call_tree = method.call_trees.callees[1]
141
+ assert_equal('AliasTest::TestMe#some_method', call_tree.target.full_name)
142
+ assert_equal(121, call_tree.line)
143
+
144
+ # Method 1
145
+ method = methods[1]
146
+ assert_equal('BasicObject#initialize', method.full_name)
147
+ assert_equal(0, method.line)
148
+ refute(method.recursive?)
149
+
150
+ assert_equal(1, method.call_trees.callers.count)
151
+ call_tree = method.call_trees.callers[0]
152
+ assert_equal('AliasTest#test_alias', call_tree.parent.target.full_name)
153
+ assert_equal(121, call_tree.line)
154
+
155
+ assert_equal(0, method.call_trees.callees.count)
156
+
157
+ # Method 2
158
+ method = methods[2]
159
+ assert_equal('AliasTest::TestMe#some_method', method.full_name)
160
+ assert_equal(13, method.line)
161
+ refute(method.recursive?)
162
+
163
+ assert_equal(1, method.call_trees.callers.count)
164
+ call_tree = method.call_trees.callers[0]
165
+ assert_equal('AliasTest#test_alias', call_tree.parent.target.full_name)
166
+ assert_equal(121, call_tree.line)
167
+
168
+ assert_equal(1, method.call_trees.callees.count)
169
+ call_tree = method.call_trees.callees[0]
170
+ assert_equal('AliasTest::TestMe#some_method_original', call_tree.target.full_name)
171
+ assert_equal(14, call_tree.line)
172
+
173
+ # Method 3
174
+ method = methods[3]
175
+ assert_equal('AliasTest::TestMe#some_method_original', method.full_name)
176
+ assert_equal(8, method.line)
177
+ refute(method.recursive?)
178
+
179
+ assert_equal(1, method.call_trees.callers.count)
180
+ call_tree = method.call_trees.callers[0]
181
+ assert_equal('AliasTest::TestMe#some_method', call_tree.parent.target.full_name)
182
+ assert_equal(14, call_tree.line)
183
+
184
+ assert_equal(1, method.call_trees.callees.count)
185
+ call_tree = method.call_trees.callees[0]
186
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
187
+ assert_equal(9, call_tree.line)
188
+
189
+ # Method 4
190
+ method = methods[4]
191
+ assert_equal('Kernel#sleep', method.full_name)
192
+ assert_equal(0, method.line)
193
+ refute(method.recursive?)
194
+
195
+ assert_equal(1, method.call_trees.callers.count)
196
+ call_tree = method.call_trees.callers[0]
197
+ assert_equal('AliasTest::TestMe#some_method_original', call_tree.parent.target.full_name)
198
+ assert_equal(9, call_tree.line)
199
+
200
+ assert_equal(0, method.call_trees.callees.count)
201
+ end
202
+ end
203
+ end
@@ -20,9 +20,9 @@ def build_call_tree(tree_hash)
20
20
  # tree_hash is a hash keyed on the parent method_name whose values are
21
21
  # child methods. Example:
22
22
  #
23
- # tree_hash = {:root => [:a, :b],
24
- # :a => [:aa, :ab],
25
- # :b => [:bb]}
23
+ # tree_hash = {root: [:a, :b],
24
+ # a: [:aa, :ab],
25
+ # b: [:bb]}
26
26
  #
27
27
  # Note this is a simplified structure for testing. It assumes methods
28
28
  # are only called from one call_tree.
@@ -49,9 +49,9 @@ def create_call_tree_1
49
49
  #
50
50
 
51
51
  # ------ Call Trees 1 -------------
52
- tree_hash = {:root => [:a, :b],
53
- :a => [:aa, :ab],
54
- :b => [:bb]}
52
+ tree_hash = {root: [:a, :b],
53
+ a: [:aa, :ab],
54
+ b: [:bb]}
55
55
 
56
56
  call_trees = build_call_tree(tree_hash)
57
57
 
@@ -90,9 +90,9 @@ def create_call_tree_2
90
90
  # \ / \
91
91
  # ab ba bb
92
92
 
93
- tree_hash = {:root => [:a, :b],
94
- :a => [:ab],
95
- :b => [:ba, :bb]}
93
+ tree_hash = {root: [:a, :b],
94
+ a: [:ab],
95
+ b: [:ba, :bb]}
96
96
 
97
97
  call_trees = build_call_tree(tree_hash)
98
98
 
@@ -1,27 +1,27 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
- require_relative './measure_times'
6
-
7
- class CallTreeVisitorTest < TestCase
8
- def test_visit
9
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
10
- RubyProf::C1.sleep_wait
11
- end
12
-
13
- visitor = RubyProf::CallTreeVisitor.new(result.threads.first.call_tree)
14
-
15
- method_names = Array.new
16
-
17
- visitor.visit do |call_tree, event|
18
- method_names << call_tree.target.full_name if event == :enter
19
- end
20
-
21
- assert_equal(3, method_names.length)
22
- assert_equal("CallTreeVisitorTest#test_visit", method_names[0])
23
- assert_equal("<Class::RubyProf::C1>#sleep_wait", method_names[1])
24
- assert_equal("Kernel#sleep", method_names[2])
25
- end
26
- end
27
-
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require_relative './measure_times'
6
+
7
+ class CallTreeVisitorTest < TestCase
8
+ def test_visit
9
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
10
+ RubyProf::C1.sleep_wait
11
+ end
12
+
13
+ visitor = RubyProf::CallTreeVisitor.new(result.threads.first.call_tree)
14
+
15
+ method_names = Array.new
16
+
17
+ visitor.visit do |call_tree, event|
18
+ method_names << call_tree.target.full_name if event == :enter
19
+ end
20
+
21
+ assert_equal(3, method_names.length)
22
+ assert_equal("CallTreeVisitorTest#test_visit", method_names[0])
23
+ assert_equal("<Class::RubyProf::C1>#sleep_wait", method_names[1])
24
+ assert_equal("Kernel#sleep", method_names[2])
25
+ end
26
+ end
27
+