module BindingOfCaller::BindingExtensions

Public Instance Methods

callers() click to toggle source

Return bindings for all caller frames. @return [Array<Binding>]

# File lib/binding_of_caller/mri2.rb, line 18
def callers
  ary = []

  RubyVM::DebugInspector.open do |i|
    n = 0
    loop do
      begin
        b = i.frame_binding(n) 
      rescue ArgumentError
        break
      end

      if b
        b.instance_variable_set(:@iseq, i.frame_iseq(n))
        ary << b
      end
      
      n += 1
    end
  end
  
  ary.drop(1)
end
frame_count() click to toggle source

Number of parent frames available at the point of call. @return [Fixnum]

# File lib/binding_of_caller/mri2.rb, line 44
def frame_count
  callers.size - 1
end
frame_description() click to toggle source

The description of the frame. @return [String]

# File lib/binding_of_caller/mri2.rb, line 60
def frame_description
  return nil if !@iseq
  @frame_description ||= @iseq.label
end
frame_type() click to toggle source

The type of the frame. @return [Symbol]

# File lib/binding_of_caller/mri2.rb, line 50
def frame_type
  return nil if !@iseq
  
  # 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
of_caller(n) click to toggle source

Retrieve the binding of the nth caller of the current frame. @return [Binding]

# File lib/binding_of_caller/mri2.rb, line 7
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