Comments (6)
I took a stab at this today. The irb
module took some getting used to, but I found a solution.
module StackProf
class Report
def source_file_lines(file)
if file.eql?("(irb)")
IRB.CurrentContext.io.instance_variable_get(:@line)
else
File.readlines(file)
end
end
def source_display(f, file, lines, range=nil)
source_file_lines(file).each_with_index do |code, i|
next unless range.nil? || range.include?(i)
if lines and lineinfo = lines[i+1]
total_samples, samples = lineinfo
if version == 1.0
samples = total_samples
f.printf "% 5d % 7s | % 5d | %s", samples, "(%2.1f%%)" % (100.0*samples/overall_samples), i+1, code
elsif samples > 0
f.printf "% 5d % 8s / % 5d % 7s | % 5d | %s", total_samples, "(%2.1f%%)" % (100.0*total_samples/overall_samples), samples, "(%2.1f%%)" % (100.0*samples/overall_samples), i+1, code
else
f.printf "% 5d % 8s | % 5d | %s", total_samples, "(%3.1f%%)" % (100.0*total_samples/overall_samples), i+1, code
end
else
if version == 1.0
f.printf " | % 5d | %s", i+1, code
else
f.printf " | % 5d | %s", i+1, code
end
end
end
rescue SystemCallError
f.puts " SOURCE UNAVAILABLE"
end
end
end
The IRB.CurrentContext.io
returns some form of "input method." These input methods all define a @line
instance variable which holds all the IRB history of the current session.
Here's sample output:
GitHub[production] (main):161:0> report.print_method("Object#foobar")
Object#foobar ((irb):1)
samples: 9823 self (88.0%) / 9823 total (88.0%)
callers:
9823 ( 100.0%) Object#irb_binding
code:
| 1 | 9823 (88.0%) / 9823 (88.0%) | 2 | def foobar
| 3 | end
from stackprof.
If you add a newline to the end of each line of code in the IRB history, then you get this:
GitHub[production] (main):185:0> report.print_method("Object#foobar")
Object#foobar ((irb):1)
samples: 9823 self (88.0%) / 9823 total (88.0%)
callers:
9823 ( 100.0%) Object#irb_binding
code:
| 1 |
9823 (88.0%) / 9823 (88.0%) | 2 | def foobar
| 3 | end
All you need to do is change #source_file_lines
:
module StackProf
class Report
def source_file_lines(file)
if file.eql?("(irb)")
IRB.CurrentContext.io.instance_variable_get(:@line).map { |line| line.to_s+"\n" }
else
File.readlines(file)
end
end
end
end
from stackprof.
@parkr You probably could do:
IRB.CurrentContext.io.instance_variable_get(:@line).map(&:to_s).join("\n")
If you wanted something a little more terse. Though, does cause one extra loop iteration.
from stackprof.
@NickLaMuro That would create just one string for all of IRB history, I think. Iām looking to mimic File.readlines
, which returns an array of lines, each with terminating new lines.
from stackprof.
Ah , you are correct. My bad
from stackprof.
No problem! Thanks for the optimization help anyway!
from stackprof.
Related Issues (20)
- Problem with Ruby 2.7.6 and version 0.2.20 HOT 6
- Error installing with Ruby 3.1 HOT 3
- Segmentation fault on Ruby 2.7.6p219 HOT 4
- Possibility to filter certain files or classes?
- flaky test failure with ruby3.1
- Test failures on 32bit arch
- Flamegraph way too short in `wall` mode HOT 5
- Support Gecko format? HOT 2
- Weird timestamp deltas with puma HOT 2
- bug: "missed_samples" integer overflow possible HOT 1
- bug: possible state leak of `buffer_count` state between stackprof invocations HOT 2
- C99 error while compiling v0.2.25 HOT 1
- Add marker metadata feature HOT 1
- stackprof fails to build native extensions on ubuntu 22.04 and ruby 3.2.2 HOT 1
- "lines" attribute format?
- bug: state of _stackprof.last_sample_at can leak between invocations
- 3.3.0-dev: Segfault in `rb_profile_frames` with N:M threads enabled HOT 3
- Add discussions tab, hide the projects tab
- ruby 3.2.2 An error occurred while installing stackprof (0.2.26), and Bundler cannot
- Test failure StackProfTest#test_raw Expected 0 to be > 0. HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
š Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. ššš
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ā¤ļø Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from stackprof.