ruby-prof 0.17.0 → 0.18.0

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 (185) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +500 -482
  3. data/LICENSE +24 -24
  4. data/README.rdoc +487 -485
  5. data/Rakefile +113 -113
  6. data/bin/ruby-prof +345 -345
  7. data/bin/ruby-prof-check-trace +45 -45
  8. data/examples/flat.txt +50 -50
  9. data/examples/graph.dot +84 -84
  10. data/examples/graph.html +823 -823
  11. data/examples/graph.txt +139 -139
  12. data/examples/multi.flat.txt +23 -23
  13. data/examples/multi.graph.html +760 -760
  14. data/examples/multi.grind.dat +114 -114
  15. data/examples/multi.stack.html +547 -547
  16. data/examples/stack.html +547 -547
  17. data/ext/ruby_prof/extconf.rb +68 -68
  18. data/ext/ruby_prof/rp_call_info.c +425 -425
  19. data/ext/ruby_prof/rp_call_info.h +53 -53
  20. data/ext/ruby_prof/rp_measure.c +40 -40
  21. data/ext/ruby_prof/rp_measure.h +45 -45
  22. data/ext/ruby_prof/rp_measure_allocations.c +76 -76
  23. data/ext/ruby_prof/rp_measure_cpu_time.c +136 -136
  24. data/ext/ruby_prof/rp_measure_gc_runs.c +73 -73
  25. data/ext/ruby_prof/rp_measure_gc_time.c +60 -60
  26. data/ext/ruby_prof/rp_measure_memory.c +77 -77
  27. data/ext/ruby_prof/rp_measure_process_time.c +71 -71
  28. data/ext/ruby_prof/rp_measure_wall_time.c +45 -45
  29. data/ext/ruby_prof/rp_method.c +630 -636
  30. data/ext/ruby_prof/rp_method.h +75 -75
  31. data/ext/ruby_prof/rp_stack.c +173 -173
  32. data/ext/ruby_prof/rp_stack.h +63 -63
  33. data/ext/ruby_prof/rp_thread.c +277 -276
  34. data/ext/ruby_prof/rp_thread.h +27 -27
  35. data/ext/ruby_prof/ruby_prof.c +794 -774
  36. data/ext/ruby_prof/ruby_prof.h +60 -59
  37. data/ext/ruby_prof/vc/ruby_prof.sln +20 -21
  38. data/ext/ruby_prof/vc/{ruby_prof_20.vcxproj → ruby_prof.vcxproj} +31 -0
  39. data/lib/ruby-prof.rb +68 -68
  40. data/lib/ruby-prof/aggregate_call_info.rb +76 -76
  41. data/lib/ruby-prof/assets/call_stack_printer.css.html +116 -116
  42. data/lib/ruby-prof/assets/call_stack_printer.js.html +384 -384
  43. data/lib/ruby-prof/call_info.rb +115 -115
  44. data/lib/ruby-prof/call_info_visitor.rb +40 -40
  45. data/lib/ruby-prof/compatibility.rb +179 -178
  46. data/lib/ruby-prof/method_info.rb +121 -121
  47. data/lib/ruby-prof/printers/abstract_printer.rb +104 -103
  48. data/lib/ruby-prof/printers/call_info_printer.rb +41 -41
  49. data/lib/ruby-prof/printers/call_stack_printer.rb +265 -265
  50. data/lib/ruby-prof/printers/call_tree_printer.rb +143 -143
  51. data/lib/ruby-prof/printers/dot_printer.rb +132 -132
  52. data/lib/ruby-prof/printers/flat_printer.rb +70 -70
  53. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +83 -83
  54. data/lib/ruby-prof/printers/graph_html_printer.rb +249 -249
  55. data/lib/ruby-prof/printers/graph_printer.rb +116 -116
  56. data/lib/ruby-prof/printers/multi_printer.rb +84 -84
  57. data/lib/ruby-prof/profile.rb +26 -26
  58. data/lib/ruby-prof/profile/exclude_common_methods.rb +207 -201
  59. data/lib/ruby-prof/profile/legacy_method_elimination.rb +50 -49
  60. data/lib/ruby-prof/rack.rb +174 -174
  61. data/lib/ruby-prof/task.rb +147 -147
  62. data/lib/ruby-prof/thread.rb +35 -35
  63. data/lib/ruby-prof/version.rb +3 -3
  64. data/lib/unprof.rb +10 -10
  65. data/ruby-prof.gemspec +58 -58
  66. data/test/abstract_printer_test.rb +53 -0
  67. data/test/aggregate_test.rb +136 -136
  68. data/test/basic_test.rb +128 -128
  69. data/test/block_test.rb +74 -74
  70. data/test/call_info_test.rb +78 -78
  71. data/test/call_info_visitor_test.rb +31 -31
  72. data/test/duplicate_names_test.rb +32 -32
  73. data/test/dynamic_method_test.rb +55 -55
  74. data/test/enumerable_test.rb +21 -21
  75. data/test/exceptions_test.rb +24 -16
  76. data/test/exclude_methods_test.rb +146 -146
  77. data/test/exclude_threads_test.rb +53 -53
  78. data/test/fiber_test.rb +79 -79
  79. data/test/issue137_test.rb +63 -63
  80. data/test/line_number_test.rb +80 -80
  81. data/test/measure_allocations_test.rb +26 -26
  82. data/test/measure_cpu_time_test.rb +212 -213
  83. data/test/measure_gc_runs_test.rb +32 -32
  84. data/test/measure_gc_time_test.rb +36 -36
  85. data/test/measure_memory_test.rb +33 -33
  86. data/test/measure_process_time_test.rb +61 -63
  87. data/test/measure_wall_time_test.rb +255 -255
  88. data/test/method_elimination_test.rb +84 -84
  89. data/test/module_test.rb +45 -45
  90. data/test/multi_printer_test.rb +104 -104
  91. data/test/no_method_class_test.rb +15 -15
  92. data/test/pause_resume_test.rb +166 -166
  93. data/test/prime.rb +54 -54
  94. data/test/printers_test.rb +275 -275
  95. data/test/printing_recursive_graph_test.rb +127 -127
  96. data/test/rack_test.rb +157 -157
  97. data/test/recursive_test.rb +215 -215
  98. data/test/singleton_test.rb +38 -38
  99. data/test/stack_printer_test.rb +77 -78
  100. data/test/stack_test.rb +138 -138
  101. data/test/start_stop_test.rb +112 -112
  102. data/test/test_helper.rb +267 -275
  103. data/test/thread_test.rb +187 -187
  104. data/test/unique_call_path_test.rb +202 -202
  105. data/test/yarv_test.rb +55 -55
  106. metadata +17 -96
  107. data/doc/LICENSE.html +0 -115
  108. data/doc/README_rdoc.html +0 -637
  109. data/doc/Rack.html +0 -96
  110. data/doc/Rack/RubyProf.html +0 -233
  111. data/doc/Rack/RubyProf/RackProfiler.html +0 -343
  112. data/doc/RubyProf.html +0 -974
  113. data/doc/RubyProf/AbstractPrinter.html +0 -625
  114. data/doc/RubyProf/AggregateCallInfo.html +0 -552
  115. data/doc/RubyProf/CallInfo.html +0 -579
  116. data/doc/RubyProf/CallInfoPrinter.html +0 -121
  117. data/doc/RubyProf/CallInfoVisitor.html +0 -199
  118. data/doc/RubyProf/CallStackPrinter.html +0 -1127
  119. data/doc/RubyProf/CallTreePrinter.html +0 -725
  120. data/doc/RubyProf/Cmd.html +0 -637
  121. data/doc/RubyProf/DeprecationWarnings.html +0 -148
  122. data/doc/RubyProf/DotPrinter.html +0 -258
  123. data/doc/RubyProf/FlatPrinter.html +0 -164
  124. data/doc/RubyProf/FlatPrinterWithLineNumbers.html +0 -210
  125. data/doc/RubyProf/GraphHtmlPrinter.html +0 -558
  126. data/doc/RubyProf/GraphPrinter.html +0 -140
  127. data/doc/RubyProf/MethodInfo.html +0 -676
  128. data/doc/RubyProf/MultiPrinter.html +0 -574
  129. data/doc/RubyProf/Profile.html +0 -908
  130. data/doc/RubyProf/Profile/ExcludeCommonMethods.html +0 -411
  131. data/doc/RubyProf/Profile/LegacyMethodElimination.html +0 -158
  132. data/doc/RubyProf/ProfileTask.html +0 -491
  133. data/doc/RubyProf/Thread.html +0 -275
  134. data/doc/created.rid +0 -33
  135. data/doc/css/fonts.css +0 -167
  136. data/doc/css/rdoc.css +0 -590
  137. data/doc/examples/flat_txt.html +0 -139
  138. data/doc/examples/graph_html.html +0 -910
  139. data/doc/examples/graph_txt.html +0 -248
  140. data/doc/fonts/Lato-Light.ttf +0 -0
  141. data/doc/fonts/Lato-LightItalic.ttf +0 -0
  142. data/doc/fonts/Lato-Regular.ttf +0 -0
  143. data/doc/fonts/Lato-RegularItalic.ttf +0 -0
  144. data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  145. data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  146. data/doc/images/add.png +0 -0
  147. data/doc/images/arrow_up.png +0 -0
  148. data/doc/images/brick.png +0 -0
  149. data/doc/images/brick_link.png +0 -0
  150. data/doc/images/bug.png +0 -0
  151. data/doc/images/bullet_black.png +0 -0
  152. data/doc/images/bullet_toggle_minus.png +0 -0
  153. data/doc/images/bullet_toggle_plus.png +0 -0
  154. data/doc/images/date.png +0 -0
  155. data/doc/images/delete.png +0 -0
  156. data/doc/images/find.png +0 -0
  157. data/doc/images/loadingAnimation.gif +0 -0
  158. data/doc/images/macFFBgHack.png +0 -0
  159. data/doc/images/package.png +0 -0
  160. data/doc/images/page_green.png +0 -0
  161. data/doc/images/page_white_text.png +0 -0
  162. data/doc/images/page_white_width.png +0 -0
  163. data/doc/images/plugin.png +0 -0
  164. data/doc/images/ruby.png +0 -0
  165. data/doc/images/tag_blue.png +0 -0
  166. data/doc/images/tag_green.png +0 -0
  167. data/doc/images/transparent.png +0 -0
  168. data/doc/images/wrench.png +0 -0
  169. data/doc/images/wrench_orange.png +0 -0
  170. data/doc/images/zoom.png +0 -0
  171. data/doc/index.html +0 -666
  172. data/doc/js/darkfish.js +0 -161
  173. data/doc/js/jquery.js +0 -4
  174. data/doc/js/navigation.js +0 -142
  175. data/doc/js/navigation.js.gz +0 -0
  176. data/doc/js/search.js +0 -109
  177. data/doc/js/search_index.js +0 -1
  178. data/doc/js/search_index.js.gz +0 -0
  179. data/doc/js/searcher.js +0 -229
  180. data/doc/js/searcher.js.gz +0 -0
  181. data/doc/table_of_contents.html +0 -1052
  182. data/examples/cachegrind.out.1 +0 -114
  183. data/examples/cachegrind.out.1.32313213 +0 -114
  184. data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +0 -108
  185. data/ext/ruby_prof/vc/ruby_prof_19.vcxproj +0 -110
@@ -1,201 +1,207 @@
1
- require 'set'
2
-
3
- module RubyProf
4
- class Profile
5
- class ExcludeCommonMethods
6
- ENUMERABLE_NAMES = Enumerable.instance_methods(false)
7
-
8
- def self.apply!(profile)
9
- new(profile).apply!
10
- end
11
-
12
- def initialize(profile)
13
- @profile = profile
14
- end
15
-
16
- def apply!
17
- ##
18
- # Kernel Methods
19
- ##
20
-
21
- exclude_methods Kernel, [
22
- :dup,
23
- :initialize_dup,
24
- :tap,
25
- :send,
26
- :public_send,
27
- ]
28
-
29
- ##
30
- # Fundamental Types
31
- ##
32
-
33
- exclude_methods BasicObject, :"!="
34
- exclude_methods Method, :"[]"
35
- exclude_methods Module, :new
36
- exclude_methods Class, :new
37
- exclude_methods Proc, :call, :yield
38
- exclude_methods Range, :each
39
- exclude_methods Integer, :times
40
-
41
- ##
42
- # Value Types
43
- ##
44
-
45
- exclude_methods String, [
46
- :sub,
47
- :sub!,
48
- :gsub,
49
- :gsub!,
50
- ]
51
-
52
- ##
53
- # Emumerables
54
- ##
55
-
56
- exclude_enumerable Enumerable
57
- exclude_enumerable Enumerator
58
-
59
- ##
60
- # Collections
61
- ##
62
-
63
- exclude_enumerable Array, [
64
- :each_index,
65
- :map!,
66
- :select!,
67
- :reject!,
68
- :collect!,
69
- :sort!,
70
- :sort_by!,
71
- :index,
72
- :delete_if,
73
- :keep_if,
74
- :drop_while,
75
- :uniq,
76
- :uniq!,
77
- :"==",
78
- :eql?,
79
- :hash,
80
- :to_json,
81
- :as_json,
82
- :encode_json,
83
- ]
84
-
85
- exclude_enumerable Hash, [
86
- :dup,
87
- :initialize_dup,
88
- :fetch,
89
- :"[]",
90
- :"[]=",
91
- :each_key,
92
- :each_value,
93
- :each_pair,
94
- :map!,
95
- :select!,
96
- :reject!,
97
- :collect!,
98
- :delete_if,
99
- :keep_if,
100
- :slice,
101
- :slice!,
102
- :except,
103
- :except!,
104
- :"==",
105
- :eql?,
106
- :hash,
107
- :to_json,
108
- :as_json,
109
- :encode_json,
110
- ]
111
-
112
- exclude_enumerable Set, [
113
- :map!,
114
- :select!,
115
- :reject!,
116
- :collect!,
117
- :classify,
118
- :delete_if,
119
- :keep_if,
120
- :divide,
121
- :"==",
122
- :eql?,
123
- :hash,
124
- :to_json,
125
- :as_json,
126
- :encode_json,
127
- ]
128
-
129
- ##
130
- # Garbage Collection
131
- ##
132
-
133
- exclude_singleton_methods GC, [
134
- :start
135
- ]
136
-
137
- ##
138
- # Unicorn
139
- ##
140
-
141
- if defined?(Unicorn)
142
- exclude_methods Unicorn::HttpServer, :process_client
143
- end
144
-
145
- if defined?(Unicorn::OobGC)
146
- exclude_methods Unicorn::OobGC, :process_client
147
- end
148
-
149
- ##
150
- # New Relic
151
- ##
152
-
153
- if defined?(NewRelic)
154
- exclude_methods NewRelic::Agent::Instrumentation::MiddlewareTracing, [
155
- :call
156
- ]
157
-
158
- exclude_methods NewRelic::Agent::MethodTracerHelpers, [
159
- :trace_execution_scoped,
160
- :log_errors,
161
- ]
162
-
163
- exclude_singleton_methods NewRelic::Agent::MethodTracerHelpers, [
164
- :trace_execution_scoped,
165
- :log_errors,
166
- ]
167
-
168
- exclude_methods NewRelic::Agent::MethodTracer, [
169
- :trace_execution_scoped,
170
- :trace_execution_unscoped,
171
- ]
172
- end
173
-
174
- ##
175
- # Miscellaneous Methods
176
- ##
177
-
178
- if defined?(Mustache)
179
- exclude_methods Mustache::Context, [
180
- :fetch
181
- ]
182
- end
183
- end
184
-
185
- private
186
-
187
- def exclude_methods(mod, *method_or_methods)
188
- @profile.exclude_methods!(mod, method_or_methods)
189
- end
190
-
191
- def exclude_singleton_methods(mod, *method_or_methods)
192
- @profile.exclude_singleton_methods!(mod, method_or_methods)
193
- end
194
-
195
- def exclude_enumerable(mod, *method_or_methods)
196
- exclude_methods(mod, [:each, *method_or_methods])
197
- exclude_methods(mod, ENUMERABLE_NAMES)
198
- end
199
- end
200
- end
201
- end
1
+ require 'set'
2
+
3
+ module RubyProf
4
+ class Profile
5
+ class ExcludeCommonMethods
6
+ ENUMERABLE_NAMES = Enumerable.instance_methods(false)
7
+
8
+ def self.apply!(profile)
9
+ new(profile).apply!
10
+ end
11
+
12
+ def initialize(profile)
13
+ @profile = profile
14
+ end
15
+
16
+ def apply!
17
+ ##
18
+ # Kernel Methods
19
+ ##
20
+
21
+ exclude_methods Kernel, [
22
+ :dup,
23
+ :initialize_dup,
24
+ :tap,
25
+ :send,
26
+ :public_send,
27
+ ]
28
+
29
+ ##
30
+ # Fundamental Types
31
+ ##
32
+
33
+ exclude_methods BasicObject, :"!="
34
+ exclude_methods Method, :"[]"
35
+ exclude_methods Module, :new
36
+ exclude_methods Class, :new
37
+ exclude_methods Proc, :call, :yield
38
+ exclude_methods Range, :each
39
+ exclude_methods Integer, :times
40
+
41
+ ##
42
+ # Value Types
43
+ ##
44
+
45
+ exclude_methods String, [
46
+ :sub,
47
+ :sub!,
48
+ :gsub,
49
+ :gsub!,
50
+ ]
51
+
52
+ ##
53
+ # Emumerables
54
+ ##
55
+
56
+ exclude_enumerable Enumerable
57
+ exclude_enumerable Enumerator
58
+
59
+ ##
60
+ # Collections
61
+ ##
62
+
63
+ exclude_enumerable Array, [
64
+ :each_index,
65
+ :map!,
66
+ :select!,
67
+ :reject!,
68
+ :collect!,
69
+ :sort!,
70
+ :sort_by!,
71
+ :index,
72
+ :delete_if,
73
+ :keep_if,
74
+ :drop_while,
75
+ :uniq,
76
+ :uniq!,
77
+ :"==",
78
+ :eql?,
79
+ :hash,
80
+ :to_json,
81
+ :as_json,
82
+ :encode_json,
83
+ ]
84
+
85
+ exclude_enumerable Hash, [
86
+ :dup,
87
+ :initialize_dup,
88
+ :fetch,
89
+ :"[]",
90
+ :"[]=",
91
+ :each_key,
92
+ :each_value,
93
+ :each_pair,
94
+ :map!,
95
+ :select!,
96
+ :reject!,
97
+ :collect!,
98
+ :delete_if,
99
+ :keep_if,
100
+ :slice,
101
+ :slice!,
102
+ :except,
103
+ :except!,
104
+ :"==",
105
+ :eql?,
106
+ :hash,
107
+ :to_json,
108
+ :as_json,
109
+ :encode_json,
110
+ ]
111
+
112
+ exclude_enumerable Set, [
113
+ :map!,
114
+ :select!,
115
+ :reject!,
116
+ :collect!,
117
+ :classify,
118
+ :delete_if,
119
+ :keep_if,
120
+ :divide,
121
+ :"==",
122
+ :eql?,
123
+ :hash,
124
+ :to_json,
125
+ :as_json,
126
+ :encode_json,
127
+ ]
128
+
129
+ ##
130
+ # Garbage Collection
131
+ ##
132
+
133
+ exclude_singleton_methods GC, [
134
+ :start
135
+ ]
136
+
137
+ ##
138
+ # Unicorn
139
+ ##
140
+
141
+ if defined?(Unicorn)
142
+ exclude_methods Unicorn::HttpServer, :process_client
143
+ end
144
+
145
+ if defined?(Unicorn::OobGC)
146
+ exclude_methods Unicorn::OobGC, :process_client
147
+ end
148
+
149
+ ##
150
+ # New Relic
151
+ ##
152
+
153
+ if defined?(NewRelic::Agent)
154
+ if defined?(NewRelic::Agent::Instrumentation::MiddlewareTracing)
155
+ exclude_methods NewRelic::Agent::Instrumentation::MiddlewareTracing, [
156
+ :call
157
+ ]
158
+ end
159
+
160
+ if defined?(NewRelic::Agent::MethodTracerHelpers)
161
+ exclude_methods NewRelic::Agent::MethodTracerHelpers, [
162
+ :trace_execution_scoped,
163
+ :log_errors,
164
+ ]
165
+
166
+ exclude_singleton_methods NewRelic::Agent::MethodTracerHelpers, [
167
+ :trace_execution_scoped,
168
+ :log_errors,
169
+ ]
170
+ end
171
+
172
+ if defined?(NewRelic::Agent::MethodTracer)
173
+ exclude_methods NewRelic::Agent::MethodTracer, [
174
+ :trace_execution_scoped,
175
+ :trace_execution_unscoped,
176
+ ]
177
+ end
178
+ end
179
+
180
+ ##
181
+ # Miscellaneous Methods
182
+ ##
183
+
184
+ if defined?(Mustache)
185
+ exclude_methods Mustache::Context, [
186
+ :fetch
187
+ ]
188
+ end
189
+ end
190
+
191
+ private
192
+
193
+ def exclude_methods(mod, *method_or_methods)
194
+ @profile.exclude_methods!(mod, method_or_methods)
195
+ end
196
+
197
+ def exclude_singleton_methods(mod, *method_or_methods)
198
+ @profile.exclude_singleton_methods!(mod, method_or_methods)
199
+ end
200
+
201
+ def exclude_enumerable(mod, *method_or_methods)
202
+ exclude_methods(mod, [:each, *method_or_methods])
203
+ exclude_methods(mod, ENUMERABLE_NAMES)
204
+ end
205
+ end
206
+ end
207
+ end
@@ -1,49 +1,50 @@
1
- module RubyProf
2
- class Profile
3
- module LegacyMethodElimination
4
- # eliminate some calls from the graph by merging the information into callers.
5
- # matchers can be a list of strings or regular expressions or the name of a file containing regexps.
6
- def eliminate_methods!(matchers)
7
- RubyProf.deprecation_warning(
8
- "Method 'eliminate_methods!' is dprecated",
9
- "Please call 'exclude_methods!' before starting the profile run instead."
10
- )
11
- matchers = read_regexps_from_file(matchers) if matchers.is_a?(String)
12
- eliminated = []
13
- threads.each do |thread|
14
- matchers.each{ |matcher| eliminated.concat(eliminate_methods(thread.methods, matcher)) }
15
- end
16
- eliminated
17
- end
18
-
19
- private
20
-
21
- # read regexps from file
22
- def read_regexps_from_file(file_name)
23
- matchers = []
24
- File.open(file_name).each_line do |l|
25
- next if (l =~ /^(#.*|\s*)$/) # emtpy lines and lines starting with #
26
- matchers << Regexp.new(l.strip)
27
- end
28
- end
29
-
30
- # eliminate methods matching matcher
31
- def eliminate_methods(methods, matcher)
32
- eliminated = []
33
- i = 0
34
- while i < methods.size
35
- method_info = methods[i]
36
- method_name = method_info.full_name
37
- if matcher === method_name
38
- raise "can't eliminate root method" if method_info.root?
39
- eliminated << methods.delete_at(i)
40
- method_info.eliminate!
41
- else
42
- i += 1
43
- end
44
- end
45
- eliminated
46
- end
47
- end
48
- end
49
- end
1
+ module RubyProf
2
+ class Profile
3
+ module LegacyMethodElimination
4
+ # eliminate some calls from the graph by merging the information into callers.
5
+ # matchers can be a list of strings or regular expressions or the name of a file containing regexps.
6
+ def eliminate_methods!(matchers)
7
+ RubyProf.deprecation_warning(
8
+ "Method 'eliminate_methods!' is deprecated",
9
+ "Please call 'exclude_methods!' before starting the profile run instead."
10
+ )
11
+ matchers = read_regexps_from_file(matchers) if matchers.is_a?(String)
12
+ eliminated = []
13
+ threads.each do |thread|
14
+ matchers.each{ |matcher| eliminated.concat(eliminate_methods(thread.methods, matcher)) }
15
+ end
16
+ eliminated
17
+ end
18
+
19
+ private
20
+
21
+ # read regexps from file
22
+ def read_regexps_from_file(file_name)
23
+ matchers = []
24
+ File.open(file_name).each_line do |l|
25
+ next if (l =~ /^(#.*|\s*)$/) # emtpy lines and lines starting with #
26
+ matchers << Regexp.new(l.strip)
27
+ end
28
+ matchers
29
+ end
30
+
31
+ # eliminate methods matching matcher
32
+ def eliminate_methods(methods, matcher)
33
+ eliminated = []
34
+ i = 0
35
+ while i < methods.size
36
+ method_info = methods[i]
37
+ method_name = method_info.full_name
38
+ if matcher === method_name
39
+ raise "can't eliminate root method" if method_info.root?
40
+ eliminated << methods.delete_at(i)
41
+ method_info.eliminate!
42
+ else
43
+ i += 1
44
+ end
45
+ end
46
+ eliminated
47
+ end
48
+ end
49
+ end
50
+ end