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