ruby-prof 0.15.6 → 0.15.7
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 +4 -4
- data/CHANGES +4 -0
- data/README.rdoc +8 -4
- data/doc/README_rdoc.html +8 -8
- data/doc/RubyProf/CallStackPrinter.html +91 -574
- data/doc/created.rid +4 -4
- data/doc/index.html +8 -8
- data/doc/js/search_index.js +1 -1
- data/doc/js/search_index.js.gz +0 -0
- data/doc/table_of_contents.html +72 -67
- data/lib/ruby-prof/printers/call_stack_printer.rb +29 -542
- data/lib/ruby-prof/version.rb +1 -1
- metadata +3 -6
- data/lib/ruby-prof/images/empty.png +0 -0
- data/lib/ruby-prof/images/minus.png +0 -0
- data/lib/ruby-prof/images/plus.png +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f31f6335c5b4bc25d847941cf578a08229c46051
|
4
|
+
data.tar.gz: c9f39f86d5d093e753e2a00d4cdf30244d025f1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2209b4b9767c7e197c38d07aab82f8f571f17704a248d5b4fb86d1c40499ed0608b2930e6e6ec9f027ef239ce9a5a956481f9438d9de66d630564ed763ec9d90
|
7
|
+
data.tar.gz: cf1ad769cee4fbc27afacfea9344dfda52ee3837cd1cbb6491f60e387b1b9fa98cd2c60ac8cebed078b51f0ee49ec7e14863096a0767641578a2c83a56ac1572
|
data/CHANGES
CHANGED
data/README.rdoc
CHANGED
@@ -16,7 +16,11 @@ ruby-prof is a fast code profiler for Ruby. Its features include:
|
|
16
16
|
|
17
17
|
== Requirements
|
18
18
|
|
19
|
-
ruby-prof requires Ruby 1.9.3 or higher.
|
19
|
+
ruby-prof requires Ruby 1.9.3 or higher. Please note some ruby
|
20
|
+
releases have known bugs which cause ruby-prof problems, like
|
21
|
+
incorrect measurements. We suggest to use the latest minor patch level
|
22
|
+
release if possible. In particular, on the 2.1 branch of ruby you
|
23
|
+
should use 2.1.5.
|
20
24
|
|
21
25
|
If you are running Linux or Unix you'll need a C compiler so the extension
|
22
26
|
can be compiled when it is installed.
|
@@ -143,16 +147,16 @@ If you want to get a more accurate measurement of what takes all of a gem's bin/
|
|
143
147
|
command to load, you may want to also measure rubygems' startup penalty.
|
144
148
|
You can do this by calling into bin/ruby-prof directly, ex:
|
145
149
|
|
146
|
-
$ gem which ruby-prof
|
150
|
+
$ gem which ruby-prof
|
147
151
|
g:/192/lib/ruby/gems/1.9.1/gems/ruby-prof-0.10.2/lib/ruby-prof.rb
|
148
152
|
|
149
153
|
now run it thus (substitute lib/ruby-prof.rb with bin/ruby-prof):
|
150
154
|
|
151
|
-
$ ruby g:/192/lib/ruby/gems/1.9.1/gems/ruby-prof-0.10.2/bin/ruby-prof g:\192\bin\some_installed_gem_command
|
155
|
+
$ ruby g:/192/lib/ruby/gems/1.9.1/gems/ruby-prof-0.10.2/bin/ruby-prof g:\192\bin\some_installed_gem_command
|
152
156
|
|
153
157
|
or
|
154
158
|
|
155
|
-
$ ruby g:/192/lib/ruby/gems/1.9.1/gems/ruby-prof-0.10.2/bin/ruby-prof ./some_file_that_does_a_require_rubygems_at_the_beginning.rb
|
159
|
+
$ ruby g:/192/lib/ruby/gems/1.9.1/gems/ruby-prof-0.10.2/bin/ruby-prof ./some_file_that_does_a_require_rubygems_at_the_beginning.rb
|
156
160
|
|
157
161
|
|
158
162
|
== Profiling Rails
|
data/doc/README_rdoc.html
CHANGED
@@ -136,7 +136,10 @@ href="README_rdoc.html">README</a>.</p>
|
|
136
136
|
|
137
137
|
<h2 id="label-Requirements">Requirements<span><a href="#label-Requirements">¶</a> <a href="#top">↑</a></span></h2>
|
138
138
|
|
139
|
-
<p>ruby-prof requires Ruby 1.9.3 or higher
|
139
|
+
<p>ruby-prof requires Ruby 1.9.3 or higher. Please note some ruby releases
|
140
|
+
have known bugs which cause ruby-prof problems, like incorrect
|
141
|
+
measurements. We suggest to use the latest minor patch level release if
|
142
|
+
possible. In particular, on the 2.1 branch of ruby you should use 2.1.5.</p>
|
140
143
|
|
141
144
|
<p>If you are running Linux or Unix you'll need a C compiler so the
|
142
145
|
extension can be compiled when it is installed.</p>
|
@@ -270,19 +273,16 @@ gem's bin/xxx command to load, you may want to also measure
|
|
270
273
|
rubygems' startup penalty. You can do this by calling into
|
271
274
|
bin/ruby-prof directly, ex:</p>
|
272
275
|
|
273
|
-
<
|
274
|
-
|
275
|
-
<pre>g:/192/lib/ruby/gems/1.9.1/gems/ruby-prof-0.10.2/lib/ruby-prof.rb</pre>
|
276
|
+
<pre>$ gem which ruby-prof
|
277
|
+
g:/192/lib/ruby/gems/1.9.1/gems/ruby-prof-0.10.2/lib/ruby-prof.rb</pre>
|
276
278
|
|
277
279
|
<p>now run it thus (substitute lib/ruby-prof.rb with bin/ruby-prof):</p>
|
278
280
|
|
279
|
-
<
|
280
|
-
g:192binsome_installed_gem_command</p>
|
281
|
+
<pre>$ ruby g:/192/lib/ruby/gems/1.9.1/gems/ruby-prof-0.10.2/bin/ruby-prof g:\192\bin\some_installed_gem_command</pre>
|
281
282
|
|
282
283
|
<p>or</p>
|
283
284
|
|
284
|
-
<
|
285
|
-
./some_file_that_does_a_require_rubygems_at_the_beginning.rb</p>
|
285
|
+
<pre>$ ruby g:/192/lib/ruby/gems/1.9.1/gems/ruby-prof-0.10.2/bin/ruby-prof ./some_file_that_does_a_require_rubygems_at_the_beginning.rb</pre>
|
286
286
|
|
287
287
|
<h2 id="label-Profiling+Rails">Profiling Rails<span><a href="#label-Profiling+Rails">¶</a> <a href="#top">↑</a></span></h2>
|
288
288
|
|
@@ -85,9 +85,9 @@
|
|
85
85
|
|
86
86
|
<li ><a href="#method-i-arguments">#arguments</a>
|
87
87
|
|
88
|
-
<li ><a href="#method-i-
|
88
|
+
<li ><a href="#method-i-base64_image">#base64_image</a>
|
89
89
|
|
90
|
-
<li ><a href="#method-i-
|
90
|
+
<li ><a href="#method-i-color">#color</a>
|
91
91
|
|
92
92
|
<li ><a href="#method-i-dump">#dump</a>
|
93
93
|
|
@@ -101,6 +101,8 @@
|
|
101
101
|
|
102
102
|
<li ><a href="#method-i-name">#name</a>
|
103
103
|
|
104
|
+
<li ><a href="#method-i-open_asset">#open_asset</a>
|
105
|
+
|
104
106
|
<li ><a href="#method-i-print">#print</a>
|
105
107
|
|
106
108
|
<li ><a href="#method-i-print_commands">#print_commands</a>
|
@@ -229,11 +231,11 @@
|
|
229
231
|
</div>
|
230
232
|
|
231
233
|
|
232
|
-
<div id="method-i-
|
234
|
+
<div id="method-i-base64_image" class="method-detail ">
|
233
235
|
|
234
236
|
<div class="method-heading">
|
235
|
-
<span class="method-name">
|
236
|
-
class="method-args">(
|
237
|
+
<span class="method-name">base64_image</span><span
|
238
|
+
class="method-args">()</span>
|
237
239
|
|
238
240
|
<span class="method-click-advice">click to toggle source</span>
|
239
241
|
|
@@ -247,19 +249,11 @@
|
|
247
249
|
|
248
250
|
|
249
251
|
|
250
|
-
<div class="method-source-code" id="
|
251
|
-
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line
|
252
|
-
<span class="ruby-keyword">def</span> <span class="ruby-identifier">
|
253
|
-
<span class="ruby-
|
254
|
-
<span class="ruby-
|
255
|
-
<span class="ruby-string">"01"</span>
|
256
|
-
<span class="ruby-keyword">when</span> <span class="ruby-value">5</span><span class="ruby-operator">..</span><span class="ruby-value">10</span>
|
257
|
-
<span class="ruby-string">"05"</span>
|
258
|
-
<span class="ruby-keyword">when</span> <span class="ruby-value">100</span>
|
259
|
-
<span class="ruby-string">"9"</span>
|
260
|
-
<span class="ruby-keyword">else</span>
|
261
|
-
<span class="ruby-node">"#{i/10}"</span>
|
262
|
-
<span class="ruby-keyword">end</span>
|
252
|
+
<div class="method-source-code" id="base64_image-source">
|
253
|
+
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line 208</span>
|
254
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">base64_image</span>
|
255
|
+
<span class="ruby-identifier">file</span> = <span class="ruby-identifier">open_asset</span>(<span class="ruby-string">'call_stack_printer.png'</span>)
|
256
|
+
<span class="ruby-constant">Base64</span>.<span class="ruby-identifier">encode64</span>(<span class="ruby-identifier">file</span>).<span class="ruby-identifier">gsub</span>(<span class="ruby-regexp">/\n/</span>, <span class="ruby-string">''</span>)
|
263
257
|
<span class="ruby-keyword">end</span></pre>
|
264
258
|
</div>
|
265
259
|
|
@@ -271,11 +265,11 @@
|
|
271
265
|
</div>
|
272
266
|
|
273
267
|
|
274
|
-
<div id="method-i-
|
268
|
+
<div id="method-i-color" class="method-detail ">
|
275
269
|
|
276
270
|
<div class="method-heading">
|
277
|
-
<span class="method-name">
|
278
|
-
class="method-args">()</span>
|
271
|
+
<span class="method-name">color</span><span
|
272
|
+
class="method-args">(p)</span>
|
279
273
|
|
280
274
|
<span class="method-click-advice">click to toggle source</span>
|
281
275
|
|
@@ -289,17 +283,18 @@
|
|
289
283
|
|
290
284
|
|
291
285
|
|
292
|
-
<div class="method-source-code" id="
|
293
|
-
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line
|
294
|
-
<span class="ruby-keyword">def</span> <span class="ruby-identifier">
|
295
|
-
<span class="ruby-keyword">
|
296
|
-
|
297
|
-
<span class="ruby-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
286
|
+
<div class="method-source-code" id="color-source">
|
287
|
+
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line 149</span>
|
288
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">color</span>(<span class="ruby-identifier">p</span>)
|
289
|
+
<span class="ruby-keyword">case</span> <span class="ruby-identifier">i</span> = <span class="ruby-identifier">p</span>.<span class="ruby-identifier">to_i</span>
|
290
|
+
<span class="ruby-keyword">when</span> <span class="ruby-value">0</span><span class="ruby-operator">..</span><span class="ruby-value">5</span>
|
291
|
+
<span class="ruby-string">"01"</span>
|
292
|
+
<span class="ruby-keyword">when</span> <span class="ruby-value">5</span><span class="ruby-operator">..</span><span class="ruby-value">10</span>
|
293
|
+
<span class="ruby-string">"05"</span>
|
294
|
+
<span class="ruby-keyword">when</span> <span class="ruby-value">100</span>
|
295
|
+
<span class="ruby-string">"9"</span>
|
296
|
+
<span class="ruby-keyword">else</span>
|
297
|
+
<span class="ruby-node">"#{i/10}"</span>
|
303
298
|
<span class="ruby-keyword">end</span>
|
304
299
|
<span class="ruby-keyword">end</span></pre>
|
305
300
|
</div>
|
@@ -521,6 +516,40 @@
|
|
521
516
|
|
522
517
|
|
523
518
|
|
519
|
+
</div>
|
520
|
+
|
521
|
+
|
522
|
+
<div id="method-i-open_asset" class="method-detail ">
|
523
|
+
|
524
|
+
<div class="method-heading">
|
525
|
+
<span class="method-name">open_asset</span><span
|
526
|
+
class="method-args">(file)</span>
|
527
|
+
|
528
|
+
<span class="method-click-advice">click to toggle source</span>
|
529
|
+
|
530
|
+
</div>
|
531
|
+
|
532
|
+
|
533
|
+
<div class="method-description">
|
534
|
+
|
535
|
+
|
536
|
+
|
537
|
+
|
538
|
+
|
539
|
+
|
540
|
+
<div class="method-source-code" id="open_asset-source">
|
541
|
+
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line 198</span>
|
542
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">open_asset</span>(<span class="ruby-identifier">file</span>)
|
543
|
+
<span class="ruby-identifier">path</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-string">'../../assets'</span>, <span class="ruby-keyword">__FILE__</span>), <span class="ruby-identifier">file</span>)
|
544
|
+
<span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">path</span>, <span class="ruby-string">'rb'</span>).<span class="ruby-identifier">read</span>
|
545
|
+
<span class="ruby-keyword">end</span></pre>
|
546
|
+
</div>
|
547
|
+
|
548
|
+
</div>
|
549
|
+
|
550
|
+
|
551
|
+
|
552
|
+
|
524
553
|
</div>
|
525
554
|
|
526
555
|
|
@@ -569,7 +598,7 @@
|
|
569
598
|
|
570
599
|
|
571
600
|
<div class="method-source-code" id="print-source">
|
572
|
-
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line
|
601
|
+
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line 38</span>
|
573
602
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">print</span>(<span class="ruby-identifier">output</span> = <span class="ruby-constant">STDOUT</span>, <span class="ruby-identifier">options</span> = {})
|
574
603
|
<span class="ruby-ivar">@output</span> = <span class="ruby-identifier">output</span>
|
575
604
|
<span class="ruby-identifier">setup_options</span>(<span class="ruby-identifier">options</span>)
|
@@ -604,7 +633,6 @@
|
|
604
633
|
|
605
634
|
<span class="ruby-identifier">print_footer</span>
|
606
635
|
|
607
|
-
<span class="ruby-identifier">copy_image_files</span>
|
608
636
|
<span class="ruby-keyword">end</span></pre>
|
609
637
|
</div>
|
610
638
|
|
@@ -635,7 +663,7 @@
|
|
635
663
|
|
636
664
|
|
637
665
|
<div class="method-source-code" id="print_commands-source">
|
638
|
-
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line
|
666
|
+
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line 227</span>
|
639
667
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">print_commands</span>
|
640
668
|
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value"><<-"end_commands"
|
641
669
|
<div id=\"commands\">
|
@@ -677,111 +705,11 @@ end_commands</span>
|
|
677
705
|
|
678
706
|
|
679
707
|
<div class="method-source-code" id="print_css-source">
|
680
|
-
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
body {
|
686
|
-
font-size:70%;
|
687
|
-
padding:0px;
|
688
|
-
margin:5px;
|
689
|
-
margin-right:0px;
|
690
|
-
margin-left:0px;
|
691
|
-
background: #ffffff;
|
692
|
-
}
|
693
|
-
ul {
|
694
|
-
margin-left:0px;
|
695
|
-
margin-top:0px;
|
696
|
-
margin-bottom:0px;
|
697
|
-
padding-left:0px;
|
698
|
-
list-style-type:none;
|
699
|
-
}
|
700
|
-
li {
|
701
|
-
margin-left:11px;
|
702
|
-
padding:0px;
|
703
|
-
white-space:nowrap;
|
704
|
-
border-top:1px solid #cccccc;
|
705
|
-
border-left:1px solid #cccccc;
|
706
|
-
border-bottom:none;
|
707
|
-
}
|
708
|
-
.thread {
|
709
|
-
margin-left:11px;
|
710
|
-
background:#708090;
|
711
|
-
padding-top:3px;
|
712
|
-
padding-left:12px;
|
713
|
-
padding-bottom:2px;
|
714
|
-
border-left:1px solid #CCCCCC;
|
715
|
-
border-top:1px solid #CCCCCC;
|
716
|
-
font-weight:bold;
|
717
|
-
}
|
718
|
-
.hidden {
|
719
|
-
display:none;
|
720
|
-
width:0px;
|
721
|
-
height:0px;
|
722
|
-
margin:0px;
|
723
|
-
padding:0px;
|
724
|
-
border-style:none;
|
725
|
-
}
|
726
|
-
.color01 { background:#adbdeb }
|
727
|
-
.color05 { background:#9daddb }
|
728
|
-
.color0 { background:#8d9dcb }
|
729
|
-
.color1 { background:#89bccb }
|
730
|
-
.color2 { background:#56e3e7 }
|
731
|
-
.color3 { background:#32cd70 }
|
732
|
-
.color4 { background:#a3d53c }
|
733
|
-
.color5 { background:#c4cb34 }
|
734
|
-
.color6 { background:#dcb66d }
|
735
|
-
.color7 { background:#cda59e }
|
736
|
-
.color8 { background:#be9d9c }
|
737
|
-
.color9 { background:#cf947a }
|
738
|
-
#commands {
|
739
|
-
font-size:10pt;
|
740
|
-
padding:10px;
|
741
|
-
margin-left:11px;
|
742
|
-
margin-bottom:0px;
|
743
|
-
margin-top:0px;
|
744
|
-
background:#708090;
|
745
|
-
border-top:1px solid #cccccc;
|
746
|
-
border-left:1px solid #cccccc;
|
747
|
-
border-bottom:none;
|
748
|
-
}
|
749
|
-
#titlebar {
|
750
|
-
font-size:10pt;
|
751
|
-
padding:10px;
|
752
|
-
margin-left:11px;
|
753
|
-
margin-bottom:0px;
|
754
|
-
margin-top:10px;
|
755
|
-
background:#8090a0;
|
756
|
-
border-top:1px solid #cccccc;
|
757
|
-
border-left:1px solid #cccccc;
|
758
|
-
border-bottom:none;
|
759
|
-
}
|
760
|
-
#help {
|
761
|
-
font-size:10pt;
|
762
|
-
padding:10px;
|
763
|
-
margin-left:11px;
|
764
|
-
margin-bottom:0px;
|
765
|
-
margin-top:0px;
|
766
|
-
background:#8090a0;
|
767
|
-
display:none;
|
768
|
-
border-top:1px solid #cccccc;
|
769
|
-
border-left:1px solid #cccccc;
|
770
|
-
border-bottom:none;
|
771
|
-
}
|
772
|
-
#sentinel {
|
773
|
-
height: 400px;
|
774
|
-
margin-left:11px;
|
775
|
-
background:#8090a0;
|
776
|
-
border-top:1px solid #cccccc;
|
777
|
-
border-left:1px solid #cccccc;
|
778
|
-
border-bottom:none;
|
779
|
-
}
|
780
|
-
input { margin-left:10px; }
|
781
|
-
-->
|
782
|
-
</style>
|
783
|
-
end_css</span>
|
784
|
-
<span class="ruby-keyword">end</span></pre>
|
708
|
+
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line 203</span>
|
709
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">print_css</span>
|
710
|
+
<span class="ruby-identifier">html</span> = <span class="ruby-identifier">open_asset</span>(<span class="ruby-string">'call_stack_printer.css.html'</span>)
|
711
|
+
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">html</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-string">'%s'</span>, <span class="ruby-identifier">base64_image</span>)
|
712
|
+
<span class="ruby-keyword">end</span></pre>
|
785
713
|
</div>
|
786
714
|
|
787
715
|
</div>
|
@@ -811,7 +739,7 @@ end_css</span>
|
|
811
739
|
|
812
740
|
|
813
741
|
<div class="method-source-code" id="print_footer-source">
|
814
|
-
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line
|
742
|
+
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line 194</span>
|
815
743
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">print_footer</span>
|
816
744
|
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">'<div id="sentinel"></div></div></body></html>'</span>
|
817
745
|
<span class="ruby-keyword">end</span></pre>
|
@@ -844,7 +772,7 @@ end_css</span>
|
|
844
772
|
|
845
773
|
|
846
774
|
<div class="method-source-code" id="print_header-source">
|
847
|
-
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line
|
775
|
+
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line 182</span>
|
848
776
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">print_header</span>
|
849
777
|
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">"<html><head>"</span>
|
850
778
|
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">'<meta http-equiv="content-type" content="text/html; charset=utf-8">'</span>
|
@@ -885,21 +813,21 @@ end_css</span>
|
|
885
813
|
|
886
814
|
|
887
815
|
<div class="method-source-code" id="print_help-source">
|
888
|
-
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line
|
816
|
+
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line 240</span>
|
889
817
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">print_help</span>
|
890
818
|
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value"><<-'end_help'
|
891
819
|
<div style="display: none;" id="help">
|
892
|
-
&
|
893
|
-
to hide all nodes marked with time values lower than <i>d</i>.<br>
|
894
|
-
&
|
895
|
-
&
|
896
|
-
&
|
897
|
-
&
|
898
|
-
&
|
899
|
-
&
|
900
|
-
&
|
901
|
-
&
|
902
|
-
&
|
820
|
+
&#8226; Enter a decimal value <i>d</i> into the threshold field and click "Apply"
|
821
|
+
to hide all nodes marked with time values lower than <i>d</i>.<br>
|
822
|
+
&#8226; Click on "Expand All" for full tree expansion.<br>
|
823
|
+
&#8226; Click on "Collapse All" to show only top level nodes.<br>
|
824
|
+
&#8226; Use a, s, d, w as in Quake or Urban Terror to navigate the tree.<br>
|
825
|
+
&#8226; Use f and b to navigate the tree in preorder forward and backwards.<br>
|
826
|
+
&#8226; Use x to toggle visibility of a subtree.<br>
|
827
|
+
&#8226; Use * to expand/collapse a whole subtree.<br>
|
828
|
+
&#8226; Use h to navigate to thread root.<br>
|
829
|
+
&#8226; Use n and p to navigate between threads.<br>
|
830
|
+
&#8226; Click on background to move focus to a subtree.<br>
|
903
831
|
</div>
|
904
832
|
end_help</span>
|
905
833
|
<span class="ruby-keyword">end</span></pre>
|
@@ -932,422 +860,11 @@ end_help</span>
|
|
932
860
|
|
933
861
|
|
934
862
|
<div class="method-source-code" id="print_java_script-source">
|
935
|
-
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
940
|
-
Copyright (C) 2005,2009 Stefan Kaes
|
941
|
-
skaes@railsexpress.de
|
942
|
-
*/
|
943
|
-
|
944
|
-
function rootNode() {
|
945
|
-
return currentThread;
|
946
|
-
}
|
947
|
-
|
948
|
-
function hideUL(node) {
|
949
|
-
var lis = node.childNodes
|
950
|
-
var l = lis.length;
|
951
|
-
for (var i=0; i < l ; i++ ) {
|
952
|
-
hideLI(lis[i]);
|
953
|
-
}
|
954
|
-
}
|
955
|
-
|
956
|
-
function showUL(node) {
|
957
|
-
var lis = node.childNodes;
|
958
|
-
var l = lis.length;
|
959
|
-
for (var i=0; i < l ; i++ ) {
|
960
|
-
showLI(lis[i]);
|
961
|
-
}
|
962
|
-
}
|
963
|
-
|
964
|
-
function findUlChild(li){
|
965
|
-
var ul = li.childNodes[2];
|
966
|
-
while (ul && ul.nodeName != "UL") {
|
967
|
-
ul = ul.nextSibling;
|
968
|
-
}
|
969
|
-
return ul;
|
970
|
-
}
|
971
|
-
|
972
|
-
function isLeafNode(li) {
|
973
|
-
var img = li.firstChild;
|
974
|
-
return (img.src.indexOf('empty.png') > -1);
|
975
|
-
}
|
976
|
-
|
977
|
-
function hideLI(li) {
|
978
|
-
if (isLeafNode(li))
|
979
|
-
return;
|
980
|
-
|
981
|
-
var img = li.firstChild;
|
982
|
-
img.src = 'plus.png';
|
983
|
-
|
984
|
-
var ul = findUlChild(li);
|
985
|
-
if (ul) {
|
986
|
-
ul.style.display = 'none';
|
987
|
-
hideUL(ul);
|
988
|
-
}
|
989
|
-
}
|
990
|
-
|
991
|
-
function showLI(li) {
|
992
|
-
if (isLeafNode(li))
|
993
|
-
return;
|
994
|
-
|
995
|
-
var img = li.firstChild;
|
996
|
-
img.src = 'minus.png';
|
997
|
-
|
998
|
-
var ul = findUlChild(li);
|
999
|
-
if (ul) {
|
1000
|
-
ul.style.display = 'block';
|
1001
|
-
showUL(ul);
|
1002
|
-
}
|
1003
|
-
}
|
1004
|
-
|
1005
|
-
function toggleLI(li) {
|
1006
|
-
var img = li.firstChild;
|
1007
|
-
if (img.src.indexOf("minus.png")>-1)
|
1008
|
-
hideLI(li);
|
1009
|
-
else {
|
1010
|
-
if (img.src.indexOf("plus.png")>-1)
|
1011
|
-
showLI(li);
|
1012
|
-
}
|
1013
|
-
}
|
1014
|
-
|
1015
|
-
function aboveThreshold(text, threshold) {
|
1016
|
-
var match = text.match(/\d+[.,]\d+/);
|
1017
|
-
return (match && parseFloat(match[0].replace(/,/, '.'))>=threshold);
|
1018
|
-
}
|
1019
|
-
|
1020
|
-
function setThresholdLI(li, threshold) {
|
1021
|
-
var img = li.firstChild;
|
1022
|
-
var text = img.nextSibling;
|
1023
|
-
var ul = findUlChild(li);
|
1024
|
-
|
1025
|
-
var visible = aboveThreshold(text.nodeValue, threshold) ? 1 : 0;
|
1026
|
-
|
1027
|
-
var count = 0;
|
1028
|
-
if (ul) {
|
1029
|
-
count = setThresholdUL(ul, threshold);
|
1030
|
-
}
|
1031
|
-
if (count>0) {
|
1032
|
-
img.src = 'minus.png';
|
1033
|
-
}
|
1034
|
-
else {
|
1035
|
-
img.src = 'empty.png';
|
1036
|
-
}
|
1037
|
-
if (visible) {
|
1038
|
-
li.style.display = 'block'
|
1039
|
-
}
|
1040
|
-
else {
|
1041
|
-
li.style.display = 'none'
|
1042
|
-
}
|
1043
|
-
return visible;
|
1044
|
-
}
|
1045
|
-
|
1046
|
-
function setThresholdUL(node, threshold) {
|
1047
|
-
var lis = node.childNodes;
|
1048
|
-
var l = lis.length;
|
1049
|
-
|
1050
|
-
var count = 0;
|
1051
|
-
for ( var i = 0; i < l ; i++ ) {
|
1052
|
-
count = count + setThresholdLI(lis[i], threshold);
|
1053
|
-
}
|
1054
|
-
|
1055
|
-
var visible = (count > 0) ? 1 : 0;
|
1056
|
-
if (visible) {
|
1057
|
-
node.style.display = 'block';
|
1058
|
-
}
|
1059
|
-
else {
|
1060
|
-
node.style.display = 'none';
|
1061
|
-
}
|
1062
|
-
return visible;
|
1063
|
-
}
|
1064
|
-
|
1065
|
-
function toggleChildren(img, event) {
|
1066
|
-
event.cancelBubble=true;
|
1067
|
-
|
1068
|
-
if (img.src.indexOf('empty.png') > -1)
|
1069
|
-
return;
|
1070
|
-
|
1071
|
-
var minus = (img.src.indexOf('minus.png') > -1);
|
1072
|
-
|
1073
|
-
if (minus) {
|
1074
|
-
img.src = 'plus.png';
|
1075
|
-
}
|
1076
|
-
else
|
1077
|
-
img.src = 'minus.png';
|
1078
|
-
|
1079
|
-
var li = img.parentNode;
|
1080
|
-
var ul = findUlChild(li);
|
1081
|
-
if (ul) {
|
1082
|
-
if (minus)
|
1083
|
-
ul.style.display = 'none';
|
1084
|
-
else
|
1085
|
-
ul.style.display = 'block';
|
1086
|
-
}
|
1087
|
-
if (minus)
|
1088
|
-
moveSelectionIfNecessary(li);
|
1089
|
-
}
|
1090
|
-
|
1091
|
-
function showChildren(li) {
|
1092
|
-
var img = li.firstChild;
|
1093
|
-
if (img.src.indexOf('empty.png') > -1)
|
1094
|
-
return;
|
1095
|
-
img.src = 'minus.png';
|
1096
|
-
|
1097
|
-
var ul = findUlChild(li);
|
1098
|
-
if (ul) {
|
1099
|
-
ul.style.display = 'block';
|
1100
|
-
}
|
1101
|
-
}
|
1102
|
-
|
1103
|
-
function setThreshold() {
|
1104
|
-
var tv = document.getElementById("threshold").value;
|
1105
|
-
if (tv.match(/[0-9]+([.,][0-9]+)?/)) {
|
1106
|
-
var f = parseFloat(tv.replace(/,/, '.'));
|
1107
|
-
var threads = document.getElementsByName("thread");
|
1108
|
-
var l = threads.length;
|
1109
|
-
for ( var i = 0; i < l ; i++ ) {
|
1110
|
-
setThresholdUL(threads[i], f);
|
1111
|
-
}
|
1112
|
-
var p = selectedNode;
|
1113
|
-
while (p && p.style.display=='none')
|
1114
|
-
p=p.parentNode.parentNode;
|
1115
|
-
if (p && p.nodeName=="LI")
|
1116
|
-
selectNode(p);
|
1117
|
-
}
|
1118
|
-
else {
|
1119
|
-
alert("Please specify a decimal number as threshold value!");
|
1120
|
-
}
|
1121
|
-
}
|
1122
|
-
|
1123
|
-
function collapseAll(event) {
|
1124
|
-
event.cancelBubble=true;
|
1125
|
-
var threads = document.getElementsByName("thread");
|
1126
|
-
var l = threads.length;
|
1127
|
-
for ( var i = 0; i < l ; i++ ) {
|
1128
|
-
hideUL(threads[i]);
|
1129
|
-
}
|
1130
|
-
selectNode(rootNode(), null);
|
1131
|
-
}
|
1132
|
-
|
1133
|
-
function expandAll(event) {
|
1134
|
-
event.cancelBubble=true;
|
1135
|
-
var threads = document.getElementsByName("thread");
|
1136
|
-
var l = threads.length;
|
1137
|
-
for ( var i = 0; i < l ; i++ ) {
|
1138
|
-
showUL(threads[i]);
|
1139
|
-
}
|
1140
|
-
}
|
1141
|
-
|
1142
|
-
function toggleHelp(node) {
|
1143
|
-
var help = document.getElementById("help");
|
1144
|
-
if (node.value == "Show Help") {
|
1145
|
-
node.value = "Hide Help";
|
1146
|
-
help.style.display = 'block';
|
1147
|
-
}
|
1148
|
-
else {
|
1149
|
-
node.value = "Show Help";
|
1150
|
-
help.style.display = 'none';
|
1151
|
-
}
|
1152
|
-
}
|
1153
|
-
|
1154
|
-
var selectedNode = null;
|
1155
|
-
var selectedColor = null;
|
1156
|
-
var selectedThread = null;
|
1157
|
-
|
1158
|
-
function descendentOf(a,b){
|
1159
|
-
while (a!=b && b!=null)
|
1160
|
-
b=b.parentNode;
|
1161
|
-
return (a==b);
|
1162
|
-
}
|
1163
|
-
|
1164
|
-
function moveSelectionIfNecessary(node){
|
1165
|
-
if (descendentOf(node, selectedNode))
|
1166
|
-
selectNode(node, null);
|
1167
|
-
}
|
1168
|
-
|
1169
|
-
function selectNode(node, event) {
|
1170
|
-
if (event) {
|
1171
|
-
event.cancelBubble = true;
|
1172
|
-
thread = findThread(node);
|
1173
|
-
selectThread(thread);
|
1174
|
-
}
|
1175
|
-
if (selectedNode) {
|
1176
|
-
selectedNode.style.background = selectedColor;
|
1177
|
-
}
|
1178
|
-
selectedNode = node;
|
1179
|
-
selectedColor = node.style.background;
|
1180
|
-
selectedNode.style.background = "red";
|
1181
|
-
selectedNode.scrollIntoView();
|
1182
|
-
window.scrollBy(0,-400);
|
1183
|
-
}
|
1184
|
-
|
1185
|
-
function moveUp(){
|
1186
|
-
var p = selectedNode.previousSibling;
|
1187
|
-
while (p && p.style.display == 'none')
|
1188
|
-
p = p.previousSibling;
|
1189
|
-
if (p && p.nodeName == "LI") {
|
1190
|
-
selectNode(p, null);
|
1191
|
-
}
|
1192
|
-
}
|
1193
|
-
|
1194
|
-
function moveDown(){
|
1195
|
-
var p = selectedNode.nextSibling;
|
1196
|
-
while (p && p.style.display == 'none')
|
1197
|
-
p = p.nextSibling;
|
1198
|
-
if (p && p.nodeName == "LI") {
|
1199
|
-
selectNode(p, null);
|
1200
|
-
}
|
1201
|
-
}
|
1202
|
-
|
1203
|
-
function moveLeft(){
|
1204
|
-
var p = selectedNode.parentNode.parentNode;
|
1205
|
-
if (p && p.nodeName=="LI") {
|
1206
|
-
selectNode(p, null);
|
1207
|
-
}
|
1208
|
-
}
|
1209
|
-
|
1210
|
-
function moveRight(){
|
1211
|
-
if (!isLeafNode(selectedNode)) {
|
1212
|
-
showChildren(selectedNode);
|
1213
|
-
var ul = findUlChild(selectedNode);
|
1214
|
-
if (ul) {
|
1215
|
-
selectNode(ul.firstChild, null);
|
1216
|
-
}
|
1217
|
-
}
|
1218
|
-
}
|
1219
|
-
|
1220
|
-
function moveForward(){
|
1221
|
-
if (isLeafNode(selectedNode)) {
|
1222
|
-
var p = selectedNode;
|
1223
|
-
while ((p.nextSibling == null || p.nextSibling.style.display=='none') && p.nodeName=="LI") {
|
1224
|
-
p = p.parentNode.parentNode;
|
1225
|
-
}
|
1226
|
-
if (p.nodeName=="LI")
|
1227
|
-
selectNode(p.nextSibling, null);
|
1228
|
-
}
|
1229
|
-
else {
|
1230
|
-
moveRight();
|
1231
|
-
}
|
1232
|
-
}
|
1233
|
-
|
1234
|
-
function isExpandedNode(li){
|
1235
|
-
var img = li.firstChild;
|
1236
|
-
return(img.src.indexOf('minus.png')>-1);
|
1237
|
-
}
|
1238
|
-
|
1239
|
-
function moveBackward(){
|
1240
|
-
var p = selectedNode;
|
1241
|
-
var q = p.previousSibling;
|
1242
|
-
while (q != null && q.style.display=='none')
|
1243
|
-
q = q.previousSibling;
|
1244
|
-
if (q == null) {
|
1245
|
-
p = p.parentNode.parentNode;
|
1246
|
-
} else {
|
1247
|
-
while (!isLeafNode(q) && isExpandedNode(q)) {
|
1248
|
-
q = findUlChild(q).lastChild;
|
1249
|
-
while (q.style.display=='none')
|
1250
|
-
q = q.previousSibling;
|
1251
|
-
}
|
1252
|
-
p = q;
|
1253
|
-
}
|
1254
|
-
if (p.nodeName=="LI")
|
1255
|
-
selectNode(p, null);
|
1256
|
-
}
|
1257
|
-
|
1258
|
-
function moveHome() {
|
1259
|
-
selectNode(currentThread);
|
1260
|
-
}
|
1261
|
-
|
1262
|
-
var currentThreadIndex = null;
|
1263
|
-
|
1264
|
-
function findThread(node){
|
1265
|
-
while (node && node.parentNode.nodeName!="BODY") {
|
1266
|
-
node = node.parentNode;
|
1267
|
-
}
|
1268
|
-
return node.firstChild;
|
1269
|
-
}
|
1270
|
-
|
1271
|
-
function selectThread(node){
|
1272
|
-
var threads = document.getElementsByName("thread");
|
1273
|
-
currentThread = node;
|
1274
|
-
for (var i=0; i<threads.length; i++) {
|
1275
|
-
if (threads[i]==currentThread.parentNode)
|
1276
|
-
currentThreadIndex = i;
|
1277
|
-
}
|
1278
|
-
}
|
1279
|
-
|
1280
|
-
function nextThread(){
|
1281
|
-
var threads = document.getElementsByName("thread");
|
1282
|
-
if (currentThreadIndex==threads.length-1)
|
1283
|
-
currentThreadIndex = 0;
|
1284
|
-
else
|
1285
|
-
currentThreadIndex += 1
|
1286
|
-
currentThread = threads[currentThreadIndex].firstChild;
|
1287
|
-
selectNode(currentThread, null);
|
1288
|
-
}
|
1289
|
-
|
1290
|
-
function previousThread(){
|
1291
|
-
var threads = document.getElementsByName("thread");
|
1292
|
-
if (currentThreadIndex==0)
|
1293
|
-
currentThreadIndex = threads.length-1;
|
1294
|
-
else
|
1295
|
-
currentThreadIndex -= 1
|
1296
|
-
currentThread = threads[currentThreadIndex].firstChild;
|
1297
|
-
selectNode(currentThread, null);
|
1298
|
-
}
|
1299
|
-
|
1300
|
-
function switchThread(node, event){
|
1301
|
-
event.cancelBubble = true;
|
1302
|
-
selectThread(node.nextSibling.firstChild);
|
1303
|
-
selectNode(currentThread, null);
|
1304
|
-
}
|
1305
|
-
|
1306
|
-
function handleKeyEvent(event){
|
1307
|
-
var code = event.charCode ? event.charCode : event.keyCode;
|
1308
|
-
var str = String.fromCharCode(code);
|
1309
|
-
switch (str) {
|
1310
|
-
case "a": moveLeft(); break;
|
1311
|
-
case "s": moveDown(); break;
|
1312
|
-
case "d": moveRight(); break;
|
1313
|
-
case "w": moveUp(); break;
|
1314
|
-
case "f": moveForward(); break;
|
1315
|
-
case "b": moveBackward(); break;
|
1316
|
-
case "x": toggleChildren(selectedNode.firstChild, event); break;
|
1317
|
-
case "*": toggleLI(selectedNode); break;
|
1318
|
-
case "n": nextThread(); break;
|
1319
|
-
case "h": moveHome(); break;
|
1320
|
-
case "p": previousThread(); break;
|
1321
|
-
}
|
1322
|
-
}
|
1323
|
-
document.onkeypress=function(event){ handleKeyEvent(event) };
|
1324
|
-
|
1325
|
-
window.onload=function(){
|
1326
|
-
var images = document.getElementsByTagName("img");
|
1327
|
-
for (var i=0; i<images.length; i++) {
|
1328
|
-
var img = images[i];
|
1329
|
-
if (img.className == "toggle") {
|
1330
|
-
img.onclick = function(event){ toggleChildren(this, event); };
|
1331
|
-
}
|
1332
|
-
}
|
1333
|
-
var divs = document.getElementsByTagName("div");
|
1334
|
-
for (i=0; i<divs.length; i++) {
|
1335
|
-
var div = divs[i];
|
1336
|
-
if (div.className == "thread")
|
1337
|
-
div.onclick = function(event){ switchThread(this, event) };
|
1338
|
-
}
|
1339
|
-
var lis = document.getElementsByTagName("li");
|
1340
|
-
for (var i=0; i<lis.length; i++) {
|
1341
|
-
lis[i].onclick = function(event){ selectNode(this, event); };
|
1342
|
-
}
|
1343
|
-
var threads = document.getElementsByName("thread");
|
1344
|
-
currentThreadIndex = 0;
|
1345
|
-
currentThread = threads[0].firstChild;
|
1346
|
-
selectNode(currentThread, null);
|
1347
|
-
}
|
1348
|
-
</script>
|
1349
|
-
end_java_script</span>
|
1350
|
-
<span class="ruby-keyword">end</span></pre>
|
863
|
+
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line 213</span>
|
864
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">print_java_script</span>
|
865
|
+
<span class="ruby-identifier">html</span> = <span class="ruby-identifier">open_asset</span>(<span class="ruby-string">'call_stack_printer.js.html'</span>)
|
866
|
+
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">html</span>
|
867
|
+
<span class="ruby-keyword">end</span></pre>
|
1351
868
|
</div>
|
1352
869
|
|
1353
870
|
</div>
|
@@ -1390,13 +907,13 @@ end_java_script</span>
|
|
1390
907
|
<span class="ruby-identifier">display</span> = <span class="ruby-identifier">visible</span> <span class="ruby-operator">?</span> <span class="ruby-string">"block"</span> <span class="ruby-operator">:</span> <span class="ruby-string">"none"</span>
|
1391
908
|
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">print</span> <span class="ruby-node">"<li class=\"color#{color}\" style=\"display:#{display}\">"</span>
|
1392
909
|
<span class="ruby-keyword">if</span> <span class="ruby-identifier">kids</span>.<span class="ruby-identifier">empty?</span>
|
1393
|
-
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">print</span> <span class="ruby-
|
910
|
+
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">print</span> <span class="ruby-node">"<a href=\"#\" class=\"toggle empty\" ></a>"</span>
|
1394
911
|
<span class="ruby-keyword">else</span>
|
1395
912
|
<span class="ruby-identifier">visible_children</span> = <span class="ruby-identifier">kids</span>.<span class="ruby-identifier">any?</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">ci</span><span class="ruby-operator">|</span> (<span class="ruby-identifier">ci</span>.<span class="ruby-identifier">total_time</span><span class="ruby-operator">/</span><span class="ruby-ivar">@overall_time</span>)<span class="ruby-operator">*</span><span class="ruby-value">100</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">threshold</span>}
|
1396
913
|
<span class="ruby-identifier">image</span> = <span class="ruby-identifier">visible_children</span> <span class="ruby-operator">?</span> (<span class="ruby-identifier">expanded</span> <span class="ruby-operator">?</span> <span class="ruby-string">"minus"</span> <span class="ruby-operator">:</span> <span class="ruby-string">"plus"</span>) <span class="ruby-operator">:</span> <span class="ruby-string">"empty"</span>
|
1397
|
-
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">print</span> <span class="ruby-node">"<
|
914
|
+
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">print</span> <span class="ruby-node">"<a href=\"#\" class=\"toggle #{image}\" ></a>"</span>
|
1398
915
|
<span class="ruby-keyword">end</span>
|
1399
|
-
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">printf</span> <span class="ruby-string">" %4.2f%% (%4.2f%%) %s %s
|
916
|
+
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">printf</span> <span class="ruby-string">"<span> %4.2f%% (%4.2f%%) %s %s</span>\n"</span>, <span class="ruby-identifier">percent_total</span>, <span class="ruby-identifier">percent_parent</span>, <span class="ruby-identifier">link</span>(<span class="ruby-identifier">call_info</span>), <span class="ruby-identifier">graph_link</span>(<span class="ruby-identifier">call_info</span>)
|
1400
917
|
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">kids</span>.<span class="ruby-identifier">empty?</span>
|
1401
918
|
<span class="ruby-keyword">if</span> <span class="ruby-identifier">expanded</span>
|
1402
919
|
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">print</span> <span class="ruby-string">"<ul>"</span>
|
@@ -1439,7 +956,7 @@ end_java_script</span>
|
|
1439
956
|
|
1440
957
|
|
1441
958
|
<div class="method-source-code" id="print_title_bar-source">
|
1442
|
-
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line
|
959
|
+
<pre><span class="ruby-comment"># File lib/ruby-prof/printers/call_stack_printer.rb, line 218</span>
|
1443
960
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">print_title_bar</span>
|
1444
961
|
<span class="ruby-ivar">@output</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value"><<-"end_title_bar"
|
1445
962
|
<div id="titlebar">
|