1#!/usr/bin/ruby
2
3unless defined? Call
4  
5Call = Struct.new( :file, :line, :method )
6class Call
7  
8  def self.parse( call_string )
9    parts = call_string.split( ':', 3 )
10    file = parts.shift
11    line = parts.shift.to_i
12    if parts.empty?
13        return Call.new( file, line )
14    else
15        mstring = parts.shift
16        match = mstring.match( /`(.+)'/ )
17        method = match ? match[ 1 ] : nil
18        return Call.new( file, line, method )
19    end
20  end
21  
22  def self.convert_backtrace( trace )
23    trace.map { |c| parse c }
24  end
25  
26  def irb?
27    self.file == '(irb)'
28  end
29  
30  def e_switch?
31    self.file == '-e'
32  end
33  
34  def to_s
35    string = '%s:%i' % [ file, line ]
36    method and string << ":in `%s'" % method
37    return( string )
38  end
39  
40  def inspect
41    to_s.inspect
42  end
43end
44
45module Kernel
46  def call_stack( depth = 1 )
47    Call.convert_backtrace( caller( depth + 1 ) )
48  end
49end
50
51class Exception
52  def backtrace!
53    Call.convert_backtrace( backtrace )
54  end
55end
56
57end # unless defined? Call
58