| #!/usr/bin/ruby |
| |
| unless defined? Call |
| |
| Call = Struct.new( :file, :line, :method ) |
| class Call |
| |
| def self.parse( call_string ) |
| parts = call_string.split( ':', 3 ) |
| file = parts.shift |
| line = parts.shift.to_i |
| if parts.empty? |
| return Call.new( file, line ) |
| else |
| mstring = parts.shift |
| match = mstring.match( /`(.+)'/ ) |
| method = match ? match[ 1 ] : nil |
| return Call.new( file, line, method ) |
| end |
| end |
| |
| def self.convert_backtrace( trace ) |
| trace.map { |c| parse c } |
| end |
| |
| def irb? |
| self.file == '(irb)' |
| end |
| |
| def e_switch? |
| self.file == '-e' |
| end |
| |
| def to_s |
| string = '%s:%i' % [ file, line ] |
| method and string << ":in `%s'" % method |
| return( string ) |
| end |
| |
| def inspect |
| to_s.inspect |
| end |
| end |
| |
| module Kernel |
| def call_stack( depth = 1 ) |
| Call.convert_backtrace( caller( depth + 1 ) ) |
| end |
| end |
| |
| class Exception |
| def backtrace! |
| Call.convert_backtrace( backtrace ) |
| end |
| end |
| |
| end # unless defined? Call |