1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverunless defined? Call
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
5324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCall = Struct.new( :file, :line, :method )
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass Call
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def self.parse( call_string )
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parts = call_string.split( ':', 3 )
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    file = parts.shift
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    line = parts.shift.to_i
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if parts.empty?
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return Call.new( file, line )
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        mstring = parts.shift
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        match = mstring.match( /`(.+)'/ )
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        method = match ? match[ 1 ] : nil
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return Call.new( file, line, method )
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def self.convert_backtrace( trace )
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    trace.map { |c| parse c }
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def irb?
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    self.file == '(irb)'
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def e_switch?
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    self.file == '-e'
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def to_s
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    string = '%s:%i' % [ file, line ]
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    method and string << ":in `%s'" % method
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return( string )
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def inspect
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    to_s.inspect
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule Kernel
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def call_stack( depth = 1 )
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Call.convert_backtrace( caller( depth + 1 ) )
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass Exception
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def backtrace!
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Call.convert_backtrace( backtrace )
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend # unless defined? Call
58