-
Notifications
You must be signed in to change notification settings - Fork 129
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Handle irb monkey-patching in StackProf::Report #137
Comments
I took a stab at this today. The 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 Here's sample output:
|
If you add a newline to the end of each line of code in the IRB history, then you get this:
All you need to do is change 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 |
@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. |
@NickLaMuro That would create just one string for all of IRB history, I think. I’m looking to mimic |
Ah , you are correct. My bad |
No problem! Thanks for the optimization help anyway! |
Hey!
I generated a StackProf::Report in production for a slow process. I found a method that appeared to be quite expensive and refactored it. I applied the monkey-patch in my irb session and regenerated the stackprof. Unfortunately, when I went to call
Report#print_method
, I got an error saying that stackprof couldn't open fileirb
.Could we add support for reading source from irb?
Report#source_display
currently callsFile.readlines(file)
, but when the source location of a method is inirb
, then it errors.The text was updated successfully, but these errors were encountered: