Sha256: acc31b4a1d8bb0776c4e6d893ce9059bfa7a095d962ee69fe9bfc264f72916a5
Contents?: true
Size: 1.41 KB
Versions: 1
Compression:
Stored size: 1.41 KB
Contents
require 'debug_inspector' module BindingOfCaller module BindingExtensions # Retrieve the binding of the nth caller of the current frame. # @return [Binding] def of_caller(n) c = callers.drop(1) if n > (c.size - 1) raise "No such frame, gone beyond end of stack!" else c[n] end end # The description of the frame. # @return [String] def frame_description @frame_description ||= @iseq.label end # Return bindings for all caller frames. # @return [Array<Binding>] def callers ary = [] RubyVM::DebugInspector.open do |i| n = 0 loop do begin b = i.frame_binding(n) if b iseq = i.frame_iseq(n) b.instance_variable_set(:@iseq, iseq) ary << b end rescue ArgumentError break end n += 1 end end ary.drop(1) end # Number of parent frames available at the point of call. # @return [Fixnum] def frame_count callers.size - 1 end # The type of the frame. # @return [Symbol] def frame_type # apparently the 9th element of the iseq array holds the frame type # ...not sure how reliable this is. @frame_type ||= @iseq.to_a[9] end end end class ::Binding include BindingOfCaller::BindingExtensions end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
binding_of_caller-0.7 | lib/binding_of_caller/mri2.rb |