class DEBUGGER__::MethodBreakpoint - debug: Ruby Standard Library Documentation

# class DEBUGGER__::MethodBreakpoint

### Attributes

klass[R]
method[R]
sig_method_name[R]

### Public Class Methods

new(b, klass_name, op, method_name, cond: nil, command: nil, path: nil) click to toggle source
Calls superclass method `DEBUGGER__::Breakpoint::new`

    # File debug-1.10.0/lib/debug/breakpoint.rb, line 430
    def initialize b, klass_name, op, method_name, cond: nil, command: nil, path: nil
      @sig_klass_name = klass_name
      @sig_op = op
      @sig_method_name = method_name
      @klass_eval_binding = b
      @override_method = false

      @klass = nil
      @method = nil
      @cond_class = nil
      @key = "#{klass_name}#{op}#{method_name}".freeze

      super(cond, command, path, do_enable: false)
    end

### Public Instance Methods

enable() click to toggle source

    # File debug-1.10.0/lib/debug/breakpoint.rb, line 475
    def enable
      try_enable
    end

eval_class_name() click to toggle source

    # File debug-1.10.0/lib/debug/breakpoint.rb, line 457
    def eval_class_name
      return @klass if @klass
      @klass = @klass_eval_binding.eval(@sig_klass_name)
      @klass_eval_binding = nil
      @klass
    end

override(klass) click to toggle source
Calls superclass method

    # File debug-1.10.0/lib/debug/breakpoint.rb, line 480
    def override klass
      sig_method_name = @sig_method_name
      klass.prepend Module.new{
        define_method(sig_method_name) do |*args, &block|
          super(*args, &block)
        end
      }
    end

search_method() click to toggle source

    # File debug-1.10.0/lib/debug/breakpoint.rb, line 464
    def search_method
      case @sig_op
      when '.'
        @method = @klass.method(@sig_method_name)
      when '#'
        @method = @klass.instance_method(@sig_method_name)
      else
        raise "Unknown op: #{@sig_op}"
      end
    end

setup() click to toggle source

    # File debug-1.10.0/lib/debug/breakpoint.rb, line 445
    def setup
      @tp = TracePoint.new(:call){|tp|
        next if !safe_eval(tp.binding, @cond) if @cond
        next if @cond_class && !tp.self.kind_of?(@cond_class)

        caller_location = caller_locations(2, 1).first.to_s
        next if skip_path?(caller_location)

        suspend
      }
    end

sig() click to toggle source

    # File debug-1.10.0/lib/debug/breakpoint.rb, line 543
    def sig
      @key
    end

to_s() click to toggle source
Calls superclass method `DEBUGGER__::Breakpoint#to_s`

    # File debug-1.10.0/lib/debug/breakpoint.rb, line 547
    def to_s
      if @method
        loc = @method.source_location || []
        "#{generate_label("Method")} #{sig} at #{loc.join(':')}"
      else
        "#{generate_label("Method (pending)")} #{sig}"
      end + super
    end

try_enable(added: false) click to toggle source

    # File debug-1.10.0/lib/debug/breakpoint.rb, line 499
    def try_enable added: false
      eval_class_name
      search_method

      begin
        retried = false

        @tp.enable(target: @method)
        DEBUGGER__.info "#{self} is activated." if added

        if @sig_op == '#'
          @cond_class = @klass if @method.owner != @klass
        else # '.'
          begin
            @cond_class = @klass.singleton_class if @method.owner != @klass.singleton_class
          rescue TypeError
          end
        end

      rescue ArgumentError
        raise if retried
        retried = true

        # maybe C method
        case @sig_op
        when '.'
          begin
            override @klass.singleton_class
          rescue TypeError
            override @klass.class
          end
        when '#'
          override @klass
        end

        # re-collect the method object after the above patch
        search_method
        @override_method = true if @method
        retry
      end
    rescue Exception
      raise unless added
    end